1/*
2 * Copyright 2014-2017 Cavium, Inc.
3 * The contents of this file are subject to the terms of the Common Development
4 * and Distribution License, v.1,  (the "License").
5 *
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the License at available
9 * at http://opensource.org/licenses/CDDL-1.0
10 *
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14
15#ifndef _TOE_CTX_H
16#define _TOE_CTX_H
17
18#include "tcp_ctx.h"
19
20
21
22/////////////////////////////////////////////////////////////////////
23// TOE TX section
24/////////////////////////////////////////////////////////////////////
25typedef struct {
26    u32_t rto_intvl;     // current unbounded rto interval (in ticks)
27    u32_t unused;
28    u32_t tcp_last_rcv_win_seq;
29    u8_t  tx_in_coalesce;
30    u8_t  tx_ind_silly_win;
31    u8_t  tx_large_bd;
32    u8_t  tx_comp_defer;
33    u16_t max_rt_tick;               // maximum total retransmit timeout (in ticks)
34    u16_t total_rt_tick;             // total retransmit timeout  (in ticks)
35    u32_t tcp_sack_start;             // keep track of rx SACK
36    u8_t  tx_comp_prod;
37    u8_t  tx_comp_cons;
38    u8_t  persist_probe_cnt;
39    u8_t  in_generic;
40    u32_t tx_comp_step;
41    u32_t reply_ts;
42        #define TOE_RTT_SAMPLED                   (1<<0)
43    u32_t tcp_save_cwin;
44    u32_t unused2;
45    u32_t host_win_update;
46} toe_l4_tx_ctx_b_t;
47
48typedef struct {
49    u32_t rto_intvl;     // current unbounded rto interval (in ticks)
50    u32_t unused;
51    u32_t tcp_last_rcv_win_seq;
52    u8_t  tx_comp_defer;
53    u8_t  tx_large_bd;
54    u8_t  tx_ind_silly_win;
55    u8_t  tx_in_coalesce;
56    u16_t total_rt_tick;             // total retransmit timeout  (in ticks)
57    u16_t max_rt_tick;               // maximum total retransmit timeout (in ticks)
58    u32_t tcp_sack_start;             // keep track of rx SACK
59    u8_t  in_generic;
60    u8_t  persist_probe_cnt;
61    u8_t  tx_comp_cons;
62    u8_t  tx_comp_prod;
63    u32_t tx_comp_step;
64    u32_t reply_ts;
65        #define TOE_RTT_SAMPLED                   (1<<0)
66    u32_t tcp_save_cwin;
67    u32_t unused2;
68    u32_t host_win_update;
69} toe_l4_tx_ctx_l_t;
70
71#if defined(LITTLE_ENDIAN)
72    typedef toe_l4_tx_ctx_l_t  toe_l4_tx_ctx_t;
73#elif defined(BIG_ENDIAN)
74    typedef toe_l4_tx_ctx_b_t  toe_l4_tx_ctx_t;
75#endif
76
77    typedef struct {
78    tcp_tx_ctx_t        tcp;
79    toe_l4_tx_ctx_t     toe;
80} toe_tx_ctx_t;
81
82/////////////////////////////////////////////////////////////////////
83// TOE CMN section
84/////////////////////////////////////////////////////////////////////
85typedef struct {
86    u32_t   tcp_disconnect_seq;           // last snd seq # before disconnecting
87    u32_t   last_fin_seq;                  // last rx seq # in FIN packet
88    u8_t    tcp_retx_defer;
89    u8_t    tcp_flow_state;
90        #define TOE_FLOW_STATE_NORMAL_INIT           (0<<0)
91        #define TOE_FLOW_STATE_NORMAL_RUNNING        (1<<0)
92        #define TOE_FLOW_STATE_LIMIT_TX_ACTIVE       (2<<0)
93        #define TOE_FLOW_STATE_IN_LOSS_RECOVERY      (3<<0)
94        #define TOE_FLOW_STATE_FAST_RETX_INIT1       (4<<0)
95        #define TOE_FLOW_STATE_FAST_RETX_INIT2       (5<<0)
96        #define TOE_FLOW_STATE_FAST_RETX_RELOAD      (6<<0)
97        #define TOE_FLOW_STATE_FAST_RETX_ACTIVE1     (7<<0)
98        #define TOE_FLOW_STATE_FAST_RETX_ACTIVE2     (8<<0)
99        #define TOE_FLOW_STATE_FAST_RECOVERY_INIT1   (9<<0)
100        #define TOE_FLOW_STATE_FAST_RECOVERY_INIT2   (10<<0)
101        #define TOE_FLOW_STATE_FAST_RECOVERY_ACTIVE  (11<<0)
102        #define TOE_FLOW_STATE_FAST_RECOVERY_EXIT    (12<<0)
103    u8_t    tcp_partial_ack_cnt;
104    u8_t    timer1_mode;        // timer1 is overloaded for retx, persist, sws prevention and FIN_WAIT2 timer
105    u32_t   tcp_snd_recover;
106    u16_t   gen_buff_accum;
107    u8_t    ooo_fin_upload_state;
108        #define OOO_FIN_UPLOAD_IDLE                   (0<<0)
109        #define OOO_FIN_UPLOAD_DEFER                  (1<<0)
110        #define OOO_FIN_UPLOAD_NOW                    (2<<0)
111        #define OOO_FIN_UPLOAD_DONE                   (3<<0)
112        #define OOO_FIN_UPLOAD_DEFER_PENDING          (4<<0)
113        #define OOO_FIN_UPLOAD_UNKNOWN                (5<<0)
114    u8_t    reload_comp_status;
115        #define RELOAD_COMP_IDLE                      (0<<0)
116        #define RELOAD_COMP_HOST_PENDING              (1<<0)
117        #define RELOAD_COMP_ONCHIP_PENDING            (2<<0)
118    u32_t   ooo_fin_seq;
119} toe_l4_cmn_ctx_b_t;
120
121typedef struct {
122    u32_t   tcp_disconnect_seq;           // last snd seq # before disconnecting
123    u32_t   last_fin_seq;                  // last rx seq # in FIN packet
124    u8_t    timer1_mode;        // timer1 is overloaded for retx, persist, sws prevention and FIN_WAIT2 timer
125        #define TIMER1_RETX_MODE        (0)
126        #define TIMER1_PERSIST_MODE     (1)
127        #define TIMER1_SWS_PREVENT_MODE (2)
128        #define TIMER1_FIN_WAIT2_MODE   (3)
129    u8_t    tcp_partial_ack_cnt;
130    u8_t    tcp_flow_state;
131        #define TOE_FLOW_STATE_NORMAL_INIT            (0<<0)
132        #define TOE_FLOW_STATE_NORMAL_RUNNING         (1<<0)
133        #define TOE_FLOW_STATE_LIMIT_TX_ACTIVE        (2<<0)
134        #define TOE_FLOW_STATE_IN_LOSS_RECOVERY       (3<<0)
135        #define TOE_FLOW_STATE_FAST_RETX_INIT1        (4<<0)
136        #define TOE_FLOW_STATE_FAST_RETX_INIT2        (5<<0)
137        #define TOE_FLOW_STATE_FAST_RETX_RELOAD       (6<<0)
138        #define TOE_FLOW_STATE_FAST_RETX_ACTIVE1      (7<<0)
139        #define TOE_FLOW_STATE_FAST_RETX_ACTIVE2      (8<<0)
140        #define TOE_FLOW_STATE_FAST_RECOVERY_INIT1    (9<<0)
141        #define TOE_FLOW_STATE_FAST_RECOVERY_INIT2    (10<<0)
142        #define TOE_FLOW_STATE_FAST_RECOVERY_ACTIVE   (11<<0)
143        #define TOE_FLOW_STATE_FAST_RECOVERY_EXIT     (12<<0)
144    u8_t    tcp_retx_defer;
145    u32_t   tcp_snd_recover;
146    u8_t    reload_comp_status;
147        #define RELOAD_COMP_IDLE                      (0<<0)
148        #define RELOAD_COMP_HOST_PENDING              (1<<0)
149        #define RELOAD_COMP_ONCHIP_PENDING            (2<<0)
150    u8_t    ooo_fin_upload_state;
151    u16_t   gen_buff_accum;
152    u32_t   ooo_fin_seq;
153} toe_l4_cmn_ctx_l_t;
154
155#if defined(LITTLE_ENDIAN)
156    typedef toe_l4_cmn_ctx_l_t  toe_l4_cmn_ctx_t;
157#elif defined(BIG_ENDIAN)
158    typedef toe_l4_cmn_ctx_b_t  toe_l4_cmn_ctx_t;
159#endif
160
161typedef struct {
162    tcp_cmn_ctx_t        tcp;
163    toe_l4_cmn_ctx_t     toe;
164} toe_cmn_ctx_t;
165
166/////////////////////////////////////////////////////////////////////
167// TOE RX section
168/////////////////////////////////////////////////////////////////////
169typedef struct {
170    u32_t ccell_hist_bseq;
171    u32_t ccell_hist_bhaddr_hi;
172    u32_t ccell_hist_bhaddr_lo;
173    u16_t ccell_hist_bidx;
174    u16_t ccell_hist_bd_nbytes;
175} toe_ccell_hist_b_t;
176
177typedef struct {
178    u32_t ccell_hist_bseq;
179    u32_t ccell_hist_bhaddr_hi;
180    u32_t ccell_hist_bhaddr_lo;
181    u16_t ccell_hist_bd_nbytes;
182    u16_t ccell_hist_bidx;
183} toe_ccell_hist_l_t;
184
185#if defined(LITTLE_ENDIAN)
186    typedef toe_ccell_hist_l_t  toe_ccell_hist_t;
187#elif defined(BIG_ENDIAN)
188    typedef toe_ccell_hist_b_t  toe_ccell_hist_t;
189#endif
190
191#define MAX_CCELL_HIST_ENTRY    9
192
193typedef struct {
194    u8_t  l4_bd_chain_v2p_proc1flags;
195    u8_t  l4_bd_chain_host_gen_count;
196    u16_t l4_bd_chain_host_bdidx;
197    u32_t l4_bd_chain_host_bseq;
198    u32_t l4_bd_chain_nx_bdhaddr_hi;
199    u32_t l4_bd_chain_nx_bdhaddr_lo;
200    u32_t l4_bd_chain_nx_seq;
201    u8_t  l4_bd_chain_v2p_flags;
202    u8_t  l4_bd_chain_v2p_gen_count;
203    u16_t l4_bd_chain_nx_bdidx;
204    u16_t l4_bd_chain_gen_used;
205    u16_t l4_bd_chain_nx_boff;
206    u32_t l4_bd_chain_cmpl_seq;
207    u32_t l4_bd_chain_cmpl_bdhaddr_hi;
208    u32_t l4_bd_chain_cmpl_bdhaddr_lo;
209    u16_t l4_bd_chain_gen_size;
210    u16_t l4_bd_chain_cmpl_bdidx;
211    u32_t l4_bd_chain_io_seq;
212    u32_t l4_bd_chain_hole_seq;
213    u32_t l4_bd_chain_end_seq;
214    u32_t l4_bd_chain_bseq_lead;
215    u32_t l4_bd_chain_push_seq;
216    u32_t l4_bd_chain_gen_start_seq;
217    u32_t l4_bd_chain_gen_seq;
218    u32_t l4_bd_chain_gen_bfr_hi;
219    u32_t l4_bd_chain_gen_bfr_lo;
220    u32_t l4_bd_chain_hole2_seq;      // to keep track of 2nd holes
221    u32_t l4_bd_chain_end2_seq;
222    u8_t  ccell_hist_prod_idx;
223    u8_t  ccell_hist_cons_idx;
224    u8_t  ccell_hist_num_entry;
225    u8_t  unused;
226    toe_ccell_hist_t ccell_hist_tbl[MAX_CCELL_HIST_ENTRY];
227} toe_l4_rx_ctx_b_t;
228
229typedef struct {
230    u16_t l4_bd_chain_host_bdidx;
231    u8_t  l4_bd_chain_host_gen_count;
232    u8_t  l4_bd_chain_v2p_proc1flags;
233    u32_t l4_bd_chain_host_bseq;
234    u32_t l4_bd_chain_nx_bdhaddr_hi;
235    u32_t l4_bd_chain_nx_bdhaddr_lo;
236    u32_t l4_bd_chain_nx_seq;
237    u16_t l4_bd_chain_nx_bdidx;
238    u8_t  l4_bd_chain_v2p_gen_count;
239    u8_t  l4_bd_chain_v2p_flags;
240    u16_t l4_bd_chain_nx_boff;
241    u16_t l4_bd_chain_gen_used;
242    u32_t l4_bd_chain_cmpl_seq;
243    u32_t l4_bd_chain_cmpl_bdhaddr_hi;
244    u32_t l4_bd_chain_cmpl_bdhaddr_lo;
245    u16_t l4_bd_chain_cmpl_bdidx;
246    u16_t l4_bd_chain_gen_size;
247    u32_t l4_bd_chain_io_seq;
248    u32_t l4_bd_chain_hole_seq;
249    u32_t l4_bd_chain_end_seq;
250    u32_t l4_bd_chain_bseq_lead;
251    u32_t l4_bd_chain_push_seq;
252    u32_t l4_bd_chain_gen_start_seq;
253    u32_t l4_bd_chain_gen_seq;
254    u32_t l4_bd_chain_gen_bfr_hi;
255    u32_t l4_bd_chain_gen_bfr_lo;
256    u32_t l4_bd_chain_hole2_seq;      // to keep track of 2nd holes
257    u32_t l4_bd_chain_end2_seq;
258    toe_ccell_hist_t ccell_hist_tbl[MAX_CCELL_HIST_ENTRY];
259    u8_t  unused;
260    u8_t  ccell_hist_num_entry;
261    u8_t  ccell_hist_cons_idx;
262    u8_t  ccell_hist_prod_idx;
263} toe_l4_rx_ctx_l_t;
264
265#if defined(LITTLE_ENDIAN)
266    typedef toe_l4_rx_ctx_l_t  toe_l4_rx_ctx_t;
267#elif defined(BIG_ENDIAN)
268    typedef toe_l4_rx_ctx_b_t  toe_l4_rx_ctx_t;
269#endif
270
271typedef struct {
272    tcp_rx_ctx_t        tcp;
273    toe_l4_rx_ctx_t     toe;
274} toe_rx_ctx_t;
275
276/* container structure for entire L4 ctx, it is mainly used by VBD debugging tools */
277typedef struct {
278    toe_tx_ctx_t            toe_tx;
279    u8_t                    unused_0[128 - sizeof(toe_tx_ctx_t)];
280    toe_cmn_ctx_t           toe_cmn;   /* ctx_cmn is full */
281//    u8_t                    unused_0[128 - sizeof(toe_cmn_ctx_t)];
282    toe_rx_ctx_t            toe_rx;
283    u8_t                    unused_1[256 - sizeof(toe_rx_ctx_t)];
284    u8_t                    reserved[64];
285    tcp_context_cmd_cell_te_t  toe_cmd_cell;
286} toe_ctx_t;
287
288
289
290// Calling the following macro will actually get optimized during compile
291// time. Its sole purpose is to ensure the context variable locations are
292// not moved by accident
293#define TEST_TOE_CTX(){                           \
294if (0){                                           \
295 1/((sizeof(toe_ctx_t) == 0x268) &&               \
296    (OFFSETOF(toe_ctx_t, toe_cmn) == 128) &&      \
297    (OFFSETOF(toe_ctx_t, toe_rx)  == 128+128) &&  \
298    (OFFSETOF(toe_ctx_t, toe_cmd_cell)  == 128+128+256+64));}}
299
300
301/*
302 *  l4_bd_chain_context_b definition
303 */
304typedef struct l4_bd_chain_context_b
305{
306    u8_t l4bdctx_v2p_proc1flags;
307        #define L4BDCTX_V2P_PROC1FLAGS_BD_CHN_FLUSH         (1<<0)
308        #define L4BDCTX_V2P_PROC1FLAGS_BD_FORCE_PUSH        (1<<1)
309
310    u8_t l4bdctx_host_gen_count;
311    u16_t l4bdctx_host_bdidx;
312    u32_t l4bdctx_host_bseq;
313    u32_t l4bdctx_nx_bdhaddr_hi;
314    u32_t l4bdctx_nx_bdhaddr_lo;
315    u32_t l4bdctx_nx_seq;
316    u8_t l4bdctx_v2p_flags;
317    u8_t l4bdctx_v2p_gen_count;
318    u16_t l4bdctx_nx_bdidx;
319    u16_t l4bdctx_gen_used;
320    u16_t l4bdctx_nx_boff;
321    u32_t l4bdctx_cmpl_seq;
322    u32_t l4bdctx_cmpl_bdhaddr_hi;
323    u32_t l4bdctx_cmpl_bdhaddr_lo;
324    u16_t l4bdctx_gen_size;
325    u16_t l4bdctx_cmpl_bdidx;
326    u32_t l4bdctx_io_seq;
327    u32_t l4bdctx_hole_seq;
328    u32_t l4bdctx_end_seq;
329    u32_t l4bdctx_bseq_lead;
330    u32_t l4bdctx_push_seq;
331    u32_t l4bdctx_gen_start_seq;
332    u32_t l4bdctx_gen_seq;
333    u32_t l4bdctx_gen_bfr_hi;
334    u32_t l4bdctx_gen_bfr_lo;
335} l4_bd_chain_context_b_t;
336
337
338/*
339 *  l4_bd_chain_context_l definition
340 */
341typedef struct l4_bd_chain_context_l
342{
343    u16_t l4bdctx_host_bdidx;
344    u8_t l4bdctx_host_gen_count;
345    u8_t l4bdctx_v2p_proc1flags;
346        #define L4BDCTX_V2P_PROC1FLAGS_BD_CHN_FLUSH         (1<<0)
347        #define L4BDCTX_V2P_PROC1FLAGS_BD_FORCE_PUSH        (1<<1)
348
349    u32_t l4bdctx_host_bseq;
350    u32_t l4bdctx_nx_bdhaddr_hi;
351    u32_t l4bdctx_nx_bdhaddr_lo;
352    u32_t l4bdctx_nx_seq;
353    u16_t l4bdctx_nx_bdidx;
354    u8_t l4bdctx_v2p_gen_count;
355    u8_t l4bdctx_v2p_flags;
356    u16_t l4bdctx_nx_boff;
357    u16_t l4bdctx_gen_used;
358    u32_t l4bdctx_cmpl_seq;
359    u32_t l4bdctx_cmpl_bdhaddr_hi;
360    u32_t l4bdctx_cmpl_bdhaddr_lo;
361    u16_t l4bdctx_cmpl_bdidx;
362    u16_t l4bdctx_gen_size;
363    u32_t l4bdctx_io_seq;
364    u32_t l4bdctx_hole_seq;
365    u32_t l4bdctx_end_seq;
366    u32_t l4bdctx_bseq_lead;
367    u32_t l4bdctx_push_seq;
368    u32_t l4bdctx_gen_start_seq;
369    u32_t l4bdctx_gen_seq;
370    u32_t l4bdctx_gen_bfr_hi;
371    u32_t l4bdctx_gen_bfr_lo;
372} l4_bd_chain_context_l_t;
373
374
375/*
376 * l4_bd_chain_context select
377 */
378#if defined(LITTLE_ENDIAN)
379    typedef l4_bd_chain_context_l_t l4_bd_chain_context_t;
380#elif defined(BIG_ENDIAN)
381    typedef l4_bd_chain_context_b_t l4_bd_chain_context_t;
382#endif
383
384/*
385 *  l4_context_b definition
386 */
387typedef struct l4_context_b
388{
389    u8_t l4ctx_ctx_type;
390        #define L4CTX_TYPE_TYPE                             (0xf<<4)
391        #define L4CTX_TYPE_TYPE_EMPTY                       (0<<4)
392        #define L4CTX_TYPE_TYPE_L2                          (1<<4)
393        #define L4CTX_TYPE_TYPE_TCP                         (2<<4)
394        #define L4CTX_TYPE_TYPE_L5                          (3<<4)
395        #define L4CTX_TYPE_TYPE_L2_BD_CHN                   (4<<4)
396        #define L4CTX_TYPE_TYPE_ISCSI                       (5<<4)
397
398    u8_t l4ctx_size;
399    u8_t l4ctx_bd_pre_read;
400    u8_t l4ctx_gen_bd_cid;
401    u8_t l4ctx_gen_bd_max;
402    u8_t l4ctx_oubits;
403        #define L4CTX_OUBITS_ACTIVATE                       (1<<0)
404        #define L4CTX_OUBITS_CP_UPLOAD                      (1<<1)
405        #define L4CTX_OUBITS_RXP_UPLOAD                     (1<<2)
406        #define L4CTX_OUBITS_TXP_UPLOAD                     (1<<3)
407        #define L4CTX_OUBITS_COM_RX_UPLOAD                  (1<<4)
408        #define L4CTX_OUBITS_COM_TX_UPLOAD                  (1<<5)
409        #define L4CTX_OUBITS_CP_UPLOAD_COMP                 (1<<6)
410
411    u8_t    l4ctx_force_ack_pending;
412    u8_t    l4ctx_challenge_ack_state;         // refer to tcpm-tcpsecure-09 requirement
413        #define CHALLENGE_ACK_NOT_SENT          0            // Challenge Ack not sent
414        #define CHALLENGE_ACK_SENT_KA_DISABLED  1            // Challenge ACK is sent while KA was disabled
415        #define CHALLENGE_ACK_SENT_KA_ENABLED   2            // Challenge ACK is sent while KA was enabled
416    u16_t   l4ctx_tcp_pgid;
417    u8_t    unused;
418    u8_t    l4ctx_tcp_retx_defer;
419    u32_t l4ctx_tcp_timer1;
420        #define L4CTX_TCP_TIMER1_DISABLE                    (1UL<<0)
421        #define L4CTX_TCP_TIMER1_VALUE                      (0x7fffffffL<<1)
422
423    u16_t l4ctx_tcp_timer2;
424        #define L4CTX_TCP_TIMER2_DISABLE                    (1<<0)
425        #define L4CTX_TCP_TIMER2_VALUE                      (0x7fff<<1)
426
427    u16_t l4ctx_tcp_timer3;
428        #define L4CTX_TCP_TIMER3_DISABLE                    (1<<0)
429        #define L4CTX_TCP_TIMER3_VALUE                      (0x7fff<<1)
430
431    u16_t l4ctx_tcp_timer4;
432        #define L4CTX_TCP_TIMER4_DISABLE                    (1<<0)
433        #define L4CTX_TCP_TIMER4_VALUE                      (0x7fff<<1)
434
435    u16_t l4ctx_tcp_timer5;
436        #define L4CTX_TCP_TIMER5_DISABLE                    (1<<0)
437        #define L4CTX_TCP_TIMER5_VALUE                      (0x7fff<<1)
438
439    u32_t l4ctx_tcp_snd_wl1;
440    u32_t l4ctx_tcp_snd_wl2;
441    u8_t l4ctx_tcp_ttl;
442    u8_t l4ctx_tcp_tos;
443    u8_t l4ctx_tcp_dack;
444    u8_t l4ctx_tcp_modes;
445        #define L4CTX_TCP_MODES_RST_INDICATED_PENDING       (1<<0)
446        #define L4CTX_TCP_MODES_DISC_BD                     (1<<1)
447        #define L4CTX_TCP_MODES_UPLOAD_INITED               (1<<2)
448        #define L4CTX_TCP_MODES_RMT_DISC                    (1<<3)
449        #define L4CTX_TCP_MODES_PG_INVALIDATED              (1<<4)
450        #define L4CTX_TCP_MODES_ABORT_PENDING               (1<<5)
451        #define L4CTX_TCP_MODES_DISC_PENDING                (1<<6)
452        #define L4CTX_TCP_MODES_STOP_TX                     (1<<7)
453
454    u32_t l4ctx_tcp_max_adv_win;
455    u32_t l4ctx_rto_intvl;         // current unbounded retransmission timeout (RTO)
456    u32_t l4ctx_tcp_ip_src;
457    u32_t l4ctx_tcp_ip_dst;
458    u8_t l4ctx_tcp_iphdr_nbytes;
459    u8_t l4ctx_tcp_snd_seg_scale;
460    u8_t l4ctx_tcp_rcv_seg_scale;
461    u8_t l4ctx_tcp_tcp_hlen;
462    u16_t l4ctx_tcp_src_port;
463    u16_t l4ctx_tcp_dst_port;
464    u16_t l4ctx_tcp_mss;
465    u8_t l4ctx_tcp_flags;
466        #define L4CTX_TCP_FLAGS_NO_DELAY_ACK                (1<<0)
467        #define L4CTX_TCP_FLAGS_KEEP_ALIVE                  (1<<1)
468        #define L4CTX_TCP_FLAGS_NAGLE                       (1<<2)
469        #define L4CTX_TCP_FLAGS_TIME_STAMP                  (1<<3)
470        #define L4CTX_TCP_FLAGS_SACK                        (1<<4)
471        #define L4CTX_TCP_FLAGS_SEG_SCALING                 (1<<5)
472        #define L4CTX_TCP_FLAGS_OPTION2                     (1<<6)
473
474    u8_t l4ctx_tcp_state;
475        #define L4CTX_TCP_STATE_VALUE                       (0xff<<0)
476        #define L4CTX_TCP_STATE_VALUE_UNDEFINED             (0<<0)
477        #define L4CTX_TCP_STATE_VALUE_LISTEN                (2<<0)
478        #define L4CTX_TCP_STATE_VALUE_SYN_SENT              (4<<0)
479        #define L4CTX_TCP_STATE_VALUE_SYN_RECV              (6<<0)
480        #define L4CTX_TCP_STATE_VALUE_CLOSE_WAIT            (8<<0)
481        #define L4CTX_TCP_STATE_VALUE_ESTABLISHED           (10<<0)
482        #define L4CTX_TCP_STATE_VALUE_FIN_WAIT1             (12<<0)
483        #define L4CTX_TCP_STATE_VALUE_FIN_WAIT2             (14<<0)
484        #define L4CTX_TCP_STATE_VALUE_TIME_WAIT             (16<<0)
485        #define L4CTX_TCP_STATE_VALUE_CLOSED                (18<<0)
486        #define L4CTX_TCP_STATE_VALUE_LAST_ACK              (20<<0)
487        #define L4CTX_TCP_STATE_VALUE_CLOSING               (22<<0)
488        #define L4CTX_TCP_STATE_VALUE_ABORT_CONNECTION      (24<<0)
489
490    u32_t l4ctx_tcp_rcv_next;
491    u32_t l4ctx_last_ack_sent;
492    u32_t l4ctx_tcp_rcv_win_seq;
493    u32_t l4ctx_tcp_snd_una;
494    u32_t l4ctx_tcp_snd_next;
495    u32_t l4ctx_tcp_snd_max;
496    u32_t l4ctx_tcp_snd_win;
497    u32_t l4ctx_tcp_snd_cwin;
498    u32_t l4ctx_tcp_tstamp;
499    u32_t l4ctx_tcp_ssthresh;
500    u16_t l4ctx_tcp_sm_rtt;
501    u16_t l4ctx_tcp_sm_delta;
502    u32_t l4ctx_tcp_max_snd_win;
503    u32_t l4ctx_tcp_tsch_snd_next;
504    u32_t l4ctx_tcp_slot_size;
505        #define L4CTX_TCP_SLOT_SIZE_SLOT_SIZE               (0xffffffL<<0)
506        #define L4CTX_TCP_SLOT_SIZE_CMD_MAX                 (0x7fL<<24)
507        #define L4CTX_TCP_SLOT_SIZE_STOP                    (1UL<<31)
508
509    u8_t l4ctx_tcp_cp_cmd;
510    u8_t l4ctx_tcp_tsch_cmd;
511    u8_t l4ctx_tcp_cons_retx_num;
512    u8_t l4ctx_tcp_tsch_xnum;
513        #define L4CTX_TCP_TSCH_XNUM_VAL                     (0x7f<<0)
514        #define L4CTX_TCP_TSCH_XNUM_L4                      (1<<7)
515
516    u8_t l4ctx_tcp_num_dupack;
517    u8_t l4ctx_tcp_tx_protocol_flags;
518        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_TIMER_DELAY_ACK  (1<<0)
519        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_UPLOAD          (1<<1)
520        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_FORCE_ACK       (1<<2)
521        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_LAST_ACK        (1<<3)
522        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_LAST_RST        (1<<4)
523        /* TOE stack overload bit 4 to signal TXP to sends out pure ack
524         * TOE stack should never use last RST bit
525         */
526        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_PURE_ACK        L4CTX_TCP_TX_PROTOCOL_FLAGS_LAST_RST
527        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_FORCE_RST       (1<<5)
528        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_FORCE_ACK_MINUS (1<<6)
529        #define L4CTX_TCP_TX_PROTOCOL_FLAGS_SKIP_KA         (1<<7)
530
531    u8_t l4ctx_tcp_prod_retx_num;
532    u8_t l4ctx_tcp_tsch_cons_retx_num;
533    u8_t l4ctx_tcp_comp_cons_retx_num;
534    u8_t l4ctx_tcp_num_retx;
535    u8_t l4ctx_tcp_upload_reason;
536        #define L4CTX_TCP_UPLOAD_REASON_KEEP_ALIVE          (1<<0)
537        #define L4CTX_TCP_UPLOAD_REASON_FIN                 (1<<1)
538        #define L4CTX_TCP_UPLOAD_REASON_URG                 (1<<2)
539        #define L4CTX_TCP_UPLOAD_REASON_FRAGMENT            (1<<3)
540        #define L4CTX_TCP_UPLOAD_REASON_IP_OPTION           (1<<4)
541        #define L4CTX_TCP_UPLOAD_REASON_RST                 (1<<5)
542        #define L4CTX_TCP_UPLOAD_REASON_SYN                 (1<<6)
543        #define L4CTX_TCP_UPLOAD_REASON_TIMEOUT             (1<<7)
544
545    u8_t l4ctx_tcp_txp_cmd;
546    u32_t l4ctx_tcp_offload_seq;
547    tcp_context_cmd_cell_te_t l4ctx_cmd[1];
548    u8_t l4ctx_l4_bd_chain_v2p_proc1flags;
549        #define L4CTX_L4_BD_CHAIN_V2P_PROC1FLAGS_BD_CHN_FLUSH             (1<<0)
550        #define L4CTX_L4_BD_CHAIN_V2P_PROC1FLAGS_BD_CHN_FORCE_PUSH        (1<<1)
551
552    u8_t l4ctx_l4_bd_chain_host_gen_count;
553    u16_t l4ctx_l4_bd_chain_host_bdidx;
554    u32_t l4ctx_l4_bd_chain_host_bseq;
555    u32_t l4ctx_l4_bd_chain_nx_bdhaddr_hi;
556    u32_t l4ctx_l4_bd_chain_nx_bdhaddr_lo;
557    u32_t l4ctx_l4_bd_chain_nx_seq;
558    u8_t l4ctx_l4_bd_chain_v2p_flags;
559        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_GEN_BD_IN_USE   (1<<1)
560        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_HOLE_MODE       (1<<2)
561        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_INDICATED       (1<<3)
562        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_PUSH_ARMED      (1<<4)
563        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_PUSH_PENDING    (1<<5)
564        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_2ND_HOLE_MODE   (1<<6)
565        #define L4CTX_L4_BD_CHAIN_V2P_FLAGS_NEW_ISLAND      (1<<7)  // 0 : 1st (inside) island is newer
566                                                                    // 1 : 2nd (outside) island is newer
567    u8_t l4ctx_l4_bd_chain_v2p_gen_count;
568    u16_t l4ctx_l4_bd_chain_nx_bdidx;
569    u16_t l4ctx_l4_bd_chain_gen_used;
570    u16_t l4ctx_l4_bd_chain_nx_boff;
571    u32_t l4ctx_l4_bd_chain_cmpl_seq;
572    u32_t l4ctx_l4_bd_chain_cmpl_bdhaddr_hi;
573    u32_t l4ctx_l4_bd_chain_cmpl_bdhaddr_lo;
574    u16_t l4ctx_l4_bd_chain_gen_size;
575    u16_t l4ctx_l4_bd_chain_cmpl_bdidx;
576    u32_t l4ctx_l4_bd_chain_io_seq;
577    u32_t l4ctx_l4_bd_chain_hole_seq;
578    u32_t l4ctx_l4_bd_chain_end_seq;
579    u32_t l4ctx_l4_bd_chain_bseq_lead;
580    u32_t l4ctx_l4_bd_chain_push_seq;
581    u32_t l4ctx_l4_bd_chain_gen_start_seq;
582    u32_t l4ctx_l4_bd_chain_gen_seq;
583    u32_t l4ctx_l4_bd_chain_gen_bfr_hi;
584    u32_t l4ctx_l4_bd_chain_gen_bfr_lo;
585    u32_t l4ctx_tx_comp_step;
586    u16_t l4ctx_max_rt_tick;               // maximum total retransmit timeout (in ticks)
587    u16_t l4ctx_total_rt_tick;             // total retransmit timeout  (in ticks)
588    u32_t l4ctx_ooo_fin_seq;
589    u32_t l4ctx_unused;
590    u32_t l4ctx_tcp_last_rcv_win_seq;
591    u32_t l4ctx_tcp_save_cwin;
592    u8_t  l4ctx_tcp_flow_state;
593        #define  TOE_FLOW_STATE_NORMAL_INIT           (0<<0)
594        #define  TOE_FLOW_STATE_NORMAL_RUNNING        (1<<0)
595        #define  TOE_FLOW_STATE_LIMIT_TX_ACTIVE       (2<<0)
596        #define  TOE_FLOW_STATE_IN_LOSS_RECOVERY      (3<<0)
597        #define  TOE_FLOW_STATE_FAST_RETX_INIT1       (4<<0)
598        #define  TOE_FLOW_STATE_FAST_RETX_INIT2       (5<<0)
599        #define  TOE_FLOW_STATE_FAST_RETX_RELOAD      (6<<0)
600        #define  TOE_FLOW_STATE_FAST_RETX_ACTIVE1     (7<<0)
601        #define  TOE_FLOW_STATE_FAST_RETX_ACTIVE2     (8<<0)
602        #define  TOE_FLOW_STATE_FAST_RECOVERY_INIT1   (9<<0)
603        #define  TOE_FLOW_STATE_FAST_RECOVERY_INIT2   (10<<0)
604        #define  TOE_FLOW_STATE_FAST_RECOVERY_ACTIVE  (11<<0)
605        #define  TOE_FLOW_STATE_FAST_RECOVERY_EXIT    (12<<0)
606        #define  TCP_FLOW_NORMAL(x)         ((x) <= TOE_FLOW_STATE_NORMAL_RUNNING)
607        #define  TCP_FLOW_LIMIT_TX(x)       ((x) == TOE_FLOW_STATE_LIMIT_TX_ACTIVE )
608        #define  TCP_FLOW_LOSS_RECOVERY(x)  ((x) == TOE_FLOW_STATE_LOSS_RECOVERY )
609        #define  TCP_FLOW_FAST_RETX(x)      ((x) >= TOE_FLOW_STATE_FAST_RETX_INIT1  \
610                                          && (x) <= TOE_FLOW_STATE_FAST_RECOVERY_ACTIVE)
611        #define  TCP_FLOW_FAST_RECOVERY(x)  ((x) >= TOE_FLOW_STATE_FAST_RECOVERY_INIT1)
612    u8_t  l4ctx_tcp_partial_ack_cnt;
613    u8_t  l4ctx_timer1_mode;        // timer1 is overloaded for retx, persist, sws prevention and FIN_WAIT2 timer
614        #define TIMER1_RETX_MODE                      (0)
615        #define TIMER1_PERSIST_MODE                   (1)
616        #define TIMER1_SWS_PREVENT_MODE               (2)
617        #define TIMER1_FIN_WAIT2_MODE                 (3)
618    u8_t  l4ctx_ooo_fin_upload_state;
619        #define OOO_FIN_UPLOAD_IDLE                   (0<<0)
620        #define OOO_FIN_UPLOAD_DEFER                  (1<<0)
621        #define OOO_FIN_UPLOAD_NOW                    (2<<0)
622        #define OOO_FIN_UPLOAD_DONE                   (3<<0)
623        #define OOO_FIN_UPLOAD_DEFER_PENDING          (4<<0)
624        #define OOO_FIN_UPLOAD_UNKNOWN                (5<<0)
625    u32_t l4ctx_last_fin_seq;              // last rx seq # in FIN packet
626    u8_t  l4ctx_persist_probe_cnt;
627    u8_t  l4ctx_reload_comp_status;
628        #define RELOAD_COMP_IDLE                      (0<<0)
629        #define RELOAD_COMP_HOST_PENDING              (1<<0)
630        #define RELOAD_COMP_ONCHIP_PENDING            (2<<0)
631    u8_t  l4ctx_tx_flags;
632        #define L4CTX_TX_FLAGS_IN_COALESCE            (1<<1)
633        #define L4CTX_TX_FLAGS_IND_SILLY_WIN          (1<<2)
634        #define L4CTX_TX_FLAGS_LARGE_BD               (1<<3)
635    u8_t  l4ctx_ka_probe_cnt;
636
637    u32_t l4ctx_tcp_disconnect_seq;          // last snd seq # before disconnecting
638    u32_t l4ctx_tcp_snd_recover;
639    u32_t l4ctx_reply_ts;
640        #define TOE_RTT_SAMPLED                       (1<<0)
641    u16_t l4ctx_ka_timeout_tick;
642    u16_t l4ctx_ka_interval_tick;
643
644    u8_t  l4ctx_tx_comp_prod;
645    u8_t  l4ctx_tx_comp_cons;
646    u8_t  l4ctx_ka_max_probe_cnt;
647    u8_t  l4ctx_in_generic;
648
649    u32_t l4ctx_host_win_update;
650    u16_t l4ctx_cam_index;
651    u16_t l4ctx_gen_buff_accum;
652} l4_context_b_t;
653
654
655
656
657/*
658 *  l4_context_l definition
659 */
660typedef struct l4_context_l
661{
662    u8_t l4ctx_gen_bd_cid;
663    u8_t l4ctx_bd_pre_read;
664    u8_t l4ctx_size;
665    u8_t l4ctx_ctx_type;
666        #define L4CTX_TYPE_TYPE                             (0xf<<4)
667        #define L4CTX_TYPE_TYPE_EMPTY                       (0<<4)
668        #define L4CTX_TYPE_TYPE_L2                          (1<<4)
669        #define L4CTX_TYPE_TYPE_TCP                         (2<<4)
670        #define L4CTX_TYPE_TYPE_L5                          (3<<4)
671        #define L4CTX_TYPE_TYPE_L2_BD_CHN                   (4<<4)
672        #define L4CTX_TYPE_TYPE_ISCSI                       (5<<4)
673
674    u8_t    l4ctx_challenge_ack_state;         // refer to tcpm-tcpsecure-09 requirement
675    u8_t    l4ctx_force_ack_pending;
676    u8_t l4ctx_oubits;
677        #define L4CTX_OUBITS_ACTIVATE                       (1<<0)
678        #define L4CTX_OUBITS_CP_UPLOAD                      (1<<1)
679        #define L4CTX_OUBITS_RXP_UPLOAD                     (1<<2)
680        #define L4CTX_OUBITS_TXP_UPLOAD                     (1<<3)
681        #define L4CTX_OUBITS_COM_RX_UPLOAD                  (1<<4)
682        #define L4CTX_OUBITS_COM_TX_UPLOAD                  (1<<5)
683        #define L4CTX_OUBITS_CP_UPLOAD_COMP                 (1<<6)
684
685    u8_t l4ctx_gen_bd_max;
686    u8_t l4ctx_tcp_retx_defer;
687    u8_t unused;
688    u16_t l4ctx_tcp_pgid;
689    u32_t l4ctx_tcp_timer1;
690        #define L4CTX_TCP_TIMER1_DISABLE                    (1UL<<0)
691        #define L4CTX_TCP_TIMER1_VALUE                      (0x7fffffffL<<1)
692
693    u16_t l4ctx_tcp_timer3;
694        #define L4CTX_TCP_TIMER3_DISABLE                    (1<<0)
695        #define L4CTX_TCP_TIMER3_VALUE                      (0x7fff<<1)
696
697    u16_t l4ctx_tcp_timer2;
698        #define L4CTX_TCP_TIMER2_DISABLE                    (1<<0)
699        #define L4CTX_TCP_TIMER2_VALUE                      (0x7fff<<1)
700
701    u16_t l4ctx_tcp_timer5;
702        #define L4CTX_TCP_TIMER5_DISABLE                    (1<<0)
703        #define L4CTX_TCP_TIMER5_VALUE                      (0x7fff<<1)
704
705    u16_t l4ctx_tcp_timer4;
706        #define L4CTX_TCP_TIMER4_DISABLE                    (1<<0)
707        #define L4CTX_TCP_TIMER4_VALUE                      (0x7fff<<1)
708
709    u32_t l4ctx_tcp_snd_wl1;
710    u32_t l4ctx_tcp_snd_wl2;
711    u8_t l4ctx_tcp_modes;
712        #define L4CTX_TCP_MODES_RST_INDICATED               (1<<0)
713        #define L4CTX_TCP_MODES_DISC_BD                     (1<<1)
714        #define L4CTX_TCP_MODES_UPLOAD_INITED               (1<<2)
715        #define L4CTX_TCP_MODES_RMT_DISC                    (1<<3)
716        #define L4CTX_TCP_MODES_PG_INVALIDATED              (1<<4)
717        #define L4CTX_TCP_MODES_ABORT_PENDING               (1<<5)
718        #define L4CTX_TCP_MODES_DISC_PENDING                (1<<6)
719        #define L4CTX_TCP_MODES_SS                          (1<<7)
720
721    u8_t l4ctx_tcp_dack;
722    u8_t l4ctx_tcp_tos;
723    u8_t l4ctx_tcp_ttl;
724    u32_t l4ctx_tcp_max_adv_win;
725    u32_t l4ctx_tcp_rto_intvl;     // current  unbounded retransmission timeout (RTO)
726    u32_t l4ctx_tcp_ip_src;
727    u32_t l4ctx_tcp_ip_dst;
728    u8_t l4ctx_tcp_tcp_hlen;
729    u8_t l4ctx_tcp_rcv_seg_scale;
730    u8_t l4ctx_tcp_snd_seg_scale;
731    u8_t l4ctx_tcp_iphdr_nbytes;
732    u16_t l4ctx_tcp_dst_port;
733    u16_t l4ctx_tcp_src_port;
734    u8_t l4ctx_tcp_state;
735        #define L4CTX_TCP_STATE_VALUE                       (0xff<<0)
736        #define L4CTX_TCP_STATE_VALUE_UNDEFINED             (0<<0)
737        #define L4CTX_TCP_STATE_VALUE_LISTEN                (2<<0)
738        #define L4CTX_TCP_STATE_VALUE_SYN_SENT              (4<<0)
739        #define L4CTX_TCP_STATE_VALUE_SYN_RECV              (6<<0)
740        #define L4CTX_TCP_STATE_VALUE_CLOSE_WAIT            (8<<0)
741        #define L4CTX_TCP_STATE_VALUE_ESTABLISHED           (10<<0)
742        #define L4CTX_TCP_STATE_VALUE_FIN_WAIT1             (12<<0)
743        #define L4CTX_TCP_STATE_VALUE_FIN_WAIT2             (14<<0)
744        #define L4CTX_TCP_STATE_VALUE_TIME_WAIT             (16<<0)
745        #define L4CTX_TCP_STATE_VALUE_CLOSED                (18<<0)
746        #define L4CTX_TCP_STATE_VALUE_LAST_ACK              (20<<0)
747        #define L4CTX_TCP_STATE_VALUE_CLOSING               (22<<0)
748        #define L4CTX_TCP_STATE_VALUE_ABORT_CONNECTION      (24<<0)
749
750    u8_t l4ctx_tcp_flags;
751        #define L4CTX_TCP_FLAGS_NO_DELAY_ACK                (1<<0)
752        #define L4CTX_TCP_FLAGS_KEEP_ALIVE                  (1<<1)
753        #define L4CTX_TCP_FLAGS_NAGLE                       (1<<2)
754        #define L4CTX_TCP_FLAGS_TIME_STAMP                  (1<<3)
755        #define L4CTX_TCP_FLAGS_SACK                        (1<<4)
756        #define L4CTX_TCP_FLAGS_SEG_SCALING                 (1<<5)
757        #define L4CTX_TCP_FLAGS_OPTION2                     (1<<6)
758        #define L4CTX_TCP_FLAGS_SEND_SYN                    (1<<7)
759
760    u16_t l4ctx_tcp_mss;
761    u32_t l4ctx_tcp_rcv_next;
762    u32_t l4ctx_last_ack_sent;
763    u32_t l4ctx_tcp_rcv_win_seq;
764    u32_t l4ctx_tcp_snd_una;
765    u32_t l4ctx_tcp_snd_next;
766    u32_t l4ctx_tcp_snd_max;
767    u32_t l4ctx_tcp_snd_win;
768    u32_t l4ctx_tcp_snd_cwin;
769    u32_t l4ctx_tcp_tstamp;
770    u32_t l4ctx_tcp_ssthresh;
771    u16_t l4ctx_tcp_sm_delta;
772    u16_t l4ctx_tcp_sm_rtt;
773    u32_t l4ctx_tcp_max_snd_win;
774    u32_t l4ctx_tcp_tsch_snd_next;
775    u32_t l4ctx_tcp_slot_size;
776        #define L4CTX_TCP_SLOT_SIZE_SLOT_SIZE               (0xffffffL<<0)
777        #define L4CTX_TCP_SLOT_SIZE_CMD_MAX                 (0x7fL<<24)
778        #define L4CTX_TCP_SLOT_SIZE_STOP                    (1UL<<31)
779
780    u8_t l4ctx_tcp_tsch_xnum;
781        #define L4CTX_TCP_TSCH_XNUM_VAL                     (0x7f<<0)
782        #define L4CTX_TCP_TSCH_XNUM_L4                      (1<<7)
783
784    u8_t l4ctx_tcp_cons_retx_num;
785    u8_t l4ctx_tcp_tsch_cmd;
786    u8_t l4ctx_tcp_cp_cmd;
787    u8_t l4ctx_tcp_tsch_cons_retx_num;
788    u8_t l4ctx_tcp_prod_retx_num;
789    u8_t l4ctx_tcp_tx_protocol_flags;
790    u8_t l4ctx_tcp_num_dupack;
791    u8_t l4ctx_tcp_txp_cmd;
792    u8_t l4ctx_tcp_upload_reason;
793        #define L4CTX_TCP_UPLOAD_REASON_KEEP_ALIVE          (1<<0)
794        #define L4CTX_TCP_UPLOAD_REASON_FIN                 (1<<1)
795        #define L4CTX_TCP_UPLOAD_REASON_URG                 (1<<2)
796        #define L4CTX_TCP_UPLOAD_REASON_FRAGMENT            (1<<3)
797        #define L4CTX_TCP_UPLOAD_REASON_IP_OPTION           (1<<4)
798        #define L4CTX_TCP_UPLOAD_REASON_RST                 (1<<5)
799        #define L4CTX_TCP_UPLOAD_REASON_SYN                 (1<<6)
800        #define L4CTX_TCP_UPLOAD_REASON_TIMEOUT             (1<<7)
801
802    u8_t l4ctx_tcp_num_retx;
803    u8_t l4ctx_tcp_comp_cons_retx_num;
804    u32_t l4ctx_tcp_offload_seq;
805    tcp_context_cmd_cell_te_t l4ctx_cmd[1];
806    u16_t l4ctx_l4_bd_chain_host_bdidx;
807    u8_t l4ctx_l4_bd_chain_host_gen_count;
808    u8_t l4ctx_l4_bd_chain_v2p_proc1flags;
809        #define L4CTX_L4_BD_CHAIN_V2P_PROC1FLAGS_BD_CHN_FLUSH             (1<<0)
810        #define L4CTX_L4_BD_CHAIN_V2P_PROC1FLAGS_BD_CHN_FORCE_PUSH        (1<<1)
811    u32_t l4ctx_l4_bd_chain_host_bseq;
812    u32_t l4ctx_l4_bd_chain_nx_bdhaddr_hi;
813    u32_t l4ctx_l4_bd_chain_nx_bdhaddr_lo;
814    u32_t l4ctx_l4_bd_chain_nx_seq;
815    u16_t l4ctx_l4_bd_chain_nx_bdidx;
816    u8_t l4ctx_l4_bd_chain_v2p_gen_count;
817    u8_t l4ctx_l4_bd_chain_v2p_flags;
818    u16_t l4ctx_l4_bd_chain_nx_boff;
819    u16_t l4ctx_l4_bd_chain_gen_used;
820    u32_t l4ctx_l4_bd_chain_cmpl_seq;
821    u32_t l4ctx_l4_bd_chain_cmpl_bdhaddr_hi;
822    u32_t l4ctx_l4_bd_chain_cmpl_bdhaddr_lo;
823    u16_t l4ctx_l4_bd_chain_cmpl_bdidx;
824    u16_t l4ctx_l4_bd_chain_gen_size;
825    u32_t l4ctx_l4_bd_chain_io_seq;
826    u32_t l4ctx_l4_bd_chain_hole_seq;
827    u32_t l4ctx_l4_bd_chain_end_seq;
828    u32_t l4ctx_l4_bd_chain_bseq_lead;
829    u32_t l4ctx_l4_bd_chain_push_seq;
830    u32_t l4ctx_l4_bd_chain_gen_start_seq;
831    u32_t l4ctx_l4_bd_chain_gen_seq;
832    u32_t l4ctx_l4_bd_chain_gen_bfr_hi;
833    u32_t l4ctx_l4_bd_chain_gen_bfr_lo;
834    u32_t l4ctx_tx_comp_step;
835    u16_t l4ctx_total_rt_tick;             // total retransmit timeout  (in ticks)
836    u16_t l4ctx_max_rt_tick;               // maximum total retransmit timeout (in ticks)
837    u32_t l4ctx_ooo_fin_seq;
838    u32_t l4ctx_unused;
839    u32_t l4ctx_tcp_last_rcv_win_seq;
840    u32_t l4ctx_tcp_save_cwin;
841    u8_t  l4ctx_ooo_fin_upload_state;
842    u8_t  l4ctx_timer1_mode;        // timer1 is overloaded for retx, persist, sws prevention and FIN_WAIT2 timer
843    u8_t  l4ctx_tcp_partial_ack_cnt;
844    u8_t  l4ctx_tcp_flow_state;
845        #define  TOE_FLOW_STATE_NORMAL_INIT           (0<<0)
846        #define  TOE_FLOW_STATE_NORMAL_RUNNING        (1<<0)
847        #define  TOE_FLOW_STATE_LIMIT_TX_ACTIVE       (2<<0)
848        #define  TOE_FLOW_STATE_IN_LOSS_RECOVERY      (3<<0)
849        #define  TOE_FLOW_STATE_FAST_RETX_INIT1       (4<<0)
850        #define  TOE_FLOW_STATE_FAST_RETX_INIT2       (5<<0)
851        #define  TOE_FLOW_STATE_FAST_RETX_RELOAD      (6<<0)
852        #define  TOE_FLOW_STATE_FAST_RETX_ACTIVE1     (7<<0)
853        #define  TOE_FLOW_STATE_FAST_RETX_ACTIVE2     (8<<0)
854        #define  TOE_FLOW_STATE_FAST_RECOVERY_INIT1   (9<<0)
855        #define  TOE_FLOW_STATE_FAST_RECOVERY_INIT2   (10<<0)
856        #define  TOE_FLOW_STATE_FAST_RECOVERY_ACTIVE  (11<<0)
857        #define  TOE_FLOW_STATE_FAST_RECOVERY_EXIT    (12<<0)
858    u32_t l4ctx_last_fin_seq;              // last rx seq # in FIN packet
859    u8_t  l4ctx_ka_probe_cnt;
860    u8_t  l4ctx_tx_flags;
861        #define L4CTX_TX_FLAGS_IN_COALESCE            (1<<1)
862        #define L4CTX_TX_FLAGS_IND_SILLY_WIN          (1<<2)
863    u8_t  l4ctx_reload_comp_status;
864        #define RELOAD_COMP_IDLE                      (0<<0)
865        #define RELOAD_COMP_HOST_PENDING              (1<<0)
866        #define RELOAD_COMP_ONCHIP_PENDING            (2<<0)
867    u8_t  l4ctx_persist_probe_cnt;
868    u32_t l4ctx_tcp_disconnect_seq;          // last snd seq # before disconnecting
869    u32_t l4ctx_tcp_snd_recover;
870    u32_t l4ctx_reply_ts;
871        #define TOE_RTT_SAMPLED                       (1<<0)
872    u16_t l4ctx_ka_interval;
873    u16_t l4ctx_ka_timeout;
874    u8_t  l4ctx_in_generic;
875    u8_t  l4ctx_ka_max_probe_cnt;
876    u8_t  l4ctx_tx_comp_con;
877    u8_t  l4ctx_tx_comp_prod;
878    u32_t l4ctx_host_win_update;
879    u16_t l4ctx_gen_buff_accum;
880    u16_t l4ctx_cam_index;
881} l4_context_l_t;
882
883
884
885
886
887/*
888 * l4_context select
889 */
890#if defined(LITTLE_ENDIAN)
891    typedef l4_context_l_t l4_context_t;
892#elif defined(BIG_ENDIAN)
893    typedef l4_context_b_t l4_context_t;
894#endif
895
896
897#endif /* _TOE_CTX_H */
898
899