datapath-windows: Fix IP fragmentation
[cascardo/ovs.git] / datapath-windows / ovsext / DpInternal.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 __DP_INTERNAL_H_
18 #define __DP_INTERNAL_H_ 1
19
20 #include <netioapi.h>
21 #define IFNAMSIZ IF_NAMESIZE
22 #include "../ovsext/Netlink/Netlink.h"
23
24 #define OVS_DP_NUMBER   ((uint32_t) 0)
25
26 typedef __declspec(align(8)) uint64_t Ovs64AlignedU64;
27 typedef __declspec(align(8)) ovs_be64 Ovs64AlignedBe64;
28 #pragma pack(push, 1)
29
30 #define OVS_MAX_PORT_NAME_LENGTH IFNAMSIZ
31
32 typedef struct _OVS_VPORT_GET {
33     uint32_t dpNo;
34     uint32_t portNo;
35     char     name[OVS_MAX_PORT_NAME_LENGTH];
36 } OVS_VPORT_GET, *POVS_VPORT_GET;
37
38 #define OVS_MAX_VM_UUID_LEN 128
39 #define OVS_MAX_VIF_UUID_LEN 128
40
41 typedef struct _OVS_VPORT_EXT_INFO {
42     uint32_t dpNo;
43     uint32_t portNo;
44     uint8_t macAddress[ETH_ADDR_LEN];
45     uint8_t permMACAddress[ETH_ADDR_LEN];
46     uint8_t vmMACAddress[ETH_ADDR_LEN];
47     uint16_t nicIndex;
48     uint32_t portId;
49     uint32_t type;
50     uint32_t mtu;
51     char name[OVS_MAX_PORT_NAME_LENGTH];
52     uint32_t status;
53     char vmUUID[OVS_MAX_VM_UUID_LEN];
54     char vifUUID[OVS_MAX_VIF_UUID_LEN];
55 } OVS_VPORT_EXT_INFO, *POVS_VPORT_EXT_INFO;
56
57
58 /* Flows. */
59 #define OVSWIN_VLAN_CFI 0x1000
60
61 /* Used for OvsFlowKey's dlType member for frames that have no Ethernet type,
62  * that is, pure 802.2 frames. */
63 #define OVSWIN_DL_TYPE_NONE 0x5ff
64
65 typedef struct L4Key {
66     ovs_be16 tpSrc;              /* TCP/UDP/SCTP source port. */
67     ovs_be16 tpDst;              /* TCP/UDP/SCTP destination port. */
68 } L4Key;
69
70 typedef struct Ipkey {
71     ovs_be32 nwSrc;              /* IPv4 source address. */
72     ovs_be32 nwDst;              /* IPv4 destination address. */
73     uint8_t nwProto;             /* IP protocol or low 8 bits of ARP opcode. */
74     uint8_t nwTos;               /* IP ToS (including DSCP and ECN). */
75     uint8_t nwTtl;               /* IP TTL/Hop Limit. */
76     uint8_t nwFrag;              /* FLOW_FRAG_* flags. */
77     L4Key   l4;
78 } IpKey;  /* Size of 16 byte. */
79
80 typedef struct ArpKey {
81     ovs_be32 nwSrc;              /* IPv4 source address. */
82     ovs_be32 nwDst;              /* IPv4 destination address. */
83     uint8_t arpSha[6];           /* ARP/ND source hardware address. */
84     uint8_t arpTha[6];           /* ARP/ND target hardware address. */
85     uint8_t nwProto;             /* IP protocol or low 8 bits of ARP opcode. */
86     uint8_t pad[3];
87 } ArpKey; /* Size of 24 byte. */
88
89 typedef struct Ipv6Key {
90     struct in6_addr ipv6Src;     /* IPv6 source address. */
91     struct in6_addr ipv6Dst;     /* IPv6 destination address. */
92     ovs_be32 ipv6Label;          /* IPv6 flow label. */
93     uint8_t nwProto;             /* IP protocol or low 8 bits of ARP opcode. */
94     uint8_t nwTos;               /* IP ToS (including DSCP and ECN). */
95     uint8_t nwTtl;               /* IP TTL/Hop Limit. */
96     uint8_t nwFrag;              /* FLOW_FRAG_* flags. */
97     L4Key  l4;
98     uint32_t pad;
99 } Ipv6Key;  /* Size of 48 byte. */
100
101 typedef struct Icmp6Key {
102     struct in6_addr ipv6Src;     /* IPv6 source address. */
103     struct in6_addr ipv6Dst;     /* IPv6 destination address. */
104     ovs_be32 ipv6Label;          /* IPv6 flow label. */
105     uint8_t nwProto;             /* IP protocol or low 8 bits of ARP opcode. */
106     uint8_t nwTos;               /* IP ToS (including DSCP and ECN). */
107     uint8_t nwTtl;               /* IP TTL/Hop Limit. */
108     uint8_t nwFrag;              /* FLOW_FRAG_* flags. */
109     L4Key  l4;
110     uint8_t arpSha[6];           /* ARP/ND source hardware address. */
111     uint8_t arpTha[6];           /* ARP/ND target hardware address. */
112     struct in6_addr ndTarget;    /* IPv6 neighbor discovery (ND) target. */
113 } Icmp6Key; /* Size of 72 byte. */
114
115 typedef struct L2Key {
116     uint32_t inPort;             /* Port number of input port. */
117     union {
118         struct {
119             uint16_t offset;
120             uint16_t keyLen;
121         };
122         uint32_t val;
123     };
124     uint8_t dlSrc[6];            /* Ethernet source address. */
125     uint8_t dlDst[6];            /* Ethernet destination address. */
126     ovs_be16 vlanTci;            /* If 802.1Q, TCI | VLAN_CFI; otherwise 0. */
127     ovs_be16 dlType;             /* Ethernet frame type. */
128 } L2Key;  /* Size of 24 byte. */
129
130 /* Number of packet attributes required to store OVS tunnel key. */
131 #define NUM_PKT_ATTR_REQUIRED 3
132
133 typedef union OvsIPv4TunnelKey {
134     struct {
135         ovs_be32 dst;
136         ovs_be32 src;
137         ovs_be64 tunnelId;
138         uint16_t flags;
139         uint8_t  tos;
140         uint8_t  ttl;
141         union {
142             uint32_t pad;
143             struct {
144                 ovs_be16 dst_port;
145                 uint16_t flow_hash;
146             };
147         };
148     };
149     uint64_t attr[NUM_PKT_ATTR_REQUIRED];
150 } OvsIPv4TunnelKey;
151
152 typedef __declspec(align(8)) struct OvsFlowKey {
153     OvsIPv4TunnelKey tunKey;     /* 24 bytes */
154     L2Key l2;                    /* 24 bytes */
155     union {
156         IpKey ipKey;             /* size 16 */
157         ArpKey arpKey;           /* size 24 */
158         Ipv6Key ipv6Key;         /* size 48 */
159         Icmp6Key icmp6Key;       /* size 72 */
160     };
161 } OvsFlowKey;
162
163 #define OVS_WIN_TUNNEL_KEY_SIZE (sizeof (OvsIPv4TunnelKey))
164 #define OVS_L2_KEY_SIZE (sizeof (L2Key))
165 #define OVS_IP_KEY_SIZE (sizeof (IpKey))
166 #define OVS_IPV6_KEY_SIZE (sizeof (Ipv6Key))
167 #define OVS_ARP_KEY_SIZE (sizeof (ArpKey))
168 #define OVS_ICMPV6_KEY_SIZE (sizeof (Icmp6Key))
169
170 typedef struct OvsFlowStats {
171     Ovs64AlignedU64 packetCount;
172     Ovs64AlignedU64 byteCount;
173     uint32_t used;
174     uint8_t tcpFlags;
175 } OvsFlowStats;
176
177 typedef struct OvsFlowInfo {
178     OvsFlowKey key;
179     struct OvsFlowStats stats;
180     uint32_t actionsLen;
181     PNL_ATTR actions;
182 } OvsFlowInfo;
183
184 enum GetFlags {
185     FLOW_GET_KEY =       0x00000001,
186     FLOW_GET_STATS =     0x00000010,
187     FLOW_GET_ACTIONS =   0x00000100,
188 };
189
190 typedef struct OvsFlowDumpInput {
191     uint32_t dpNo;
192     uint32_t position[2];   /* Offset hint to the start of flow dump. */
193                             /* 0 - index of the hash table.
194                              * 1 - nth element in the hash table index. */
195     uint32_t getFlags;      /* Information to get in addition to keys. */
196     uint32_t actionsLen;
197 } OvsFlowDumpInput;
198
199
200 typedef struct OvsFlowDumpOutput {
201     /* Hint for the next flow dump operation. */
202     uint32_t position[2];
203
204     /* #flows (currently 0 or 1). In case the buffer is too small to output all
205      * actions, this field indicates actual size needed to dump all actions. */
206     uint32_t n;
207
208     OvsFlowInfo flow;
209 } OvsFlowDumpOutput;
210
211 typedef struct OvsFlowGetInput {
212     uint32_t dpNo;
213     OvsFlowKey key;
214     uint32_t getFlags;           /* Information to get in addition to keys. */
215     uint32_t actionsLen;         /* Sizeof of buffer for actions. */
216 } OvsFlowGetInput;
217
218 typedef struct OvsFlowGetOutput {
219     OvsFlowInfo info;            /* Variable length. */
220 } OvsFlowGetOutput;
221
222
223 typedef enum OvsFlowPutFlags {
224     OVSWIN_FLOW_PUT_CREATE = 1 << 0,
225     OVSWIN_FLOW_PUT_MODIFY = 1 << 1,
226     OVSWIN_FLOW_PUT_DELETE = 1 << 2,
227
228     OVSWIN_FLOW_PUT_CLEAR = 1 << 3
229 } OvsFlowPutFlags;
230
231
232 typedef struct OvsFlowPut {
233     uint32_t dpNo;
234     uint32_t actionsLen;
235     OvsFlowKey key;
236     uint32_t flags;
237     PNL_ATTR  actions;
238 } OvsFlowPut;
239
240 #define OVS_MIN_PACKET_SIZE 60
241 typedef struct _OVS_PACKET_INFO {
242     uint32_t totalLen;
243     uint32_t userDataLen;
244     uint32_t packetLen;
245     uint32_t queue;
246     uint32_t inPort;
247     uint32_t cmd;
248     OvsIPv4TunnelKey tunnelKey;
249     uint8_t *payload;
250     /* Includes user data defined as chain of netlink attributes followed by the
251      * packet data. */
252     uint8_t  data[0];
253 } OVS_PACKET_INFO, *POVS_PACKET_INFO;
254
255 typedef struct OvsPacketExecute {
256    uint32_t dpNo;
257    uint32_t inPort;
258
259    uint32_t packetLen;
260    uint32_t actionsLen;
261    PCHAR packetBuf;
262    PNL_ATTR actions;
263 } OvsPacketExecute;
264
265
266 typedef struct _OVS_EVENT_SUBSCRIBE {
267     uint32_t cookie;
268     uint32_t dpNo;
269     uint32_t subscribe;
270     uint32_t mask;
271 } OVS_EVENT_SUBSCRIBE, *POVS_EVENT_SUBSCRIBE;
272
273 typedef struct _OVS_EVENT_POLL {
274     uint32_t cookie;
275     uint32_t dpNo;
276 } OVS_EVENT_POLL, *POVS_EVENT_POLL;
277
278 enum {
279     OVS_EVENT_CONNECT       = ((uint32_t)0x1 << 0),
280     OVS_EVENT_DISCONNECT    = ((uint32_t)0x1 << 1),
281     OVS_EVENT_LINK_UP       = ((uint32_t)0x1 << 2),
282     OVS_EVENT_LINK_DOWN     = ((uint32_t)0x1 << 3),
283     OVS_EVENT_MAC_CHANGE    = ((uint32_t)0x1 << 4),
284     OVS_EVENT_MTU_CHANGE    = ((uint32_t)0x1 << 5),
285     OVS_EVENT_MASK_ALL      = 0x3f,
286 };
287
288
289 typedef struct _OVS_EVENT_ENTRY {
290     uint32_t portNo;
291     uint32_t status;
292 } OVS_EVENT_ENTRY, *POVS_EVENT_ENTRY;
293
294 #define OVS_DEFAULT_PORT_NO 0xffffffff
295 #define OVS_DEFAULT_EVENT_STATUS  0xffffffff
296
297 typedef struct _OVS_EVENT_STATUS {
298     uint32_t numberEntries;
299     OVS_EVENT_ENTRY eventEntries[0];
300 } OVS_EVENT_STATUS, *POVS_EVENT_STATUS;
301
302 #pragma pack(pop)
303
304 #endif /* __DP_INTERNAL_H_ */