interfaces_helper_mgmt_for_af(struct lldpd *cfg,
int af,
struct interfaces_address_list *addrs,
+ struct interfaces_device_list *interfaces,
int global, int allnegative)
{
struct interfaces_address *addr;
+ struct interfaces_device *device;
struct lldpd_mgmt *mgmt;
char addrstrbuf[INET6_ADDRSTRLEN];
int found = 0;
continue;
}
if (cfg->g_config.c_mgmt_pattern == NULL ||
- pattern_match(addrstrbuf, cfg->g_config.c_mgmt_pattern, allnegative)) {
+ /* Match on IP address */
+ pattern_match(addrstrbuf, cfg->g_config.c_mgmt_pattern, allnegative) ||
+ /* Match on interface name */
+ ((device = interfaces_indextointerface(interfaces, addr->index)) &&
+ pattern_match(device->name, cfg->g_config.c_mgmt_pattern, allnegative))) {
mgmt = lldpd_alloc_mgmt(af, &in_addr, in_addr_size,
addr->index);
if (mgmt == NULL) {
to the local chassis). */
void
interfaces_helper_mgmt(struct lldpd *cfg,
- struct interfaces_address_list *addrs)
+ struct interfaces_address_list *addrs,
+ struct interfaces_device_list *interfaces)
{
int allnegative = 0;
int af;
if (inet_pton(lldpd_af(af), pattern, &addr) == 1)
break;
}
- if (af == LLDPD_AF_LAST) {
- log_debug("interfaces",
- "interface management pattern is an incorrect IP");
- 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;
- }
- else if (LLDPD_AF_IPV6 == af) {
- if (0 == memcmp(&addr,
- &((struct sockaddr_in6 *)&ifaddr->address)->sin6_addr,
- addr_size))
- break;
+ if (af != LLDPD_AF_LAST) {
+ /* 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;
+ }
+ 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");
+ 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;
}
- log_debug("interfaces", "add exact management address %s",
- pattern);
- TAILQ_INSERT_TAIL(&LOCAL_CHASSIS(cfg)->c_mgmt, mgmt, m_entries);
- return;
+ /* else: could be an interface name */
}
/* Is the pattern provided all negative? */
/* Find management addresses */
for (af = LLDPD_AF_UNSPEC + 1; af != LLDPD_AF_LAST; af++) {
- (void)(interfaces_helper_mgmt_for_af(cfg, af, addrs, 1, allnegative) ||
- interfaces_helper_mgmt_for_af(cfg, af, addrs, 0, allnegative));
+ (void)(interfaces_helper_mgmt_for_af(cfg, af, addrs, interfaces, 1, allnegative) ||
+ interfaces_helper_mgmt_for_af(cfg, af, addrs, interfaces, 0, allnegative));
}
}
assert out["lldp.eth0.chassis.mgmt-iface"] == "2"
+def test_management_interface(lldpd1, lldpd, lldpcli, links, namespaces):
+ links(namespaces(1), namespaces(2), 4)
+ 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)
+ idx = ipr.link_lookup(ifname="eth3")[0]
+ ipr.addr('add', index=idx, address="172.25.21.47", mask=24)
+ lldpd("-m", "eth3")
+ with namespaces(1):
+ out = lldpcli("-f", "keyvalue", "show", "neighbors")
+ assert out["lldp.eth0.chassis.mgmt-ip"] == ["172.25.21.47",
+ "fe80::200:ff:fe00:4"]
+ assert out["lldp.eth0.chassis.mgmt-iface"] == ["4", "4"]
+
+
def test_change_management_address(lldpd1, lldpd, lldpcli, links, namespaces):
with namespaces(2):
ipr = pyroute2.IPRoute()