add list of blocked ports for IPv6 57/2857/1
authorMohammad Abdul Awal <mohammad.abdul.awal@intel.com>
Fri, 9 Sep 2016 13:35:00 +0000 (14:35 +0100)
committerMohammad Abdul Awal <mohammad.abdul.awal@intel.com>
Tue, 13 Sep 2016 15:15:00 +0000 (16:15 +0100)
Change-Id: Iefc866e71e887fe23ff9473b23577b6e576f18b1
Signed-off-by: Mohammad Abdul Awal <mohammad.abdul.awal@intel.com>
examples/udpfwd/main.c
lib/libtle_udp/tle_udp_impl.h
lib/libtle_udp/udp_ctl.c

index 96150b0..f8a6f1b 100644 (file)
@@ -751,7 +751,7 @@ create_context(struct netbe_lcore *lc, const struct tle_udp_ctx_param *ctx_prm)
  */
 static int
 lcore_init(struct netbe_lcore *lc, const struct tle_udp_ctx_param *ctx_prm,
-       const uint32_t prtqid, uint16_t *bl_ports, uint32_t nb_bl_ports)
+       const uint32_t prtqid, const uint16_t *bl_ports, uint32_t nb_bl_ports)
 {
        int32_t rc = 0;
        struct tle_udp_dev_param dprm;
@@ -765,8 +765,10 @@ lcore_init(struct netbe_lcore *lc, const struct tle_udp_ctx_param *ctx_prm,
                dprm.local_addr4.s_addr = lc->prtq[prtqid].port.ipv4;
                memcpy(&dprm.local_addr6,  &lc->prtq[prtqid].port.ipv6,
                        sizeof(lc->prtq[prtqid].port.ipv6));
-               dprm.nb_bl_ports = nb_bl_ports;
-               dprm.bl_ports = bl_ports;
+               dprm.bl4.nb_port = nb_bl_ports;
+               dprm.bl4.port = bl_ports;
+               dprm.bl6.nb_port = nb_bl_ports;
+               dprm.bl6.port = bl_ports;
 
                lc->prtq[prtqid].dev = tle_udp_add_dev(lc->ctx, &dprm);
 
@@ -814,13 +816,12 @@ netbe_lcore_init(struct netbe_cfg *cfg,
        const struct tle_udp_ctx_param *ctx_prm)
 {
        int32_t rc;
-       uint32_t i, j, nb_bl_ports, sz;
+       uint32_t i, j, nb_bl_ports = 0, sz;
        struct netbe_lcore *lc;
        static uint16_t *bl_ports;
 
        /* Create the udp context and attached queue for each lcore. */
        rc = 0;
-       nb_bl_ports = 0;
        sz = sizeof(uint16_t) * UINT16_MAX;
        bl_ports = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE);
        for (i = 0; i < cfg->cpu_num; i++) {
@@ -830,7 +831,8 @@ netbe_lcore_init(struct netbe_cfg *cfg,
                        /* create list of blocked ports based on q */
                        nb_bl_ports = create_blocklist(&lc->prtq[j].port,
                                bl_ports, lc->prtq[j].rxqid);
-                       RTE_LOG(NOTICE, USER1, "lc=%u, q=%u, nb_bl_ports4=%u\n",
+                       RTE_LOG(NOTICE, USER1,
+                               "lc=%u, q=%u, nb_bl_ports=%u\n",
                                lc->id, lc->prtq[j].rxqid, nb_bl_ports);
 
                        rc = lcore_init(lc, ctx_prm, j, bl_ports, nb_bl_ports);
index b46e4dd..a0af7ce 100644 (file)
@@ -55,6 +55,14 @@ extern "C" {
 struct tle_udp_ctx;
 struct tle_udp_dev;
 
+/**
+ * Blocked UDP ports info.
+ */
+struct tle_bl_port {
+       uint32_t nb_port; /**< number of blocked ports. */
+       const uint16_t *port; /**< list of blocked ports. */
+};
+
 /**
  * UDP device parameters.
  */
@@ -63,8 +71,8 @@ struct tle_udp_dev_param {
        uint32_t tx_offload; /**< DEV_TX_OFFLOAD_* supported. */
        struct in_addr local_addr4;  /**< local IPv4 address assigned. */
        struct in6_addr local_addr6; /**< local IPv6 address assigned. */
-       uint32_t nb_bl_ports; /**< number of blocked ports. */
-       uint16_t *bl_ports; /**< list of blocked ports. */
+       struct tle_bl_port bl4; /**< blocked ports for IPv4 address. */
+       struct tle_bl_port bl6; /**< blocked ports for IPv4 address. */
 };
 
 #define TLE_UDP_MAX_HDR        0x60
index 3ff9751..618a7ef 100644 (file)
@@ -48,8 +48,12 @@ check_dev_prm(const struct tle_udp_dev_param *dev_prm)
                return -EINVAL;
 
        /* all the ports are blocked. */
-       if (dev_prm->nb_bl_ports > UINT16_MAX ||
-               (dev_prm->nb_bl_ports != 0 && dev_prm->bl_ports == NULL))
+       if (dev_prm->bl4.nb_port > UINT16_MAX ||
+               (dev_prm->bl4.nb_port != 0 && dev_prm->bl4.port == NULL))
+               return -EINVAL;
+
+       if (dev_prm->bl6.nb_port > UINT16_MAX ||
+               (dev_prm->bl6.nb_port != 0 && dev_prm->bl6.port == NULL))
                return -EINVAL;
 
        return 0;
@@ -245,12 +249,20 @@ tle_udp_ctx_invalidate(struct tle_udp_ctx *ctx)
        RTE_SET_USED(ctx);
 }
 
+static void
+fill_pbm(struct udp_pbm *pbm, const struct tle_bl_port *blp)
+{
+       uint32_t i;
+
+       for (i = 0; i != blp->nb_port; i++)
+               udp_pbm_set(pbm, blp->port[i]);
+}
+
 static int
 init_dev_proto(struct tle_udp_dev *dev, uint32_t idx, int32_t socket_id,
-               uint16_t *bl_ports, uint32_t nb_bl_ports)
+       const struct tle_bl_port *blp)
 {
        size_t sz;
-       uint32_t i;
 
        sz = sizeof(*dev->dp[idx]);
        dev->dp[idx] = rte_zmalloc_socket(NULL, sz, RTE_CACHE_LINE_SIZE,
@@ -264,10 +276,7 @@ init_dev_proto(struct tle_udp_dev *dev, uint32_t idx, int32_t socket_id,
        }
 
        udp_pbm_init(&dev->dp[idx]->use, LPORT_START_BLK);
-
-       if (bl_ports != NULL)
-               for (i = 0; i < nb_bl_ports; i++)
-                       udp_pbm_set(&dev->dp[idx]->use, bl_ports[i]);
+       fill_pbm(&dev->dp[idx]->use, blp);
 
        return 0;
 }
@@ -293,7 +302,6 @@ tle_udp_add_dev(struct tle_udp_ctx *ctx,
        const struct tle_udp_dev_param *dev_prm)
 {
        int32_t rc;
-       uint32_t i;
        struct tle_udp_dev *dev;
 
        if (ctx == NULL || dev_prm == NULL || check_dev_prm(dev_prm) != 0) {
@@ -309,20 +317,18 @@ tle_udp_add_dev(struct tle_udp_ctx *ctx,
        /* device can handle IPv4 traffic */
        if (dev_prm->local_addr4.s_addr != INADDR_ANY) {
                rc = init_dev_proto(dev, TLE_UDP_V4, ctx->prm.socket_id,
-                               dev_prm->bl_ports, dev_prm->nb_bl_ports);
-               for (i = 0; i < dev_prm->nb_bl_ports; i++)
-                       udp_pbm_set(&ctx->use[TLE_UDP_V4],
-                               dev_prm->bl_ports[i]);
+                               &dev_prm->bl4);
+               if (rc == 0)
+                       fill_pbm(&ctx->use[TLE_UDP_V4], &dev_prm->bl4);
        }
 
        /* device can handle IPv6 traffic */
        if (rc == 0 && memcmp(&dev_prm->local_addr6, &tle_udp6_any,
                        sizeof(tle_udp6_any)) != 0) {
                rc = init_dev_proto(dev, TLE_UDP_V6, ctx->prm.socket_id,
-                               dev_prm->bl_ports, dev_prm->nb_bl_ports);
-               for (i = 0; i < dev_prm->nb_bl_ports; i++)
-                       udp_pbm_set(&ctx->use[TLE_UDP_V6],
-                               dev_prm->bl_ports[i]);
+                               &dev_prm->bl6);
+               if (rc == 0)
+                       fill_pbm(&ctx->use[TLE_UDP_V6], &dev_prm->bl6);
        }
 
        if (rc != 0) {