chiark / gitweb /
networkd: add support for peer address
authorSusant Sahani <susant@redhat.com>
Mon, 7 Jul 2014 09:28:56 +0000 (14:58 +0530)
committerTom Gundersen <teg@jklm.no>
Mon, 7 Jul 2014 11:32:14 +0000 (13:32 +0200)
This patch adds peer address support for
networkd . In the  [Address]  a new configurable
param is Peer.

[Match]
Name=ipip-tun

[Address]
Address=10.0.0.1/32
Peer=10.0.0.2/32

src/network/networkd-address.c
src/network/networkd-network-gperf.gperf
src/network/networkd.h

index 1ba2108..8c4ef99 100644 (file)
@@ -345,13 +345,25 @@ int address_configure(Address *address, Link *link,
                 return r;
         }
 
-        if (address->family == AF_INET) {
-                r = sd_rtnl_message_append_in_addr(req, IFA_BROADCAST, &address->broadcast);
+        if (!in_addr_null(address->family, &address->in_addr_peer)) {
+                if (address->family == AF_INET)
+                        r = sd_rtnl_message_append_in_addr(req, IFA_ADDRESS, &address->in_addr_peer.in);
+                else if (address->family == AF_INET6)
+                        r = sd_rtnl_message_append_in6_addr(req, IFA_ADDRESS, &address->in_addr_peer.in6);
                 if (r < 0) {
-                        log_error("Could not append IFA_BROADCAST attribute: %s",
+                        log_error("Could not append IFA_ADDRESS attribute: %s",
                                   strerror(-r));
                         return r;
                 }
+        } else {
+                if (address->family == AF_INET) {
+                        r = sd_rtnl_message_append_in_addr(req, IFA_BROADCAST, &address->broadcast);
+                        if (r < 0) {
+                                log_error("Could not append IFA_BROADCAST attribute: %s",
+                                          strerror(-r));
+                                return r;
+                        }
+                }
         }
 
         if (address->label) {
@@ -488,6 +500,7 @@ int config_parse_address(const char *unit,
         Network *network = userdata;
         _cleanup_address_free_ Address *n = NULL;
         _cleanup_free_ char *address = NULL;
+        union in_addr_union *addr;
         const char *e;
         int r;
 
@@ -507,6 +520,11 @@ int config_parse_address(const char *unit,
         if (r < 0)
                 return r;
 
+        if (streq(lvalue, "Address"))
+                addr = &n->in_addr;
+        else
+                addr = &n->in_addr_peer;
+
         /* Address=address/prefixlen */
 
         /* prefixlen */
@@ -532,7 +550,7 @@ int config_parse_address(const char *unit,
                         return log_oom();
         }
 
-        r = net_parse_inaddr(address, &n->family, &n->in_addr);
+        r = net_parse_inaddr(address, &n->family, addr);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, EINVAL,
                            "Address is invalid, ignoring assignment: %s", address);
index ce9047c..c821ead 100644 (file)
@@ -39,6 +39,7 @@ Network.DNS,                 config_parse_dns,                   0,
 Network.NTP,                 config_parse_dns,                   0,                             offsetof(Network, ntp)
 Network.Tunnel,              config_parse_tunnel,                0,                             offsetof(Network, tunnel)
 Address.Address,             config_parse_address,               0,                             0
+Address.Peer,                config_parse_address,               0,                             0
 Address.Broadcast,           config_parse_broadcast,             0,                             0
 Address.Label,               config_parse_label,                 0,                             0
 Route.Gateway,               config_parse_gateway,               0,                             0
index 6a00175..5df52c9 100644 (file)
@@ -211,6 +211,7 @@ struct Address {
         struct ifa_cacheinfo cinfo;
 
         union in_addr_union in_addr;
+        union in_addr_union in_addr_peer;
 
         LIST_FIELDS(Address, addresses);
 };