[systemd-devel] [PATCH 2/2] networkd: integrate LLDP
Susant Sahani
susant at redhat.com
Sat Nov 22 20:45:10 PST 2014
This patch integrates LLDP with networkd.
Example conf:
file : lldp.network
[Match]
Name=em1
[Network]
LLDP=yes
---
man/systemd.network.xml | 7 +++++
src/network/networkd-link.c | 45 ++++++++++++++++++++++++++++++++
src/network/networkd-link.h | 2 ++
src/network/networkd-network-gperf.gperf | 1 +
src/network/networkd.h | 3 +++
5 files changed, 58 insertions(+)
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 4cc13b2..143c9ee 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -234,6 +234,13 @@
</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>
<para>A static IPv4 or IPv6 address and its prefix length,
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index fcfbd3e..f9e4ee9 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -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_warning_link(link, "Could not stop LLDP : %s",
+ strerror(-r));
+ r = k;
+ }
+ }
+
return r;
}
@@ -973,6 +996,18 @@ static int link_acquire_conf(Link *link) {
}
}
+ if (link_lldp_enabled(link)) {
+ assert(link->lldp);
+
+ log_debug_link(link, "Starting LLDP");
+
+ r = sd_lldp_start(link->lldp);
+ if (r < 0) {
+ log_warning_link(link, "could not start LLDP ");
+ return r;
+ }
+ }
+
return 0;
}
@@ -1248,6 +1283,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)
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
index 7acf404..b7ed1fb 100644
--- a/src/network/networkd-link.h
+++ b/src/network/networkd-link.h
@@ -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);
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index a736461..8cc3399 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -35,6 +35,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)
diff --git a/src/network/networkd.h b/src/network/networkd.h
index 19a661e..0bb501e 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -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"
@@ -106,6 +107,8 @@ struct Network {
bool dhcp_server;
+ bool lldp;
+
LIST_HEAD(Address, static_addresses);
LIST_HEAD(Route, static_routes);
--
2.1.0
More information about the systemd-devel
mailing list