diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 360c57cb763..ea278c70d7c 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -257,6 +257,13 @@ announcement. Defaults to true. + + LLDP= + + A boolean. When true, enables LLDP link receive support. + + + Address= diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 341ae88ec10..725e22b93f6 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_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) diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 05c34eef197..6bb59d2190e 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 fb0a2091036..5094b488f39 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -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) diff --git a/src/network/networkd.h b/src/network/networkd.h index a5c5b085bad..7107c5f9321 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" @@ -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);