FreeBSD kernel IPv4 code
tcp_lro.h
Go to the documentation of this file.
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2006, Myricom Inc.
5 * Copyright (c) 2008, Intel Corporation.
6 * Copyright (c) 2016-2021 Mellanox Technologies.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * $FreeBSD$
31 */
32
33#ifndef _TCP_LRO_H_
34#define _TCP_LRO_H_
35
36#include <sys/time.h>
37#include <netinet/in.h>
38
39#ifndef TCP_LRO_ENTRIES
40/* Define default number of LRO entries per RX queue */
41#define TCP_LRO_ENTRIES 8
42#endif
43
44/*
45 * Flags for ACK entry for compression
46 * the bottom 12 bits has the th_x2|th_flags.
47 * LRO itself adds only the TSTMP flags
48 * to indicate if either of the types
49 * of timestamps are filled and the
50 * HAS_TSTMP option to indicate if the
51 * TCP timestamp option is valid.
52 *
53 * The other 1 flag bits are for processing
54 * by a stack.
55 *
56 */
57#define TSTMP_LRO 0x1000
58#define TSTMP_HDWR 0x2000
59#define HAS_TSTMP 0x4000
60/*
61 * Default number of interrupts on the same cpu in a row
62 * that will cause us to declare a "affinity cpu".
63 */
64#define TCP_LRO_CPU_DECLARATION_THRESH 50
65
66struct inpcb;
67
69 u_long raw[1];
70 struct {
71 uint8_t lro_type; /* internal */
72#define LRO_TYPE_NONE 0
73#define LRO_TYPE_IPV4_TCP 1
74#define LRO_TYPE_IPV6_TCP 2
75#define LRO_TYPE_IPV4_UDP 3
76#define LRO_TYPE_IPV6_UDP 4
78#define LRO_FLAG_DECRYPTED 1
79 uint16_t vlan_id; /* VLAN identifier */
80 uint16_t s_port; /* source TCP/UDP port */
81 uint16_t d_port; /* destination TCP/UDP port */
82 uint32_t vxlan_vni; /* VXLAN virtual network identifier */
83 union {
84 struct in_addr v4;
85 struct in6_addr v6;
86 } s_addr; /* source IPv4/IPv6 address */
87 union {
88 struct in_addr v4;
89 struct in6_addr v6;
90 } d_addr; /* destination IPv4/IPv6 address */
91 };
92} __aligned(sizeof(u_long));
93
94#define LRO_RAW_ADDRESS_MAX \
95 (sizeof(union lro_address) / sizeof(u_long))
96
97/* Optimize address comparison by comparing one unsigned long at a time: */
98
99static inline bool
100lro_address_compare(const union lro_address *pa, const union lro_address *pb)
101{
102 if (pa->lro_type == LRO_TYPE_NONE && pb->lro_type == LRO_TYPE_NONE) {
103 return (true);
104 } else for (unsigned i = 0; i < LRO_RAW_ADDRESS_MAX; i++) {
105 if (pa->raw[i] != pb->raw[i])
106 return (false);
107 }
108 return (true);
109}
110
113 union {
115 struct ip *ip4;
116 struct ip6_hdr *ip6;
117 };
118 union {
120 struct tcphdr *tcp;
121 struct udphdr *udp;
122 };
125
126/* This structure is zeroed frequently, try to keep it small. */
127struct lro_entry {
130 struct mbuf *m_head;
131 struct mbuf *m_tail;
132 struct mbuf *m_last_mbuf;
135 uint32_t next_seq; /* tcp_seq */
136 uint32_t ack_seq; /* tcp_seq */
142 uint16_t flags : 12, /* 12 TCP header bits */
145 reserved : 2; /* unused */
146 struct bintime alloc_time; /* time when entry was allocated */
147};
148
150
152 uint64_t seq;
153 struct mbuf *mb;
154};
155
156/* NB: This is part of driver structs. */
157struct lro_ctrl {
158 struct ifnet *ifp;
160 struct bintime lro_last_queue_time; /* last time data was queued */
161 uint64_t lro_queued;
162 uint64_t lro_flushed;
163 uint64_t lro_bad_csum;
164 unsigned lro_cnt;
166 unsigned lro_mbuf_max;
167 unsigned short lro_ackcnt_lim; /* max # of aggregated ACKs */
168 unsigned short lro_cpu; /* Guess at the cpu we have affinity too */
169 unsigned lro_length_lim; /* max len of aggregated data */
173 struct lro_head *lro_hash;
174 struct lro_head lro_active;
175 struct lro_head lro_free;
176 uint8_t lro_cpu_is_set; /* Flag to say its ok to set the CPU on the inp */
177};
178
180 uint64_t timestamp; /* hardware or sofware timestamp, valid if TSTMP_LRO or TSTMP_HDRW set */
181 uint32_t seq; /* th_seq value */
182 uint32_t ack; /* th_ack value */
183 uint32_t ts_value; /* If ts option value, valid if HAS_TSTMP is set */
184 uint32_t ts_echo; /* If ts option echo, valid if HAS_TSTMP is set */
185 uint16_t win; /* TCP window */
186 uint16_t flags; /* Flags to say if TS is present and type of timestamp and th_flags */
187 uint8_t codepoint; /* IP level codepoint including ECN bits */
188 uint8_t ack_val_set; /* Classification of ack used by the stack */
189 uint8_t pad[2]; /* To 32 byte boundary */
190};
191
192/* We use two M_PROTO on the mbuf */
193#define M_ACKCMP M_PROTO4 /* Indicates LRO is sending in a Ack-compression mbuf */
194#define M_LRO_EHDRSTRP M_PROTO6 /* Indicates that LRO has stripped the etherenet header */
195
196#define TCP_LRO_LENGTH_MAX (65535 - 255) /* safe value with room for outer headers */
197#define TCP_LRO_ACKCNT_MAX 65535 /* unlimited */
198
199int tcp_lro_init(struct lro_ctrl *);
200int tcp_lro_init_args(struct lro_ctrl *, struct ifnet *, unsigned, unsigned);
201void tcp_lro_free(struct lro_ctrl *);
202void tcp_lro_flush_inactive(struct lro_ctrl *, const struct timeval *);
203void tcp_lro_flush(struct lro_ctrl *, struct lro_entry *);
204void tcp_lro_flush_all(struct lro_ctrl *);
205int tcp_lro_rx(struct lro_ctrl *, struct mbuf *, uint32_t);
206void tcp_lro_queue_mbuf(struct lro_ctrl *, struct mbuf *);
207void tcp_lro_reg_mbufq(void);
208void tcp_lro_dereg_mbufq(void);
209
210#define TCP_LRO_NO_ENTRIES -2
211#define TCP_LRO_CANNOT -1
212#define TCP_LRO_NOT_SUPPORTED 1
213
214#endif /* _TCP_LRO_H_ */
__uint32_t uint32_t
Definition: in.h:62
__uint16_t uint16_t
Definition: in.h:57
__uint8_t uint8_t
Definition: in.h:52
ipfw_dyn_rule * next
Definition: ip_fw.h:0
Definition: in.h:83
Definition: in_pcb.h:217
Definition: ip6.h:74
Definition: ip.h:51
struct lro_head * lro_hash
Definition: tcp_lro.h:173
uint64_t lro_bad_csum
Definition: tcp_lro.h:163
struct ifnet * ifp
Definition: tcp_lro.h:158
unsigned lro_mbuf_max
Definition: tcp_lro.h:166
struct bintime lro_last_queue_time
Definition: tcp_lro.h:160
unsigned lro_mbuf_count
Definition: tcp_lro.h:165
unsigned lro_cnt
Definition: tcp_lro.h:164
uint8_t lro_cpu_is_set
Definition: tcp_lro.h:176
uint64_t lro_queued
Definition: tcp_lro.h:161
u_long lro_hashsz
Definition: tcp_lro.h:170
uint32_t lro_cnt_of_same_cpu
Definition: tcp_lro.h:172
unsigned short lro_ackcnt_lim
Definition: tcp_lro.h:167
uint64_t lro_flushed
Definition: tcp_lro.h:162
struct lro_mbuf_sort * lro_mbuf_data
Definition: tcp_lro.h:159
unsigned lro_length_lim
Definition: tcp_lro.h:169
uint32_t lro_last_cpu
Definition: tcp_lro.h:171
unsigned short lro_cpu
Definition: tcp_lro.h:168
struct lro_head lro_active
Definition: tcp_lro.h:174
struct lro_head lro_free
Definition: tcp_lro.h:175
Definition: tcp_lro.h:127
LIST_ENTRY(lro_entry) next
struct lro_parser outer
Definition: tcp_lro.h:133
struct mbuf * m_head
Definition: tcp_lro.h:130
uint16_t timestamp
Definition: tcp_lro.h:143
struct lro_parser inner
Definition: tcp_lro.h:134
uint32_t next_seq
Definition: tcp_lro.h:135
LIST_ENTRY(lro_entry) hash_next
uint16_t compressed
Definition: tcp_lro.h:139
uint16_t reserved
Definition: tcp_lro.h:145
uint32_t tsecr
Definition: tcp_lro.h:138
uint32_t tsval
Definition: tcp_lro.h:137
struct mbuf * m_tail
Definition: tcp_lro.h:131
uint16_t uncompressed
Definition: tcp_lro.h:140
uint16_t flags
Definition: tcp_lro.h:142
uint16_t needs_merge
Definition: tcp_lro.h:144
uint16_t window
Definition: tcp_lro.h:141
uint32_t ack_seq
Definition: tcp_lro.h:136
struct mbuf * m_last_mbuf
Definition: tcp_lro.h:132
struct bintime alloc_time
Definition: tcp_lro.h:146
uint64_t seq
Definition: tcp_lro.h:152
struct mbuf * mb
Definition: tcp_lro.h:153
uint8_t * l3
Definition: tcp_lro.h:114
struct tcphdr * tcp
Definition: tcp_lro.h:120
uint8_t * l4
Definition: tcp_lro.h:119
union lro_address data
Definition: tcp_lro.h:112
struct ip6_hdr * ip6
Definition: tcp_lro.h:116
struct udphdr * udp
Definition: tcp_lro.h:121
struct ip * ip4
Definition: tcp_lro.h:115
uint16_t total_hdr_len
Definition: tcp_lro.h:123
uint8_t ack_val_set
Definition: tcp_lro.h:188
uint64_t timestamp
Definition: tcp_lro.h:180
uint32_t ts_echo
Definition: tcp_lro.h:184
uint16_t win
Definition: tcp_lro.h:185
uint8_t codepoint
Definition: tcp_lro.h:187
uint32_t seq
Definition: tcp_lro.h:181
uint8_t pad[2]
Definition: tcp_lro.h:189
uint32_t ts_value
Definition: tcp_lro.h:183
uint32_t ack
Definition: tcp_lro.h:182
uint16_t flags
Definition: tcp_lro.h:186
Definition: udp.h:45
void tcp_lro_flush_all(struct lro_ctrl *)
Definition: tcp_lro.c:1496
LIST_HEAD(lro_head, lro_entry)
void tcp_lro_flush_inactive(struct lro_ctrl *, const struct timeval *)
Definition: tcp_lro.c:596
int tcp_lro_init_args(struct lro_ctrl *, struct ifnet *, unsigned, unsigned)
Definition: tcp_lro.c:171
void tcp_lro_queue_mbuf(struct lro_ctrl *, struct mbuf *)
Definition: tcp_lro.c:1941
void tcp_lro_reg_mbufq(void)
Definition: tcp_lro.c:136
struct lro_parser __aligned
#define LRO_TYPE_NONE
Definition: tcp_lro.h:3
void tcp_lro_dereg_mbufq(void)
Definition: tcp_lro.c:142
void tcp_lro_flush(struct lro_ctrl *, struct lro_entry *)
Definition: tcp_lro.c:1383
#define LRO_RAW_ADDRESS_MAX
Definition: tcp_lro.h:94
int tcp_lro_init(struct lro_ctrl *)
Definition: tcp_lro.c:165
static bool lro_address_compare(const union lro_address *pa, const union lro_address *pb)
Definition: tcp_lro.h:100
void tcp_lro_free(struct lro_ctrl *)
Definition: tcp_lro.c:491
int tcp_lro_rx(struct lro_ctrl *, struct mbuf *, uint32_t)
Definition: tcp_lro.c:1916
uint8_t lro_flags
Definition: tcp_lro.h:77
u_long raw[1]
Definition: tcp_lro.h:69
uint32_t vxlan_vni
Definition: tcp_lro.h:82
struct in_addr v4
Definition: tcp_lro.h:84
uint8_t lro_type
Definition: tcp_lro.h:71
uint16_t s_port
Definition: tcp_lro.h:80
uint16_t vlan_id
Definition: tcp_lro.h:79
struct in6_addr v6
Definition: tcp_lro.h:85
uint16_t d_port
Definition: tcp_lro.h:81
union lro_address::@41::@44 d_addr
union lro_address::@41::@43 s_addr