l4p/tcp: introduce tle_tcp_stream_rx_bulk() API 10/32310/1
authorKonstantin Ananyev <konstantin.ananyev@intel.com>
Thu, 13 May 2021 17:25:12 +0000 (17:25 +0000)
committerKonstantin Ananyev <konstantin.ananyev@intel.com>
Thu, 13 May 2021 17:32:55 +0000 (17:32 +0000)
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 <konstantin.ananyev@intel.com>
Change-Id: I94a744d6d9c8ff3671ebfa84b83a34a24612bde0

lib/libtle_l4p/tcp_rxtx.c
lib/libtle_l4p/tle_tcp.h

index 0e8a39f..4f43557 100644 (file)
@@ -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)
index 3155dfa..9947041 100644 (file)
@@ -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.