At AF_PACKET socket create, do intf bind before rx ring cfg to avoid receiving pkts... 20/11120/2
authorChaoyu Jin <chjin@cisco.com>
Tue, 13 Mar 2018 14:37:41 +0000 (07:37 -0700)
committerDamjan Marion <dmarion.lists@gmail.com>
Wed, 14 Mar 2018 07:49:39 +0000 (07:49 +0000)
Change-Id: Ie40ee9129edaac717e716b469f4d10f3c29a4932
Signed-off-by: Chaoyu Jin <chjin@cisco.com>
src/vnet/devices/af_packet/af_packet.c

index 2a13510..e286ae9 100644 (file)
@@ -144,6 +144,18 @@ create_packet_v2_sock (int host_if_index, tpacket_req_t * rx_req,
       goto error;
     }
 
+  /* bind before rx ring is cfged so we don't receive packets from other interfaces */
+  memset (&sll, 0, sizeof (sll));
+  sll.sll_family = PF_PACKET;
+  sll.sll_protocol = htons (ETH_P_ALL);
+  sll.sll_ifindex = host_if_index;
+  if ((err = bind (*fd, (struct sockaddr *) &sll, sizeof (sll))) < 0)
+    {
+      DBG_SOCK ("Failed to bind rx packet socket (error %d)", err);
+      ret = VNET_API_ERROR_SYSCALL_ERROR_1;
+      goto error;
+    }
+
   if ((err =
        setsockopt (*fd, SOL_PACKET, PACKET_VERSION, &ver, sizeof (ver))) < 0)
     {
@@ -187,18 +199,6 @@ create_packet_v2_sock (int host_if_index, tpacket_req_t * rx_req,
       goto error;
     }
 
-  memset (&sll, 0, sizeof (sll));
-  sll.sll_family = PF_PACKET;
-  sll.sll_protocol = htons (ETH_P_ALL);
-  sll.sll_ifindex = host_if_index;
-
-  if ((err = bind (*fd, (struct sockaddr *) &sll, sizeof (sll))) < 0)
-    {
-      DBG_SOCK ("Failed to bind rx packet socket (error %d)", err);
-      ret = VNET_API_ERROR_SYSCALL_ERROR_1;
-      goto error;
-    }
-
   return 0;
 error:
   if (*fd >= 0)