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>
34 volatile uint16_t state;
35 volatile uint16_t uop; /* operations by user performed */
38 uint32_t irs; /* initial received sequence */
45 uint32_t srtt; /* smoothed round trip time (scaled by >> 3) */
46 uint32_t rttvar; /* rtt variance */
54 uint64_t rcvr; /* recover RFC 6582 */
55 uint64_t fss; /* FIN sequence # */
56 uint32_t fastack; /* # of partial acks in fast retransmit */
58 union wui wu; /* window update */
59 uint32_t ack; /* last sent ack */
61 uint32_t cwnd; /* congestion window */
62 uint32_t ssthresh; /* slow start threshold */
63 uint32_t rto; /* retransmission timeout */
64 uint32_t rto_tw; /* TIME_WAIT retransmission timeout */
65 uint32_t iss; /* initial send sequence */
68 uint8_t nb_retx; /* number of retransmission */
69 uint8_t nb_retm; /**< max number of retx attempts. */
70 uint8_t close_flags; /* tcp flags to send on close */
72 struct tle_tcp_syn_opts so; /* initial syn options. */
75 struct tle_tcp_stream {
82 struct stbl_entry *ste; /* entry in streams table. */
85 int32_t ts_offset; /* TS.VAL offset from TSC calculated */
93 struct tle_stream_cb cb;
94 /*bitmask of remote events */
99 struct rte_ring *q; /* listen (syn) queue */
101 struct tle_event *ev; /* user provided recv event. */
102 struct tle_stream_cb cb; /* user provided recv callback. */
103 } rx __rte_cache_aligned;
106 rte_atomic32_t arm; /* when > 0 stream is in to-send queue */
108 uint32_t nb_elem; /* number of objects per drb. */
109 uint32_t nb_max; /* number of drbs per stream. */
112 struct rte_ring *q; /* (re)tx queue */
113 struct tle_event *ev;
114 struct tle_stream_cb cb;
116 } tx __rte_cache_aligned;
118 } __rte_cache_aligned;
120 #define TCP_STREAM(p) \
121 ((struct tle_tcp_stream *)((uintptr_t)(p) - offsetof(struct tle_tcp_stream, s)))
123 #define TCP_STREAM_TX_PENDING(s) \
124 ((s)->tx.drb.nb_max != rte_ring_count((s)->tx.drb.r))
126 #define TCP_STREAM_TX_FINISHED(s) \
127 ((s)->tx.drb.nb_max == rte_ring_count((s)->tx.drb.r))
129 #include "stream_table.h"
133 STAILQ_HEAD(, tle_stream) fe;
134 STAILQ_HEAD(, tle_stream) be;
137 /* tempalte sizes/offsets/etc. for tcp stream */
138 struct stream_szofs {
161 struct tle_timer_wheel *tmr; /* timer wheel */
162 struct rte_ring *tsq; /* to-send streams queue */
163 struct tle_memtank *mts; /* memtank to allocate streams from */
164 struct sdr dr; /* death row for zombie streams */
165 struct stream_szofs szofs; /* size and offsets for stream data */
168 #define CTX_TCP_STREAMS(ctx) ((struct tcp_streams *)(ctx)->streams.buf)
169 #define CTX_TCP_STLB(ctx) (&CTX_TCP_STREAMS(ctx)->st)
170 #define CTX_TCP_TMWHL(ctx) (CTX_TCP_STREAMS(ctx)->tmr)
171 #define CTX_TCP_TSQ(ctx) (CTX_TCP_STREAMS(ctx)->tsq)
172 #define CTX_TCP_SDR(ctx) (&CTX_TCP_STREAMS(ctx)->dr)
173 #define CTX_TCP_MTS(ctx) (CTX_TCP_STREAMS(ctx)->mts)
175 extern int tcp_stream_fill_prm(struct tle_tcp_stream *s,
176 const struct tle_tcp_stream_param *prm);
182 #endif /* _TCP_STREAM_H_ */