1316485Sdavidcs/*
2316485Sdavidcs * Copyright (c) 2017-2018 Cavium, Inc.
3316485Sdavidcs * All rights reserved.
4316485Sdavidcs *
5316485Sdavidcs *  Redistribution and use in source and binary forms, with or without
6316485Sdavidcs *  modification, are permitted provided that the following conditions
7316485Sdavidcs *  are met:
8316485Sdavidcs *
9316485Sdavidcs *  1. Redistributions of source code must retain the above copyright
10316485Sdavidcs *     notice, this list of conditions and the following disclaimer.
11316485Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12316485Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13316485Sdavidcs *     documentation and/or other materials provided with the distribution.
14316485Sdavidcs *
15316485Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16316485Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17316485Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18316485Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19316485Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20316485Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21316485Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22316485Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23316485Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24316485Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25316485Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26316485Sdavidcs *
27316485Sdavidcs * $FreeBSD: stable/10/sys/dev/qlnx/qlnxe/tcp_common.h 337519 2018-08-09 01:39:47Z davidcs $
28316485Sdavidcs *
29316485Sdavidcs */
30316485Sdavidcs
31320162Sdavidcs
32316485Sdavidcs#ifndef __TCP_COMMON__
33316485Sdavidcs#define __TCP_COMMON__
34316485Sdavidcs/********************/
35316485Sdavidcs/* TCP FW CONSTANTS */
36316485Sdavidcs/********************/
37316485Sdavidcs
38316485Sdavidcs#define TCP_INVALID_TIMEOUT_VAL -1
39316485Sdavidcs
40316485Sdavidcs
41316485Sdavidcs/*
42316485Sdavidcs * OOO opaque data received from LL2
43316485Sdavidcs */
44316485Sdavidcsstruct ooo_opaque
45316485Sdavidcs{
46316485Sdavidcs	__le32 cid /* connection ID  */;
47316485Sdavidcs	u8 drop_isle /* isle number of the first isle to drop */;
48316485Sdavidcs	u8 drop_size /* number of isles to drop */;
49316485Sdavidcs	u8 ooo_opcode /* (use enum tcp_seg_placement_event) */;
50316485Sdavidcs	u8 ooo_isle /* OOO isle number to add the packet to */;
51316485Sdavidcs};
52316485Sdavidcs
53316485Sdavidcs
54316485Sdavidcs/*
55316485Sdavidcs * tcp connect mode enum
56316485Sdavidcs */
57316485Sdavidcsenum tcp_connect_mode
58316485Sdavidcs{
59316485Sdavidcs	TCP_CONNECT_ACTIVE,
60316485Sdavidcs	TCP_CONNECT_PASSIVE,
61316485Sdavidcs	MAX_TCP_CONNECT_MODE
62316485Sdavidcs};
63316485Sdavidcs
64316485Sdavidcs
65316485Sdavidcs/*
66316485Sdavidcs * tcp function init parameters
67316485Sdavidcs */
68316485Sdavidcsstruct tcp_init_params
69316485Sdavidcs{
70316485Sdavidcs	__le32 two_msl_timer /* 2MSL (used for TIME_WAIT state) timeout value */;
71316485Sdavidcs	__le16 tx_sws_timer /* Transmission silly window syndrom timeout value */;
72337519Sdavidcs	u8 max_fin_rt /* Minimum Fin RT */;
73316485Sdavidcs	u8 reserved[9];
74316485Sdavidcs};
75316485Sdavidcs
76316485Sdavidcs
77316485Sdavidcs/*
78316485Sdavidcs * tcp IPv4/IPv6 enum
79316485Sdavidcs */
80316485Sdavidcsenum tcp_ip_version
81316485Sdavidcs{
82316485Sdavidcs	TCP_IPV4,
83316485Sdavidcs	TCP_IPV6,
84316485Sdavidcs	MAX_TCP_IP_VERSION
85316485Sdavidcs};
86316485Sdavidcs
87316485Sdavidcs
88316485Sdavidcs/*
89316485Sdavidcs * tcp offload parameters
90316485Sdavidcs */
91316485Sdavidcsstruct tcp_offload_params
92316485Sdavidcs{
93316485Sdavidcs	__le16 local_mac_addr_lo;
94316485Sdavidcs	__le16 local_mac_addr_mid;
95316485Sdavidcs	__le16 local_mac_addr_hi;
96316485Sdavidcs	__le16 remote_mac_addr_lo;
97316485Sdavidcs	__le16 remote_mac_addr_mid;
98316485Sdavidcs	__le16 remote_mac_addr_hi;
99316485Sdavidcs	__le16 vlan_id;
100337519Sdavidcs	__le16 flags;
101337519Sdavidcs#define TCP_OFFLOAD_PARAMS_TS_EN_MASK            0x1 /* timestamp enable */
102337519Sdavidcs#define TCP_OFFLOAD_PARAMS_TS_EN_SHIFT           0
103337519Sdavidcs#define TCP_OFFLOAD_PARAMS_DA_EN_MASK            0x1 /* delayed ack enabled */
104337519Sdavidcs#define TCP_OFFLOAD_PARAMS_DA_EN_SHIFT           1
105337519Sdavidcs#define TCP_OFFLOAD_PARAMS_KA_EN_MASK            0x1 /* keep alive enabled */
106337519Sdavidcs#define TCP_OFFLOAD_PARAMS_KA_EN_SHIFT           2
107337519Sdavidcs#define TCP_OFFLOAD_PARAMS_ECN_SENDER_EN_MASK    0x1 /* ECN sender enabled */
108337519Sdavidcs#define TCP_OFFLOAD_PARAMS_ECN_SENDER_EN_SHIFT   3
109337519Sdavidcs#define TCP_OFFLOAD_PARAMS_ECN_RECEIVER_EN_MASK  0x1 /* ECN receiver enabled */
110337519Sdavidcs#define TCP_OFFLOAD_PARAMS_ECN_RECEIVER_EN_SHIFT 4
111337519Sdavidcs#define TCP_OFFLOAD_PARAMS_NAGLE_EN_MASK         0x1 /* nagle algorithm enabled */
112337519Sdavidcs#define TCP_OFFLOAD_PARAMS_NAGLE_EN_SHIFT        5
113337519Sdavidcs#define TCP_OFFLOAD_PARAMS_DA_CNT_EN_MASK        0x1 /* delayed ack counter enabled */
114337519Sdavidcs#define TCP_OFFLOAD_PARAMS_DA_CNT_EN_SHIFT       6
115337519Sdavidcs#define TCP_OFFLOAD_PARAMS_FIN_SENT_MASK         0x1 /* fin already sent to far end */
116337519Sdavidcs#define TCP_OFFLOAD_PARAMS_FIN_SENT_SHIFT        7
117337519Sdavidcs#define TCP_OFFLOAD_PARAMS_FIN_RECEIVED_MASK     0x1 /* fin received */
118337519Sdavidcs#define TCP_OFFLOAD_PARAMS_FIN_RECEIVED_SHIFT    8
119337519Sdavidcs#define TCP_OFFLOAD_PARAMS_RESERVED_MASK         0x7F
120337519Sdavidcs#define TCP_OFFLOAD_PARAMS_RESERVED_SHIFT        9
121337519Sdavidcs	u8 ip_version /*  (use enum tcp_ip_version) */;
122337519Sdavidcs	u8 reserved0[3];
123316485Sdavidcs	__le32 remote_ip[4];
124316485Sdavidcs	__le32 local_ip[4];
125316485Sdavidcs	__le32 flow_label;
126316485Sdavidcs	u8 ttl;
127316485Sdavidcs	u8 tos_or_tc;
128316485Sdavidcs	__le16 remote_port;
129316485Sdavidcs	__le16 local_port;
130316485Sdavidcs	__le16 mss /* the mss derived from remote mss and local mtu, ipVersion options and tags */;
131316485Sdavidcs	u8 rcv_wnd_scale;
132337519Sdavidcs	u8 connect_mode /* TCP connect mode: use enum tcp_connect_mode (use enum tcp_connect_mode) */;
133316485Sdavidcs	__le16 srtt /* in ms */;
134337519Sdavidcs	__le32 ss_thresh;
135337519Sdavidcs	__le32 rcv_wnd /* absolute receive window (not scaled) */;
136316485Sdavidcs	__le32 cwnd /* absolute congestion window */;
137316485Sdavidcs	u8 ka_max_probe_cnt;
138316485Sdavidcs	u8 dup_ack_theshold;
139337519Sdavidcs	__le16 reserved1;
140337519Sdavidcs	__le32 ka_timeout /* This member specifies, in ms, the timeout interval for inactivity before sending a keepalive probe */;
141337519Sdavidcs	__le32 ka_interval /* This member specifies, in ms, the timeout after which to retransmit a keepalive frame if no response is received to a keepalive probe  */;
142337519Sdavidcs	__le32 max_rt_time /* This member specifies, in ms, the maximum time that the offload target should spend retransmitting a segment */;
143337519Sdavidcs	__le32 initial_rcv_wnd /* Initial receive window */;
144316485Sdavidcs	__le32 rcv_next;
145316485Sdavidcs	__le32 snd_una;
146316485Sdavidcs	__le32 snd_next;
147316485Sdavidcs	__le32 snd_max;
148316485Sdavidcs	__le32 snd_wnd /* absolute send window (not scaled) */;
149316485Sdavidcs	__le32 snd_wl1 /* the segment sequence number used for the last window update */;
150316485Sdavidcs	__le32 ts_recent /* The timestamp value to send in the next ACK */;
151316485Sdavidcs	__le32 ts_recent_age /* The length of time, in ms, since the most recent timestamp was received */;
152316485Sdavidcs	__le32 total_rt /* The total time, in ms, that has been spent retransmitting the current TCP segment */;
153316485Sdavidcs	__le32 ka_timeout_delta /* The time remaining, in clock ticks, until the next keepalive timeout. A value of -1 indicates that the keepalive timer was not running when the connection was offloaded. */;
154316485Sdavidcs	__le32 rt_timeout_delta /* The time remaining, in clock ticks, until the next retransmit timeout. A value of -1 indicates that the  retransmit timer was not running when the connection was offloaded. */;
155316485Sdavidcs	u8 dup_ack_cnt /* The number of ACKs that have been accepted for the same sequence number */;
156316485Sdavidcs	u8 snd_wnd_probe_cnt /* The current send window probe round */;
157316485Sdavidcs	u8 ka_probe_cnt /* the number of keepalive probes that have been sent that have not received a response */;
158316485Sdavidcs	u8 rt_cnt /* The number of retransmits that have been sent */;
159316485Sdavidcs	__le16 rtt_var /* in ms */;
160316485Sdavidcs	__le16 fw_internal /* fw internal use - initialize value = 0 */;
161316485Sdavidcs	u8 snd_wnd_scale;
162316485Sdavidcs	u8 ack_frequency /* delayed ack counter threshold */;
163316485Sdavidcs	__le16 da_timeout_value /* delayed ack timeout value in ms */;
164337519Sdavidcs	__le32 reserved3;
165316485Sdavidcs};
166316485Sdavidcs
167316485Sdavidcs
168316485Sdavidcs/*
169316485Sdavidcs * tcp offload parameters
170316485Sdavidcs */
171316485Sdavidcsstruct tcp_offload_params_opt2
172316485Sdavidcs{
173316485Sdavidcs	__le16 local_mac_addr_lo;
174316485Sdavidcs	__le16 local_mac_addr_mid;
175316485Sdavidcs	__le16 local_mac_addr_hi;
176316485Sdavidcs	__le16 remote_mac_addr_lo;
177316485Sdavidcs	__le16 remote_mac_addr_mid;
178316485Sdavidcs	__le16 remote_mac_addr_hi;
179316485Sdavidcs	__le16 vlan_id;
180337519Sdavidcs	__le16 flags;
181316485Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_TS_EN_MASK      0x1 /* timestamp enable */
182316485Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_TS_EN_SHIFT     0
183316485Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_DA_EN_MASK      0x1 /* delayed ack enabled */
184316485Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_DA_EN_SHIFT     1
185316485Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_KA_EN_MASK      0x1 /* keep alive enabled */
186316485Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_KA_EN_SHIFT     2
187337519Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_ECN_EN_MASK     0x1 /* ECN enabled */
188337519Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_ECN_EN_SHIFT    3
189337519Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_RESERVED0_MASK  0xFFF
190337519Sdavidcs#define TCP_OFFLOAD_PARAMS_OPT2_RESERVED0_SHIFT 4
191337519Sdavidcs	u8 ip_version /*  (use enum tcp_ip_version) */;
192337519Sdavidcs	u8 reserved1[3];
193316485Sdavidcs	__le32 remote_ip[4];
194316485Sdavidcs	__le32 local_ip[4];
195316485Sdavidcs	__le32 flow_label;
196316485Sdavidcs	u8 ttl;
197316485Sdavidcs	u8 tos_or_tc;
198316485Sdavidcs	__le16 remote_port;
199316485Sdavidcs	__le16 local_port;
200316485Sdavidcs	__le16 mss /* the mss derived from remote mss and local mtu, ipVersion options and tags */;
201316485Sdavidcs	u8 rcv_wnd_scale;
202337519Sdavidcs	u8 connect_mode /* TCP connect mode: use enum tcp_connect_mode (use enum tcp_connect_mode) */;
203316485Sdavidcs	__le16 syn_ip_payload_length /* length of Tcp header in SYN packet - relevent for passive mode */;
204316485Sdavidcs	__le32 syn_phy_addr_lo /* physical address (low) of SYN buffer - relevent for passive mode */;
205316485Sdavidcs	__le32 syn_phy_addr_hi /* physical address (high) of SYN buffer - relevent for passive mode */;
206337519Sdavidcs	__le32 cwnd /* absolute congestion window */;
207337519Sdavidcs	u8 ka_max_probe_cnt;
208337519Sdavidcs	u8 reserved2[3];
209337519Sdavidcs	__le32 ka_timeout /* This member specifies, in ms, the timeout interval for inactivity before sending a keepalive probe */;
210337519Sdavidcs	__le32 ka_interval /* This member specifies, in ms, the timeout after which to retransmit a keepalive frame if no response is received to a keepalive probe  */;
211337519Sdavidcs	__le32 max_rt_time /* This member specifies, in ms, the maximum time that the offload target should spend retransmitting a segment */;
212337519Sdavidcs	__le32 reserved3[16];
213316485Sdavidcs};
214316485Sdavidcs
215316485Sdavidcs
216316485Sdavidcs/*
217316485Sdavidcs * tcp IPv4/IPv6 enum
218316485Sdavidcs */
219316485Sdavidcsenum tcp_seg_placement_event
220316485Sdavidcs{
221316485Sdavidcs	TCP_EVENT_ADD_PEN,
222316485Sdavidcs	TCP_EVENT_ADD_NEW_ISLE,
223316485Sdavidcs	TCP_EVENT_ADD_ISLE_RIGHT,
224316485Sdavidcs	TCP_EVENT_ADD_ISLE_LEFT,
225316485Sdavidcs	TCP_EVENT_JOIN,
226316485Sdavidcs	TCP_EVENT_DELETE_ISLES,
227316485Sdavidcs	TCP_EVENT_NOP,
228316485Sdavidcs	MAX_TCP_SEG_PLACEMENT_EVENT
229316485Sdavidcs};
230316485Sdavidcs
231316485Sdavidcs
232316485Sdavidcs/*
233316485Sdavidcs * tcp init parameters
234316485Sdavidcs */
235316485Sdavidcsstruct tcp_update_params
236316485Sdavidcs{
237316485Sdavidcs	__le16 flags;
238316485Sdavidcs#define TCP_UPDATE_PARAMS_REMOTE_MAC_ADDR_CHANGED_MASK   0x1
239316485Sdavidcs#define TCP_UPDATE_PARAMS_REMOTE_MAC_ADDR_CHANGED_SHIFT  0
240316485Sdavidcs#define TCP_UPDATE_PARAMS_MSS_CHANGED_MASK               0x1
241316485Sdavidcs#define TCP_UPDATE_PARAMS_MSS_CHANGED_SHIFT              1
242316485Sdavidcs#define TCP_UPDATE_PARAMS_TTL_CHANGED_MASK               0x1
243316485Sdavidcs#define TCP_UPDATE_PARAMS_TTL_CHANGED_SHIFT              2
244316485Sdavidcs#define TCP_UPDATE_PARAMS_TOS_OR_TC_CHANGED_MASK         0x1
245316485Sdavidcs#define TCP_UPDATE_PARAMS_TOS_OR_TC_CHANGED_SHIFT        3
246316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_TIMEOUT_CHANGED_MASK        0x1
247316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_TIMEOUT_CHANGED_SHIFT       4
248316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_INTERVAL_CHANGED_MASK       0x1
249316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_INTERVAL_CHANGED_SHIFT      5
250316485Sdavidcs#define TCP_UPDATE_PARAMS_MAX_RT_TIME_CHANGED_MASK       0x1
251316485Sdavidcs#define TCP_UPDATE_PARAMS_MAX_RT_TIME_CHANGED_SHIFT      6
252316485Sdavidcs#define TCP_UPDATE_PARAMS_FLOW_LABEL_CHANGED_MASK        0x1
253316485Sdavidcs#define TCP_UPDATE_PARAMS_FLOW_LABEL_CHANGED_SHIFT       7
254316485Sdavidcs#define TCP_UPDATE_PARAMS_INITIAL_RCV_WND_CHANGED_MASK   0x1
255316485Sdavidcs#define TCP_UPDATE_PARAMS_INITIAL_RCV_WND_CHANGED_SHIFT  8
256316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_MAX_PROBE_CNT_CHANGED_MASK  0x1
257316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_MAX_PROBE_CNT_CHANGED_SHIFT 9
258316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_EN_CHANGED_MASK             0x1
259316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_EN_CHANGED_SHIFT            10
260316485Sdavidcs#define TCP_UPDATE_PARAMS_NAGLE_EN_CHANGED_MASK          0x1
261316485Sdavidcs#define TCP_UPDATE_PARAMS_NAGLE_EN_CHANGED_SHIFT         11
262316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_EN_MASK                     0x1
263316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_EN_SHIFT                    12
264316485Sdavidcs#define TCP_UPDATE_PARAMS_NAGLE_EN_MASK                  0x1
265316485Sdavidcs#define TCP_UPDATE_PARAMS_NAGLE_EN_SHIFT                 13
266316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_RESTART_MASK                0x1
267316485Sdavidcs#define TCP_UPDATE_PARAMS_KA_RESTART_SHIFT               14
268316485Sdavidcs#define TCP_UPDATE_PARAMS_RETRANSMIT_RESTART_MASK        0x1
269316485Sdavidcs#define TCP_UPDATE_PARAMS_RETRANSMIT_RESTART_SHIFT       15
270316485Sdavidcs	__le16 remote_mac_addr_lo;
271316485Sdavidcs	__le16 remote_mac_addr_mid;
272316485Sdavidcs	__le16 remote_mac_addr_hi;
273316485Sdavidcs	__le16 mss;
274316485Sdavidcs	u8 ttl;
275316485Sdavidcs	u8 tos_or_tc;
276316485Sdavidcs	__le32 ka_timeout;
277316485Sdavidcs	__le32 ka_interval;
278316485Sdavidcs	__le32 max_rt_time;
279316485Sdavidcs	__le32 flow_label;
280316485Sdavidcs	__le32 initial_rcv_wnd;
281316485Sdavidcs	u8 ka_max_probe_cnt;
282316485Sdavidcs	u8 reserved1[7];
283316485Sdavidcs};
284316485Sdavidcs
285316485Sdavidcs
286316485Sdavidcs/*
287316485Sdavidcs * toe upload parameters
288316485Sdavidcs */
289316485Sdavidcsstruct tcp_upload_params
290316485Sdavidcs{
291316485Sdavidcs	__le32 rcv_next;
292316485Sdavidcs	__le32 snd_una;
293316485Sdavidcs	__le32 snd_next;
294316485Sdavidcs	__le32 snd_max;
295316485Sdavidcs	__le32 snd_wnd /* absolute send window (not scaled) */;
296316485Sdavidcs	__le32 rcv_wnd /* absolute receive window (not scaled) */;
297316485Sdavidcs	__le32 snd_wl1 /* the segment sequence number used for the last window update */;
298316485Sdavidcs	__le32 cwnd /* absolute congestion window */;
299316485Sdavidcs	__le32 ss_thresh;
300316485Sdavidcs	__le16 srtt /* in ms */;
301316485Sdavidcs	__le16 rtt_var /* in ms */;
302316485Sdavidcs	__le32 ts_time /* The current value of the adjusted timestamp */;
303316485Sdavidcs	__le32 ts_recent /* The timestamp value to send in the next ACK */;
304316485Sdavidcs	__le32 ts_recent_age /* The length of time, in ms, since the most recent timestamp was received */;
305316485Sdavidcs	__le32 total_rt /* The total time, in ms, that has been spent retransmitting the current TCP segment */;
306316485Sdavidcs	__le32 ka_timeout_delta /* The time remaining, in clock ticks, until the next keepalive timeout. A value of -1 indicates that the keepalive timer was not running when the connection was offloaded. */;
307316485Sdavidcs	__le32 rt_timeout_delta /* The time remaining, in clock ticks, until the next retransmit timeout. A value of -1 indicates that the  retransmit timer was not running when the connection was offloaded. */;
308316485Sdavidcs	u8 dup_ack_cnt /* The number of ACKs that have been accepted for the same sequence number */;
309316485Sdavidcs	u8 snd_wnd_probe_cnt /* The current send window probe round */;
310316485Sdavidcs	u8 ka_probe_cnt /* the number of keepalive probes that have been sent that have not received a response */;
311316485Sdavidcs	u8 rt_cnt /* The number of retransmits that have been sent */;
312316485Sdavidcs	__le32 reserved;
313316485Sdavidcs};
314316485Sdavidcs
315316485Sdavidcs#endif /* __TCP_COMMON__ */
316