rdma: prevent loopback of broadcast packets 31/22531/2
authorBenoît Ganne <bganne@cisco.com>
Fri, 4 Oct 2019 13:28:12 +0000 (15:28 +0200)
committerDave Barach <openvpp@barachs.net>
Sun, 6 Oct 2019 12:50:39 +0000 (12:50 +0000)
TX queues must be created before RX queues on Mellanox cards in order to
not receive our own broadcast packets.

Type: fix

Change-Id: I32ae25a47d819f715feda621a5ecddcf4efd71ba
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/plugins/rdma/device.c

index d68bfaa..32b7ea5 100644 (file)
@@ -534,16 +534,21 @@ rdma_dev_init (vlib_main_t * vm, rdma_device_t * rd, u32 rxq_size,
 
   ethernet_mac_address_generate (rd->hwaddr.bytes);
 
+  /*
+   * /!\ WARNING /!\ creation order is important
+   * We *must* create TX queues *before* RX queues, otherwise we will receive
+   * the broacast packets we sent
+   */
+  for (i = 0; i < tm->n_vlib_mains; i++)
+    if ((err = rdma_txq_init (vm, rd, i, txq_size)))
+      return err;
+
   for (i = 0; i < rxq_num; i++)
     if ((err = rdma_rxq_init (vm, rd, i, rxq_size)))
       return err;
   if ((err = rdma_rxq_finalize (vm, rd)))
     return err;
 
-  for (i = 0; i < tm->n_vlib_mains; i++)
-    if ((err = rdma_txq_init (vm, rd, i, txq_size)))
-      return err;
-
   if ((rd->mr = ibv_reg_mr (rd->pd, (void *) bm->buffer_mem_start,
                            bm->buffer_mem_size,
                            IBV_ACCESS_LOCAL_WRITE)) == 0)