aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libtle_l4p/tcp_ctl.h
diff options
context:
space:
mode:
authorKonstantin Ananyev <konstantin.ananyev@intel.com>2017-02-21 18:12:20 +0000
committerKonstantin Ananyev <konstantin.ananyev@intel.com>2017-02-24 16:37:08 +0000
commitaa97dd1ce910b839fed46ad55d1e70e403f5a930 (patch)
treef6f0fd494eaf499859bff9f20f5ddfac9ab99233 /lib/libtle_l4p/tcp_ctl.h
parentf5f10013ffef8e4ac1071087b8492fe6380d98fe (diff)
Introduce first version of TCP code.
Supported functionality: - open/close - listen/accept/connect - send/recv In order to achieve that libtle_udp library was reworked into libtle_l4p library that supports both TCP and UDP protocols. New libtle_timer library was introduced (thanks to Cisco guys and Dave Barach <dbarach@cisco.com> for sharing their timer code with us). Sample application was also reworked significantly to support both TCP and UDP traffic handling. New UT were introduced. Change-Id: I806b05011f521e89b58db403cfdd484a37beb775 Signed-off-by: Mohammad Abdul Awal <mohammad.abdul.awal@intel.com> Signed-off-by: Karol Latecki <karolx.latecki@intel.com> Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com> Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Diffstat (limited to 'lib/libtle_l4p/tcp_ctl.h')
-rw-r--r--lib/libtle_l4p/tcp_ctl.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/lib/libtle_l4p/tcp_ctl.h b/lib/libtle_l4p/tcp_ctl.h
new file mode 100644
index 0000000..dcb9c3e
--- /dev/null
+++ b/lib/libtle_l4p/tcp_ctl.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2016 Intel Corporation.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Some helper stream control functions definitions.
+ */
+
+#ifndef _TCP_CTL_H_
+#define _TCP_CTL_H_
+
+#include "tcp_stream.h"
+#include "tcp_ofo.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static inline void
+tcp_stream_down(struct tle_tcp_stream *s)
+{
+ rwl_down(&s->rx.use);
+ rwl_down(&s->tx.use);
+}
+
+static inline void
+tcp_stream_up(struct tle_tcp_stream *s)
+{
+ rwl_up(&s->rx.use);
+ rwl_up(&s->tx.use);
+}
+
+/* empty stream's receive queue */
+static void
+empty_rq(struct tle_tcp_stream *s)
+{
+ empty_mbuf_ring(s->rx.q);
+ tcp_ofo_reset(s->rx.ofo);
+}
+
+/* empty stream's listen queue */
+static void
+empty_lq(struct tle_tcp_stream *s, struct stbl *st)
+{
+ uint32_t i, n;
+ struct rte_mbuf *mb;
+ union pkt_info pi;
+ union seg_info si;
+ struct stbl_entry *se[MAX_PKT_BURST];
+
+ do {
+ n = rte_ring_dequeue_burst(s->rx.q, (void **)se, RTE_DIM(se));
+ for (i = 0; i != n; i++) {
+ mb = stbl_get_pkt(se[i]);
+ get_pkt_info(mb, &pi, &si);
+ stbl_del_pkt_lock(st, se[i], &pi);
+ rte_pktmbuf_free(mb);
+ }
+ } while (n != 0);
+}
+
+static inline void
+tcp_stream_reset(struct tle_ctx *ctx, struct tle_tcp_stream *s)
+{
+ struct stbl *st;
+ uint16_t uop;
+
+ st = CTX_TCP_STLB(ctx);
+
+ /* reset TX armed */
+ rte_atomic32_set(&s->tx.arm, 0);
+
+ /* reset TCB */
+ uop = s->tcb.uop & (TCP_OP_LISTEN | TCP_OP_CONNECT);
+ memset(&s->tcb, 0, sizeof(s->tcb));
+
+ /* reset cached destination */
+ memset(&s->tx.dst, 0, sizeof(s->tx.dst));
+
+ if (uop != 0) {
+ /* free stream's destination port */
+ stream_clear_ctx(ctx, &s->s);
+ if (uop == TCP_OP_LISTEN)
+ empty_lq(s, st);
+ }
+
+ if (s->ste != NULL) {
+ /* remove entry from RX streams table */
+ stbl_del_stream_lock(st, s->ste, s);
+ s->ste = NULL;
+ empty_rq(s);
+ }
+
+ /* empty TX queue */
+ empty_mbuf_ring(s->tx.q);
+
+ /*
+ * mark the stream as free again.
+ * if there still are pkts queued for TX,
+ * then put this stream to the tail of free list.
+ */
+ put_stream(ctx, &s->s, TCP_STREAM_TX_FINISHED(s));
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TCP_CTL_H_ */