tcp_stream.h revision aa97dd1c
1/*
2 * Copyright (c) 2016  Intel Corporation.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef _TCP_STREAM_H_
17#define _TCP_STREAM_H_
18
19#include <rte_vect.h>
20#include <tle_dring.h>
21#include <tle_tcp.h>
22#include <tle_event.h>
23
24#include "stream.h"
25#include "misc.h"
26#include "tcp_misc.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32enum {
33	TCP_ST_CLOSED,
34	TCP_ST_LISTEN,
35	TCP_ST_SYN_SENT,
36	TCP_ST_SYN_RCVD,
37	TCP_ST_ESTABLISHED,
38	TCP_ST_FIN_WAIT_1,
39	TCP_ST_FIN_WAIT_2,
40	TCP_ST_CLOSE_WAIT,
41	TCP_ST_CLOSING,
42	TCP_ST_LAST_ACK,
43	TCP_ST_TIME_WAIT,
44	TCP_ST_NUM
45};
46
47enum {
48	TCP_OP_LISTEN =  0x1,
49	TCP_OP_ACCEPT =  0x2,
50	TCP_OP_CONNECT = 0x4,
51	TCP_OP_CLOSE =   0x8,
52};
53
54struct tcb {
55	volatile uint16_t state;
56	volatile uint16_t uop; /* operations by user performed */
57	struct {
58		uint32_t nxt;
59		uint32_t irs; /* initial received sequence */
60		uint32_t wnd;
61		uint32_t ts;
62		struct {
63			uint32_t seq;
64			uint32_t on;
65		} frs;
66		uint32_t srtt;   /* smoothed round trip time (scaled by >> 3) */
67		uint32_t rttvar; /* rtt variance */
68		uint16_t mss;
69		uint8_t  wscale;
70		uint8_t  dupack;
71	} rcv;
72	struct {
73		uint64_t nxt;
74		uint64_t una;
75		uint64_t rcvr; /* recover RFC 6582 */
76		uint64_t fss;  /* FIN sequence # */
77		uint32_t fastack; /* # of partial acks in fast retransmit */
78		uint32_t wnd;
79		union wui wu; /* window update */
80		uint32_t ack; /* last sent ack */
81		uint32_t ts;
82		uint32_t cwnd;     /* congestion window */
83		uint32_t ssthresh; /* slow start threshold */
84		uint32_t rto;      /* retransmission timeout */
85		uint32_t iss;      /* initial send sequence */
86		uint16_t mss;
87		uint8_t  wscale;
88		uint8_t nb_retx; /* number of retransmission */
89		uint8_t nb_retm; /**< max number of retx attempts. */
90	} snd;
91	struct syn_opts so; /* initial syn options. */
92};
93
94
95struct tle_tcp_stream {
96
97	struct tle_stream s;
98
99	struct stbl_entry *ste;     /* entry in streams table. */
100	struct tcb tcb;
101
102	struct {
103		void *handle;
104	} timer;
105
106	struct {
107		struct tle_event *ev;
108		struct tle_stream_cb cb;
109	} err;
110
111	struct {
112		rte_atomic32_t use;
113		struct rte_ring *q;     /* listen (syn) queue */
114		struct ofo *ofo;
115		struct tle_event *ev;    /* user provided recv event. */
116		struct tle_stream_cb cb; /* user provided recv callback. */
117	} rx __rte_cache_aligned;
118
119	struct {
120		rte_atomic32_t use;
121		rte_atomic32_t arm;  /* when > 0 stream is in to-send queue */
122		struct {
123			uint32_t nb_elem;  /* number of objects per drb. */
124			uint32_t nb_max;   /* number of drbs per stream. */
125			struct rte_ring *r;
126		} drb;
127		struct rte_ring *q;  /* (re)tx queue */
128		struct tle_event *ev;
129		struct tle_stream_cb cb;
130		struct tle_dest dst;
131	} tx __rte_cache_aligned;
132
133} __rte_cache_aligned;
134
135#define TCP_STREAM(p)	\
136((struct tle_tcp_stream *)((uintptr_t)(p) - offsetof(struct tle_tcp_stream, s)))
137
138#define TCP_STREAM_TX_PENDING(s)	\
139	((s)->tx.drb.nb_max != rte_ring_count((s)->tx.drb.r))
140
141#define TCP_STREAM_TX_FINISHED(s)	\
142	((s)->tx.drb.nb_max == rte_ring_count((s)->tx.drb.r))
143
144#include "stream_table.h"
145
146struct sdr {
147	rte_spinlock_t lock;
148	STAILQ_HEAD(, tle_stream) fe;
149	STAILQ_HEAD(, tle_stream) be;
150};
151
152struct tcp_streams {
153	struct stbl st;
154	struct tle_timer_wheel *tmr; /* timer wheel */
155	struct rte_ring *tsq;        /* to-send streams queue */
156	struct sdr dr;               /* death row for zombie streams */
157	struct tle_tcp_stream s[];   /* array of allocated streams. */
158};
159
160#define CTX_TCP_STREAMS(ctx)	((struct tcp_streams *)(ctx)->streams.buf)
161#define CTX_TCP_STLB(ctx)	(&CTX_TCP_STREAMS(ctx)->st)
162#define CTX_TCP_TMWHL(ctx)	(CTX_TCP_STREAMS(ctx)->tmr)
163#define CTX_TCP_TSQ(ctx)	(CTX_TCP_STREAMS(ctx)->tsq)
164#define CTX_TCP_SDR(ctx)	(&CTX_TCP_STREAMS(ctx)->dr)
165
166#ifdef __cplusplus
167}
168#endif
169
170#endif /* _TCP_STREAM_H_ */
171