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