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 /////////////////////////////////////////////////////////////////////
25 typedef 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 
48 typedef 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 /////////////////////////////////////////////////////////////////////
85 typedef 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 
121 typedef 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 
161 typedef 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 /////////////////////////////////////////////////////////////////////
169 typedef 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 
177 typedef 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 
193 typedef 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 
229 typedef 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 
271 typedef 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 */
277 typedef 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(){                           \
294 if (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  */
304 typedef 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  */
341 typedef 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  */
387 typedef 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  */
660 typedef 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