LCOV - code coverage report
Current view: top level - network - networkd-util.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 21 46 45.7 %
Date: 2019-08-23 13:36:53 Functions: 8 13 61.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 17 52 32.7 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include "condition.h"
       4                 :            : #include "conf-parser.h"
       5                 :            : #include "networkd-util.h"
       6                 :            : #include "parse-util.h"
       7                 :            : #include "string-table.h"
       8                 :            : #include "string-util.h"
       9                 :            : #include "util.h"
      10                 :            : 
      11                 :            : static const char * const address_family_table[_ADDRESS_FAMILY_MAX] = {
      12                 :            :         [ADDRESS_FAMILY_NO]            = "no",
      13                 :            :         [ADDRESS_FAMILY_YES]           = "yes",
      14                 :            :         [ADDRESS_FAMILY_IPV4]          = "ipv4",
      15                 :            :         [ADDRESS_FAMILY_IPV6]          = "ipv6",
      16                 :            : };
      17                 :            : 
      18                 :            : static const char * const link_local_address_family_table[_ADDRESS_FAMILY_MAX] = {
      19                 :            :         [ADDRESS_FAMILY_NO]            = "no",
      20                 :            :         [ADDRESS_FAMILY_YES]           = "yes",
      21                 :            :         [ADDRESS_FAMILY_IPV4]          = "ipv4",
      22                 :            :         [ADDRESS_FAMILY_IPV6]          = "ipv6",
      23                 :            :         [ADDRESS_FAMILY_FALLBACK]      = "fallback",
      24                 :            :         [ADDRESS_FAMILY_FALLBACK_IPV4] = "ipv4-fallback",
      25                 :            : };
      26                 :            : 
      27                 :            : static const char * const routing_policy_rule_address_family_table[_ADDRESS_FAMILY_MAX] = {
      28                 :            :         [ADDRESS_FAMILY_YES]           = "both",
      29                 :            :         [ADDRESS_FAMILY_IPV4]          = "ipv4",
      30                 :            :         [ADDRESS_FAMILY_IPV6]          = "ipv6",
      31                 :            : };
      32                 :            : 
      33   [ +  +  +  +  :         76 : DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(address_family, AddressFamily, ADDRESS_FAMILY_YES);
                   +  + ]
      34   [ -  +  -  +  :         12 : DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(link_local_address_family, AddressFamily, ADDRESS_FAMILY_YES);
                   +  - ]
      35   [ #  #  #  # ]:          0 : DEFINE_STRING_TABLE_LOOKUP(routing_policy_rule_address_family, AddressFamily);
      36   [ -  +  -  +  :         12 : DEFINE_CONFIG_PARSE_ENUM(config_parse_link_local_address_family, link_local_address_family,
          -  +  -  +  -  
                +  #  # ]
      37                 :            :                          AddressFamily, "Failed to parse option");
      38                 :            : 
      39                 :          0 : int config_parse_address_family_with_kernel(
      40                 :            :                 const char* unit,
      41                 :            :                 const char *filename,
      42                 :            :                 unsigned line,
      43                 :            :                 const char *section,
      44                 :            :                 unsigned section_line,
      45                 :            :                 const char *lvalue,
      46                 :            :                 int ltype,
      47                 :            :                 const char *rvalue,
      48                 :            :                 void *data,
      49                 :            :                 void *userdata) {
      50                 :            : 
      51                 :          0 :         AddressFamily *fwd = data, s;
      52                 :            : 
      53         [ #  # ]:          0 :         assert(filename);
      54         [ #  # ]:          0 :         assert(lvalue);
      55         [ #  # ]:          0 :         assert(rvalue);
      56         [ #  # ]:          0 :         assert(data);
      57                 :            : 
      58                 :            :         /* This function is mostly obsolete now. It simply redirects
      59                 :            :          * "kernel" to "no". In older networkd versions we used to
      60                 :            :          * distinguish IPForward=off from IPForward=kernel, where the
      61                 :            :          * former would explicitly turn off forwarding while the
      62                 :            :          * latter would simply not touch the setting. But that logic
      63                 :            :          * is gone, hence silently accept the old setting, but turn it
      64                 :            :          * to "no". */
      65                 :            : 
      66                 :          0 :         s = address_family_from_string(rvalue);
      67         [ #  # ]:          0 :         if (s < 0) {
      68         [ #  # ]:          0 :                 if (streq(rvalue, "kernel"))
      69                 :          0 :                         s = ADDRESS_FAMILY_NO;
      70                 :            :                 else {
      71         [ #  # ]:          0 :                         log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse IPForward= option, ignoring: %s", rvalue);
      72                 :          0 :                         return 0;
      73                 :            :                 }
      74                 :            :         }
      75                 :            : 
      76                 :          0 :         *fwd = s;
      77                 :            : 
      78                 :          0 :         return 0;
      79                 :            : }
      80                 :            : 
      81                 :            : /* Router lifetime can be set with netlink interface since kernel >= 4.5
      82                 :            :  * so for the supported kernel we don't need to expire routes in userspace */
      83                 :          0 : int kernel_route_expiration_supported(void) {
      84                 :            :         static int cached = -1;
      85                 :            :         int r;
      86                 :            : 
      87         [ #  # ]:          0 :         if (cached < 0) {
      88                 :          0 :                 Condition c = {
      89                 :            :                         .type = CONDITION_KERNEL_VERSION,
      90                 :            :                         .parameter = (char *) ">= 4.5"
      91                 :            :                 };
      92                 :          0 :                 r = condition_test(&c);
      93         [ #  # ]:          0 :                 if (r < 0)
      94                 :          0 :                         return r;
      95                 :            : 
      96                 :          0 :                 cached = r;
      97                 :            :         }
      98                 :          0 :         return cached;
      99                 :            : }
     100                 :            : 
     101                 :        184 : static void network_config_hash_func(const NetworkConfigSection *c, struct siphash *state) {
     102                 :        184 :         siphash24_compress(c->filename, strlen(c->filename), state);
     103                 :        184 :         siphash24_compress(&c->line, sizeof(c->line), state);
     104                 :        184 : }
     105                 :            : 
     106                 :         92 : static int network_config_compare_func(const NetworkConfigSection *x, const NetworkConfigSection *y) {
     107                 :            :         int r;
     108                 :            : 
     109                 :         92 :         r = strcmp(x->filename, y->filename);
     110         [ -  + ]:         92 :         if (r != 0)
     111                 :          0 :                 return r;
     112                 :            : 
     113         [ +  - ]:         92 :         return CMP(x->line, y->line);
     114                 :            : }
     115                 :            : 
     116                 :            : DEFINE_HASH_OPS(network_config_hash_ops, NetworkConfigSection, network_config_hash_func, network_config_compare_func);
     117                 :            : 
     118                 :         92 : int network_config_section_new(const char *filename, unsigned line, NetworkConfigSection **s) {
     119                 :            :         NetworkConfigSection *cs;
     120                 :            : 
     121                 :         92 :         cs = malloc0(offsetof(NetworkConfigSection, filename) + strlen(filename) + 1);
     122         [ -  + ]:         92 :         if (!cs)
     123                 :          0 :                 return -ENOMEM;
     124                 :            : 
     125                 :         92 :         strcpy(cs->filename, filename);
     126                 :         92 :         cs->line = line;
     127                 :            : 
     128                 :         92 :         *s = TAKE_PTR(cs);
     129                 :            : 
     130                 :         92 :         return 0;
     131                 :            : }
     132                 :            : 
     133                 :        136 : void network_config_section_free(NetworkConfigSection *cs) {
     134                 :        136 :         free(cs);
     135                 :        136 : }

Generated by: LCOV version 1.14