1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2018 Joyent, Inc.
*/
#ifndef _SYS_PATTR_H
#define _SYS_PATTR_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Attribute types and structures.
*/
#define PATTR_DSTADDRSAP 0x1 /* destination physical address+SAP */
#define PATTR_SRCADDRSAP 0x2 /* source physical address+SAP */
#define PATTR_HCKSUM 0x3 /* hardware checksum attribute */
#define PATTR_ZCOPY 0x4 /* zerocopy attribute */
/*
* Structure shared by {source,destination} physical address+SAP attributes.
*/
typedef struct pattr_addr_s {
uint8_t addr_is_group; /* address is broadcast or multicast */
uint8_t addr_len; /* length of address */
uint8_t addr[1]; /* address */
} pattr_addr_t;
/*
* Structure used for Hardware Checksum attribute.
*/
typedef struct pattr_hcksum_s {
uint32_t hcksum_start_offset;
uint32_t hcksum_stuff_offset;
uint32_t hcksum_end_offset;
union {
uint64_t value;
uint16_t inet_cksum; /* to store H/W computed cksum value */
} hcksum_cksum_val;
uint32_t hcksum_flags;
} pattr_hcksum_t;
/*
* Values for hcksum_flags
*
* Although not explicit in the names, the first set refers to "outer" headers.
*/
#define HCK_IPV4_HDRCKSUM 0x01 /* On Transmit: Compute IP header */
/* checksum in hardware. */
#define HCK_IPV4_HDRCKSUM_OK 0x01 /* On Receive: IP header checksum */
/* was verified by h/w and is */
/* correct. */
#define HCK_PARTIALCKSUM 0x02 /* On Transmit: Compute partial 1's */
/* complement checksum based on */
/* start, stuff and end offsets. */
/* On Receive : Partial checksum */
/* computed and attached. */
#define HCK_FULLCKSUM 0x04 /* On Transmit: Compute full(in case */
/* of TCP/UDP, full is pseudo-header */
/* + header + payload) checksum for */
/* this packet. */
/* On Receive : Full checksum */
/* computed in h/w and is attached */
#define HCK_FULLCKSUM_OK 0x08 /* On Transmit: N/A */
/* On Receive: Full checksum status */
/* If set, implies full checksum */
/* computation was successful */
/* i.e. checksum was correct. */
/* If it is not set, IP will also */
/* check the attached h/w computed */
/* checksum value to determine if */
/* checksum was bad */
/*
* This second set refers to "inner" headers.
*/
#define HCK_INNER_IPV4_HDRCKSUM_OK 0x20 /* On Transmit: N/A */
/* On Receive: equivalent to */
/* HCK_IPV4_HDRCKSUM_OK for the inner */
/* header */
#define HCK_INNER_IPV4_HDRCKSUM_NEEDED 0x20 /* On Transmit: equivalent to */
/* HCK_IPV4_HDRCKSUM; HW calculates */
/* inner checksum */
#define HCK_INNER_FULLCKSUM_OK 0x40 /* On Transmit: N/A */
/* On Receive: equivalent to */
/* HCK_FULLCKSUM_OK for the inner */
/* header */
#define HCK_INNER_FULLCKSUM_NEEDED 0x40 /* On Transmit: equivalent to */
/* HCK_FULLCKSUM; HW calculates inner */
/* L4 header checksum. */
#define HCK_INNER_PSEUDO_NEEDED 0x80 /* On Transmit: offload */
/* of the inner TCP/UDP header, but */
/* requires that the pseudo-header */
/* is filled in the checksum. Like */
/* HCK_PARTIALCKSUM, but no fields */
/* saved */
#define HCK_INNER_FLAGS_NEEDED (HCK_INNER_IPV4_HDRCKSUM_NEEDED | \
HCK_INNER_FULLCKSUM_NEEDED | \
HCK_INNER_PSEUDO_NEEDED)
#define HCK_INNER_FLAGS (HCK_INNER_IPV4_HDRCKSUM_OK | \
HCK_INNER_FULLCKSUM_OK | \
HCK_INNER_FLAGS_NEEDED)
#define HCK_OUTER_FLAGS (HCK_IPV4_HDRCKSUM | HCK_PARTIALCKSUM | \
HCK_FULLCKSUM | HCK_FULLCKSUM_OK)
#define HCK_FLAGS (HCK_INNER_FLAGS | HCK_OUTER_FLAGS)
/*
* Extended hardware offloading flags that also use hcksum_flags
*/
#define HW_LSO 0x10 /* On Transmit: hardware does LSO */
/* On Receive: N/A */
#define HW_LSO_FLAGS HW_LSO /* All LSO flags, currently only one */
/*
* The upper three bits are used to indicate if the packet has any known
* tunneling information.
*/
#define TTYPE_MASK 0xe000
#define TTYPE_SHIFT 13
#define TTYPE_NONE 0x00
#define TTYPE_VXLAN 0x01
/*
* Structure used for zerocopy attribute.
*/
typedef struct pattr_zcopy_s {
uint_t zcopy_flags;
} pattr_zcopy_t;
#ifdef __cplusplus
}
#endif
#endif /* _SYS_PATTR_H */
|