network: rename Neighbor.MACAddress= to Neighbor.LinkLayerAddress=
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 10 Jul 2019 17:23:41 +0000 (02:23 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Jul 2019 13:22:29 +0000 (22:22 +0900)
And make it support IPv4 address.

Closes #13015.

man/systemd.network.xml
src/network/networkd-neighbor.c
src/network/networkd-neighbor.h
src/network/networkd-network-gperf.gperf
test/fuzz/fuzz-network-parser/directives.network

index c544315..612450d 100644 (file)
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><varname>MACAddress=</varname></term>
+          <term><varname>LinkLayerAddress=</varname></term>
           <listitem>
-            <para>The hardware address of the neighbor.</para>
+            <para>The link layer address (MAC address or IP address) of the neighbor.</para>
           </listitem>
         </varlistentry>
       </variablelist>
index c3490cb..5eed80b 100644 (file)
@@ -59,6 +59,7 @@ static int neighbor_new_static(Network *network, const char *filename, unsigned
         *neighbor = (Neighbor) {
                 .network = network,
                 .family = AF_UNSPEC,
+                .lladdr_type = _NEIGHBOR_LLADDR_INVALID,
         };
 
         LIST_APPEND(neighbors, network->neighbors, neighbor);
@@ -117,8 +118,8 @@ int neighbor_configure(Neighbor *neighbor, Link *link, link_netlink_message_hand
 
         if (neighbor->family == AF_UNSPEC)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Neighbor without Address= configured");
-        if (!neighbor->mac_configured)
-                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Neighbor without MACAddress= configured");
+        if (neighbor->lladdr_type < 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Neighbor without LinkLayerAddress= configured");
 
         r = sd_rtnl_message_new_neigh(link->manager->rtnl, &req, RTM_NEWNEIGH,
                                           link->ifindex, neighbor->family);
@@ -133,7 +134,10 @@ int neighbor_configure(Neighbor *neighbor, Link *link, link_netlink_message_hand
         if (r < 0)
                 return log_error_errno(r, "Could not set flags: %m");
 
-        r = sd_netlink_message_append_data(req, NDA_LLADDR, &neighbor->mac, sizeof(neighbor->mac));
+        if (neighbor->lladdr_type == NEIGHBOR_LLADDR_MAC)
+                r = sd_netlink_message_append_data(req, NDA_LLADDR, &neighbor->lladdr.mac, sizeof(neighbor->lladdr.mac));
+        else
+                r = sd_netlink_message_append_data(req, NDA_LLADDR, &neighbor->lladdr.ip.in, sizeof(neighbor->lladdr.ip.in));
         if (r < 0)
                 return log_error_errno(r, "Could not append NDA_LLADDR attribute: %m");
 
@@ -152,16 +156,17 @@ int neighbor_configure(Neighbor *neighbor, Link *link, link_netlink_message_hand
         return 0;
 }
 
-int config_parse_neighbor_address(const char *unit,
-                                  const char *filename,
-                                  unsigned line,
-                                  const char *section,
-                                  unsigned section_line,
-                                  const char *lvalue,
-                                  int ltype,
-                                  const char *rvalue,
-                                  void *data,
-                                  void *userdata) {
+int config_parse_neighbor_address(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
 
         Network *network = userdata;
         _cleanup_(neighbor_free_or_set_invalidp) Neighbor *n = NULL;
@@ -188,16 +193,17 @@ int config_parse_neighbor_address(const char *unit,
         return 0;
 }
 
-int config_parse_neighbor_hwaddr(const char *unit,
-                                 const char *filename,
-                                 unsigned line,
-                                 const char *section,
-                                 unsigned section_line,
-                                 const char *lvalue,
-                                 int ltype,
-                                 const char *rvalue,
-                                 void *data,
-                                 void *userdata) {
+int config_parse_neighbor_lladdr(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
 
         Network *network = userdata;
         _cleanup_(neighbor_free_or_set_invalidp) Neighbor *n = NULL;
@@ -213,13 +219,56 @@ int config_parse_neighbor_hwaddr(const char *unit,
         if (r < 0)
                 return r;
 
-        r = ether_addr_from_string(rvalue, &n->mac);
+        r = ether_addr_from_string(rvalue, &n->lladdr.mac);
+        if (r >= 0)
+                n->lladdr_type = NEIGHBOR_LLADDR_MAC;
+        else {
+                r = in_addr_from_string(AF_INET, rvalue, &n->lladdr.ip);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Neighbor LinkLayerAddress= is invalid, ignoring assignment: %s", rvalue);
+                        return 0;
+                }
+                n->lladdr_type = NEIGHBOR_LLADDR_IP;
+        }
+
+        TAKE_PTR(n);
+
+        return 0;
+}
+
+int config_parse_neighbor_hwaddr(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Network *network = userdata;
+        _cleanup_(neighbor_free_or_set_invalidp) Neighbor *n = NULL;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = neighbor_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        r = ether_addr_from_string(rvalue, &n->lladdr.mac);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Neighbor MACAddress is invalid, ignoring assignment: %s", rvalue);
+                log_syntax(unit, LOG_ERR, filename, line, r, "Neighbor MACAddress= is invalid, ignoring assignment: %s", rvalue);
                 return 0;
         }
 
-        n->mac_configured = true;
+        n->lladdr_type = NEIGHBOR_LLADDR_MAC;
         TAKE_PTR(n);
 
         return 0;
index f591f0b..59cd82a 100644 (file)
@@ -15,6 +15,13 @@ typedef struct Neighbor Neighbor;
 #include "networkd-network.h"
 #include "networkd-util.h"
 
+typedef enum {
+        NEIGHBOR_LLADDR_MAC,
+        NEIGHBOR_LLADDR_IP,
+        _NEIGHBOR_LLADDR_MAX,
+        _NEIGHBOR_LLADDR_INVALID = -1,
+} NeighborLLAddressType;
+
 struct Neighbor {
         Network *network;
         Link *link;
@@ -22,8 +29,11 @@ struct Neighbor {
 
         int family;
         union in_addr_union in_addr;
-        bool mac_configured;
-        struct ether_addr mac;
+        union {
+                struct ether_addr mac;
+                union in_addr_union ip;
+        } lladdr;
+        NeighborLLAddressType lladdr_type;
 
         LIST_FIELDS(Neighbor, neighbors);
 };
@@ -36,3 +46,4 @@ int neighbor_configure(Neighbor *neighbor, Link *link, link_netlink_message_hand
 
 CONFIG_PARSER_PROTOTYPE(config_parse_neighbor_address);
 CONFIG_PARSER_PROTOTYPE(config_parse_neighbor_hwaddr);
+CONFIG_PARSER_PROTOTYPE(config_parse_neighbor_lladdr);
index ed8c061..3501ffd 100644 (file)
@@ -108,7 +108,8 @@ Address.Scope,                          config_parse_address_scope,
 IPv6AddressLabel.Prefix,                config_parse_address_label_prefix,               0,                             0
 IPv6AddressLabel.Label,                 config_parse_address_label,                      0,                             0
 Neighbor.Address,                       config_parse_neighbor_address,                   0,                             0
-Neighbor.MACAddress,                    config_parse_neighbor_hwaddr,                    0,                             0
+Neighbor.LinkLayerAddress,              config_parse_neighbor_lladdr,                    0,                             0
+Neighbor.MACAddress,                    config_parse_neighbor_hwaddr,                    0,                             0 /* deprecated */
 RoutingPolicyRule.TypeOfService,        config_parse_routing_policy_rule_tos,            0,                             0
 RoutingPolicyRule.Priority,             config_parse_routing_policy_rule_priority,       0,                             0
 RoutingPolicyRule.Table,                config_parse_routing_policy_rule_table,          0,                             0
index b895e09..69a4281 100644 (file)
@@ -223,6 +223,7 @@ Managed=
 OtherInformation=
 [Neighbor]
 Address=
+LinkLayerAddress=
 MACAddress=
 [IPv6AddressLabel]
 Label=