summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/pattr.h
blob: 6545c5d619ec0b4a5f42866e74155ce9aaa8a2f6 (plain)
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 */