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