]> git.proxmox.com Git - ovs.git/blob - datapath-windows/ovsext/NetProto.h
4364c5c6cd69b3df2402613a0d84c44faf3072b0
[ovs.git] / datapath-windows / ovsext / NetProto.h
1 /*
2 * Copyright (c) 2014 VMware, Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef __NET_PROTO_H_
18 #define __NET_PROTO_H_ 1
19
20 #include "precomp.h"
21 #include "Ethernet.h"
22
23 #define ETH_ADDR_LENGTH 6
24 /*
25 * There is a more inclusive definition of ethernet header (Eth_Header) in
26 * OvsEth.h that is used for packet parsing. For simple cases, , use the following definition.
27 */
28 typedef struct EthHdr {
29 UINT8 Destination[ETH_ADDR_LENGTH];
30 UINT8 Source[ETH_ADDR_LENGTH];
31 UINT16 Type;
32 } EthHdr, *PEthHdr;
33
34 #define IPV4 4
35 #define IPV6 6
36
37 #define IP_HDR_MIN_LENGTH 20
38 #define TCP_HDR_MIN_LENGTH 20
39 #define TCP_CSUM_OFFSET 16
40 #define UDP_CSUM_OFFSET 6
41 #define ICMP_CSUM_OFFSET 2
42 #define INET_CSUM_LENGTH (sizeof(UINT16))
43
44 #define IP4_UNITS_TO_BYTES(x) ((x) << 2)
45 #define IP4_BYTES_TO_UNITS(x) ((x) >> 2)
46
47 // length unit for ip->ihl, tcp->doff
48 typedef UINT32 IP4UnitLength;
49
50 #define IP4_LENGTH_UNIT (sizeof(IP4UnitLength))
51 #define IP4_HDR_MIN_LENGTH_IN_UNITS (IP_HDR_MIN_LENGTH / IP4_LENGTH_UNIT)
52 #define TCP_HDR_MIN_LENGTH_IN_UNITS (TCP_HDR_MIN_LENGTH / IP4_LENGTH_UNIT)
53
54 #define IP4_IHL_NO_OPTIONS IP4_HDR_MIN_LENGTH_IN_UNITS
55 #define IP4_HDR_LEN(iph) IP4_UNITS_TO_BYTES((iph)->ihl)
56
57 // length unit for ip->frag_off
58 typedef UINT64 IP4FragUnitLength;
59
60 #define IP4_FRAG_UNIT_LENGTH (sizeof(IP4FragUnitLength))
61
62 // length UINT for ipv6 header length.
63 typedef UINT64 IP6UnitLength;
64
65 #define TCP_HDR_LEN(tcph) IP4_UNITS_TO_BYTES((tcph)->doff)
66 #define TCP_DATA_LENGTH(iph, tcph) (ntohs(iph->tot_len) - \
67 IP4_HDR_LEN(iph) - TCP_HDR_LEN(tcph))
68
69 #define TCP_DATA_OFFSET_NO_OPTIONS TCP_HDR_MIN_LENGTH_IN_UNITS
70 #define TCP_DATA_OFFSET_WITH_TIMESTAMP 8
71
72 /*
73 * This is the maximum value for the length field in the IP header. The meaning
74 * varies with IP protocols:
75 * IPv4: the total ip length (including ip header and extention)
76 * IPv6: the IP payload length (including IP extensions)
77 */
78 #define IP_MAX_PACKET 0xFFFF
79
80 #define IPPROTO_ICMP 1
81 #define IPPROTO_IGMP 2
82 #define IPPROTO_UDP 17
83 #define IPPROTO_GRE 47
84 #define IPPROTO_TCP 6
85 #define IPPROTO_SCTP 132
86 #define IPPROTO_RSVD 0xff
87
88 #define IPPROTO_HOPOPTS 0 /* Hop-by-hop option header */
89 #define IPPROTO_IPV6 41 /* IPv6 in IPv6 */
90 #define IPPROTO_ROUTING 43 /* Routing header */
91 #define IPPROTO_FRAGMENT 44 /* Fragmentation/reassembly header */
92 #define IPPROTO_GRE 47 /* General Routing Encapsulation */
93 #define IPPROTO_ESP 50 /* Encap. Security Payload */
94 #define IPPROTO_AH 51 /* Authentication header */
95 #define IPPROTO_ICMPV6 58 /* ICMP for IPv6 */
96 #define IPPROTO_NONE 59 /* No next header */
97 #define IPPROTO_DSTOPTS 60 /* Destination options header */
98 #define IPPROTO_ETHERIP 97 /* etherIp tunneled protocol */
99
100 /* ICMPv6 types. */
101 #define ND_NEIGHBOR_SOLICIT 135 /* neighbor solicitation */
102 #define ND_NEIGHBOR_ADVERT 136 /* neighbor advertisment */
103
104 /* IPv6 Neighbor discovery option header. */
105 #define ND_OPT_SOURCE_LINKADDR 1
106 #define ND_OPT_TARGET_LINKADDR 2
107
108 /* Collides with MS definition (opposite order) */
109 #define IP6F_OFF_HOST_ORDER_MASK 0xfff8
110
111 #define ARPOP_REQUEST 1 /* ARP request. */
112 #define ARPOP_REPLY 2 /* ARP reply. */
113 #define RARPOP_REQUEST 3 /* RARP request. */
114 #define RARPOP_REPLY 4 /* RARP reply. */
115
116 /* all ARP NBO's assume short ar_op */
117 #define ARPOP_REQUEST_NBO 0x0100 /* NBO ARP request. */
118 #define ARPOP_REPLY_NBO 0x0200 /* NBO ARP reply. */
119 #define RARPOP_REQUEST_NBO 0x0300 /* NBO RARP request. */
120 #define RARPOP_REPLY_NBO 0x0300 /* NBO RARP reply. */
121
122 #define ICMP_ECHO 8 /* Echo Request */
123 #define ICMP_ECHOREPLY 0 /* Echo Reply */
124 #define ICMP_DEST_UNREACH 3 /* Destination Unreachable */
125
126 /* IGMP related constants */
127 #define IGMP_UNKNOWN 0x00 /* For IGMP packets where we don't know the type */
128 /* Eg: Fragmented packets without the header */
129
130 /* Constants from RFC 3376 */
131 #define IGMP_QUERY 0x11 /* IGMP Host Membership Query. */
132 #define IGMP_V1REPORT 0x12 /* IGMPv1 Host Membership Report. */
133 #define IGMP_V2REPORT 0x16 /* IGMPv2 Host Membership Report. */
134 #define IGMP_V3REPORT 0x22 /* IGMPv3 Host Membership Report. */
135 #define IGMP_V2LEAVE 0x17 /* IGMPv2 Leave. */
136
137 /* Constants from RFC 2710 and RFC 3810 */
138 #define MLD_QUERY 0x82 /* Multicast Listener Query. */
139 #define MLD_V1REPORT 0x83 /* Multicast Listener V1 Report. */
140 #define MLD_V2REPORT 0x8F /* Multicast Listener V2 Report. */
141 #define MLD_DONE 0x84 /* Multicast Listener Done. */
142
143 /* IPv4 offset flags */
144 #define IP_CE 0x8000 /* Flag: "Congestion" */
145 #define IP_DF 0x4000 /* Flag: "Don't Fragment" */
146 #define IP_MF 0x2000 /* Flag: "More Fragments" */
147 #define IP_OFFSET 0x1FFF /* "Fragment Offset" part */
148
149 #define IP_OFFSET_NBO 0xFF1F /* "Fragment Offset" part, NBO */
150 #define IP_DF_NBO 0x0040 /* NBO version of don't fragment */
151 #define IP_MF_NBO 0x0020 /* NBO version of more fragments */
152
153 #define IPOPT_RTRALT 0x94
154
155 /* IP Explicit Congestion Notification bits (TOS field) */
156 #define IP_ECN_NOT_ECT 0
157 #define IP_ECN_ECT_1 1
158 #define IP_ECN_ECT_0 2
159 #define IP_ECN_CE 3
160 #define IP_ECN_MASK 3
161
162 /* TCP options */
163 #define TCP_OPT_NOP 1 /* Padding */
164 #define TCP_OPT_EOL 0 /* End of options */
165 #define TCP_OPT_MSS 2 /* Segment size negotiating */
166 #define TCP_OPT_WINDOW 3 /* Window scaling */
167 #define TCP_OPT_SACK_PERM 4 /* SACK Permitted */
168 #define TCP_OPT_SACK 5 /* SACK Block */
169 #define TCP_OPT_TIMESTAMP 8 /* Better RTT estimations/PAWS */
170 #define TCP_OPT_MD5SIG 19 /* MD5 Signature (RFC2385) */
171
172 #define TCP_OPT_LEN_MSS 4
173 #define TCP_OPT_LEN_WINDOW 3
174 #define TCP_OPT_LEN_SACK_PERM 2
175 #define TCP_OPT_LEN_TIMESTAMP 10
176 #define TCP_OPT_LEN_MD5SIG 18
177
178 #define SOCKET_IPPROTO_HOPOPTS IPPROTO_HOPOPTS
179 #define SOCKET_IPPROTO_ROUTING IPPROTO_ROUTING
180 #define SOCKET_IPPROTO_FRAGMENT IPPROTO_FRAGMENT
181 #define SOCKET_IPPROTO_AH IPPROTO_AH
182 #define SOCKET_IPPROTO_ICMPV6 IPPROTO_ICMPV6
183 #define SOCKET_IPPROTO_NONE IPPROTO_NONE
184 #define SOCKET_IPPROTO_DSTOPTS IPPROTO_DSTOPTS
185 #define SOCKET_IPPROTO_EON 80
186 #define SOCKET_IPPROTO_ETHERIP IPPROTO_ETHERIP
187 #define SOCKET_IPPROTO_ENCAP 98
188 #define SOCKET_IPPROTO_PIM 103
189 #define SOCKET_IPPROTO_IPCOMP 108
190 #define SOCKET_IPPROTO_CARP 112
191 #define SOCKET_IPPROTO_PFSYNC 240
192 #define SOCKET_IPPROTO_RAW IPPROTO_RSVD
193
194 typedef union _OVS_PACKET_HDR_INFO {
195 struct {
196 UINT16 l3Offset;
197 UINT16 l4Offset;
198 union {
199 UINT16 l7Offset;
200 UINT16 l4PayLoad;
201 };
202 UINT16 isIPv4:1;
203 UINT16 isIPv6:1;
204 UINT16 isTcp:1;
205 UINT16 isUdp:1;
206 UINT16 isSctp:1;
207 UINT16 tcpCsumNeeded:1;
208 UINT16 udpCsumNeeded:1;
209 UINT16 udpCsumZero:1;
210 UINT16 pad:9;
211 } ;
212 UINT64 value;
213 } OVS_PACKET_HDR_INFO, *POVS_PACKET_HDR_INFO;
214
215 typedef struct IPHdr {
216 UINT8 ihl:4,
217 version:4;
218 UINT8 tos;
219 UINT16 tot_len;
220 UINT16 id;
221 UINT16 frag_off;
222 UINT8 ttl;
223 UINT8 protocol;
224 UINT16 check;
225 UINT32 saddr;
226 UINT32 daddr;
227 } IPHdr;
228
229
230 /*
231 * IPv6 fixed header
232 *
233 * BEWARE, it is incorrect. The first 4 bits of flow_lbl
234 * are glued to priority now, forming "class".
235 */
236
237 typedef struct IPv6Hdr {
238 UINT8 priority:4,
239 version:4;
240 UINT8 flow_lbl[3];
241
242 UINT16 payload_len;
243 UINT8 nexthdr;
244 UINT8 hop_limit;
245
246 struct in6_addr saddr;
247 struct in6_addr daddr;
248 } IPv6Hdr;
249
250 // Generic IPv6 extension header
251 typedef struct IPv6ExtHdr {
252 UINT8 nextHeader; // type of the next header
253 UINT8 hdrExtLen; // length of header extensions (beyond 8 bytes)
254 UINT16 optPad1;
255 UINT32 optPad2;
256 } IPv6ExtHdr;
257
258 typedef struct IPv6FragHdr {
259 UINT8 nextHeader;
260 UINT8 reserved;
261 UINT16 offlg;
262 UINT32 ident;
263 } IPv6FragHdr;
264
265 typedef struct IPv6NdOptHdr {
266 UINT8 type;
267 UINT8 len;
268 } IPv6NdOptHdr;
269
270 typedef struct ICMPHdr {
271 UINT8 type;
272 UINT8 code;
273 UINT16 checksum;
274 } ICMPHdr;
275
276 typedef struct ICMPEcho {
277 UINT16 id;
278 UINT16 seq;
279 } ICMPEcho;
280
281 typedef struct UDPHdr {
282 UINT16 source;
283 UINT16 dest;
284 UINT16 len;
285 UINT16 check;
286 } UDPHdr;
287
288 typedef struct TCPHdr {
289 UINT16 source;
290 UINT16 dest;
291 UINT32 seq;
292 UINT32 ack_seq;
293 UINT16 res1:4,
294 doff:4,
295 fin:1,
296 syn:1,
297 rst:1,
298 psh:1,
299 ack:1,
300 urg:1,
301 ece:1,
302 cwr:1;
303 UINT16 window;
304 UINT16 check;
305 UINT16 urg_ptr;
306 } TCPHdr;
307
308 typedef struct SCTPHdr {
309 UINT16 source;
310 UINT16 dest;
311 UINT32 vtag;
312 UINT32 check;
313 } SCTPHdr;
314
315 typedef struct PseudoHdr {
316 UINT32 sourceIPAddr;
317 UINT32 destIPAddr;
318 UINT8 zero;
319 UINT8 protocol;
320 UINT16 length;
321 } PseudoHdr;
322
323 typedef struct PseudoHdrIPv6 {
324 UINT8 sourceIPAddr[16];
325 UINT8 destIPAddr[16];
326 UINT8 zero;
327 UINT8 protocol;
328 UINT16 length;
329 } PseudoHdrIPv6;
330
331
332 struct ArpHdr {
333 UINT16 ar_hrd; /* Format of hardware address. */
334 UINT16 ar_pro; /* Format of protocol address. */
335 UINT8 ar_hln; /* Length of hardware address. */
336 UINT8 ar_pln; /* Length of protocol address. */
337 UINT16 ar_op; /* ARP opcode (command). */
338 };
339
340 typedef struct EtherArp {
341 struct ArpHdr ea_hdr; /* fixed-size header */
342 Eth_Address arp_sha; /* sender hardware address */
343 UINT8 arp_spa[4]; /* sender protocol address */
344 Eth_Address arp_tha; /* target hardware address */
345 UINT8 arp_tpa[4]; /* target protocol address */
346 } EtherArp;
347
348 typedef struct IGMPHdr {
349 UINT8 type;
350 UINT8 maxResponseTime;
351 UINT16 csum;
352 UINT8 groupAddr[4];
353 } IGMPHdr;
354
355 typedef struct IGMPV3Trailer {
356 UINT8 qrv:3,
357 s:1,
358 resv:4;
359 UINT8 qqic;
360 UINT16 numSources;
361 } IGMPV3Trailer;
362
363 typedef struct IPOpt {
364 UINT8 type;
365 UINT8 length;
366 UINT16 value;
367 } IPOpt;
368
369 /*
370 * IP protocol types
371 */
372 #define SOCKET_IPPROTO_IP 0
373 #define SOCKET_IPPROTO_ICMP 1
374 #define SOCKET_IPPROTO_TCP 6
375 #define SOCKET_IPPROTO_UDP 17
376 #define SOCKET_IPPROTO_GRE 47
377 #define SOCKET_IPPROTO_SCTP 132
378
379 #endif /* __NET_PROTO_H_ */