]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: integrate LLDP
authorSusant Sahani <susant@redhat.com>
Sun, 23 Nov 2014 04:26:14 +0000 (09:56 +0530)
committerSusant Sahani <susant@redhat.com>
Fri, 19 Dec 2014 02:32:45 +0000 (08:02 +0530)
This patch integrates LLDP with networkd.

Example conf:
file : lldp.network

[Match]
Name=em1

[Network]
LLDP=yes

man/systemd.network.xml
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-network-gperf.gperf
src/network/networkd.h

index 360c57cb7631a558afc60b3835b82423373695dd..ea278c70d7c2d13475edee67674fe8155a712647 100644 (file)
                                                 announcement. Defaults to true.</para>
                                         </listitem>
                                 </varlistentry>
+                                <varlistentry>
+                                        <term><varname>LLDP=</varname></term>
+                                        <listitem>
+                                                <para>A boolean. When true, enables LLDP link receive support.
+                                                </para>
+                                        </listitem>
+                                </varlistentry>
                                 <varlistentry>
                                         <term><varname>Address=</varname></term>
                                         <listitem>
index 341ae88ec101569a848205666157d736455988ec..725e22b93f69bda768e7c28fe6e164cafe55b6c7 100644 (file)
@@ -75,6 +75,19 @@ static bool link_ipv4ll_enabled(Link *link) {
         return link->network->ipv4ll;
 }
 
+static bool link_lldp_enabled(Link *link) {
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        if(link->network->bridge)
+                return false;
+
+        return link->network->lldp;
+}
+
 #define FLAG_STRING(string, flag, old, new) \
         (((old ^ new) & flag) \
                 ? ((old & flag) ? (" -" string) : (" +" string)) \
@@ -364,6 +377,16 @@ static int link_stop_clients(Link *link) {
                 }
         }
 
+        if (link->lldp) {
+
+                k = sd_lldp_stop(link->lldp);
+                if (k < 0) {
+                        log_link_warning(link, "Could not stop LLDP : %s",
+                                         strerror(-r));
+                        r = k;
+                }
+        }
+
         return r;
 }
 
@@ -919,6 +942,18 @@ static int link_acquire_conf(Link *link) {
                 }
         }
 
+        if (link_lldp_enabled(link)) {
+                assert(link->lldp);
+
+                log_link_debug(link, "Starting LLDP");
+
+                r = sd_lldp_start(link->lldp);
+                if (r < 0) {
+                        log_link_warning(link, "could not start LLDP ");
+                        return r;
+                }
+        }
+
         return 0;
 }
 
@@ -1194,6 +1229,16 @@ static int link_configure(Link *link) {
                         return r;
         }
 
+        if (link_lldp_enabled(link)) {
+                r = sd_lldp_new(link->ifindex, link->ifname, &link->mac, &link->lldp);
+                if (r < 0)
+                        return r;
+
+                r = sd_lldp_attach_event(link->lldp, NULL, 0);
+                if (r < 0)
+                        return r;
+        }
+
         if (link_has_carrier(link)) {
                 r = link_acquire_conf(link);
                 if (r < 0)
index 05c34eef197124ea6a9ae41d473027c1c9f0b9d4..6bb59d2190efd9f1ad1a9aef0518681bc1b4321f 100644 (file)
@@ -91,6 +91,8 @@ struct Link {
 
         sd_icmp6_nd *icmp6_router_discovery;
         sd_dhcp6_client *dhcp6_client;
+
+        sd_lldp *lldp;
 };
 
 Link *link_unref(Link *link);
index fb0a2091036aa619c83f82b9cfa183ccad60cbe6..5094b488f3971d2c1f1c3c29153fefdf1d5c019b 100644 (file)
@@ -37,6 +37,7 @@ Network.DHCP,                config_parse_dhcp,                  0,
 Network.DHCPServer,          config_parse_bool,                  0,                             offsetof(Network, dhcp_server)
 Network.IPv4LL,              config_parse_bool,                  0,                             offsetof(Network, ipv4ll)
 Network.IPv4LLRoute,         config_parse_bool,                  0,                             offsetof(Network, ipv4ll_route)
+Network.LLDP,                config_parse_bool,                  0,                             offsetof(Network, lldp)
 Network.Address,             config_parse_address,               0,                             0
 Network.Gateway,             config_parse_gateway,               0,                             0
 Network.Domains,             config_parse_domains,               0,                             offsetof(Network, domains)
index a5c5b085bad58b0891f22438e790b7170e6ec40b..7107c5f9321dd47b5a897ff6268b43c9bfc5e97c 100644 (file)
@@ -32,6 +32,7 @@
 #include "sd-icmp6-nd.h"
 #include "sd-dhcp6-client.h"
 #include "udev.h"
+#include "sd-lldp.h"
 
 #include "rtnl-util.h"
 #include "hashmap.h"
@@ -122,6 +123,8 @@ struct Network {
         struct ether_addr *mac;
         unsigned mtu;
 
+        bool lldp;
+
         LIST_HEAD(Address, static_addresses);
         LIST_HEAD(Route, static_routes);
         LIST_HEAD(FdbEntry, static_fdb_entries);