diff options
Diffstat (limited to 'lib/libtle_l4p/ctx.h')
-rw-r--r-- | lib/libtle_l4p/ctx.h | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/lib/libtle_l4p/ctx.h b/lib/libtle_l4p/ctx.h index f18060b..9483976 100644 --- a/lib/libtle_l4p/ctx.h +++ b/lib/libtle_l4p/ctx.h @@ -21,7 +21,7 @@ #include <tle_dring.h> #include <tle_ctx.h> -#include "port_bitmap.h" +#include "port_statmap.h" #include "osdep.h" #include "net_misc.h" @@ -29,11 +29,6 @@ extern "C" { #endif -struct tle_dport { - struct tle_pbm use; /* ports in use. */ - struct tle_stream *streams[MAX_PORT_NUM]; /* port to stream. */ -}; - struct tle_dev { struct tle_ctx *ctx; struct { @@ -45,7 +40,6 @@ struct tle_dev { struct tle_dring dr; } tx; struct tle_dev_param prm; /* copy of device parameters. */ - struct tle_dport *dp[TLE_VNUM]; /* device L4 ports */ }; struct tle_ctx { @@ -54,18 +48,23 @@ struct tle_ctx { struct { rte_spinlock_t lock; uint32_t nb_free; /* number of free streams. */ + uint32_t nb_cur; /* number of allocated streams. */ STAILQ_HEAD(, tle_stream) free; void *buf; /* space allocated for streams */ } streams; - rte_spinlock_t dev_lock; + rte_spinlock_t bhash_lock[TLE_VNUM]; + struct rte_hash *bhash[TLE_VNUM]; /* bind and listen hash table */ + uint32_t nb_dev; - struct tle_pbm use[TLE_VNUM]; /* all ports in use. */ + rte_spinlock_t dev_lock; + struct tle_psm use[TLE_VNUM]; /* all ports in use. */ struct tle_dev dev[RTE_MAX_ETHPORTS]; }; struct stream_ops { int (*init_streams)(struct tle_ctx *); + uint32_t (*more_streams)(struct tle_ctx *); void (*fini_streams)(struct tle_ctx *); void (*free_drbs)(struct tle_stream *, struct tle_drb *[], uint32_t); }; @@ -77,6 +76,27 @@ int stream_fill_ctx(struct tle_ctx *ctx, struct tle_stream *s, int stream_clear_ctx(struct tle_ctx *ctx, struct tle_stream *s); +static inline void +fill_ipv4_am(const struct sockaddr_in *in, uint32_t *addr, uint32_t *mask) +{ + *addr = in->sin_addr.s_addr; + *mask = (*addr == INADDR_ANY) ? INADDR_ANY : INADDR_NONE; +} + +static inline void +fill_ipv6_am(const struct sockaddr_in6 *in, rte_xmm_t *addr, rte_xmm_t *mask) +{ + const struct in6_addr *pm; + + memcpy(addr, &in->sin6_addr, sizeof(*addr)); + if (IN6_IS_ADDR_UNSPECIFIED(addr)) + pm = &tle_ipv6_any; + else + pm = &tle_ipv6_none; + + memcpy(mask, pm, sizeof(*mask)); +} + #ifdef __cplusplus } #endif |