LCOV - code coverage report
Current view: top level - network - networkd-conf.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 58 76 76.3 %
Date: 2019-08-23 13:36:53 Functions: 3 4 75.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 40 77 51.9 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : /***
       3                 :            :   Copyright © 2014 Vinay Kulkarni <kulkarniv@vmware.com>
       4                 :            :  ***/
       5                 :            : 
       6                 :            : #include <ctype.h>
       7                 :            : 
       8                 :            : #include "conf-parser.h"
       9                 :            : #include "def.h"
      10                 :            : #include "dhcp-identifier.h"
      11                 :            : #include "extract-word.h"
      12                 :            : #include "hexdecoct.h"
      13                 :            : #include "networkd-conf.h"
      14                 :            : #include "networkd-manager.h"
      15                 :            : #include "networkd-network.h"
      16                 :            : #include "networkd-speed-meter.h"
      17                 :            : #include "string-table.h"
      18                 :            : 
      19                 :          0 : int manager_parse_config_file(Manager *m) {
      20                 :            :         int r;
      21                 :            : 
      22         [ #  # ]:          0 :         assert(m);
      23                 :            : 
      24                 :          0 :         r = config_parse_many_nulstr(PKGSYSCONFDIR "/networkd.conf",
      25                 :            :                                      CONF_PATHS_NULSTR("systemd/networkd.conf.d"),
      26                 :            :                                      "Network\0DHCP\0",
      27                 :            :                                      config_item_perf_lookup, networkd_gperf_lookup,
      28                 :            :                                      CONFIG_PARSE_WARN, m);
      29         [ #  # ]:          0 :         if (r < 0)
      30                 :          0 :                 return r;
      31                 :            : 
      32   [ #  #  #  # ]:          0 :         if (m->use_speed_meter && m->speed_meter_interval_usec < SPEED_METER_MINIMUM_TIME_INTERVAL) {
      33                 :            :                 char buf[FORMAT_TIMESPAN_MAX];
      34                 :            : 
      35         [ #  # ]:          0 :                 log_warning("SpeedMeterIntervalSec= is too small, using %s.",
      36                 :            :                             format_timespan(buf, sizeof buf, SPEED_METER_MINIMUM_TIME_INTERVAL, USEC_PER_SEC));
      37                 :          0 :                 m->speed_meter_interval_usec = SPEED_METER_MINIMUM_TIME_INTERVAL;
      38                 :            :         }
      39                 :            : 
      40                 :          0 :         return 0;
      41                 :            : }
      42                 :            : 
      43                 :            : static const char* const duid_type_table[_DUID_TYPE_MAX] = {
      44                 :            :         [DUID_TYPE_LLT]  = "link-layer-time",
      45                 :            :         [DUID_TYPE_EN]   = "vendor",
      46                 :            :         [DUID_TYPE_LL]   = "link-layer",
      47                 :            :         [DUID_TYPE_UUID] = "uuid",
      48                 :            : };
      49                 :         40 : DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(duid_type, DUIDType);
      50                 :            : 
      51                 :         44 : int config_parse_duid_type(
      52                 :            :                 const char *unit,
      53                 :            :                 const char *filename,
      54                 :            :                 unsigned line,
      55                 :            :                 const char *section,
      56                 :            :                 unsigned section_line,
      57                 :            :                 const char *lvalue,
      58                 :            :                 int ltype,
      59                 :            :                 const char *rvalue,
      60                 :            :                 void *data,
      61                 :            :                 void *userdata) {
      62                 :            : 
      63                 :         44 :         _cleanup_free_ char *type_string = NULL;
      64                 :         44 :         const char *p = rvalue;
      65                 :         44 :         DUID *duid = data;
      66                 :            :         DUIDType type;
      67                 :            :         int r;
      68                 :            : 
      69         [ -  + ]:         44 :         assert(filename);
      70         [ -  + ]:         44 :         assert(lvalue);
      71         [ -  + ]:         44 :         assert(rvalue);
      72         [ -  + ]:         44 :         assert(duid);
      73                 :            : 
      74                 :         44 :         r = extract_first_word(&p, &type_string, ":", 0);
      75         [ -  + ]:         44 :         if (r == -ENOMEM)
      76                 :          0 :                 return log_oom();
      77         [ -  + ]:         44 :         if (r < 0) {
      78         [ #  # ]:          0 :                 log_syntax(unit, LOG_WARNING, filename, line, r,
      79                 :            :                            "Invalid syntax, ignoring: %s", rvalue);
      80                 :          0 :                 return 0;
      81                 :            :         }
      82         [ +  + ]:         44 :         if (r == 0) {
      83         [ +  - ]:          4 :                 log_syntax(unit, LOG_WARNING, filename, line, 0,
      84                 :            :                            "Failed to extract DUID type from '%s', ignoring.", rvalue);
      85                 :          4 :                 return 0;
      86                 :            :         }
      87                 :            : 
      88                 :         40 :         type = duid_type_from_string(type_string);
      89         [ +  + ]:         40 :         if (type < 0) {
      90         [ +  - ]:          8 :                 log_syntax(unit, LOG_WARNING, filename, line, 0,
      91                 :            :                            "Failed to parse DUID type '%s', ignoring.", type_string);
      92                 :          8 :                 return 0;
      93                 :            :         }
      94                 :            : 
      95         [ +  + ]:         32 :         if (!isempty(p)) {
      96                 :            :                 usec_t u;
      97                 :            : 
      98         [ +  + ]:         16 :                 if (type != DUID_TYPE_LLT) {
      99         [ +  - ]:         12 :                         log_syntax(unit, LOG_WARNING, filename, line, r,
     100                 :            :                                    "Invalid syntax, ignoring: %s", rvalue);
     101                 :         12 :                         return 0;
     102                 :            :                 }
     103                 :            : 
     104                 :          4 :                 r = parse_timestamp(p, &u);
     105         [ -  + ]:          4 :                 if (r < 0) {
     106         [ #  # ]:          0 :                         log_syntax(unit, LOG_WARNING, filename, line, r,
     107                 :            :                                    "Failed to parse timestamp, ignoring: %s", p);
     108                 :          0 :                         return 0;
     109                 :            :                 }
     110                 :            : 
     111                 :          4 :                 duid->llt_time = u;
     112                 :            :         }
     113                 :            : 
     114                 :         20 :         duid->type = type;
     115                 :            : 
     116                 :         20 :         return 0;
     117                 :            : }
     118                 :            : 
     119                 :         40 : int config_parse_duid_rawdata(
     120                 :            :                 const char *unit,
     121                 :            :                 const char *filename,
     122                 :            :                 unsigned line,
     123                 :            :                 const char *section,
     124                 :            :                 unsigned section_line,
     125                 :            :                 const char *lvalue,
     126                 :            :                 int ltype,
     127                 :            :                 const char *rvalue,
     128                 :            :                 void *data,
     129                 :            :                 void *userdata) {
     130                 :            : 
     131                 :         40 :         DUID *ret = data;
     132                 :            :         uint8_t raw_data[MAX_DUID_LEN];
     133                 :         40 :         unsigned count = 0;
     134                 :            : 
     135         [ -  + ]:         40 :         assert(filename);
     136         [ -  + ]:         40 :         assert(lvalue);
     137         [ -  + ]:         40 :         assert(rvalue);
     138         [ -  + ]:         40 :         assert(ret);
     139                 :            : 
     140                 :            :         /* RawData contains DUID in format "NN:NN:NN..." */
     141                 :       1108 :         for (;;) {
     142                 :            :                 int n1, n2, len, r;
     143                 :            :                 uint32_t byte;
     144      [ +  +  + ]:       1148 :                 _cleanup_free_ char *cbyte = NULL;
     145                 :            : 
     146                 :       1148 :                 r = extract_first_word(&rvalue, &cbyte, ":", 0);
     147         [ -  + ]:       1148 :                 if (r < 0) {
     148         [ #  # ]:          0 :                         log_syntax(unit, LOG_ERR, filename, line, r, "Failed to read DUID, ignoring assignment: %s.", rvalue);
     149                 :          0 :                         return 0;
     150                 :            :                 }
     151         [ +  + ]:       1148 :                 if (r == 0)
     152                 :         24 :                         break;
     153         [ +  + ]:       1124 :                 if (count >= MAX_DUID_LEN) {
     154         [ +  - ]:          4 :                         log_syntax(unit, LOG_ERR, filename, line, 0, "Max DUID length exceeded, ignoring assignment: %s.", rvalue);
     155                 :          4 :                         return 0;
     156                 :            :                 }
     157                 :            : 
     158                 :       1120 :                 len = strlen(cbyte);
     159   [ +  +  +  + ]:       1120 :                 if (!IN_SET(len, 1, 2)) {
     160         [ +  - ]:         12 :                         log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid length - DUID byte: %s, ignoring assignment: %s.", cbyte, rvalue);
     161                 :         12 :                         return 0;
     162                 :            :                 }
     163                 :       1108 :                 n1 = unhexchar(cbyte[0]);
     164         [ +  + ]:       1108 :                 if (len == 2)
     165                 :        952 :                         n2 = unhexchar(cbyte[1]);
     166                 :            :                 else
     167                 :        156 :                         n2 = 0;
     168                 :            : 
     169   [ +  -  -  + ]:       1108 :                 if (n1 < 0 || n2 < 0) {
     170         [ #  # ]:          0 :                         log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid DUID byte: %s. Ignoring assignment: %s.", cbyte, rvalue);
     171                 :          0 :                         return 0;
     172                 :            :                 }
     173                 :            : 
     174                 :       1108 :                 byte = ((uint8_t) n1 << (4 * (len-1))) | (uint8_t) n2;
     175                 :       1108 :                 raw_data[count++] = byte;
     176                 :            :         }
     177                 :            : 
     178                 :            :         assert_cc(sizeof(raw_data) == sizeof(ret->raw_data));
     179                 :         24 :         memcpy(ret->raw_data, raw_data, count);
     180                 :         24 :         ret->raw_data_len = count;
     181                 :         24 :         return 0;
     182                 :            : }

Generated by: LCOV version 1.14