Update appveyor OpenSSL link
[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_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:8;
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_ */