X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-lldp-rx.c;h=f74485488eb91c4bee95c5f322137c1fc0c46e73;hb=HEAD;hp=65a8a314d602adf6412fdf74bc7b5d9492a8f52e;hpb=85585b767d3c06d473a04b5eeb4e02fdcd061db2;p=thirdparty%2Fsystemd.git diff --git a/src/network/networkd-lldp-rx.c b/src/network/networkd-lldp-rx.c index 65a8a314d60..f74485488eb 100644 --- a/src/network/networkd-lldp-rx.c +++ b/src/network/networkd-lldp-rx.c @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include @@ -6,6 +6,7 @@ #include "fd-util.h" #include "fileio.h" +#include "fs-util.h" #include "networkd-link.h" #include "networkd-lldp-rx.h" #include "networkd-lldp-tx.h" @@ -40,27 +41,24 @@ static bool link_lldp_rx_enabled(Link *link) { /* LLDP should be handled on bridge and bond slaves as those have a direct connection to their peers, * not on the bridge/bond master. Linux doesn't even (by default) forward lldp packets to the bridge - * master.*/ + * master. */ if (link->kind && STR_IN_SET(link->kind, "bridge", "bond")) return false; return link->network->lldp_mode != LLDP_MODE_NO; } -static void lldp_handler(sd_lldp *lldp, sd_lldp_event event, sd_lldp_neighbor *n, void *userdata) { - Link *link = userdata; +static void lldp_rx_handler(sd_lldp_rx *lldp_rx, sd_lldp_rx_event_t event, sd_lldp_neighbor *n, void *userdata) { + Link *link = ASSERT_PTR(userdata); int r; - assert(link); - - (void) link_lldp_save(link); - - if (link_lldp_emit_enabled(link) && event == SD_LLDP_EVENT_ADDED) { + if (link->lldp_tx && event == SD_LLDP_RX_EVENT_ADDED) { /* If we received information about a new neighbor, restart the LLDP "fast" logic */ log_link_debug(link, "Received LLDP datagram from previously unknown neighbor, restarting 'fast' LLDP transmission."); - r = link_lldp_emit_start(link); + (void) sd_lldp_tx_stop(link->lldp_tx); + r = sd_lldp_tx_start(link->lldp_tx); if (r < 0) log_link_warning_errno(link, r, "Failed to restart LLDP transmission: %m"); } @@ -72,134 +70,35 @@ int link_lldp_rx_configure(Link *link) { if (!link_lldp_rx_enabled(link)) return 0; - if (!link->lldp) { - r = sd_lldp_new(&link->lldp); - if (r < 0) - return r; - - r = sd_lldp_attach_event(link->lldp, link->manager->event, 0); - if (r < 0) - return r; - } + if (link->lldp_rx) + return -EBUSY; - r = sd_lldp_set_ifindex(link->lldp, link->ifindex); + r = sd_lldp_rx_new(&link->lldp_rx); if (r < 0) return r; - r = sd_lldp_match_capabilities(link->lldp, - link->network->lldp_mode == LLDP_MODE_ROUTERS_ONLY ? - SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS : - SD_LLDP_SYSTEM_CAPABILITIES_ALL); + r = sd_lldp_rx_attach_event(link->lldp_rx, link->manager->event, 0); if (r < 0) return r; - r = sd_lldp_set_filter_address(link->lldp, &link->mac); + r = sd_lldp_rx_set_ifindex(link->lldp_rx, link->ifindex); if (r < 0) return r; - r = sd_lldp_set_callback(link->lldp, lldp_handler, link); + r = sd_lldp_rx_match_capabilities(link->lldp_rx, + link->network->lldp_mode == LLDP_MODE_ROUTERS_ONLY ? + SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS : + SD_LLDP_SYSTEM_CAPABILITIES_ALL); if (r < 0) return r; - r = link_update_lldp(link); + r = sd_lldp_rx_set_filter_address(link->lldp_rx, &link->hw_addr.ether); if (r < 0) return r; - return 0; -} - -int link_update_lldp(Link *link) { - int r; - - assert(link); - - if (!link->lldp) - return 0; - - if (link->flags & IFF_UP) { - r = sd_lldp_start(link->lldp); - if (r < 0) - return log_link_warning_errno(link, r, "Failed to start LLDP: %m"); - if (r > 0) - log_link_debug(link, "Started LLDP."); - } else { - r = sd_lldp_stop(link->lldp); - if (r < 0) - return log_link_warning_errno(link, r, "Failed to stop LLDP: %m"); - if (r > 0) - log_link_debug(link, "Stopped LLDP."); - } - - return r; -} - -int link_lldp_save(Link *link) { - _cleanup_free_ char *temp_path = NULL; - _cleanup_fclose_ FILE *f = NULL; - sd_lldp_neighbor **l = NULL; - int n = 0, r, i; - - assert(link); - assert(link->lldp_file); - - if (!link->lldp) { - (void) unlink(link->lldp_file); - return 0; - } - - r = sd_lldp_get_neighbors(link->lldp, &l); - if (r < 0) - goto finish; - if (r == 0) { - (void) unlink(link->lldp_file); - goto finish; - } - - n = r; - - r = fopen_temporary(link->lldp_file, &f, &temp_path); - if (r < 0) - goto finish; - - fchmod(fileno(f), 0644); - - for (i = 0; i < n; i++) { - const void *p; - le64_t u; - size_t sz; - - r = sd_lldp_neighbor_get_raw(l[i], &p, &sz); - if (r < 0) - goto finish; - - u = htole64(sz); - (void) fwrite(&u, 1, sizeof(u), f); - (void) fwrite(p, 1, sz, f); - } - - r = fflush_and_check(f); + r = sd_lldp_rx_set_callback(link->lldp_rx, lldp_rx_handler, link); if (r < 0) - goto finish; - - if (rename(temp_path, link->lldp_file) < 0) { - r = -errno; - goto finish; - } - -finish: - if (r < 0) { - (void) unlink(link->lldp_file); - if (temp_path) - (void) unlink(temp_path); - - log_link_error_errno(link, r, "Failed to save LLDP data to %s: %m", link->lldp_file); - } - - if (l) { - for (i = 0; i < n; i++) - sd_lldp_neighbor_unref(l[i]); - free(l); - } + return r; - return r; + return 0; }