Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

openvswitch: Expose <linux/openvswitch.h> to userspace

It contains the public netlink interface bits required by userspace to
make use of the interface.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Jesse Gross <jesse@nicira.com>

authored by

Thomas Graf and committed by
Jesse Gross
22e3880a 14b57a10

+458 -432
+1 -432
include/linux/openvswitch.h
··· 19 19 #ifndef _LINUX_OPENVSWITCH_H 20 20 #define _LINUX_OPENVSWITCH_H 1 21 21 22 - #include <linux/types.h> 23 - #include <linux/if_ether.h> 24 - 25 - /** 26 - * struct ovs_header - header for OVS Generic Netlink messages. 27 - * @dp_ifindex: ifindex of local port for datapath (0 to make a request not 28 - * specific to a datapath). 29 - * 30 - * Attributes following the header are specific to a particular OVS Generic 31 - * Netlink family, but all of the OVS families use this header. 32 - */ 33 - 34 - struct ovs_header { 35 - int dp_ifindex; 36 - }; 37 - 38 - /* Datapaths. */ 39 - 40 - #define OVS_DATAPATH_FAMILY "ovs_datapath" 41 - #define OVS_DATAPATH_MCGROUP "ovs_datapath" 42 - #define OVS_DATAPATH_VERSION 0x1 43 - 44 - enum ovs_datapath_cmd { 45 - OVS_DP_CMD_UNSPEC, 46 - OVS_DP_CMD_NEW, 47 - OVS_DP_CMD_DEL, 48 - OVS_DP_CMD_GET, 49 - OVS_DP_CMD_SET 50 - }; 51 - 52 - /** 53 - * enum ovs_datapath_attr - attributes for %OVS_DP_* commands. 54 - * @OVS_DP_ATTR_NAME: Name of the network device that serves as the "local 55 - * port". This is the name of the network device whose dp_ifindex is given in 56 - * the &struct ovs_header. Always present in notifications. Required in 57 - * %OVS_DP_NEW requests. May be used as an alternative to specifying 58 - * dp_ifindex in other requests (with a dp_ifindex of 0). 59 - * @OVS_DP_ATTR_UPCALL_PID: The Netlink socket in userspace that is initially 60 - * set on the datapath port (for OVS_ACTION_ATTR_MISS). Only valid on 61 - * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should 62 - * not be sent. 63 - * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the 64 - * datapath. Always present in notifications. 65 - * 66 - * These attributes follow the &struct ovs_header within the Generic Netlink 67 - * payload for %OVS_DP_* commands. 68 - */ 69 - enum ovs_datapath_attr { 70 - OVS_DP_ATTR_UNSPEC, 71 - OVS_DP_ATTR_NAME, /* name of dp_ifindex netdev */ 72 - OVS_DP_ATTR_UPCALL_PID, /* Netlink PID to receive upcalls */ 73 - OVS_DP_ATTR_STATS, /* struct ovs_dp_stats */ 74 - __OVS_DP_ATTR_MAX 75 - }; 76 - 77 - #define OVS_DP_ATTR_MAX (__OVS_DP_ATTR_MAX - 1) 78 - 79 - struct ovs_dp_stats { 80 - __u64 n_hit; /* Number of flow table matches. */ 81 - __u64 n_missed; /* Number of flow table misses. */ 82 - __u64 n_lost; /* Number of misses not sent to userspace. */ 83 - __u64 n_flows; /* Number of flows present */ 84 - }; 85 - 86 - struct ovs_vport_stats { 87 - __u64 rx_packets; /* total packets received */ 88 - __u64 tx_packets; /* total packets transmitted */ 89 - __u64 rx_bytes; /* total bytes received */ 90 - __u64 tx_bytes; /* total bytes transmitted */ 91 - __u64 rx_errors; /* bad packets received */ 92 - __u64 tx_errors; /* packet transmit problems */ 93 - __u64 rx_dropped; /* no space in linux buffers */ 94 - __u64 tx_dropped; /* no space available in linux */ 95 - }; 96 - 97 - /* Fixed logical ports. */ 98 - #define OVSP_LOCAL ((__u32)0) 99 - 100 - /* Packet transfer. */ 101 - 102 - #define OVS_PACKET_FAMILY "ovs_packet" 103 - #define OVS_PACKET_VERSION 0x1 104 - 105 - enum ovs_packet_cmd { 106 - OVS_PACKET_CMD_UNSPEC, 107 - 108 - /* Kernel-to-user notifications. */ 109 - OVS_PACKET_CMD_MISS, /* Flow table miss. */ 110 - OVS_PACKET_CMD_ACTION, /* OVS_ACTION_ATTR_USERSPACE action. */ 111 - 112 - /* Userspace commands. */ 113 - OVS_PACKET_CMD_EXECUTE /* Apply actions to a packet. */ 114 - }; 115 - 116 - /** 117 - * enum ovs_packet_attr - attributes for %OVS_PACKET_* commands. 118 - * @OVS_PACKET_ATTR_PACKET: Present for all notifications. Contains the entire 119 - * packet as received, from the start of the Ethernet header onward. For 120 - * %OVS_PACKET_CMD_ACTION, %OVS_PACKET_ATTR_PACKET reflects changes made by 121 - * actions preceding %OVS_ACTION_ATTR_USERSPACE, but %OVS_PACKET_ATTR_KEY is 122 - * the flow key extracted from the packet as originally received. 123 - * @OVS_PACKET_ATTR_KEY: Present for all notifications. Contains the flow key 124 - * extracted from the packet as nested %OVS_KEY_ATTR_* attributes. This allows 125 - * userspace to adapt its flow setup strategy by comparing its notion of the 126 - * flow key against the kernel's. 127 - * @OVS_PACKET_ATTR_ACTIONS: Contains actions for the packet. Used 128 - * for %OVS_PACKET_CMD_EXECUTE. It has nested %OVS_ACTION_ATTR_* attributes. 129 - * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION 130 - * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an 131 - * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content 132 - * specified there. 133 - * 134 - * These attributes follow the &struct ovs_header within the Generic Netlink 135 - * payload for %OVS_PACKET_* commands. 136 - */ 137 - enum ovs_packet_attr { 138 - OVS_PACKET_ATTR_UNSPEC, 139 - OVS_PACKET_ATTR_PACKET, /* Packet data. */ 140 - OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */ 141 - OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ 142 - OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ 143 - __OVS_PACKET_ATTR_MAX 144 - }; 145 - 146 - #define OVS_PACKET_ATTR_MAX (__OVS_PACKET_ATTR_MAX - 1) 147 - 148 - /* Virtual ports. */ 149 - 150 - #define OVS_VPORT_FAMILY "ovs_vport" 151 - #define OVS_VPORT_MCGROUP "ovs_vport" 152 - #define OVS_VPORT_VERSION 0x1 153 - 154 - enum ovs_vport_cmd { 155 - OVS_VPORT_CMD_UNSPEC, 156 - OVS_VPORT_CMD_NEW, 157 - OVS_VPORT_CMD_DEL, 158 - OVS_VPORT_CMD_GET, 159 - OVS_VPORT_CMD_SET 160 - }; 161 - 162 - enum ovs_vport_type { 163 - OVS_VPORT_TYPE_UNSPEC, 164 - OVS_VPORT_TYPE_NETDEV, /* network device */ 165 - OVS_VPORT_TYPE_INTERNAL, /* network device implemented by datapath */ 166 - __OVS_VPORT_TYPE_MAX 167 - }; 168 - 169 - #define OVS_VPORT_TYPE_MAX (__OVS_VPORT_TYPE_MAX - 1) 170 - 171 - /** 172 - * enum ovs_vport_attr - attributes for %OVS_VPORT_* commands. 173 - * @OVS_VPORT_ATTR_PORT_NO: 32-bit port number within datapath. 174 - * @OVS_VPORT_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing the type 175 - * of vport. 176 - * @OVS_VPORT_ATTR_NAME: Name of vport. For a vport based on a network device 177 - * this is the name of the network device. Maximum length %IFNAMSIZ-1 bytes 178 - * plus a null terminator. 179 - * @OVS_VPORT_ATTR_OPTIONS: Vport-specific configuration information. 180 - * @OVS_VPORT_ATTR_UPCALL_PID: The Netlink socket in userspace that 181 - * OVS_PACKET_CMD_MISS upcalls will be directed to for packets received on 182 - * this port. A value of zero indicates that upcalls should not be sent. 183 - * @OVS_VPORT_ATTR_STATS: A &struct ovs_vport_stats giving statistics for 184 - * packets sent or received through the vport. 185 - * 186 - * These attributes follow the &struct ovs_header within the Generic Netlink 187 - * payload for %OVS_VPORT_* commands. 188 - * 189 - * For %OVS_VPORT_CMD_NEW requests, the %OVS_VPORT_ATTR_TYPE and 190 - * %OVS_VPORT_ATTR_NAME attributes are required. %OVS_VPORT_ATTR_PORT_NO is 191 - * optional; if not specified a free port number is automatically selected. 192 - * Whether %OVS_VPORT_ATTR_OPTIONS is required or optional depends on the type 193 - * of vport. 194 - * and other attributes are ignored. 195 - * 196 - * For other requests, if %OVS_VPORT_ATTR_NAME is specified then it is used to 197 - * look up the vport to operate on; otherwise dp_idx from the &struct 198 - * ovs_header plus %OVS_VPORT_ATTR_PORT_NO determine the vport. 199 - */ 200 - enum ovs_vport_attr { 201 - OVS_VPORT_ATTR_UNSPEC, 202 - OVS_VPORT_ATTR_PORT_NO, /* u32 port number within datapath */ 203 - OVS_VPORT_ATTR_TYPE, /* u32 OVS_VPORT_TYPE_* constant. */ 204 - OVS_VPORT_ATTR_NAME, /* string name, up to IFNAMSIZ bytes long */ 205 - OVS_VPORT_ATTR_OPTIONS, /* nested attributes, varies by vport type */ 206 - OVS_VPORT_ATTR_UPCALL_PID, /* u32 Netlink PID to receive upcalls */ 207 - OVS_VPORT_ATTR_STATS, /* struct ovs_vport_stats */ 208 - __OVS_VPORT_ATTR_MAX 209 - }; 210 - 211 - #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) 212 - 213 - /* Flows. */ 214 - 215 - #define OVS_FLOW_FAMILY "ovs_flow" 216 - #define OVS_FLOW_MCGROUP "ovs_flow" 217 - #define OVS_FLOW_VERSION 0x1 218 - 219 - enum ovs_flow_cmd { 220 - OVS_FLOW_CMD_UNSPEC, 221 - OVS_FLOW_CMD_NEW, 222 - OVS_FLOW_CMD_DEL, 223 - OVS_FLOW_CMD_GET, 224 - OVS_FLOW_CMD_SET 225 - }; 226 - 227 - struct ovs_flow_stats { 228 - __u64 n_packets; /* Number of matched packets. */ 229 - __u64 n_bytes; /* Number of matched bytes. */ 230 - }; 231 - 232 - enum ovs_key_attr { 233 - OVS_KEY_ATTR_UNSPEC, 234 - OVS_KEY_ATTR_ENCAP, /* Nested set of encapsulated attributes. */ 235 - OVS_KEY_ATTR_PRIORITY, /* u32 skb->priority */ 236 - OVS_KEY_ATTR_IN_PORT, /* u32 OVS dp port number */ 237 - OVS_KEY_ATTR_ETHERNET, /* struct ovs_key_ethernet */ 238 - OVS_KEY_ATTR_VLAN, /* be16 VLAN TCI */ 239 - OVS_KEY_ATTR_ETHERTYPE, /* be16 Ethernet type */ 240 - OVS_KEY_ATTR_IPV4, /* struct ovs_key_ipv4 */ 241 - OVS_KEY_ATTR_IPV6, /* struct ovs_key_ipv6 */ 242 - OVS_KEY_ATTR_TCP, /* struct ovs_key_tcp */ 243 - OVS_KEY_ATTR_UDP, /* struct ovs_key_udp */ 244 - OVS_KEY_ATTR_ICMP, /* struct ovs_key_icmp */ 245 - OVS_KEY_ATTR_ICMPV6, /* struct ovs_key_icmpv6 */ 246 - OVS_KEY_ATTR_ARP, /* struct ovs_key_arp */ 247 - OVS_KEY_ATTR_ND, /* struct ovs_key_nd */ 248 - OVS_KEY_ATTR_SKB_MARK, /* u32 skb mark */ 249 - __OVS_KEY_ATTR_MAX 250 - }; 251 - 252 - #define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1) 253 - 254 - /** 255 - * enum ovs_frag_type - IPv4 and IPv6 fragment type 256 - * @OVS_FRAG_TYPE_NONE: Packet is not a fragment. 257 - * @OVS_FRAG_TYPE_FIRST: Packet is a fragment with offset 0. 258 - * @OVS_FRAG_TYPE_LATER: Packet is a fragment with nonzero offset. 259 - * 260 - * Used as the @ipv4_frag in &struct ovs_key_ipv4 and as @ipv6_frag &struct 261 - * ovs_key_ipv6. 262 - */ 263 - enum ovs_frag_type { 264 - OVS_FRAG_TYPE_NONE, 265 - OVS_FRAG_TYPE_FIRST, 266 - OVS_FRAG_TYPE_LATER, 267 - __OVS_FRAG_TYPE_MAX 268 - }; 269 - 270 - #define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1) 271 - 272 - struct ovs_key_ethernet { 273 - __u8 eth_src[ETH_ALEN]; 274 - __u8 eth_dst[ETH_ALEN]; 275 - }; 276 - 277 - struct ovs_key_ipv4 { 278 - __be32 ipv4_src; 279 - __be32 ipv4_dst; 280 - __u8 ipv4_proto; 281 - __u8 ipv4_tos; 282 - __u8 ipv4_ttl; 283 - __u8 ipv4_frag; /* One of OVS_FRAG_TYPE_*. */ 284 - }; 285 - 286 - struct ovs_key_ipv6 { 287 - __be32 ipv6_src[4]; 288 - __be32 ipv6_dst[4]; 289 - __be32 ipv6_label; /* 20-bits in least-significant bits. */ 290 - __u8 ipv6_proto; 291 - __u8 ipv6_tclass; 292 - __u8 ipv6_hlimit; 293 - __u8 ipv6_frag; /* One of OVS_FRAG_TYPE_*. */ 294 - }; 295 - 296 - struct ovs_key_tcp { 297 - __be16 tcp_src; 298 - __be16 tcp_dst; 299 - }; 300 - 301 - struct ovs_key_udp { 302 - __be16 udp_src; 303 - __be16 udp_dst; 304 - }; 305 - 306 - struct ovs_key_icmp { 307 - __u8 icmp_type; 308 - __u8 icmp_code; 309 - }; 310 - 311 - struct ovs_key_icmpv6 { 312 - __u8 icmpv6_type; 313 - __u8 icmpv6_code; 314 - }; 315 - 316 - struct ovs_key_arp { 317 - __be32 arp_sip; 318 - __be32 arp_tip; 319 - __be16 arp_op; 320 - __u8 arp_sha[ETH_ALEN]; 321 - __u8 arp_tha[ETH_ALEN]; 322 - }; 323 - 324 - struct ovs_key_nd { 325 - __u32 nd_target[4]; 326 - __u8 nd_sll[ETH_ALEN]; 327 - __u8 nd_tll[ETH_ALEN]; 328 - }; 329 - 330 - /** 331 - * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. 332 - * @OVS_FLOW_ATTR_KEY: Nested %OVS_KEY_ATTR_* attributes specifying the flow 333 - * key. Always present in notifications. Required for all requests (except 334 - * dumps). 335 - * @OVS_FLOW_ATTR_ACTIONS: Nested %OVS_ACTION_ATTR_* attributes specifying 336 - * the actions to take for packets that match the key. Always present in 337 - * notifications. Required for %OVS_FLOW_CMD_NEW requests, optional for 338 - * %OVS_FLOW_CMD_SET requests. 339 - * @OVS_FLOW_ATTR_STATS: &struct ovs_flow_stats giving statistics for this 340 - * flow. Present in notifications if the stats would be nonzero. Ignored in 341 - * requests. 342 - * @OVS_FLOW_ATTR_TCP_FLAGS: An 8-bit value giving the OR'd value of all of the 343 - * TCP flags seen on packets in this flow. Only present in notifications for 344 - * TCP flows, and only if it would be nonzero. Ignored in requests. 345 - * @OVS_FLOW_ATTR_USED: A 64-bit integer giving the time, in milliseconds on 346 - * the system monotonic clock, at which a packet was last processed for this 347 - * flow. Only present in notifications if a packet has been processed for this 348 - * flow. Ignored in requests. 349 - * @OVS_FLOW_ATTR_CLEAR: If present in a %OVS_FLOW_CMD_SET request, clears the 350 - * last-used time, accumulated TCP flags, and statistics for this flow. 351 - * Otherwise ignored in requests. Never present in notifications. 352 - * 353 - * These attributes follow the &struct ovs_header within the Generic Netlink 354 - * payload for %OVS_FLOW_* commands. 355 - */ 356 - enum ovs_flow_attr { 357 - OVS_FLOW_ATTR_UNSPEC, 358 - OVS_FLOW_ATTR_KEY, /* Sequence of OVS_KEY_ATTR_* attributes. */ 359 - OVS_FLOW_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ 360 - OVS_FLOW_ATTR_STATS, /* struct ovs_flow_stats. */ 361 - OVS_FLOW_ATTR_TCP_FLAGS, /* 8-bit OR'd TCP flags. */ 362 - OVS_FLOW_ATTR_USED, /* u64 msecs last used in monotonic time. */ 363 - OVS_FLOW_ATTR_CLEAR, /* Flag to clear stats, tcp_flags, used. */ 364 - __OVS_FLOW_ATTR_MAX 365 - }; 366 - 367 - #define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) 368 - 369 - /** 370 - * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. 371 - * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with 372 - * @OVS_ACTION_ATTR_SAMPLE. A value of 0 samples no packets, a value of 373 - * %UINT32_MAX samples all packets and intermediate values sample intermediate 374 - * fractions of packets. 375 - * @OVS_SAMPLE_ATTR_ACTIONS: Set of actions to execute in sampling event. 376 - * Actions are passed as nested attributes. 377 - * 378 - * Executes the specified actions with the given probability on a per-packet 379 - * basis. 380 - */ 381 - enum ovs_sample_attr { 382 - OVS_SAMPLE_ATTR_UNSPEC, 383 - OVS_SAMPLE_ATTR_PROBABILITY, /* u32 number */ 384 - OVS_SAMPLE_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ 385 - __OVS_SAMPLE_ATTR_MAX, 386 - }; 387 - 388 - #define OVS_SAMPLE_ATTR_MAX (__OVS_SAMPLE_ATTR_MAX - 1) 389 - 390 - /** 391 - * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action. 392 - * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION 393 - * message should be sent. Required. 394 - * @OVS_USERSPACE_ATTR_USERDATA: If present, its variable-length argument is 395 - * copied to the %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA. 396 - */ 397 - enum ovs_userspace_attr { 398 - OVS_USERSPACE_ATTR_UNSPEC, 399 - OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */ 400 - OVS_USERSPACE_ATTR_USERDATA, /* Optional user-specified cookie. */ 401 - __OVS_USERSPACE_ATTR_MAX 402 - }; 403 - 404 - #define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) 405 - 406 - /** 407 - * struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument. 408 - * @vlan_tpid: Tag protocol identifier (TPID) to push. 409 - * @vlan_tci: Tag control identifier (TCI) to push. The CFI bit must be set 410 - * (but it will not be set in the 802.1Q header that is pushed). 411 - * 412 - * The @vlan_tpid value is typically %ETH_P_8021Q. The only acceptable TPID 413 - * values are those that the kernel module also parses as 802.1Q headers, to 414 - * prevent %OVS_ACTION_ATTR_PUSH_VLAN followed by %OVS_ACTION_ATTR_POP_VLAN 415 - * from having surprising results. 416 - */ 417 - struct ovs_action_push_vlan { 418 - __be16 vlan_tpid; /* 802.1Q TPID. */ 419 - __be16 vlan_tci; /* 802.1Q TCI (VLAN ID and priority). */ 420 - }; 421 - 422 - /** 423 - * enum ovs_action_attr - Action types. 424 - * 425 - * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. 426 - * @OVS_ACTION_ATTR_USERSPACE: Send packet to userspace according to nested 427 - * %OVS_USERSPACE_ATTR_* attributes. 428 - * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The 429 - * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its 430 - * value. 431 - * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the 432 - * packet. 433 - * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. 434 - * @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in 435 - * the nested %OVS_SAMPLE_ATTR_* attributes. 436 - * 437 - * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all 438 - * fields within a header are modifiable, e.g. the IPv4 protocol and fragment 439 - * type may not be changed. 440 - */ 441 - 442 - enum ovs_action_attr { 443 - OVS_ACTION_ATTR_UNSPEC, 444 - OVS_ACTION_ATTR_OUTPUT, /* u32 port number. */ 445 - OVS_ACTION_ATTR_USERSPACE, /* Nested OVS_USERSPACE_ATTR_*. */ 446 - OVS_ACTION_ATTR_SET, /* One nested OVS_KEY_ATTR_*. */ 447 - OVS_ACTION_ATTR_PUSH_VLAN, /* struct ovs_action_push_vlan. */ 448 - OVS_ACTION_ATTR_POP_VLAN, /* No argument. */ 449 - OVS_ACTION_ATTR_SAMPLE, /* Nested OVS_SAMPLE_ATTR_*. */ 450 - __OVS_ACTION_ATTR_MAX 451 - }; 452 - 453 - #define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) 22 + #include <uapi/linux/openvswitch.h> 454 23 455 24 #endif /* _LINUX_OPENVSWITCH_H */
+1
include/uapi/linux/Kbuild
··· 285 285 header-y += omap3isp.h 286 286 header-y += omapfb.h 287 287 header-y += oom.h 288 + header-y += openvswitch.h 288 289 header-y += packet_diag.h 289 290 header-y += param.h 290 291 header-y += parport.h
+456
include/uapi/linux/openvswitch.h
··· 1 + 2 + /* 3 + * Copyright (c) 2007-2011 Nicira Networks. 4 + * 5 + * This program is free software; you can redistribute it and/or 6 + * modify it under the terms of version 2 of the GNU General Public 7 + * License as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but 10 + * WITHOUT ANY WARRANTY; without even the implied warranty of 11 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 + * General Public License for more details. 13 + * 14 + * You should have received a copy of the GNU General Public License 15 + * along with this program; if not, write to the Free Software 16 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 + * 02110-1301, USA 18 + */ 19 + 20 + #ifndef _UAPI__LINUX_OPENVSWITCH_H 21 + #define _UAPI__LINUX_OPENVSWITCH_H 1 22 + 23 + #include <linux/types.h> 24 + #include <linux/if_ether.h> 25 + 26 + /** 27 + * struct ovs_header - header for OVS Generic Netlink messages. 28 + * @dp_ifindex: ifindex of local port for datapath (0 to make a request not 29 + * specific to a datapath). 30 + * 31 + * Attributes following the header are specific to a particular OVS Generic 32 + * Netlink family, but all of the OVS families use this header. 33 + */ 34 + 35 + struct ovs_header { 36 + int dp_ifindex; 37 + }; 38 + 39 + /* Datapaths. */ 40 + 41 + #define OVS_DATAPATH_FAMILY "ovs_datapath" 42 + #define OVS_DATAPATH_MCGROUP "ovs_datapath" 43 + #define OVS_DATAPATH_VERSION 0x1 44 + 45 + enum ovs_datapath_cmd { 46 + OVS_DP_CMD_UNSPEC, 47 + OVS_DP_CMD_NEW, 48 + OVS_DP_CMD_DEL, 49 + OVS_DP_CMD_GET, 50 + OVS_DP_CMD_SET 51 + }; 52 + 53 + /** 54 + * enum ovs_datapath_attr - attributes for %OVS_DP_* commands. 55 + * @OVS_DP_ATTR_NAME: Name of the network device that serves as the "local 56 + * port". This is the name of the network device whose dp_ifindex is given in 57 + * the &struct ovs_header. Always present in notifications. Required in 58 + * %OVS_DP_NEW requests. May be used as an alternative to specifying 59 + * dp_ifindex in other requests (with a dp_ifindex of 0). 60 + * @OVS_DP_ATTR_UPCALL_PID: The Netlink socket in userspace that is initially 61 + * set on the datapath port (for OVS_ACTION_ATTR_MISS). Only valid on 62 + * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should 63 + * not be sent. 64 + * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the 65 + * datapath. Always present in notifications. 66 + * 67 + * These attributes follow the &struct ovs_header within the Generic Netlink 68 + * payload for %OVS_DP_* commands. 69 + */ 70 + enum ovs_datapath_attr { 71 + OVS_DP_ATTR_UNSPEC, 72 + OVS_DP_ATTR_NAME, /* name of dp_ifindex netdev */ 73 + OVS_DP_ATTR_UPCALL_PID, /* Netlink PID to receive upcalls */ 74 + OVS_DP_ATTR_STATS, /* struct ovs_dp_stats */ 75 + __OVS_DP_ATTR_MAX 76 + }; 77 + 78 + #define OVS_DP_ATTR_MAX (__OVS_DP_ATTR_MAX - 1) 79 + 80 + struct ovs_dp_stats { 81 + __u64 n_hit; /* Number of flow table matches. */ 82 + __u64 n_missed; /* Number of flow table misses. */ 83 + __u64 n_lost; /* Number of misses not sent to userspace. */ 84 + __u64 n_flows; /* Number of flows present */ 85 + }; 86 + 87 + struct ovs_vport_stats { 88 + __u64 rx_packets; /* total packets received */ 89 + __u64 tx_packets; /* total packets transmitted */ 90 + __u64 rx_bytes; /* total bytes received */ 91 + __u64 tx_bytes; /* total bytes transmitted */ 92 + __u64 rx_errors; /* bad packets received */ 93 + __u64 tx_errors; /* packet transmit problems */ 94 + __u64 rx_dropped; /* no space in linux buffers */ 95 + __u64 tx_dropped; /* no space available in linux */ 96 + }; 97 + 98 + /* Fixed logical ports. */ 99 + #define OVSP_LOCAL ((__u32)0) 100 + 101 + /* Packet transfer. */ 102 + 103 + #define OVS_PACKET_FAMILY "ovs_packet" 104 + #define OVS_PACKET_VERSION 0x1 105 + 106 + enum ovs_packet_cmd { 107 + OVS_PACKET_CMD_UNSPEC, 108 + 109 + /* Kernel-to-user notifications. */ 110 + OVS_PACKET_CMD_MISS, /* Flow table miss. */ 111 + OVS_PACKET_CMD_ACTION, /* OVS_ACTION_ATTR_USERSPACE action. */ 112 + 113 + /* Userspace commands. */ 114 + OVS_PACKET_CMD_EXECUTE /* Apply actions to a packet. */ 115 + }; 116 + 117 + /** 118 + * enum ovs_packet_attr - attributes for %OVS_PACKET_* commands. 119 + * @OVS_PACKET_ATTR_PACKET: Present for all notifications. Contains the entire 120 + * packet as received, from the start of the Ethernet header onward. For 121 + * %OVS_PACKET_CMD_ACTION, %OVS_PACKET_ATTR_PACKET reflects changes made by 122 + * actions preceding %OVS_ACTION_ATTR_USERSPACE, but %OVS_PACKET_ATTR_KEY is 123 + * the flow key extracted from the packet as originally received. 124 + * @OVS_PACKET_ATTR_KEY: Present for all notifications. Contains the flow key 125 + * extracted from the packet as nested %OVS_KEY_ATTR_* attributes. This allows 126 + * userspace to adapt its flow setup strategy by comparing its notion of the 127 + * flow key against the kernel's. 128 + * @OVS_PACKET_ATTR_ACTIONS: Contains actions for the packet. Used 129 + * for %OVS_PACKET_CMD_EXECUTE. It has nested %OVS_ACTION_ATTR_* attributes. 130 + * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION 131 + * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an 132 + * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content 133 + * specified there. 134 + * 135 + * These attributes follow the &struct ovs_header within the Generic Netlink 136 + * payload for %OVS_PACKET_* commands. 137 + */ 138 + enum ovs_packet_attr { 139 + OVS_PACKET_ATTR_UNSPEC, 140 + OVS_PACKET_ATTR_PACKET, /* Packet data. */ 141 + OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */ 142 + OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ 143 + OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ 144 + __OVS_PACKET_ATTR_MAX 145 + }; 146 + 147 + #define OVS_PACKET_ATTR_MAX (__OVS_PACKET_ATTR_MAX - 1) 148 + 149 + /* Virtual ports. */ 150 + 151 + #define OVS_VPORT_FAMILY "ovs_vport" 152 + #define OVS_VPORT_MCGROUP "ovs_vport" 153 + #define OVS_VPORT_VERSION 0x1 154 + 155 + enum ovs_vport_cmd { 156 + OVS_VPORT_CMD_UNSPEC, 157 + OVS_VPORT_CMD_NEW, 158 + OVS_VPORT_CMD_DEL, 159 + OVS_VPORT_CMD_GET, 160 + OVS_VPORT_CMD_SET 161 + }; 162 + 163 + enum ovs_vport_type { 164 + OVS_VPORT_TYPE_UNSPEC, 165 + OVS_VPORT_TYPE_NETDEV, /* network device */ 166 + OVS_VPORT_TYPE_INTERNAL, /* network device implemented by datapath */ 167 + __OVS_VPORT_TYPE_MAX 168 + }; 169 + 170 + #define OVS_VPORT_TYPE_MAX (__OVS_VPORT_TYPE_MAX - 1) 171 + 172 + /** 173 + * enum ovs_vport_attr - attributes for %OVS_VPORT_* commands. 174 + * @OVS_VPORT_ATTR_PORT_NO: 32-bit port number within datapath. 175 + * @OVS_VPORT_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing the type 176 + * of vport. 177 + * @OVS_VPORT_ATTR_NAME: Name of vport. For a vport based on a network device 178 + * this is the name of the network device. Maximum length %IFNAMSIZ-1 bytes 179 + * plus a null terminator. 180 + * @OVS_VPORT_ATTR_OPTIONS: Vport-specific configuration information. 181 + * @OVS_VPORT_ATTR_UPCALL_PID: The Netlink socket in userspace that 182 + * OVS_PACKET_CMD_MISS upcalls will be directed to for packets received on 183 + * this port. A value of zero indicates that upcalls should not be sent. 184 + * @OVS_VPORT_ATTR_STATS: A &struct ovs_vport_stats giving statistics for 185 + * packets sent or received through the vport. 186 + * 187 + * These attributes follow the &struct ovs_header within the Generic Netlink 188 + * payload for %OVS_VPORT_* commands. 189 + * 190 + * For %OVS_VPORT_CMD_NEW requests, the %OVS_VPORT_ATTR_TYPE and 191 + * %OVS_VPORT_ATTR_NAME attributes are required. %OVS_VPORT_ATTR_PORT_NO is 192 + * optional; if not specified a free port number is automatically selected. 193 + * Whether %OVS_VPORT_ATTR_OPTIONS is required or optional depends on the type 194 + * of vport. 195 + * and other attributes are ignored. 196 + * 197 + * For other requests, if %OVS_VPORT_ATTR_NAME is specified then it is used to 198 + * look up the vport to operate on; otherwise dp_idx from the &struct 199 + * ovs_header plus %OVS_VPORT_ATTR_PORT_NO determine the vport. 200 + */ 201 + enum ovs_vport_attr { 202 + OVS_VPORT_ATTR_UNSPEC, 203 + OVS_VPORT_ATTR_PORT_NO, /* u32 port number within datapath */ 204 + OVS_VPORT_ATTR_TYPE, /* u32 OVS_VPORT_TYPE_* constant. */ 205 + OVS_VPORT_ATTR_NAME, /* string name, up to IFNAMSIZ bytes long */ 206 + OVS_VPORT_ATTR_OPTIONS, /* nested attributes, varies by vport type */ 207 + OVS_VPORT_ATTR_UPCALL_PID, /* u32 Netlink PID to receive upcalls */ 208 + OVS_VPORT_ATTR_STATS, /* struct ovs_vport_stats */ 209 + __OVS_VPORT_ATTR_MAX 210 + }; 211 + 212 + #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) 213 + 214 + /* Flows. */ 215 + 216 + #define OVS_FLOW_FAMILY "ovs_flow" 217 + #define OVS_FLOW_MCGROUP "ovs_flow" 218 + #define OVS_FLOW_VERSION 0x1 219 + 220 + enum ovs_flow_cmd { 221 + OVS_FLOW_CMD_UNSPEC, 222 + OVS_FLOW_CMD_NEW, 223 + OVS_FLOW_CMD_DEL, 224 + OVS_FLOW_CMD_GET, 225 + OVS_FLOW_CMD_SET 226 + }; 227 + 228 + struct ovs_flow_stats { 229 + __u64 n_packets; /* Number of matched packets. */ 230 + __u64 n_bytes; /* Number of matched bytes. */ 231 + }; 232 + 233 + enum ovs_key_attr { 234 + OVS_KEY_ATTR_UNSPEC, 235 + OVS_KEY_ATTR_ENCAP, /* Nested set of encapsulated attributes. */ 236 + OVS_KEY_ATTR_PRIORITY, /* u32 skb->priority */ 237 + OVS_KEY_ATTR_IN_PORT, /* u32 OVS dp port number */ 238 + OVS_KEY_ATTR_ETHERNET, /* struct ovs_key_ethernet */ 239 + OVS_KEY_ATTR_VLAN, /* be16 VLAN TCI */ 240 + OVS_KEY_ATTR_ETHERTYPE, /* be16 Ethernet type */ 241 + OVS_KEY_ATTR_IPV4, /* struct ovs_key_ipv4 */ 242 + OVS_KEY_ATTR_IPV6, /* struct ovs_key_ipv6 */ 243 + OVS_KEY_ATTR_TCP, /* struct ovs_key_tcp */ 244 + OVS_KEY_ATTR_UDP, /* struct ovs_key_udp */ 245 + OVS_KEY_ATTR_ICMP, /* struct ovs_key_icmp */ 246 + OVS_KEY_ATTR_ICMPV6, /* struct ovs_key_icmpv6 */ 247 + OVS_KEY_ATTR_ARP, /* struct ovs_key_arp */ 248 + OVS_KEY_ATTR_ND, /* struct ovs_key_nd */ 249 + OVS_KEY_ATTR_SKB_MARK, /* u32 skb mark */ 250 + __OVS_KEY_ATTR_MAX 251 + }; 252 + 253 + #define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1) 254 + 255 + /** 256 + * enum ovs_frag_type - IPv4 and IPv6 fragment type 257 + * @OVS_FRAG_TYPE_NONE: Packet is not a fragment. 258 + * @OVS_FRAG_TYPE_FIRST: Packet is a fragment with offset 0. 259 + * @OVS_FRAG_TYPE_LATER: Packet is a fragment with nonzero offset. 260 + * 261 + * Used as the @ipv4_frag in &struct ovs_key_ipv4 and as @ipv6_frag &struct 262 + * ovs_key_ipv6. 263 + */ 264 + enum ovs_frag_type { 265 + OVS_FRAG_TYPE_NONE, 266 + OVS_FRAG_TYPE_FIRST, 267 + OVS_FRAG_TYPE_LATER, 268 + __OVS_FRAG_TYPE_MAX 269 + }; 270 + 271 + #define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1) 272 + 273 + struct ovs_key_ethernet { 274 + __u8 eth_src[ETH_ALEN]; 275 + __u8 eth_dst[ETH_ALEN]; 276 + }; 277 + 278 + struct ovs_key_ipv4 { 279 + __be32 ipv4_src; 280 + __be32 ipv4_dst; 281 + __u8 ipv4_proto; 282 + __u8 ipv4_tos; 283 + __u8 ipv4_ttl; 284 + __u8 ipv4_frag; /* One of OVS_FRAG_TYPE_*. */ 285 + }; 286 + 287 + struct ovs_key_ipv6 { 288 + __be32 ipv6_src[4]; 289 + __be32 ipv6_dst[4]; 290 + __be32 ipv6_label; /* 20-bits in least-significant bits. */ 291 + __u8 ipv6_proto; 292 + __u8 ipv6_tclass; 293 + __u8 ipv6_hlimit; 294 + __u8 ipv6_frag; /* One of OVS_FRAG_TYPE_*. */ 295 + }; 296 + 297 + struct ovs_key_tcp { 298 + __be16 tcp_src; 299 + __be16 tcp_dst; 300 + }; 301 + 302 + struct ovs_key_udp { 303 + __be16 udp_src; 304 + __be16 udp_dst; 305 + }; 306 + 307 + struct ovs_key_icmp { 308 + __u8 icmp_type; 309 + __u8 icmp_code; 310 + }; 311 + 312 + struct ovs_key_icmpv6 { 313 + __u8 icmpv6_type; 314 + __u8 icmpv6_code; 315 + }; 316 + 317 + struct ovs_key_arp { 318 + __be32 arp_sip; 319 + __be32 arp_tip; 320 + __be16 arp_op; 321 + __u8 arp_sha[ETH_ALEN]; 322 + __u8 arp_tha[ETH_ALEN]; 323 + }; 324 + 325 + struct ovs_key_nd { 326 + __u32 nd_target[4]; 327 + __u8 nd_sll[ETH_ALEN]; 328 + __u8 nd_tll[ETH_ALEN]; 329 + }; 330 + 331 + /** 332 + * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands. 333 + * @OVS_FLOW_ATTR_KEY: Nested %OVS_KEY_ATTR_* attributes specifying the flow 334 + * key. Always present in notifications. Required for all requests (except 335 + * dumps). 336 + * @OVS_FLOW_ATTR_ACTIONS: Nested %OVS_ACTION_ATTR_* attributes specifying 337 + * the actions to take for packets that match the key. Always present in 338 + * notifications. Required for %OVS_FLOW_CMD_NEW requests, optional for 339 + * %OVS_FLOW_CMD_SET requests. 340 + * @OVS_FLOW_ATTR_STATS: &struct ovs_flow_stats giving statistics for this 341 + * flow. Present in notifications if the stats would be nonzero. Ignored in 342 + * requests. 343 + * @OVS_FLOW_ATTR_TCP_FLAGS: An 8-bit value giving the OR'd value of all of the 344 + * TCP flags seen on packets in this flow. Only present in notifications for 345 + * TCP flows, and only if it would be nonzero. Ignored in requests. 346 + * @OVS_FLOW_ATTR_USED: A 64-bit integer giving the time, in milliseconds on 347 + * the system monotonic clock, at which a packet was last processed for this 348 + * flow. Only present in notifications if a packet has been processed for this 349 + * flow. Ignored in requests. 350 + * @OVS_FLOW_ATTR_CLEAR: If present in a %OVS_FLOW_CMD_SET request, clears the 351 + * last-used time, accumulated TCP flags, and statistics for this flow. 352 + * Otherwise ignored in requests. Never present in notifications. 353 + * 354 + * These attributes follow the &struct ovs_header within the Generic Netlink 355 + * payload for %OVS_FLOW_* commands. 356 + */ 357 + enum ovs_flow_attr { 358 + OVS_FLOW_ATTR_UNSPEC, 359 + OVS_FLOW_ATTR_KEY, /* Sequence of OVS_KEY_ATTR_* attributes. */ 360 + OVS_FLOW_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ 361 + OVS_FLOW_ATTR_STATS, /* struct ovs_flow_stats. */ 362 + OVS_FLOW_ATTR_TCP_FLAGS, /* 8-bit OR'd TCP flags. */ 363 + OVS_FLOW_ATTR_USED, /* u64 msecs last used in monotonic time. */ 364 + OVS_FLOW_ATTR_CLEAR, /* Flag to clear stats, tcp_flags, used. */ 365 + __OVS_FLOW_ATTR_MAX 366 + }; 367 + 368 + #define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) 369 + 370 + /** 371 + * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. 372 + * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with 373 + * @OVS_ACTION_ATTR_SAMPLE. A value of 0 samples no packets, a value of 374 + * %UINT32_MAX samples all packets and intermediate values sample intermediate 375 + * fractions of packets. 376 + * @OVS_SAMPLE_ATTR_ACTIONS: Set of actions to execute in sampling event. 377 + * Actions are passed as nested attributes. 378 + * 379 + * Executes the specified actions with the given probability on a per-packet 380 + * basis. 381 + */ 382 + enum ovs_sample_attr { 383 + OVS_SAMPLE_ATTR_UNSPEC, 384 + OVS_SAMPLE_ATTR_PROBABILITY, /* u32 number */ 385 + OVS_SAMPLE_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ 386 + __OVS_SAMPLE_ATTR_MAX, 387 + }; 388 + 389 + #define OVS_SAMPLE_ATTR_MAX (__OVS_SAMPLE_ATTR_MAX - 1) 390 + 391 + /** 392 + * enum ovs_userspace_attr - Attributes for %OVS_ACTION_ATTR_USERSPACE action. 393 + * @OVS_USERSPACE_ATTR_PID: u32 Netlink PID to which the %OVS_PACKET_CMD_ACTION 394 + * message should be sent. Required. 395 + * @OVS_USERSPACE_ATTR_USERDATA: If present, its variable-length argument is 396 + * copied to the %OVS_PACKET_CMD_ACTION message as %OVS_PACKET_ATTR_USERDATA. 397 + */ 398 + enum ovs_userspace_attr { 399 + OVS_USERSPACE_ATTR_UNSPEC, 400 + OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */ 401 + OVS_USERSPACE_ATTR_USERDATA, /* Optional user-specified cookie. */ 402 + __OVS_USERSPACE_ATTR_MAX 403 + }; 404 + 405 + #define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1) 406 + 407 + /** 408 + * struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument. 409 + * @vlan_tpid: Tag protocol identifier (TPID) to push. 410 + * @vlan_tci: Tag control identifier (TCI) to push. The CFI bit must be set 411 + * (but it will not be set in the 802.1Q header that is pushed). 412 + * 413 + * The @vlan_tpid value is typically %ETH_P_8021Q. The only acceptable TPID 414 + * values are those that the kernel module also parses as 802.1Q headers, to 415 + * prevent %OVS_ACTION_ATTR_PUSH_VLAN followed by %OVS_ACTION_ATTR_POP_VLAN 416 + * from having surprising results. 417 + */ 418 + struct ovs_action_push_vlan { 419 + __be16 vlan_tpid; /* 802.1Q TPID. */ 420 + __be16 vlan_tci; /* 802.1Q TCI (VLAN ID and priority). */ 421 + }; 422 + 423 + /** 424 + * enum ovs_action_attr - Action types. 425 + * 426 + * @OVS_ACTION_ATTR_OUTPUT: Output packet to port. 427 + * @OVS_ACTION_ATTR_USERSPACE: Send packet to userspace according to nested 428 + * %OVS_USERSPACE_ATTR_* attributes. 429 + * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The 430 + * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its 431 + * value. 432 + * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the 433 + * packet. 434 + * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. 435 + * @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in 436 + * the nested %OVS_SAMPLE_ATTR_* attributes. 437 + * 438 + * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all 439 + * fields within a header are modifiable, e.g. the IPv4 protocol and fragment 440 + * type may not be changed. 441 + */ 442 + 443 + enum ovs_action_attr { 444 + OVS_ACTION_ATTR_UNSPEC, 445 + OVS_ACTION_ATTR_OUTPUT, /* u32 port number. */ 446 + OVS_ACTION_ATTR_USERSPACE, /* Nested OVS_USERSPACE_ATTR_*. */ 447 + OVS_ACTION_ATTR_SET, /* One nested OVS_KEY_ATTR_*. */ 448 + OVS_ACTION_ATTR_PUSH_VLAN, /* struct ovs_action_push_vlan. */ 449 + OVS_ACTION_ATTR_POP_VLAN, /* No argument. */ 450 + OVS_ACTION_ATTR_SAMPLE, /* Nested OVS_SAMPLE_ATTR_*. */ 451 + __OVS_ACTION_ATTR_MAX 452 + }; 453 + 454 + #define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) 455 + 456 + #endif /* _LINUX_OPENVSWITCH_H */