From ee773b24a248313557aef10520ddf25d2c50c02e Mon Sep 17 00:00:00 2001 From: Amritha Nambiar Date: Tue, 13 Oct 2015 22:08:46 -0700 Subject: [PATCH] isisd: Drop packet received on multiple interfaces due to the time gap in binding socket to an interface Due to the time window between opening socket and binding it to an interface, the same hello packet is delivered on multiple interfaces, unique socket per circuit is not yet established. When such hellos get processed, they form incorrect adjacencies. So, drop the packet that is received on multiple interfaces because the socket for the circuit is yet to bind to an interface. V2: Fix warning on sign comparison Signed-off-by: Amritha Nambiar --- isisd/isis_pfpacket.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/isisd/isis_pfpacket.c b/isisd/isis_pfpacket.c index d91d988858..1bc5f763cd 100644 --- a/isisd/isis_pfpacket.c +++ b/isisd/isis_pfpacket.c @@ -230,12 +230,24 @@ isis_recv_pdu_bcast (struct isis_circuit *circuit, u_char * ssnpa) LLC_LEN, MSG_PEEK, (struct sockaddr *) &s_addr, (socklen_t *) &addr_len); - if (bytesread < 0) + if ((bytesread < 0) || (s_addr.sll_ifindex != (int)circuit->interface->ifindex)) { - zlog_warn ("isis_recv_packet_bcast(): ifname %s, fd %d, bytesread %d, " - "recvfrom(): %s", - circuit->interface->name, circuit->fd, bytesread, - safe_strerror (errno)); + if (bytesread < 0) + { + zlog_warn ("isis_recv_packet_bcast(): ifname %s, fd %d, " + "bytesread %d, recvfrom(): %s", + circuit->interface->name, circuit->fd, bytesread, + safe_strerror (errno)); + } + if (s_addr.sll_ifindex != (int)circuit->interface->ifindex) + { + zlog_warn("packet is received on multiple interfaces: " + "socket interface %d, circuit interface %d, " + "packet type %u", + s_addr.sll_ifindex, circuit->interface->ifindex, + s_addr.sll_pkttype); + } + /* get rid of the packet */ bytesread = recvfrom (circuit->fd, discard_buff, sizeof (discard_buff), MSG_DONTWAIT, (struct sockaddr *) &s_addr, -- 2.39.5