2 * Copyright (c) 2014 VMware, Inc.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef __DP_INTERNAL_H_
18 #define __DP_INTERNAL_H_ 1
21 #define IFNAMSIZ IF_NAMESIZE
22 #include "../ovsext/Netlink/Netlink.h"
25 #define OVS_DP_NUMBER ((uint32_t) 0)
27 typedef __declspec(align(8)) uint64_t Ovs64AlignedU64;
28 typedef __declspec(align(8)) ovs_be64 Ovs64AlignedBe64;
31 #define OVS_MAX_PORT_NAME_LENGTH IFNAMSIZ
33 typedef struct _OVS_VPORT_GET {
36 char name[OVS_MAX_PORT_NAME_LENGTH];
37 } OVS_VPORT_GET, *POVS_VPORT_GET;
39 #define OVS_MAX_VM_UUID_LEN 128
40 #define OVS_MAX_VIF_UUID_LEN 128
42 typedef struct _OVS_VPORT_EXT_INFO {
45 uint8_t macAddress[ETH_ADDR_LEN];
46 uint8_t permMACAddress[ETH_ADDR_LEN];
47 uint8_t vmMACAddress[ETH_ADDR_LEN];
52 char name[OVS_MAX_PORT_NAME_LENGTH];
54 char vmUUID[OVS_MAX_VM_UUID_LEN];
55 char vifUUID[OVS_MAX_VIF_UUID_LEN];
56 } OVS_VPORT_EXT_INFO, *POVS_VPORT_EXT_INFO;
60 #define OVSWIN_VLAN_CFI 0x1000
62 /* Used for OvsFlowKey's dlType member for frames that have no Ethernet type,
63 * that is, pure 802.2 frames. */
64 #define OVSWIN_DL_TYPE_NONE 0x5ff
66 typedef struct L4Key {
67 ovs_be16 tpSrc; /* TCP/UDP/SCTP source port. */
68 ovs_be16 tpDst; /* TCP/UDP/SCTP destination port. */
71 typedef struct Ipkey {
72 ovs_be32 nwSrc; /* IPv4 source address. */
73 ovs_be32 nwDst; /* IPv4 destination address. */
74 uint8_t nwProto; /* IP protocol or low 8 bits of ARP opcode. */
75 uint8_t nwTos; /* IP ToS (including DSCP and ECN). */
76 uint8_t nwTtl; /* IP TTL/Hop Limit. */
77 uint8_t nwFrag; /* FLOW_FRAG_* flags. */
79 } IpKey; /* Size of 16 byte. */
81 typedef struct ArpKey {
82 ovs_be32 nwSrc; /* IPv4 source address. */
83 ovs_be32 nwDst; /* IPv4 destination address. */
84 uint8_t arpSha[6]; /* ARP/ND source hardware address. */
85 uint8_t arpTha[6]; /* ARP/ND target hardware address. */
86 uint8_t nwProto; /* IP protocol or low 8 bits of ARP opcode. */
88 } ArpKey; /* Size of 24 byte. */
90 typedef struct Ipv6Key {
91 struct in6_addr ipv6Src; /* IPv6 source address. */
92 struct in6_addr ipv6Dst; /* IPv6 destination address. */
93 ovs_be32 ipv6Label; /* IPv6 flow label. */
94 uint8_t nwProto; /* IP protocol or low 8 bits of ARP opcode. */
95 uint8_t nwTos; /* IP ToS (including DSCP and ECN). */
96 uint8_t nwTtl; /* IP TTL/Hop Limit. */
97 uint8_t nwFrag; /* FLOW_FRAG_* flags. */
100 } Ipv6Key; /* Size of 48 byte. */
102 typedef struct Icmp6Key {
103 struct in6_addr ipv6Src; /* IPv6 source address. */
104 struct in6_addr ipv6Dst; /* IPv6 destination address. */
105 ovs_be32 ipv6Label; /* IPv6 flow label. */
106 uint8_t nwProto; /* IP protocol or low 8 bits of ARP opcode. */
107 uint8_t nwTos; /* IP ToS (including DSCP and ECN). */
108 uint8_t nwTtl; /* IP TTL/Hop Limit. */
109 uint8_t nwFrag; /* FLOW_FRAG_* flags. */
111 uint8_t arpSha[6]; /* ARP/ND source hardware address. */
112 uint8_t arpTha[6]; /* ARP/ND target hardware address. */
113 struct in6_addr ndTarget; /* IPv6 neighbor discovery (ND) target. */
114 } Icmp6Key; /* Size of 72 byte. */
116 typedef struct L2Key {
117 uint32_t inPort; /* Port number of input port. */
125 uint8_t dlSrc[6]; /* Ethernet source address. */
126 uint8_t dlDst[6]; /* Ethernet destination address. */
127 ovs_be16 vlanTci; /* If 802.1Q, TCI | VLAN_CFI; otherwise 0. */
128 ovs_be16 dlType; /* Ethernet frame type. */
129 } L2Key; /* Size of 24 byte. */
131 /* Number of packet attributes required to store OVS tunnel key. */
132 #define NUM_PKT_ATTR_REQUIRED 3
134 typedef union OvsIPv4TunnelKey {
150 uint64_t attr[NUM_PKT_ATTR_REQUIRED];
151 } OvsIPv4TunnelKey; /* Size of 24 byte. */
153 typedef struct MplsKey {
154 ovs_be32 lse; /* MPLS topmost label stack entry. */
156 } MplsKey; /* Size of 8 bytes. */
158 typedef __declspec(align(8)) struct OvsFlowKey {
159 OvsIPv4TunnelKey tunKey; /* 24 bytes */
160 L2Key l2; /* 24 bytes */
162 /* These headers are mutually exclusive. */
163 IpKey ipKey; /* size 16 */
164 ArpKey arpKey; /* size 24 */
165 Ipv6Key ipv6Key; /* size 48 */
166 Icmp6Key icmp6Key; /* size 72 */
167 MplsKey mplsKey; /* size 8 */
171 #define OVS_WIN_TUNNEL_KEY_SIZE (sizeof (OvsIPv4TunnelKey))
172 #define OVS_L2_KEY_SIZE (sizeof (L2Key))
173 #define OVS_IP_KEY_SIZE (sizeof (IpKey))
174 #define OVS_IPV6_KEY_SIZE (sizeof (Ipv6Key))
175 #define OVS_ARP_KEY_SIZE (sizeof (ArpKey))
176 #define OVS_ICMPV6_KEY_SIZE (sizeof (Icmp6Key))
178 typedef struct OvsFlowStats {
179 Ovs64AlignedU64 packetCount;
180 Ovs64AlignedU64 byteCount;
185 typedef struct OvsFlowInfo {
187 struct OvsFlowStats stats;
193 FLOW_GET_KEY = 0x00000001,
194 FLOW_GET_STATS = 0x00000010,
195 FLOW_GET_ACTIONS = 0x00000100,
198 typedef struct OvsFlowDumpInput {
200 uint32_t position[2]; /* Offset hint to the start of flow dump. */
201 /* 0 - index of the hash table.
202 * 1 - nth element in the hash table index. */
203 uint32_t getFlags; /* Information to get in addition to keys. */
208 typedef struct OvsFlowDumpOutput {
209 /* Hint for the next flow dump operation. */
210 uint32_t position[2];
212 /* #flows (currently 0 or 1). In case the buffer is too small to output all
213 * actions, this field indicates actual size needed to dump all actions. */
219 typedef struct OvsFlowGetInput {
222 uint32_t getFlags; /* Information to get in addition to keys. */
223 uint32_t actionsLen; /* Sizeof of buffer for actions. */
226 typedef struct OvsFlowGetOutput {
227 OvsFlowInfo info; /* Variable length. */
231 typedef enum OvsFlowPutFlags {
232 OVSWIN_FLOW_PUT_CREATE = 1 << 0,
233 OVSWIN_FLOW_PUT_MODIFY = 1 << 1,
234 OVSWIN_FLOW_PUT_DELETE = 1 << 2,
236 OVSWIN_FLOW_PUT_CLEAR = 1 << 3
240 typedef struct OvsFlowPut {
248 #define OVS_MIN_PACKET_SIZE 60
249 typedef struct _OVS_PACKET_INFO {
251 uint32_t userDataLen;
256 OvsIPv4TunnelKey tunnelKey;
258 /* Includes user data defined as chain of netlink attributes followed by the
261 } OVS_PACKET_INFO, *POVS_PACKET_INFO;
263 typedef struct OvsPacketExecute {
274 typedef struct _OVS_EVENT_SUBSCRIBE {
279 } OVS_EVENT_SUBSCRIBE, *POVS_EVENT_SUBSCRIBE;
281 typedef struct _OVS_EVENT_POLL {
284 } OVS_EVENT_POLL, *POVS_EVENT_POLL;
287 OVS_EVENT_CONNECT = ((uint32_t)0x1 << 0),
288 OVS_EVENT_DISCONNECT = ((uint32_t)0x1 << 1),
289 OVS_EVENT_LINK_UP = ((uint32_t)0x1 << 2),
290 OVS_EVENT_LINK_DOWN = ((uint32_t)0x1 << 3),
291 OVS_EVENT_MAC_CHANGE = ((uint32_t)0x1 << 4),
292 OVS_EVENT_MTU_CHANGE = ((uint32_t)0x1 << 5),
293 OVS_EVENT_MASK_ALL = 0x3f,
297 typedef struct _OVS_EVENT_ENTRY {
299 OVS_VPORT_TYPE ovsType;
301 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
303 } OVS_EVENT_ENTRY, *POVS_EVENT_ENTRY;
306 typedef struct _OVS_EVENT_STATUS {
307 uint32_t numberEntries;
308 OVS_EVENT_ENTRY eventEntries[0];
309 } OVS_EVENT_STATUS, *POVS_EVENT_STATUS;
313 #endif /* __DP_INTERNAL_H_ */