1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
4 #include <net/if_arp.h>
6 #include "sd-lldp-tx.h"
8 #include "networkd-link.h"
9 #include "networkd-lldp-tx.h"
10 #include "networkd-manager.h"
11 #include "parse-util.h"
12 #include "string-table.h"
13 #include "string-util.h"
16 static bool link_lldp_tx_enabled(Link
*link
) {
19 if (link
->flags
& IFF_LOOPBACK
)
22 if (link
->iftype
!= ARPHRD_ETHER
)
28 if (link
->kind
&& STR_IN_SET(link
->kind
, "bridge", "bond"))
31 return link
->network
->lldp_multicast_mode
>= 0 &&
32 link
->network
->lldp_multicast_mode
< _SD_LLDP_MULTICAST_MODE_MAX
;
35 int link_lldp_tx_configure(Link
*link
) {
40 if (!link_lldp_tx_enabled(link
))
46 r
= sd_lldp_tx_new(&link
->lldp_tx
);
50 r
= sd_lldp_tx_attach_event(link
->lldp_tx
, link
->manager
->event
, 0);
54 r
= sd_lldp_tx_set_ifindex(link
->lldp_tx
, link
->ifindex
);
58 r
= sd_lldp_tx_set_hwaddr(link
->lldp_tx
, &link
->hw_addr
.ether
);
62 r
= sd_lldp_tx_set_multicast_mode(link
->lldp_tx
, link
->network
->lldp_multicast_mode
);
66 r
= sd_lldp_tx_set_capabilities(link
->lldp_tx
,
67 SD_LLDP_SYSTEM_CAPABILITIES_STATION
|
68 SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE
|
69 SD_LLDP_SYSTEM_CAPABILITIES_ROUTER
,
70 (link
->network
&& link
->network
->ip_forward
!= ADDRESS_FAMILY_NO
) ?
71 SD_LLDP_SYSTEM_CAPABILITIES_ROUTER
:
72 SD_LLDP_SYSTEM_CAPABILITIES_STATION
);
76 r
= sd_lldp_tx_set_port_description(link
->lldp_tx
, link
->network
->description
);
80 r
= sd_lldp_tx_set_mud_url(link
->lldp_tx
, link
->network
->lldp_mudurl
);
87 static const char * const lldp_multicast_mode_table
[_SD_LLDP_MULTICAST_MODE_MAX
] = {
88 [SD_LLDP_MULTICAST_MODE_NEAREST_BRIDGE
] = "nearest-bridge",
89 [SD_LLDP_MULTICAST_MODE_NON_TPMR_BRIDGE
] = "non-tpmr-bridge",
90 [SD_LLDP_MULTICAST_MODE_CUSTOMER_BRIDGE
] = "customer-bridge",
93 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(lldp_multicast_mode
, sd_lldp_multicast_mode_t
);
95 int config_parse_lldp_multicast_mode(
100 unsigned section_line
,
107 sd_lldp_multicast_mode_t m
, *mode
= data
;
116 if (isempty(rvalue
)) {
117 *mode
= _SD_LLDP_MULTICAST_MODE_INVALID
;
121 r
= parse_boolean(rvalue
);
123 *mode
= r
== 0 ? _SD_LLDP_MULTICAST_MODE_INVALID
: SD_LLDP_MULTICAST_MODE_NEAREST_BRIDGE
;
127 m
= lldp_multicast_mode_from_string(rvalue
);
129 log_syntax(unit
, LOG_WARNING
, filename
, line
, m
,
130 "Failed to parse %s=, ignoring assignment: %s", lvalue
, rvalue
);