2 * Copyright (c) 2016-2017 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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #ifndef _TCP_STREAM_H_
17 #define _TCP_STREAM_H_
20 #include <tle_dring.h>
21 #include <tle_memtank.h>
23 #include <tle_event.h>
52 TCP_OP_ESTABLISH = 0x8,
57 volatile uint16_t state;
58 volatile uint16_t uop; /* operations by user performed */
61 uint32_t irs; /* initial received sequence */
68 uint32_t srtt; /* smoothed round trip time (scaled by >> 3) */
69 uint32_t rttvar; /* rtt variance */
77 uint64_t rcvr; /* recover RFC 6582 */
78 uint64_t fss; /* FIN sequence # */
79 uint32_t fastack; /* # of partial acks in fast retransmit */
81 union wui wu; /* window update */
82 uint32_t ack; /* last sent ack */
84 uint32_t cwnd; /* congestion window */
85 uint32_t ssthresh; /* slow start threshold */
86 uint32_t rto; /* retransmission timeout */
87 uint32_t rto_tw; /* TIME_WAIT retransmission timeout */
88 uint32_t iss; /* initial send sequence */
91 uint8_t nb_retx; /* number of retransmission */
92 uint8_t nb_retm; /**< max number of retx attempts. */
94 struct tle_tcp_syn_opts so; /* initial syn options. */
97 struct tle_tcp_stream {
104 struct stbl_entry *ste; /* entry in streams table. */
112 struct tle_event *ev;
113 struct tle_stream_cb cb;
117 struct rte_ring *q; /* listen (syn) queue */
119 struct tle_event *ev; /* user provided recv event. */
120 struct tle_stream_cb cb; /* user provided recv callback. */
121 } rx __rte_cache_aligned;
124 rte_atomic32_t arm; /* when > 0 stream is in to-send queue */
126 uint32_t nb_elem; /* number of objects per drb. */
127 uint32_t nb_max; /* number of drbs per stream. */
130 struct rte_ring *q; /* (re)tx queue */
131 struct tle_event *ev;
132 struct tle_stream_cb cb;
134 } tx __rte_cache_aligned;
136 } __rte_cache_aligned;
138 #define TCP_STREAM(p) \
139 ((struct tle_tcp_stream *)((uintptr_t)(p) - offsetof(struct tle_tcp_stream, s)))
141 #define TCP_STREAM_TX_PENDING(s) \
142 ((s)->tx.drb.nb_max != rte_ring_count((s)->tx.drb.r))
144 #define TCP_STREAM_TX_FINISHED(s) \
145 ((s)->tx.drb.nb_max == rte_ring_count((s)->tx.drb.r))
147 #include "stream_table.h"
151 STAILQ_HEAD(, tle_stream) fe;
152 STAILQ_HEAD(, tle_stream) be;
155 /* tempalte sizes/offsets/etc. for tcp stream */
156 struct stream_szofs {
179 struct tle_timer_wheel *tmr; /* timer wheel */
180 struct rte_ring *tsq; /* to-send streams queue */
181 struct tle_memtank *mts; /* memtank to allocate streams from */
182 struct sdr dr; /* death row for zombie streams */
183 struct stream_szofs szofs; /* size and offsets for stream data */
186 #define CTX_TCP_STREAMS(ctx) ((struct tcp_streams *)(ctx)->streams.buf)
187 #define CTX_TCP_STLB(ctx) (&CTX_TCP_STREAMS(ctx)->st)
188 #define CTX_TCP_TMWHL(ctx) (CTX_TCP_STREAMS(ctx)->tmr)
189 #define CTX_TCP_TSQ(ctx) (CTX_TCP_STREAMS(ctx)->tsq)
190 #define CTX_TCP_SDR(ctx) (&CTX_TCP_STREAMS(ctx)->dr)
191 #define CTX_TCP_MTS(ctx) (CTX_TCP_STREAMS(ctx)->mts)
193 extern int tcp_stream_fill_prm(struct tle_tcp_stream *s,
194 const struct tle_tcp_stream_param *prm);
200 #endif /* _TCP_STREAM_H_ */