+lldpd (1.0.7)
+ * Fix:
+ + Do not listen only to LLDP packets on Linux. When an interface
+ is enslaved to an Open vSwitch, incoming packets are missed.
+
lldpd (1.0.6)
* Fix:
+ Do not loose chassis local information when interface status changes.
log_debug("interfaces", "initialize ethernet device %s",
hardware->h_ifname);
- if ((fd = priv_iface_init(hardware->h_ifindex, hardware->h_ifname, 0)) == -1)
+ if ((fd = priv_iface_init(hardware->h_ifindex, hardware->h_ifname)) == -1)
return -1;
/* Allocate receive buffer */
#define MAX_PORTS 1024
#define MAX_BRIDGES 1024
-static int
-only_lldp(struct lldpd *cfg)
-{
- int lldp_enabled = 0;
- int other_enabled = 0;
- size_t i;
- for (i=0; cfg->g_protocols[i].mode != 0; i++) {
- if (cfg->g_protocols[i].mode == LLDPD_MODE_LLDP)
- lldp_enabled = cfg->g_protocols[i].enabled;
- else other_enabled = other_enabled || cfg->g_protocols[i].enabled;
- }
- return lldp_enabled && !other_enabled;
-
-}
-
static int
iflinux_eth_init(struct lldpd *cfg, struct lldpd_hardware *hardware)
{
log_debug("interfaces", "initialize ethernet device %s",
hardware->h_ifname);
- if ((fd = priv_iface_init(hardware->h_ifindex, hardware->h_ifname,
- only_lldp(cfg)?ETH_P_LLDP:ETH_P_ALL)) == -1)
+ if ((fd = priv_iface_init(hardware->h_ifindex, hardware->h_ifname)) == -1)
return -1;
hardware->h_sendfd = fd; /* Send */
struct bond_master *master = hardware->h_data;
int fd;
int un = 1;
- int proto;
if (!master) return -1;
hardware->h_ifname);
/* First, we get a socket to the raw physical interface */
- proto = only_lldp(cfg)?ETH_P_LLDP:ETH_P_ALL;
if ((fd = priv_iface_init(hardware->h_ifindex,
- hardware->h_ifname, proto)) == -1)
+ hardware->h_ifname)) == -1)
return -1;
hardware->h_sendfd = fd;
interfaces_setup_multicast(cfg, hardware->h_ifname, 0);
/* Then, we open a raw interface for the master */
log_debug("interfaces", "enslaved device %s has master %s(%d)",
hardware->h_ifname, master->name, master->index);
- if ((fd = priv_iface_init(master->index, master->name, proto)) == -1) {
+ if ((fd = priv_iface_init(master->index, master->name)) == -1) {
close(hardware->h_sendfd);
return -1;
}
int priv_open(char*);
void asroot_open(void);
#endif
-int priv_iface_init(int, char *, int);
-int asroot_iface_init_os(int, char *, int *, int);
+int priv_iface_init(int, char *);
+int asroot_iface_init_os(int, char *, int *);
int priv_iface_multicast(const char *, const u_int8_t *, int);
int priv_iface_description(const char *, const char *);
int asroot_iface_description_os(const char *, const char *);
#include <string.h>
int
-asroot_iface_init_os(int ifindex, char *name, int *fd, int proto)
+asroot_iface_init_os(int ifindex, char *name, int *fd)
{
int enable, required, rc;
struct bpf_insn filter[] = { LLDPD_FILTER_F };
}
int
-asroot_iface_init_os(int ifindex, char *name, int *fd, int proto)
+asroot_iface_init_os(int ifindex, char *name, int *fd)
{
int rc;
/* Open listening socket to receive/send frames */
if ((*fd = socket(PF_PACKET, SOCK_RAW,
- htons(proto))) < 0) {
+ htons(ETH_P_ALL))) < 0) {
rc = errno;
return rc;
}
int
-priv_iface_init(int index, char *iface, int proto)
+priv_iface_init(int index, char *iface)
{
int rc;
char dev[IFNAMSIZ] = {};
must_write(PRIV_UNPRIVILEGED, &index, sizeof(int));
strlcpy(dev, iface, IFNAMSIZ);
must_write(PRIV_UNPRIVILEGED, dev, IFNAMSIZ);
- must_write(PRIV_UNPRIVILEGED, &proto, sizeof(int));
priv_wait();
must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int));
if (rc != 0) return -1;
{
int rc = -1, fd = -1;
int ifindex;
- int proto;
char name[IFNAMSIZ];
must_read(PRIV_PRIVILEGED, &ifindex, sizeof(ifindex));
must_read(PRIV_PRIVILEGED, &name, sizeof(name));
name[sizeof(name) - 1] = '\0';
- must_read(PRIV_PRIVILEGED, &proto, sizeof(proto));
TRACE(LLDPD_PRIV_INTERFACE_INIT(name));
- rc = asroot_iface_init_os(ifindex, name, &fd, proto);
+ rc = asroot_iface_init_os(ifindex, name, &fd);
must_write(PRIV_PRIVILEGED, &rc, sizeof(rc));
if (rc == 0 && fd >=0) send_fd(PRIV_PRIVILEGED, fd);
if (fd >= 0) close(fd);