devices: add cli support to disable qdisc bypass
[vpp.git] / src / vnet / devices / af_packet / af_packet.c
index c941d37..a8ab944 100644 (file)
@@ -191,7 +191,8 @@ af_packet_set_tx_queues (vlib_main_t *vm, af_packet_if_t *apif)
 static int
 create_packet_v3_sock (int host_if_index, tpacket_req3_t *rx_req,
                       tpacket_req3_t *tx_req, int *fd, af_packet_ring_t *ring,
-                      u8 *is_cksum_gso_enabled, u32 fanout_id, u8 is_fanout)
+                      u8 *is_cksum_gso_enabled, u32 fanout_id, u8 is_fanout,
+                      af_packet_if_flags_t *flags)
 {
   af_packet_main_t *apm = &af_packet_main;
   struct sockaddr_ll sll;
@@ -261,15 +262,18 @@ create_packet_v3_sock (int host_if_index, tpacket_req3_t *rx_req,
     *is_cksum_gso_enabled = 1;
 
 #if defined(PACKET_QDISC_BYPASS)
-  /* Introduced with Linux 3.14 so the ifdef should eventually be removed  */
-  if (setsockopt (*fd, SOL_PACKET, PACKET_QDISC_BYPASS, &opt, sizeof (opt)) <
-      0)
-    {
-      vlib_log_debug (apm->log_class,
-                     "Failed to set qdisc bypass error "
-                     "handling option: %s (errno %d)",
-                     strerror (errno), errno);
-    }
+  if (*flags & AF_PACKET_IF_FLAGS_QDISC_BYPASS)
+    /* Introduced with Linux 3.14 so the ifdef should eventually be removed  */
+    if (setsockopt (*fd, SOL_PACKET, PACKET_QDISC_BYPASS, &opt, sizeof (opt)) <
+       0)
+      {
+       // remove the flag
+       *flags &= ~AF_PACKET_IF_FLAGS_QDISC_BYPASS;
+       vlib_log_debug (apm->log_class,
+                       "Failed to set qdisc bypass error "
+                       "handling option: %s (errno %d)",
+                       strerror (errno), errno);
+      }
 #endif
 
   if (is_fanout)
@@ -389,7 +393,7 @@ af_packet_queue_init (vlib_main_t *vm, af_packet_if_t *apif,
     {
       ret = create_packet_v3_sock (apif->host_if_index, rx_req, tx_req, &fd,
                                   &ring, &is_cksum_gso_enabled,
-                                  apif->dev_instance, is_fanout);
+                                  apif->dev_instance, is_fanout, &arg->flags);
 
       if (ret != 0)
        goto error;
@@ -641,6 +645,9 @@ af_packet_create_if (af_packet_create_if_arg_t *arg)
   af_packet_set_rx_queues (vm, apif);
   af_packet_set_tx_queues (vm, apif);
 
+  apif->is_qdisc_bypass_enabled =
+    (arg->flags & AF_PACKET_IF_FLAGS_QDISC_BYPASS);
+
   if (apif->is_cksum_gso_enabled)
     caps |= VNET_HW_IF_CAP_TCP_GSO | VNET_HW_IF_CAP_TX_IP4_CKSUM |
            VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM;