From 267cf19de5077e395cc05918159a93e63e8c4a11 Mon Sep 17 00:00:00 2001 From: Konstantin Ananyev Date: Thu, 13 May 2021 17:25:12 +0000 Subject: l4p/tcp: introduce tle_tcp_stream_rx_bulk() API tle_tcp_stream_rx_bulk() allows to push input packets for futher processing straight into given TCP stream. Given stream is expected to be already in connected state. Signed-off-by: Konstantin Ananyev Change-Id: I94a744d6d9c8ff3671ebfa84b83a34a24612bde0 --- lib/libtle_l4p/tcp_rxtx.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ lib/libtle_l4p/tle_tcp.h | 34 +++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/lib/libtle_l4p/tcp_rxtx.c b/lib/libtle_l4p/tcp_rxtx.c index 0e8a39f..4f43557 100644 --- a/lib/libtle_l4p/tcp_rxtx.c +++ b/lib/libtle_l4p/tcp_rxtx.c @@ -71,6 +71,23 @@ rx_obtain_listen_stream(const struct tle_dev *dev, const union pkt_info *pi, return s; } +static inline struct tle_tcp_stream * +rx_acquire_stream(struct tle_stream *ts) +{ + struct tle_tcp_stream *s; + + s = TCP_STREAM(ts); + if (tcp_stream_acquire(s) < 0) + return NULL; + + else if (s->tcb.state == TCP_ST_CLOSED) { + tcp_stream_release(s); + return NULL; + } + + return s; +} + static inline struct tle_tcp_stream * rx_obtain_stream(const struct tle_dev *dev, struct stbl *st, const union pkt_info *pi, uint32_t type) @@ -1958,6 +1975,60 @@ tle_tcp_rx_bulk(struct tle_dev *dev, struct rte_mbuf *pkt[], return num - k; } +uint16_t +tle_tcp_stream_rx_bulk(struct tle_stream *ts, struct rte_mbuf *pkt[], + struct rte_mbuf *rp[], int32_t rc[], uint16_t num) +{ + struct tle_ctx *ctx; + struct tle_tcp_stream *s; + uint32_t i, j, k, n, t, tms; + union pkt_info pi[num]; + union seg_info si[num]; + + ctx = ts->ctx; + tms = tcp_get_tms(ctx->cycles_ms_shift); + + s = rx_acquire_stream(ts); + if (s == NULL) { + for (i = 0; i != num; i++) { + rc[i] = ENOENT; + rp[i] = pkt[i]; + } + return 0; + } + + /* extract packet info and check the L3/L4 csums */ + for (i = 0; i != num; i++) { + get_pkt_info(pkt[i], &pi[i], &si[i]); + pi[i].csf = check_pkt_csum(pkt[i], pi[i].csf, pi[i].tf.type, + IPPROTO_TCP); + } + + k = 0; + for (i = 0; i != num; i += j) { + + t = pi[i].tf.type; + j = 1; + + /*basic checks for incoming packet */ + if (t != ts->type || pi[i].csf != 0 || + rx_check_stream(s, pi + i) != 0) { + rc[k] = EINVAL; + rp[k] = pkt[i]; + k++; + continue; + } + + j = pkt_info_bulk_eq(pi + i, num - i); + n = rx_stream(s, tms, pi + i, si + i, pkt + i, + rp + k, rc + k, j); + k += j - n; + } + + tcp_stream_release(s); + return num - k; +} + uint16_t tle_tcp_stream_accept(struct tle_stream *ts, struct tle_stream *rs[], uint32_t num) diff --git a/lib/libtle_l4p/tle_tcp.h b/lib/libtle_l4p/tle_tcp.h index 3155dfa..9947041 100644 --- a/lib/libtle_l4p/tle_tcp.h +++ b/lib/libtle_l4p/tle_tcp.h @@ -414,6 +414,40 @@ ssize_t tle_tcp_stream_writev(struct tle_stream *ts, struct rte_mempool *mp, uint16_t tle_tcp_rx_bulk(struct tle_dev *dev, struct rte_mbuf *pkt[], struct rte_mbuf *rp[], int32_t rc[], uint16_t num); + +/** + * Take input mbufs and put them for processing to given TCP streams. + * expects that for each input packet: + * - l2_len, l3_len, l4_len are setup correctly + * - (packet_type & (RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L3_IPV6)) != 0, + * - (packet_type & RTE_PTYPE_L4_TCP) != 0, + * During delivery L3/L4 checksums will be verified + * (either relies on HW offload or in SW). + * May cause some extra packets to be queued for TX. + * This function is not multi-thread safe. + * @param ts + * TCP stream given packets belong to. + * Note that it is caller repsonsibility to make sure that input packets + * belong to given stream. + * @param pkt + * The burst of input packets that need to be processed. + * @param rp + * The array that will contain pointers of unprocessed packets at return. + * Should contain at least *num* elements. + * @param rc + * The array that will contain error code for corresponding rp[] entry: + * - ENOENT - invalid stream. + * - ENOBUFS - receive buffer of the destination stream is full. + * - EINVAL - invalid input packet encountered. + * Should contain at least *num* elements. + * @param num + * Number of elements in the *pkt* input array. + * @return + * number of packets delivered to the TCP stream. + */ +uint16_t tle_tcp_stream_rx_bulk(struct tle_stream *ts, struct rte_mbuf *pkt[], + struct rte_mbuf *rp[], int32_t rc[], uint16_t num); + /** * Fill *pkt* with pointers to the packets that have to be transmitted * over given TCP device. -- cgit 1.2.3-korg