From: Vincent Bernat Date: Sat, 27 Jul 2019 15:28:01 +0000 (+0200) Subject: interfaces: compute interface index for fixed management address X-Git-Tag: 1.0.5~56 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Flldpd.git;a=commitdiff_plain;h=b7b7dc349aa42de0840b770298dd2e7c404fd819 interfaces: compute interface index for fixed management address When management address is provided without a pattern, fetch the appropriate interface index if the interface is known. Thanks to @kefins for the actual patch. Fix #338. --- diff --git a/src/daemon/interfaces.c b/src/daemon/interfaces.c index 3c6c255d..e6fcc551 100644 --- a/src/daemon/interfaces.c +++ b/src/daemon/interfaces.c @@ -477,6 +477,9 @@ interfaces_helper_mgmt(struct lldpd *cfg, if (pattern && strpbrk(pattern, "!,*?") == NULL) { struct in6_addr addr; size_t addr_size; + struct lldpd_mgmt *mgmt; + struct interfaces_address *ifaddr; + for (af = LLDPD_AF_UNSPEC + 1; af != LLDPD_AF_LAST; af++) { switch (af) { @@ -490,17 +493,35 @@ interfaces_helper_mgmt(struct lldpd *cfg, if (af == LLDPD_AF_LAST) { log_debug("interfaces", "interface management pattern is an incorrect IP"); - } else { - struct lldpd_mgmt *mgmt; - mgmt = lldpd_alloc_mgmt(af, &addr, addr_size, 0); - if (mgmt == NULL) { - log_warn("interfaces", "out of memory error"); - return; + return; + } + + /* Try to get the index if possible. */ + TAILQ_FOREACH(ifaddr, addrs, next) { + if (ifaddr->address.ss_family != lldpd_af(af)) + continue; + if (LLDPD_AF_IPV4 == af) { + struct sockaddr_in *sa_sin; + sa_sin = (struct sockaddr_in *)&ifaddr->address; + if ((sa_sin->sin_addr.s_addr) == ((struct in_addr *)&addr)->s_addr) + break; } - log_debug("interfaces", "add exact management address %s", - pattern); - TAILQ_INSERT_TAIL(&LOCAL_CHASSIS(cfg)->c_mgmt, mgmt, m_entries); + else if (LLDPD_AF_IPV6 == af) { + if (0 == memcmp(&addr, + &((struct sockaddr_in6 *)&ifaddr->address)->sin6_addr, + addr_size)) + break; + } + } + + mgmt = lldpd_alloc_mgmt(af, &addr, addr_size, ifaddr ? ifaddr->index : 0); + if (mgmt == NULL) { + log_warn("interfaces", "out of memory error"); + return; } + log_debug("interfaces", "add exact management address %s", + pattern); + TAILQ_INSERT_TAIL(&LOCAL_CHASSIS(cfg)->c_mgmt, mgmt, m_entries); return; } diff --git a/tests/integration/test_basic.py b/tests/integration/test_basic.py index 6d79020c..f2cea6ba 100644 --- a/tests/integration/test_basic.py +++ b/tests/integration/test_basic.py @@ -146,7 +146,7 @@ def test_listen_only(lldpd1, lldpd, lldpcli, namespaces): assert out == {} -def test_forced_management_address(lldpd1, lldpd, lldpcli, namespaces): +def test_forced_unknown_management_address(lldpd1, lldpd, lldpcli, namespaces): with namespaces(2): lldpd("-m", "2001:db8::47") with namespaces(1): @@ -155,6 +155,18 @@ def test_forced_management_address(lldpd1, lldpd, lldpcli, namespaces): assert out["lldp.eth0.chassis.mgmt-iface"] == "0" +def test_forced_known_management_address(lldpd1, lldpd, lldpcli, namespaces): + with namespaces(2): + ipr = pyroute2.IPRoute() + idx = ipr.link_lookup(ifname="eth1")[0] + ipr.addr('add', index=idx, address="192.168.14.2", mask=24) + lldpd("-m", "192.168.14.2") + with namespaces(1): + out = lldpcli("-f", "keyvalue", "show", "neighbors") + assert out["lldp.eth0.chassis.mgmt-ip"] == "192.168.14.2" + assert out["lldp.eth0.chassis.mgmt-iface"] == "2" + + def test_management_address(lldpd1, lldpd, lldpcli, links, namespaces): with namespaces(2): ipr = pyroute2.IPRoute()