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