aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libtle_udp/tle_udp_impl.h2
-rw-r--r--lib/libtle_udp/udp_ctl.c35
2 files changed, 30 insertions, 7 deletions
diff --git a/lib/libtle_udp/tle_udp_impl.h b/lib/libtle_udp/tle_udp_impl.h
index 8e61ea6..b46e4dd 100644
--- a/lib/libtle_udp/tle_udp_impl.h
+++ b/lib/libtle_udp/tle_udp_impl.h
@@ -63,6 +63,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. */
};
#define TLE_UDP_MAX_HDR 0x60
diff --git a/lib/libtle_udp/udp_ctl.c b/lib/libtle_udp/udp_ctl.c
index 55c4afd..3ff9751 100644
--- a/lib/libtle_udp/udp_ctl.c
+++ b/lib/libtle_udp/udp_ctl.c
@@ -47,6 +47,11 @@ check_dev_prm(const struct tle_udp_dev_param *dev_prm)
sizeof(tle_udp6_any)) == 0)
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))
+ return -EINVAL;
+
return 0;
}
@@ -241,9 +246,11 @@ tle_udp_ctx_invalidate(struct tle_udp_ctx *ctx)
}
static int
-init_dev_proto(struct tle_udp_dev *dev, uint32_t idx, int32_t socket_id)
+init_dev_proto(struct tle_udp_dev *dev, uint32_t idx, int32_t socket_id,
+ uint16_t *bl_ports, uint32_t nb_bl_ports)
{
size_t sz;
+ uint32_t i;
sz = sizeof(*dev->dp[idx]);
dev->dp[idx] = rte_zmalloc_socket(NULL, sz, RTE_CACHE_LINE_SIZE,
@@ -257,6 +264,11 @@ 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]);
+
return 0;
}
@@ -281,6 +293,7 @@ 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) {
@@ -294,13 +307,23 @@ tle_udp_add_dev(struct tle_udp_ctx *ctx,
rc = 0;
/* 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);
+ 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]);
+ }
/* 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);
+ 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]);
+ }
if (rc != 0) {
/* cleanup and return an error. */
@@ -483,13 +506,11 @@ stream_fill_dev(struct tle_udp_ctx *ctx, struct tle_udp_stream *s)
return ENFILE;
/* fill socket's dst port and type */
-
sp = htons(p);
s->type = t;
s->port.dst = sp;
/* mark port as in-use */
-
udp_pbm_set(&ctx->use[t], p);
if (dev != NULL) {
udp_pbm_set(pbm, p);