1eef4f27bSRobert Mustacchi /* 2eef4f27bSRobert Mustacchi * Copyright 2014-2017 Cavium, Inc. 3eef4f27bSRobert Mustacchi * The contents of this file are subject to the terms of the Common Development 4eef4f27bSRobert Mustacchi * and Distribution License, v.1, (the "License"). 5eef4f27bSRobert Mustacchi * 6eef4f27bSRobert Mustacchi * You may not use this file except in compliance with the License. 7eef4f27bSRobert Mustacchi * 8eef4f27bSRobert Mustacchi * You can obtain a copy of the License at available 9eef4f27bSRobert Mustacchi * at http://opensource.org/licenses/CDDL-1.0 10eef4f27bSRobert Mustacchi * 11eef4f27bSRobert Mustacchi * See the License for the specific language governing permissions and 12eef4f27bSRobert Mustacchi * limitations under the License. 13eef4f27bSRobert Mustacchi */ 14eef4f27bSRobert Mustacchi 15eef4f27bSRobert Mustacchi #ifndef _TCP_CTX_H 16eef4f27bSRobert Mustacchi #define _TCP_CTX_H 17eef4f27bSRobert Mustacchi 18eef4f27bSRobert Mustacchi #include "bcmtype.h" 19eef4f27bSRobert Mustacchi #include "l2_defs.h" 20eef4f27bSRobert Mustacchi 21eef4f27bSRobert Mustacchi ///////////////////////////////////////////////////////////////////// 22eef4f27bSRobert Mustacchi // TCP TX section 23eef4f27bSRobert Mustacchi ///////////////////////////////////////////////////////////////////// 24eef4f27bSRobert Mustacchi 25eef4f27bSRobert Mustacchi #if defined(LITTLE_ENDIAN) 26eef4f27bSRobert Mustacchi typedef struct { 27*55fea89dSDan Cross u32_t tcp_tsch_snd_next; // TSCH copy of snd_next, used for window calculations 28eef4f27bSRobert Mustacchi u32_t tcp_snd_max; // TCP snd_max 29*55fea89dSDan Cross u8_t tcp_tsch_xnum; // last slot number that was scheduled by TSCH 30eef4f27bSRobert Mustacchi u8_t tcp_cons_retx_num; // last retransmit flush index that COM has received completion for 31*55fea89dSDan Cross u8_t tcp_tsch_cmd; // Index of next ccell to be scheduled by TSCH 32*55fea89dSDan Cross u8_t tcp_cp_cmd; // Command Queue producer 33*55fea89dSDan Cross u8_t tcp_tsch_cons_retx_num; // last retransmit flush index that was sent by TSCH 34*55fea89dSDan Cross u8_t tcp_prod_retx_num; // Retransmit flush is initiated by incrementing this member 35*55fea89dSDan Cross u16_t tcp_pgid; // L2 context cid that belong to this connection 36eef4f27bSRobert Mustacchi u8_t cam_pending; // number of free entries in the CAM that are reserved for offloading the connection 37*55fea89dSDan Cross u8_t tcp_tcp_hlen; // size of TCP header in 32 bit words 38*55fea89dSDan Cross u8_t tcp_iphdr_nbytes; // size of IP header in bytes 39*55fea89dSDan Cross u8_t l2_slot_size; // N/A for iSCSI 40*55fea89dSDan Cross u32_t tcp_max_adv_win; // Maximum advertised window to the remote peer 41eef4f27bSRobert Mustacchi u8_t tcp_modes; 42eef4f27bSRobert Mustacchi u8_t tcp_dack; 43eef4f27bSRobert Mustacchi u8_t tcp_tos; 44eef4f27bSRobert Mustacchi u8_t tcp_ttl; 45eef4f27bSRobert Mustacchi union { 46eef4f27bSRobert Mustacchi u32_t tcp_ip_dst; // destination IP address 47eef4f27bSRobert Mustacchi u32_t tcp_ipv6_dst[4]; // destination IP v6 address 48eef4f27bSRobert Mustacchi }u1; 49eef4f27bSRobert Mustacchi union { 50*55fea89dSDan Cross u32_t tcp_ip_src; // source IP address 51eef4f27bSRobert Mustacchi u32_t tcp_ipv6_src[4]; // source IP v6 address 52eef4f27bSRobert Mustacchi }u2; 53*55fea89dSDan Cross u16_t tcp_dst_port; // TCP destination port number 54*55fea89dSDan Cross u16_t tcp_src_port; // TCP source port number 55eef4f27bSRobert Mustacchi } tcp_tx_ctx_l_t; 56eef4f27bSRobert Mustacchi typedef tcp_tx_ctx_l_t tcp_tx_ctx_t; 57eef4f27bSRobert Mustacchi #elif defined(BIG_ENDIAN) 58eef4f27bSRobert Mustacchi typedef struct { 59*55fea89dSDan Cross u32_t tcp_tsch_snd_next; // TSCH copy of snd_next, used for window calculations 60eef4f27bSRobert Mustacchi u32_t tcp_snd_max; // TCP snd_max 61*55fea89dSDan Cross u8_t tcp_cp_cmd; // Command Queue producer 62*55fea89dSDan Cross u8_t tcp_tsch_cmd; // Index of next ccell to be scheduled by TSCH 63eef4f27bSRobert Mustacchi u8_t tcp_cons_retx_num; // last retransmit flush index that COM has received completion for 64*55fea89dSDan Cross u8_t tcp_tsch_xnum; // last slot number that was scheduled by TSCH 65*55fea89dSDan Cross u16_t tcp_pgid; // L2 context cid that belong to this connection 66*55fea89dSDan Cross u8_t tcp_prod_retx_num; // Retransmit flush is initiated by incrementing this member 67*55fea89dSDan Cross u8_t tcp_tsch_cons_retx_num; // last retransmit flush index that was sent by TSCH 68*55fea89dSDan Cross u8_t l2_slot_size; // N/A for iSCSI 69*55fea89dSDan Cross u8_t tcp_iphdr_nbytes; // size of IP header in bytes 70*55fea89dSDan Cross u8_t tcp_tcp_hlen; // size of TCP header in 32 bit words 71eef4f27bSRobert Mustacchi u8_t cam_pending; // number of free entries in the CAM that are reserved for offloading the connection 72*55fea89dSDan Cross u32_t tcp_max_adv_win; // Maximum advertised window to the remote peer 73eef4f27bSRobert Mustacchi u8_t tcp_ttl; 74eef4f27bSRobert Mustacchi u8_t tcp_tos; 75eef4f27bSRobert Mustacchi u8_t tcp_dack; 76eef4f27bSRobert Mustacchi u8_t tcp_modes; 77eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_RST_INDICATED_PENDING (1<<0) 78eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_DISC_BD (1<<1) 79eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_UPLOAD_INITED (1<<2) 80eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_RMT_DISC (1<<3) 81eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_PG_INVALIDATED (1<<4) 82eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_ABORT_PENDING (1<<5) 83eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_DISC_PENDING (1<<6) 84eef4f27bSRobert Mustacchi #define L4CTX_TCP_MODES_STOP_TX (1<<7) 85eef4f27bSRobert Mustacchi union { 86eef4f27bSRobert Mustacchi u32_t tcp_ip_dst; // destination IP address 87eef4f27bSRobert Mustacchi u32_t tcp_ipv6_dst[4]; // destination IP v6 address 88eef4f27bSRobert Mustacchi }; 89eef4f27bSRobert Mustacchi union { 90*55fea89dSDan Cross u32_t tcp_ip_src; // source IP address 91eef4f27bSRobert Mustacchi u32_t tcp_ipv6_src[4]; // source IP v6 address 92eef4f27bSRobert Mustacchi }; 93*55fea89dSDan Cross u16_t tcp_src_port; // TCP source port number 94eef4f27bSRobert Mustacchi u16_t tcp_dst_port; // TCP destination port number 95eef4f27bSRobert Mustacchi } tcp_tx_ctx_b_t; 96eef4f27bSRobert Mustacchi 97eef4f27bSRobert Mustacchi typedef tcp_tx_ctx_b_t tcp_tx_ctx_t; 98eef4f27bSRobert Mustacchi #endif 99eef4f27bSRobert Mustacchi ///////////////////////////////////////////////////////////////////// 100eef4f27bSRobert Mustacchi // TCP CMN section 101eef4f27bSRobert Mustacchi ///////////////////////////////////////////////////////////////////// 102eef4f27bSRobert Mustacchi 103*55fea89dSDan Cross // Congestion avoidance and slow start require that two variables be maintained 104*55fea89dSDan Cross // for each connection: a congestion window, cwnd, and a slow start threshold 105*55fea89dSDan Cross // size, ssthresh. Initialization for a given connection sets cwnd to one segment 106*55fea89dSDan Cross // and ssthresh to 65535 (or 0xFFFF)bytes. (but MS passed down 0xFFFFFFFF as 107eef4f27bSRobert Mustacchi // initial value) 108eef4f27bSRobert Mustacchi #define INITIAL_SSTHRESH_VAL 0xFFFFFFFF 109eef4f27bSRobert Mustacchi #define MAX_SSTHRESH_VAL 0x7FFFFFFF 110eef4f27bSRobert Mustacchi 111eef4f27bSRobert Mustacchi typedef struct { 112*55fea89dSDan Cross u8_t ctx_type; // 0x0 context type enum 113eef4f27bSRobert Mustacchi #define CTX_TYPE_ISCSI (5<<4) 114*55fea89dSDan Cross u8_t size; // 0x1 context size in bytes 115eef4f27bSRobert Mustacchi u8_t bd_pre_read; // 0x2 116eef4f27bSRobert Mustacchi u8_t gen_bd_cid; // 0x3 117*55fea89dSDan Cross u8_t gen_bd_max; // 0x4 118eef4f27bSRobert Mustacchi u8_t oubits; // 0x5 119eef4f27bSRobert Mustacchi u16_t sq_prod; // 0x6 SQ producer, updated by host via mailbox. wraps at size: bits 0 - (k-1): queue element index within page, bits k - 15: page index in page table 120*55fea89dSDan Cross u8_t tcp_flags; // 0x8 121*55fea89dSDan Cross u8_t tcp_state; // 0x9 TCP state machine 122eef4f27bSRobert Mustacchi union idx16_union_t rq_prod; // 0xa RQ producer, updated by driver, wraps at rq_size 123*55fea89dSDan Cross u32_t tcp_timer1; // 0xc retransmit timer 124*55fea89dSDan Cross u16_t tcp_timer2; // 0x10 125*55fea89dSDan Cross u16_t tcp_timer3; // 126*55fea89dSDan Cross u16_t tcp_timer4; // 0x14 127*55fea89dSDan Cross u16_t tcp_timer5; // 128*55fea89dSDan Cross u32_t tcp_slot_size; // 0x18 129eef4f27bSRobert Mustacchi #define L4CTX_TCP_SLOT_SIZE_SLOT_SIZE (0xffffffL<<0) 130eef4f27bSRobert Mustacchi #define L4CTX_TCP_SLOT_SIZE_CMD_MAX (0x7fL<<24) 131eef4f27bSRobert Mustacchi #define L4CTX_TCP_SLOT_SIZE_STOP (1UL<<31) 132*55fea89dSDan Cross u32_t tcp_snd_cwin; // 0x1c 133*55fea89dSDan Cross u32_t tcp_snd_win; // 0x20 134*55fea89dSDan Cross u8_t tcp_num_dupack; // 0x24 number of consecutive duplicate ACK received 135*55fea89dSDan Cross u8_t tcp_tx_protocol_flags; // 0x25 ack/rst/syn/fin indication 136*55fea89dSDan Cross u8_t tcp_comp_cons_retx_num; // Last retransmit flush index that was completed by TXP 137*55fea89dSDan Cross u8_t tcp_num_retx; // 138eef4f27bSRobert Mustacchi u32_t tcp_fl; // TCP flow label for IPV6 139*55fea89dSDan Cross u32_t tcp_ssthresh; // 0x2c TCP slow start threshold 140eef4f27bSRobert Mustacchi u32_t tcp_rcv_next; // 0x30 TCP receive next sequence number 141*55fea89dSDan Cross u32_t tcp_rcv_win_seq; // unused in iSCSI 142eef4f27bSRobert Mustacchi u32_t tcp_snd_una; // 143eef4f27bSRobert Mustacchi u32_t tcp_snd_next; // 144eef4f27bSRobert Mustacchi u32_t tcp_sm_rtt; // 0x40 145eef4f27bSRobert Mustacchi u32_t tcp_sm_delta; // 146eef4f27bSRobert Mustacchi u32_t tcp_max_snd_win; // 147eef4f27bSRobert Mustacchi u8_t tcp_txp_cmd; // 0x4c index of the ccell that the TXP is currently transmitting 148*55fea89dSDan Cross u8_t tcp_upload_reason; // 149eef4f27bSRobert Mustacchi u8_t tcp_rcv_seg_scale; // TCP segment scale that is advertised by Xinan 150*55fea89dSDan Cross u8_t tcp_ulp_ooo_flags; 151eef4f27bSRobert Mustacchi #define TCP_ULP_OOO_DETECTED (0x01) 152*55fea89dSDan Cross u32_t last_ack_sent; // TCP ack sequence of the previous packet transmitted 153eef4f27bSRobert Mustacchi u32_t tcp_offload_seq; // initial TCP seq number of the Xinan sid (i.e. bseq + offload_seq = tcp_seq) 154*55fea89dSDan Cross u32_t tcp_tstamp; // 155eef4f27bSRobert Mustacchi u16_t tcp_mss; // mss of the connection 156eef4f27bSRobert Mustacchi u8_t ka_probe_cnt; 157eef4f27bSRobert Mustacchi u8_t ka_max_probe_cnt; 158eef4f27bSRobert Mustacchi u8_t force_ack_pending; 159eef4f27bSRobert Mustacchi u8_t krnlq_id; // indicate which krnlq that kcqe should be written to. 160eef4f27bSRobert Mustacchi u16_t ka_timeout_tick; 161eef4f27bSRobert Mustacchi u16_t ka_interval_tick; 162eef4f27bSRobert Mustacchi u8_t unused2; 163eef4f27bSRobert Mustacchi u8_t challenge_ack_state; // refer to tcpm-tcpsecure-09 requirement 164eef4f27bSRobert Mustacchi #define CHALLENGE_ACK_NOT_SENT 0 // Challenge Ack not sent 165eef4f27bSRobert Mustacchi #define CHALLENGE_ACK_SENT_KA_DISABLED 1 // Challenge ACK is sent while KA was disabled 166eef4f27bSRobert Mustacchi #define CHALLENGE_ACK_SENT_KA_ENABLED 2 // Challenge ACK is sent while KA was enabled 167*55fea89dSDan Cross } tcp_cmn_ctx_b_t; 168eef4f27bSRobert Mustacchi 169eef4f27bSRobert Mustacchi typedef struct { 170eef4f27bSRobert Mustacchi u8_t gen_bd_cid; // 0x0 171eef4f27bSRobert Mustacchi u8_t bd_pre_read; // 0x1 172eef4f27bSRobert Mustacchi u8_t size; // 0x2 173*55fea89dSDan Cross u8_t ctx_type; // 0x3 context type enum 174eef4f27bSRobert Mustacchi u16_t sq_prod; // 0x4 SQ producer, updated by host via mailbox. wraps at size: bits 0 - (k-1): queue element index within page, bits k - 15: page index in page table 175*55fea89dSDan Cross u8_t oubits; // 0x6 ??? 176eef4f27bSRobert Mustacchi u8_t gen_bd_max; // 0x7 177*55fea89dSDan Cross u16_t rq_prod; // 0x8 RQ producer, updated by driver, wraps at rq_size 178*55fea89dSDan Cross u8_t tcp_state; // 0xa TCP state machine 179*55fea89dSDan Cross u8_t tcp_flags; // 0xb 180*55fea89dSDan Cross u32_t tcp_timer1; // 0xc retransmit timer 181eef4f27bSRobert Mustacchi u16_t tcp_timer3; // 182eef4f27bSRobert Mustacchi u16_t tcp_timer2; // 0x10 183*55fea89dSDan Cross u16_t tcp_timer5; // 184*55fea89dSDan Cross u16_t tcp_timer4; // 0x14 185eef4f27bSRobert Mustacchi u32_t tcp_slot_size; // 0x18 186*55fea89dSDan Cross u32_t tcp_snd_cwin; // 0x1c 187*55fea89dSDan Cross u32_t tcp_snd_win; // 0x20 188*55fea89dSDan Cross u8_t tcp_num_retx; // 189*55fea89dSDan Cross u8_t tcp_comp_cons_retx_num; // Last retransmit flush index that was completed by TXP 190eef4f27bSRobert Mustacchi u8_t tcp_tx_protocol_flags; // 0x25 ack/rst/syn/fin indication 191*55fea89dSDan Cross u8_t tcp_num_dupack; // 0x24 number of consecutive duplicate ACK received 192eef4f27bSRobert Mustacchi u32_t tcp_fl; // 0x28 TCP flow label for IPV6 193eef4f27bSRobert Mustacchi u32_t tcp_ssthresh; // 0x2c TCP slow start threshold 194eef4f27bSRobert Mustacchi u32_t tcp_rcv_next; // 0x30 TCP receive next sequence number 195eef4f27bSRobert Mustacchi u32_t tcp_rcv_win_seq; // unused in iSCSI 196eef4f27bSRobert Mustacchi u32_t tcp_snd_una; // 197eef4f27bSRobert Mustacchi u32_t tcp_snd_next; // 198eef4f27bSRobert Mustacchi u32_t tcp_sm_rtt; // 0x40 199eef4f27bSRobert Mustacchi u32_t tcp_sm_delta; // 200eef4f27bSRobert Mustacchi u32_t tcp_max_snd_win; // 201eef4f27bSRobert Mustacchi u8_t tcp_ulp_ooo_flags; 202eef4f27bSRobert Mustacchi u8_t tcp_rcv_seg_scale; // TCP segment scale that is advertised by Xinan 203eef4f27bSRobert Mustacchi u8_t tcp_upload_reason; // 204eef4f27bSRobert Mustacchi u8_t tcp_txp_cmd; // 0x4c index of the ccell that the TXP is currently transmitting 205eef4f27bSRobert Mustacchi u32_t last_ack_sent; // TCP ack sequence of the previous packet transmitted 206eef4f27bSRobert Mustacchi u32_t tcp_offload_seq; // initial TCP seq number of the Xinan side (i.e. bseq + offload_seq = tcp_seq) 207*55fea89dSDan Cross u32_t tcp_tstamp; // 208eef4f27bSRobert Mustacchi u8_t ka_max_probe_cnt; 209eef4f27bSRobert Mustacchi u8_t ka_probe_cnt; 210eef4f27bSRobert Mustacchi u16_t tcp_mss; // mss of the connection 211eef4f27bSRobert Mustacchi u16_t ka_timeout_tick; 212eef4f27bSRobert Mustacchi u8_t krnlq_id; // indicate which krnlq that kcqe should be written to. 213*55fea89dSDan Cross u8_t force_ack_pending; 214eef4f27bSRobert Mustacchi u8_t challenge_ack_state; // refer to tcpm-tcpsecure-09 requirement 215eef4f27bSRobert Mustacchi u8_t unused2; 216eef4f27bSRobert Mustacchi u16_t ka_interval_tick; 217eef4f27bSRobert Mustacchi } tcp_cmn_ctx_l_t; 218eef4f27bSRobert Mustacchi 219eef4f27bSRobert Mustacchi #if defined(LITTLE_ENDIAN) 220eef4f27bSRobert Mustacchi typedef tcp_cmn_ctx_l_t tcp_cmn_ctx_t; 221eef4f27bSRobert Mustacchi #elif defined(BIG_ENDIAN) 222eef4f27bSRobert Mustacchi typedef tcp_cmn_ctx_b_t tcp_cmn_ctx_t; 223eef4f27bSRobert Mustacchi #endif 224eef4f27bSRobert Mustacchi ///////////////////////////////////////////////////////////////////// 225eef4f27bSRobert Mustacchi // TCP RX section 226eef4f27bSRobert Mustacchi ///////////////////////////////////////////////////////////////////// 227eef4f27bSRobert Mustacchi typedef struct { 228eef4f27bSRobert Mustacchi u8_t state; // iooo state 229eef4f27bSRobert Mustacchi u8_t spill_mode:1; 230*55fea89dSDan Cross u8_t mode:7; 231eef4f27bSRobert Mustacchi } iooo_tcp_b_t; 232eef4f27bSRobert Mustacchi 233eef4f27bSRobert Mustacchi typedef struct { 234*55fea89dSDan Cross u8_t mode:7; 235eef4f27bSRobert Mustacchi u8_t spill_mode:1; 236eef4f27bSRobert Mustacchi u8_t state; // iooo state 237eef4f27bSRobert Mustacchi } iooo_tcp_l_t; 238eef4f27bSRobert Mustacchi 239eef4f27bSRobert Mustacchi typedef struct { 240*55fea89dSDan Cross u32_t tcp_snd_wl1; // 241*55fea89dSDan Cross u32_t tcp_snd_wl2; // 242eef4f27bSRobert Mustacchi u8_t tcp_snd_seg_scale; // TCP segment scale that is advertised by the remote peer 243eef4f27bSRobert Mustacchi #if (ISCSI_OOO_SUPPORT) 244eef4f27bSRobert Mustacchi iooo_tcp_b_t iooo_tcp; // iSCSI OOO tcp manager structure 245eef4f27bSRobert Mustacchi u8_t reserved0; 246eef4f27bSRobert Mustacchi #else 247eef4f27bSRobert Mustacchi u8_t reserved0[3]; 248eef4f27bSRobert Mustacchi #endif 249eef4f27bSRobert Mustacchi } tcp_rx_ctx_b_t; 250eef4f27bSRobert Mustacchi 251eef4f27bSRobert Mustacchi typedef struct { 252*55fea89dSDan Cross u32_t tcp_snd_wl1; // 253eef4f27bSRobert Mustacchi u32_t tcp_snd_wl2; // 254eef4f27bSRobert Mustacchi #if (ISCSI_OOO_SUPPORT) 255eef4f27bSRobert Mustacchi iooo_tcp_l_t iooo_tcp; // iSCSI OOO tcp manager structure 256eef4f27bSRobert Mustacchi u8_t reserved0; 257eef4f27bSRobert Mustacchi #else 258eef4f27bSRobert Mustacchi u8_t reserved0[3]; 259eef4f27bSRobert Mustacchi #endif 260*55fea89dSDan Cross u8_t tcp_snd_seg_scale; // TCP segment scale that is advertised by the remote peer 261eef4f27bSRobert Mustacchi } tcp_rx_ctx_l_t; 262eef4f27bSRobert Mustacchi 263eef4f27bSRobert Mustacchi #if defined(LITTLE_ENDIAN) 264eef4f27bSRobert Mustacchi typedef tcp_rx_ctx_l_t tcp_rx_ctx_t; 265eef4f27bSRobert Mustacchi #elif defined(BIG_ENDIAN) 266eef4f27bSRobert Mustacchi typedef tcp_rx_ctx_b_t tcp_rx_ctx_t; 267eef4f27bSRobert Mustacchi #endif 268eef4f27bSRobert Mustacchi 269eef4f27bSRobert Mustacchi #endif /* _TCP_CTX_H */ 270eef4f27bSRobert Mustacchi 271