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 assert(link
->network
);
64 r
= sd_lldp_tx_set_multicast_mode(link
->lldp_tx
, link
->network
->lldp_multicast_mode
);
68 r
= sd_lldp_tx_set_capabilities(link
->lldp_tx
,
69 SD_LLDP_SYSTEM_CAPABILITIES_STATION
|
70 SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE
|
71 SD_LLDP_SYSTEM_CAPABILITIES_ROUTER
,
72 (link
->network
->ip_forward
!= ADDRESS_FAMILY_NO
) ?
73 SD_LLDP_SYSTEM_CAPABILITIES_ROUTER
:
74 SD_LLDP_SYSTEM_CAPABILITIES_STATION
);
78 r
= sd_lldp_tx_set_port_description(link
->lldp_tx
, link
->network
->description
);
82 r
= sd_lldp_tx_set_mud_url(link
->lldp_tx
, link
->network
->lldp_mudurl
);
89 static const char * const lldp_multicast_mode_table
[_SD_LLDP_MULTICAST_MODE_MAX
] = {
90 [SD_LLDP_MULTICAST_MODE_NEAREST_BRIDGE
] = "nearest-bridge",
91 [SD_LLDP_MULTICAST_MODE_NON_TPMR_BRIDGE
] = "non-tpmr-bridge",
92 [SD_LLDP_MULTICAST_MODE_CUSTOMER_BRIDGE
] = "customer-bridge",
95 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(lldp_multicast_mode
, sd_lldp_multicast_mode_t
);
97 int config_parse_lldp_multicast_mode(
102 unsigned section_line
,
109 sd_lldp_multicast_mode_t m
, *mode
= ASSERT_PTR(data
);
117 if (isempty(rvalue
)) {
118 *mode
= _SD_LLDP_MULTICAST_MODE_INVALID
;
122 r
= parse_boolean(rvalue
);
124 *mode
= r
== 0 ? _SD_LLDP_MULTICAST_MODE_INVALID
: SD_LLDP_MULTICAST_MODE_NEAREST_BRIDGE
;
128 m
= lldp_multicast_mode_from_string(rvalue
);
130 log_syntax(unit
, LOG_WARNING
, filename
, line
, m
,
131 "Failed to parse %s=, ignoring assignment: %s", lvalue
, rvalue
);