2009-07-08 13:19:16 -07:00
|
|
|
/*
|
2010-01-08 16:46:03 -08:00
|
|
|
* Copyright (c) 2009, 2010 Nicira Networks.
|
2009-07-08 13:19:16 -07:00
|
|
|
*
|
2009-06-15 15:11:30 -07:00
|
|
|
* This file is offered under your choice of two licenses: Apache 2.0 or GNU
|
|
|
|
* GPL 2.0 or later. The permission statements for each of these licenses is
|
|
|
|
* given below. You may license your modifications to this file under either
|
|
|
|
* of these licenses or both. If you wish to license your modifications under
|
|
|
|
* only one of these licenses, delete the permission text for the other
|
|
|
|
* license.
|
2009-07-08 13:19:16 -07:00
|
|
|
*
|
2009-06-15 15:11:30 -07:00
|
|
|
* ----------------------------------------------------------------------
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at:
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
* ----------------------------------------------------------------------
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
* ----------------------------------------------------------------------
|
2009-07-08 13:19:16 -07:00
|
|
|
*/
|
|
|
|
|
2010-05-13 15:25:27 -07:00
|
|
|
/* Protocol between userspace and kernel datapath.
|
|
|
|
*
|
|
|
|
* Be sure to update datapath/odp-compat.h if you change any of the structures
|
|
|
|
* in here. */
|
2009-07-08 13:19:16 -07:00
|
|
|
|
|
|
|
#ifndef OPENVSWITCH_DATAPATH_PROTOCOL_H
|
|
|
|
#define OPENVSWITCH_DATAPATH_PROTOCOL_H 1
|
|
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#else
|
|
|
|
#include <sys/types.h>
|
|
|
|
#endif
|
|
|
|
#include <linux/if_ether.h>
|
|
|
|
|
|
|
|
#define ODP_MAX 256 /* Maximum number of datapaths. */
|
|
|
|
|
|
|
|
#define ODP_DP_CREATE _IO('O', 0)
|
|
|
|
#define ODP_DP_DESTROY _IO('O', 1)
|
|
|
|
#define ODP_DP_STATS _IOW('O', 2, struct odp_stats)
|
|
|
|
|
|
|
|
#define ODP_GET_DROP_FRAGS _IOW('O', 3, int)
|
|
|
|
#define ODP_SET_DROP_FRAGS _IOR('O', 4, int)
|
|
|
|
|
|
|
|
#define ODP_GET_LISTEN_MASK _IOW('O', 5, int)
|
|
|
|
#define ODP_SET_LISTEN_MASK _IOR('O', 6, int)
|
|
|
|
|
2010-04-12 15:53:39 -04:00
|
|
|
#define ODP_PORT_ATTACH _IOR('O', 7, struct odp_port)
|
|
|
|
#define ODP_PORT_DETACH _IOR('O', 8, int)
|
2009-07-08 13:19:16 -07:00
|
|
|
#define ODP_PORT_QUERY _IOWR('O', 9, struct odp_port)
|
|
|
|
#define ODP_PORT_LIST _IOWR('O', 10, struct odp_portvec)
|
|
|
|
|
|
|
|
#define ODP_PORT_GROUP_SET _IOR('O', 11, struct odp_port_group)
|
|
|
|
#define ODP_PORT_GROUP_GET _IOWR('O', 12, struct odp_port_group)
|
|
|
|
|
|
|
|
#define ODP_FLOW_GET _IOWR('O', 13, struct odp_flow)
|
2009-06-17 14:35:35 -07:00
|
|
|
#define ODP_FLOW_PUT _IOWR('O', 14, struct odp_flow)
|
2009-07-08 13:19:16 -07:00
|
|
|
#define ODP_FLOW_LIST _IOWR('O', 15, struct odp_flowvec)
|
|
|
|
#define ODP_FLOW_FLUSH _IO('O', 16)
|
2009-06-17 14:35:35 -07:00
|
|
|
#define ODP_FLOW_DEL _IOWR('O', 17, struct odp_flow)
|
2009-07-08 13:19:16 -07:00
|
|
|
|
2009-06-17 14:35:35 -07:00
|
|
|
#define ODP_EXECUTE _IOR('O', 18, struct odp_execute)
|
2009-07-08 13:19:16 -07:00
|
|
|
|
2010-01-08 16:46:03 -08:00
|
|
|
#define ODP_SET_SFLOW_PROBABILITY _IOR('O', 19, int)
|
|
|
|
#define ODP_GET_SFLOW_PROBABILITY _IOW('O', 20, int)
|
2010-01-04 13:08:37 -08:00
|
|
|
|
2010-04-12 15:53:39 -04:00
|
|
|
#define ODP_VPORT_ADD _IOR('O', 21, struct odp_vport_add)
|
|
|
|
#define ODP_VPORT_MOD _IOR('O', 22, struct odp_vport_mod)
|
|
|
|
#define ODP_VPORT_DEL _IO('O', 23)
|
|
|
|
#define ODP_VPORT_STATS_GET _IOWR('O', 24, struct odp_vport_stats_req)
|
|
|
|
#define ODP_VPORT_ETHER_GET _IOWR('O', 25, struct odp_vport_ether)
|
|
|
|
#define ODP_VPORT_ETHER_SET _IOW('O', 26, struct odp_vport_ether)
|
|
|
|
#define ODP_VPORT_MTU_GET _IOWR('O', 27, struct odp_vport_mtu)
|
|
|
|
#define ODP_VPORT_MTU_SET _IOW('O', 28, struct odp_vport_mtu)
|
|
|
|
|
2009-07-08 13:19:16 -07:00
|
|
|
struct odp_stats {
|
|
|
|
/* Flows. */
|
|
|
|
__u32 n_flows; /* Number of flows in flow table. */
|
|
|
|
__u32 cur_capacity; /* Current flow table capacity. */
|
|
|
|
__u32 max_capacity; /* Maximum expansion of flow table capacity. */
|
|
|
|
|
|
|
|
/* Ports. */
|
|
|
|
__u32 n_ports; /* Current number of ports. */
|
|
|
|
__u32 max_ports; /* Maximum supported number of ports. */
|
|
|
|
__u16 max_groups; /* Maximum number of port groups. */
|
|
|
|
__u16 reserved;
|
|
|
|
|
|
|
|
/* Lookups. */
|
|
|
|
__u64 n_frags; /* Number of dropped IP fragments. */
|
|
|
|
__u64 n_hit; /* Number of flow table matches. */
|
|
|
|
__u64 n_missed; /* Number of flow table misses. */
|
|
|
|
__u64 n_lost; /* Number of misses not sent to userspace. */
|
|
|
|
|
|
|
|
/* Queues. */
|
|
|
|
__u16 max_miss_queue; /* Max length of ODPL_MISS queue. */
|
|
|
|
__u16 max_action_queue; /* Max length of ODPL_ACTION queue. */
|
2010-01-04 13:08:37 -08:00
|
|
|
__u16 max_sflow_queue; /* Max length of ODPL_SFLOW queue. */
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Logical ports. */
|
|
|
|
#define ODPP_LOCAL ((__u16)0)
|
|
|
|
#define ODPP_NONE ((__u16)-1)
|
2010-02-11 13:45:03 -08:00
|
|
|
#define ODPP_NORMAL ((__u16)-2)
|
2009-07-08 13:19:16 -07:00
|
|
|
|
|
|
|
/* Listening channels. */
|
|
|
|
#define _ODPL_MISS_NR 0 /* Packet missed in flow table. */
|
|
|
|
#define ODPL_MISS (1 << _ODPL_MISS_NR)
|
|
|
|
#define _ODPL_ACTION_NR 1 /* Packet output to ODPP_CONTROLLER. */
|
|
|
|
#define ODPL_ACTION (1 << _ODPL_ACTION_NR)
|
2010-01-04 13:08:37 -08:00
|
|
|
#define _ODPL_SFLOW_NR 2 /* sFlow samples. */
|
|
|
|
#define ODPL_SFLOW (1 << _ODPL_SFLOW_NR)
|
|
|
|
#define ODPL_ALL (ODPL_MISS | ODPL_ACTION | ODPL_SFLOW)
|
2009-07-08 13:19:16 -07:00
|
|
|
|
2010-01-11 11:06:56 -08:00
|
|
|
/**
|
|
|
|
* struct odp_msg - format of messages read from datapath fd.
|
|
|
|
* @type: One of the %_ODPL_* constants.
|
|
|
|
* @length: Total length of message, including this header.
|
|
|
|
* @port: Port that received the packet embedded in this message.
|
|
|
|
* @reserved: Not currently used. Should be set to 0.
|
|
|
|
* @arg: Argument value whose meaning depends on @type.
|
|
|
|
*
|
|
|
|
* For @type == %_ODPL_MISS_NR, the header is followed by packet data. The
|
2010-04-12 11:49:16 -04:00
|
|
|
* @arg member is the ID (in network byte order) of the tunnel that
|
|
|
|
* encapsulated this packet. It is 0 if the packet was not received on a tunnel.
|
2010-01-11 11:06:56 -08:00
|
|
|
*
|
|
|
|
* For @type == %_ODPL_ACTION_NR, the header is followed by packet data. The
|
|
|
|
* @arg member is copied from the &struct odp_action_controller that caused
|
|
|
|
* the &struct odp_msg to be composed.
|
|
|
|
*
|
|
|
|
* For @type == %_ODPL_SFLOW_NR, the header is followed by &struct
|
|
|
|
* odp_sflow_sample_header, then by an array of &union odp_action (the number
|
|
|
|
* of which is specified in &struct odp_sflow_sample_header), then by packet
|
|
|
|
* data.
|
|
|
|
*/
|
2009-07-08 13:19:16 -07:00
|
|
|
struct odp_msg {
|
2010-01-11 11:06:56 -08:00
|
|
|
__u32 type;
|
|
|
|
__u32 length;
|
|
|
|
__u16 port;
|
2009-07-08 13:19:16 -07:00
|
|
|
__u16 reserved;
|
2010-01-11 11:06:56 -08:00
|
|
|
__u32 arg;
|
2010-01-04 13:08:37 -08:00
|
|
|
};
|
|
|
|
|
2010-01-11 11:06:56 -08:00
|
|
|
/**
|
|
|
|
* struct odp_sflow_sample_header - header added to sFlow sampled packet.
|
|
|
|
* @sample_pool: Number of packets that were candidates for sFlow sampling,
|
|
|
|
* regardless of whether they were actually chosen and sent down to userspace.
|
|
|
|
* @n_actions: Number of "union odp_action"s immediately following this header.
|
|
|
|
*
|
|
|
|
* This header follows &struct odp_msg when that structure's @type is
|
|
|
|
* %_ODPL_SFLOW_NR, and it is itself followed by an array of &union odp_action
|
|
|
|
* (the number of which is specified in @n_actions) and then by packet data.
|
|
|
|
*/
|
2010-01-04 13:08:37 -08:00
|
|
|
struct odp_sflow_sample_header {
|
sflow: Fix sFlow sampling structure.
According to Neil McKee, in an email archived at
http://openvswitch.org/pipermail/dev_openvswitch.org/2010-January/000934.html:
The containment rule is that a given sflow-datasource (sampler or
poller) should be scoped within only one sflow-agent (or
sub-agent). So the issue arrises when you have two
switches/datapaths defined on the same host being managed with
the same IP address: each switch is a separate sub-agent, so they
can run independently (e.g. with their own sequence numbers) but
they can't both claim to speak for the same sflow-datasource.
Specifically, they can't both represent the <ifindex>:0
data-source. This containment rule is necessary so that the
sFlow collector can scale and combine the results accurately.
One option would be to stick with the <ifindex>:0 data-source but
elevate it to be global across all bridges, with a global
sample_pool and a global sflow_agent. Not tempting. Better to
go the other way and allow each interface to have it's own
sampler, just as it already has it's own poller. The ifIndex
numbers are globally unique across all switches/datapaths on the
host, so the containment is now clean. Datasource <ifindex>:5
might be on one switch, whille <ifindex>:7 can be on another.
Other benefits are that 1) you can support the option of
overriding the default sampling-rate on an interface-by-interface
basis, and 2) this is how most sFlow implementations are coded,
so there will be no surprises or interoperability issues with any
sFlow collectors out there.
This commit implements the approach suggested by Neil.
This commit uses an atomic_t to represent the sampling pool. This is
because we do want access to it to be atomic, but we expect that it will
"mostly" be accessed from a single CPU at a time. Perhaps this is a bad
assumption; we can always switch to another form of synchronization later.
CC: Neil McKee <neil.mckee@inmon.com>
2010-01-20 13:52:42 -08:00
|
|
|
__u32 sample_pool;
|
2010-01-11 11:06:56 -08:00
|
|
|
__u32 n_actions;
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
#define ODP_PORT_INTERNAL (1 << 0) /* This port is simulated. */
|
|
|
|
struct odp_port {
|
|
|
|
char devname[16]; /* IFNAMSIZ */
|
|
|
|
__u16 port;
|
|
|
|
__u16 flags;
|
|
|
|
__u32 reserved2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_portvec {
|
|
|
|
struct odp_port *ports;
|
2010-05-13 11:04:56 -07:00
|
|
|
__u32 n_ports;
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_port_group {
|
|
|
|
__u16 *ports;
|
|
|
|
__u16 n_ports; /* Number of ports. */
|
|
|
|
__u16 group; /* Group number. */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_flow_stats {
|
|
|
|
__u64 n_packets; /* Number of matched packets. */
|
|
|
|
__u64 n_bytes; /* Number of matched bytes. */
|
|
|
|
__u64 used_sec; /* Time last used. */
|
|
|
|
__u32 used_nsec;
|
|
|
|
__u8 tcp_flags;
|
|
|
|
__u8 ip_tos;
|
2009-06-17 12:41:30 -07:00
|
|
|
__u16 error; /* Used by ODP_FLOW_GET. */
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_flow_key {
|
2010-04-12 11:49:16 -04:00
|
|
|
__be32 tun_id; /* Encapsulating tunnel ID. */
|
2009-07-16 15:21:47 -07:00
|
|
|
__be32 nw_src; /* IP source address. */
|
|
|
|
__be32 nw_dst; /* IP destination address. */
|
|
|
|
__u16 in_port; /* Input switch port. */
|
|
|
|
__be16 dl_vlan; /* Input VLAN. */
|
|
|
|
__be16 dl_type; /* Ethernet frame type. */
|
|
|
|
__be16 tp_src; /* TCP/UDP source port. */
|
|
|
|
__be16 tp_dst; /* TCP/UDP destination port. */
|
|
|
|
__u8 dl_src[ETH_ALEN]; /* Ethernet source address. */
|
|
|
|
__u8 dl_dst[ETH_ALEN]; /* Ethernet destination address. */
|
2009-07-16 12:58:28 -07:00
|
|
|
__u8 nw_proto; /* IP protocol or lower 8 bits of
|
|
|
|
ARP opcode. */
|
2009-11-11 14:59:49 -08:00
|
|
|
__u8 dl_vlan_pcp; /* Input VLAN priority. */
|
2010-01-21 17:34:05 -08:00
|
|
|
__u8 nw_tos; /* IP ToS (DSCP field, 6 bits). */
|
|
|
|
__u8 reserved[3]; /* Align to 32-bits...must be zeroed. */
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
2009-10-28 14:36:52 -07:00
|
|
|
/* Flags for ODP_FLOW. */
|
|
|
|
#define ODPFF_ZERO_TCP_FLAGS (1 << 0) /* Zero the TCP flags. */
|
|
|
|
|
2009-07-08 13:19:16 -07:00
|
|
|
struct odp_flow {
|
|
|
|
struct odp_flow_stats stats;
|
|
|
|
struct odp_flow_key key;
|
|
|
|
union odp_action *actions;
|
|
|
|
__u32 n_actions;
|
2009-10-28 14:36:52 -07:00
|
|
|
__u32 flags;
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Flags for ODP_FLOW_PUT. */
|
|
|
|
#define ODPPF_CREATE (1 << 0) /* Allow creating a new flow. */
|
|
|
|
#define ODPPF_MODIFY (1 << 1) /* Allow modifying an existing flow. */
|
|
|
|
#define ODPPF_ZERO_STATS (1 << 2) /* Zero the stats of an existing flow. */
|
|
|
|
|
|
|
|
/* ODP_FLOW_PUT argument. */
|
|
|
|
struct odp_flow_put {
|
|
|
|
struct odp_flow flow;
|
|
|
|
__u32 flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_flowvec {
|
|
|
|
struct odp_flow *flows;
|
2010-05-10 13:53:26 -07:00
|
|
|
__u32 n_flows;
|
2009-07-08 13:19:16 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
/* The VLAN id is 12 bits, so we can use the entire 16 bits to indicate
|
|
|
|
* special conditions. All ones is used to match that no VLAN id was
|
|
|
|
* set. */
|
|
|
|
#define ODP_VLAN_NONE 0xffff
|
|
|
|
|
|
|
|
/* Action types. */
|
|
|
|
#define ODPAT_OUTPUT 0 /* Output to switch port. */
|
|
|
|
#define ODPAT_OUTPUT_GROUP 1 /* Output to all ports in group. */
|
|
|
|
#define ODPAT_CONTROLLER 2 /* Send copy to controller. */
|
|
|
|
#define ODPAT_SET_VLAN_VID 3 /* Set the 802.1q VLAN id. */
|
|
|
|
#define ODPAT_SET_VLAN_PCP 4 /* Set the 802.1q priority. */
|
|
|
|
#define ODPAT_STRIP_VLAN 5 /* Strip the 802.1q header. */
|
|
|
|
#define ODPAT_SET_DL_SRC 6 /* Ethernet source address. */
|
|
|
|
#define ODPAT_SET_DL_DST 7 /* Ethernet destination address. */
|
|
|
|
#define ODPAT_SET_NW_SRC 8 /* IP source address. */
|
|
|
|
#define ODPAT_SET_NW_DST 9 /* IP destination address. */
|
2009-11-11 14:59:49 -08:00
|
|
|
#define ODPAT_SET_NW_TOS 10 /* IP ToS/DSCP field (6 bits). */
|
|
|
|
#define ODPAT_SET_TP_SRC 11 /* TCP/UDP source port. */
|
|
|
|
#define ODPAT_SET_TP_DST 12 /* TCP/UDP destination port. */
|
2010-04-12 11:49:16 -04:00
|
|
|
#define ODPAT_SET_TUNNEL 13 /* Set the encapsulating tunnel ID. */
|
|
|
|
#define ODPAT_N_ACTIONS 14
|
2009-07-08 13:19:16 -07:00
|
|
|
|
|
|
|
struct odp_action_output {
|
|
|
|
__u16 type; /* ODPAT_OUTPUT. */
|
|
|
|
__u16 port; /* Output port. */
|
|
|
|
__u16 reserved1;
|
|
|
|
__u16 reserved2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_action_output_group {
|
|
|
|
__u16 type; /* ODPAT_OUTPUT_GROUP. */
|
|
|
|
__u16 group; /* Group number. */
|
|
|
|
__u16 reserved1;
|
|
|
|
__u16 reserved2;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_action_controller {
|
|
|
|
__u16 type; /* ODPAT_OUTPUT_CONTROLLER. */
|
|
|
|
__u16 reserved;
|
|
|
|
__u32 arg; /* Copied to struct odp_msg 'arg' member. */
|
|
|
|
};
|
|
|
|
|
2010-04-12 11:49:16 -04:00
|
|
|
struct odp_action_tunnel {
|
|
|
|
__u16 type; /* ODPAT_SET_TUNNEL. */
|
|
|
|
__u16 reserved;
|
|
|
|
__be32 tun_id; /* Tunnel ID. */
|
|
|
|
};
|
|
|
|
|
2009-07-08 13:19:16 -07:00
|
|
|
/* Action structure for ODPAT_SET_VLAN_VID. */
|
|
|
|
struct odp_action_vlan_vid {
|
|
|
|
__u16 type; /* ODPAT_SET_VLAN_VID. */
|
|
|
|
__be16 vlan_vid; /* VLAN id. */
|
|
|
|
__u16 reserved1;
|
|
|
|
__u16 reserved2;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Action structure for ODPAT_SET_VLAN_PCP. */
|
|
|
|
struct odp_action_vlan_pcp {
|
|
|
|
__u16 type; /* ODPAT_SET_VLAN_PCP. */
|
|
|
|
__u8 vlan_pcp; /* VLAN priority. */
|
|
|
|
__u8 reserved1;
|
|
|
|
__u16 reserved2;
|
|
|
|
__u16 reserved3;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Action structure for ODPAT_SET_DL_SRC/DST. */
|
|
|
|
struct odp_action_dl_addr {
|
|
|
|
__u16 type; /* ODPAT_SET_DL_SRC/DST. */
|
|
|
|
__u8 dl_addr[ETH_ALEN]; /* Ethernet address. */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Action structure for ODPAT_SET_NW_SRC/DST. */
|
|
|
|
struct odp_action_nw_addr {
|
|
|
|
__u16 type; /* ODPAT_SET_TW_SRC/DST. */
|
|
|
|
__u16 reserved;
|
|
|
|
__be32 nw_addr; /* IP address. */
|
|
|
|
};
|
|
|
|
|
2009-11-11 14:59:49 -08:00
|
|
|
struct odp_action_nw_tos {
|
|
|
|
__u16 type; /* ODPAT_SET_NW_TOS. */
|
|
|
|
__u8 nw_tos; /* IP ToS/DSCP field (6 bits). */
|
|
|
|
__u8 reserved1;
|
|
|
|
__u16 reserved2;
|
|
|
|
__u16 reserved3;
|
|
|
|
};
|
|
|
|
|
2009-07-08 13:19:16 -07:00
|
|
|
/* Action structure for ODPAT_SET_TP_SRC/DST. */
|
|
|
|
struct odp_action_tp_port {
|
|
|
|
__u16 type; /* ODPAT_SET_TP_SRC/DST. */
|
|
|
|
__be16 tp_port; /* TCP/UDP port. */
|
|
|
|
__u16 reserved1;
|
|
|
|
__u16 reserved2;
|
|
|
|
};
|
|
|
|
|
|
|
|
union odp_action {
|
|
|
|
__u16 type;
|
|
|
|
struct odp_action_output output;
|
|
|
|
struct odp_action_output_group output_group;
|
|
|
|
struct odp_action_controller controller;
|
2010-04-12 11:49:16 -04:00
|
|
|
struct odp_action_tunnel tunnel;
|
2009-07-08 13:19:16 -07:00
|
|
|
struct odp_action_vlan_vid vlan_vid;
|
|
|
|
struct odp_action_vlan_pcp vlan_pcp;
|
|
|
|
struct odp_action_dl_addr dl_addr;
|
|
|
|
struct odp_action_nw_addr nw_addr;
|
2009-11-11 14:59:49 -08:00
|
|
|
struct odp_action_nw_tos nw_tos;
|
2009-07-08 13:19:16 -07:00
|
|
|
struct odp_action_tp_port tp_port;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_execute {
|
|
|
|
__u16 in_port;
|
|
|
|
__u16 reserved1;
|
|
|
|
__u32 reserved2;
|
|
|
|
|
|
|
|
union odp_action *actions;
|
|
|
|
__u32 n_actions;
|
|
|
|
|
|
|
|
const void *data;
|
|
|
|
__u32 length;
|
|
|
|
};
|
|
|
|
|
2010-04-12 15:53:39 -04:00
|
|
|
#define VPORT_TYPE_SIZE 16
|
|
|
|
struct odp_vport_add {
|
|
|
|
char port_type[VPORT_TYPE_SIZE];
|
|
|
|
char devname[16]; /* IFNAMSIZ */
|
|
|
|
void *config;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_vport_mod {
|
|
|
|
char devname[16]; /* IFNAMSIZ */
|
|
|
|
void *config;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_vport_stats {
|
|
|
|
__u64 rx_packets;
|
|
|
|
__u64 tx_packets;
|
|
|
|
__u64 rx_bytes;
|
|
|
|
__u64 tx_bytes;
|
|
|
|
__u64 rx_dropped;
|
|
|
|
__u64 tx_dropped;
|
|
|
|
__u64 rx_errors;
|
|
|
|
__u64 tx_errors;
|
|
|
|
__u64 rx_frame_err;
|
|
|
|
__u64 rx_over_err;
|
|
|
|
__u64 rx_crc_err;
|
|
|
|
__u64 collisions;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_vport_stats_req {
|
|
|
|
char devname[16]; /* IFNAMSIZ */
|
|
|
|
struct odp_vport_stats stats;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_vport_ether {
|
|
|
|
char devname[16]; /* IFNAMSIZ */
|
|
|
|
unsigned char ether_addr[ETH_ALEN];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct odp_vport_mtu {
|
|
|
|
char devname[16]; /* IFNAMSIZ */
|
|
|
|
__u16 mtu;
|
|
|
|
};
|
|
|
|
|
2009-07-08 13:19:16 -07:00
|
|
|
/* Values below this cutoff are 802.3 packets and the two bytes
|
|
|
|
* following MAC addresses are used as a frame length. Otherwise, the
|
|
|
|
* two bytes are used as the Ethernet type.
|
|
|
|
*/
|
|
|
|
#define ODP_DL_TYPE_ETH2_CUTOFF 0x0600
|
|
|
|
|
|
|
|
/* Value of dl_type to indicate that the frame does not include an
|
|
|
|
* Ethernet type.
|
|
|
|
*/
|
|
|
|
#define ODP_DL_TYPE_NOT_ETH_TYPE 0x05ff
|
|
|
|
|
|
|
|
/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
|
|
|
|
* special conditions. All ones indicates that no VLAN id was set.
|
|
|
|
*/
|
|
|
|
#define ODP_VLAN_NONE 0xffff
|
|
|
|
|
|
|
|
#endif /* openvswitch/datapath-protocol.h */
|