{
struct lldpd_hardware *hardware;
TAILQ_FOREACH(hardware, &cfg->g_hardware, h_entries) {
- if ((strcmp(hardware->h_ifname, name) == 0) &&
- (hardware->h_ifindex == index))
- break;
+ if (strcmp(hardware->h_ifname, name) == 0) {
+ if (hardware->h_flags == 0) {
+ hardware->h_ifindex = index;
+ break;
+ }
+ if (hardware->h_ifindex == index)
+ break;
+ }
}
return hardware;
}
int ret = 0;
len1 = lldpd_port_serialize_configuration(dflt, 0, &out1);
len2 = lldpd_port_serialize_configuration(port, 0, &out2);
- if (len1 == -1 || len2 == -1 || len1 != len2) goto end;
- if (memcmp(out1, out2, len1)) goto end;
+ if (len1 == -1 || len2 == -1) goto end;
+ if (len1 == len2 && !memcmp(out1, out2, len1)) goto end;
ret = 1;
end:
free(out1);
log_debug("localchassis", "do not delete %s, modified",
hardware->h_ifname);
} else {
+ log_debug("localchassis", "delete %s, unmodified",
+ hardware->h_ifname);
TRACE(LLDPD_INTERFACES_DELETE(hardware->h_ifname));
TAILQ_REMOVE(&cfg->g_hardware, hardware, h_entries);
lldpd_remote_cleanup(hardware, notify_clients_deletion, 1);
lldpd_hardware_cleanup(cfg, hardware);
}
} else {
+ log_debug("localchassis", "keep %s, still exists",
+ hardware->h_ifname);
lldpd_remote_cleanup(hardware, notify_clients_deletion,
!(hardware->h_flags & IFF_RUNNING));
}
@pytest.mark.skipif('Dot3' not in pytest.config.lldpd.features,
reason="Dot3 not supported")
-def test_port_keep_configuration(lldpd1, lldpd, lldpcli, namespaces, links):
- links(namespaces(1), namespaces(2))
- with namespaces(2):
+def test_port_keep_configuration_when_down(lldpd, lldpcli, namespaces, links):
+ with namespaces(1):
+ links.dummy('eth3')
lldpd()
result = lldpcli(*("configure ports eth3 dot3 power "
"pse supported enabled paircontrol powerpairs "
time.sleep(3)
links.down('eth3')
time.sleep(4)
+ # eth3 configuration is kept because the port still exists.
+ out = lldpcli("-f", "keyvalue", "show", "interfaces", "details")
+ assert out['lldp.eth3.port.power.device-type'] == 'PSE'
+
links.up('eth3')
time.sleep(4)
+ # eth3 configuration is unchanged
out = lldpcli("-f", "keyvalue", "show", "interfaces", "details")
assert out['lldp.eth3.port.power.device-type'] == 'PSE'
+
+
+@pytest.mark.skipif('Dot3' not in pytest.config.lldpd.features,
+ reason="Dot3 not supported")
+def test_port_keep_configuration_when_modified(lldpd, lldpcli,
+ namespaces, links):
with namespaces(1):
- out = lldpcli("-f", "keyvalue", "show", "neighbors", "details")
- assert out['lldp.eth2.port.descr'] == 'eth3'
- assert out['lldp.eth2.port.power.device-type'] == 'PSE'
+ links.dummy('eth3')
+ lldpd()
+ result = lldpcli(*("configure ports eth3 dot3 power "
+ "pse supported enabled paircontrol powerpairs "
+ "spare class class-3").split())
+ assert result.returncode == 0
+ time.sleep(3)
+ links.remove('eth3')
+ time.sleep(4)
+ # eth3 configuration is kept because the port was modified
+ out = lldpcli("-f", "keyvalue", "show", "interfaces", "details")
+ assert out['lldp.eth3.port.power.device-type'] == 'PSE'
+
+ links.dummy('eth3')
+ time.sleep(4)
+ # eth3 configuration is unchanged
+ out = lldpcli("-f", "keyvalue", "show", "interfaces", "details")
+ assert out['lldp.eth3.port.power.device-type'] == 'PSE'
+
+
+@pytest.mark.skipif('Dot3' not in pytest.config.lldpd.features,
+ reason="Dot3 not supported")
+def test_port_forget_configuration_when_unmodified(lldpd, lldpcli,
+ namespaces, links):
+ with namespaces(1):
+ links.dummy('eth3')
+ lldpd()
+ result = lldpcli(*("configure dot3 power "
+ "pse supported enabled paircontrol powerpairs "
+ "spare class class-3").split())
+ assert result.returncode == 0
+ time.sleep(3)
+ links.remove('eth3')
+ time.sleep(4)
+ # eth3 configuration was forgotten because it was the same as
+ # the default.
+ out = lldpcli("-f", "keyvalue", "show", "interfaces", "details")
+ assert 'lldp.eth3.port.power.device-type' not in out
def test_watch(lldpd1, lldpd, lldpcli, namespaces, links):