Skip to content

Commit

Permalink
Merge branch 'master' into next
Browse files Browse the repository at this point in the history
Conflicts:
	COPYING
	datapath/datapath.h
	lib/automake.mk
	lib/dpif-provider.h
	lib/dpif.c
	lib/hmap.h
	lib/netdev-provider.h
	lib/netdev.c
	lib/stream-ssl.h
	ofproto/executer.c
	ofproto/ofproto.c
	ofproto/ofproto.h
	tests/automake.mk
	utilities/ovs-ofctl.c
	utilities/ovs-vsctl.in
	vswitchd/ovs-vswitchd.conf.5.in
	xenserver/etc_init.d_vswitch
	xenserver/etc_xensource_scripts_vif
	xenserver/opt_xensource_libexec_interface-reconfigure
  • Loading branch information
Justin Pettit committed Feb 6, 2010
2 parents 93ff029 + 5819a7c commit a4af004
Show file tree
Hide file tree
Showing 57 changed files with 5,994 additions and 1,468 deletions.
4 changes: 4 additions & 0 deletions COPYING
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,7 @@ The files under ovsdb/simplejson are covered by the following license:
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

Files lib/sflow*.[ch] are licensed under the terms of the InMon sFlow
licence that is available at:
http://www.inmon.com/technology/sflowlicense.txt
11 changes: 11 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
v0.99.1 - 25 Jan 2010
---------------------
- Add support for sFlow(R)
- Make headers compatible with C++
- Bug fixes

v0.99.0 - 14 Jan 2010
---------------------
- User-space forwarding engine
- Bug fixes

v0.90.6 - 6 Oct 2009
--------------------
- Bug fixes
Expand Down
7 changes: 4 additions & 3 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ What is Open vSwitch?
Open vSwitch is a multilayer software switch licensed under the open
source Apache 2 license. Our goal is to implement a production
quality switch platform that supports standard management interfaces
(e.g. NetFlow, RSPAN, ERSPAN, IOS-like CLI), and opens the forwarding
functions to programmatic extension and control.
(e.g. NetFlow, sFlow(R), RSPAN, ERSPAN, IOS-like CLI), and opens the
forwarding functions to programmatic extension and control.

Open vSwitch is well suited to function as a virtual switch in VM
environments. In addition to exposing standard control and visibility
Expand All @@ -20,7 +20,8 @@ The bulk of the code is written in platform-independent C and is
easily ported to other environments. The current release of Open
vSwitch supports the following features:

* Visibility into inter-VM communication via NetFlow, SPAN, and RSPAN
* Visibility into inter-VM communication via NetFlow, sFlow, SPAN,
and RSPAN
* Standard 802.1Q VLAN model with trunking
* Per VM policing
* NIC bonding with source-MAC load balancing
Expand Down
11 changes: 11 additions & 0 deletions acinclude.m4
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ AC_DEFUN([OVS_CHECK_STRTOK_R],
char *token1, *token2;
token1 = strtok_r(string, ":", &save_ptr);
token2 = strtok_r(NULL, ":", &save_ptr);
freopen ("/dev/null", "w", stdout);
printf ("%s %s\n", token1, token2);
return 0;
]])],
Expand Down Expand Up @@ -259,4 +260,14 @@ dnl Example: OVS_ENABLE_OPTION([-Wdeclaration-after-statement])
AC_DEFUN([OVS_ENABLE_OPTION],
[OVS_CHECK_CC_OPTION([$1], [WARNING_FLAGS="$WARNING_FLAGS $1"])
AC_SUBST([WARNING_FLAGS])])

dnl OVS_CONDITIONAL_CC_OPTION([OPTION], [CONDITIONAL])
dnl Check whether the given C compiler OPTION is accepted.
dnl If so, enable the given Automake CONDITIONAL.

dnl Example: OVS_CONDITIONAL_CC_OPTION([-Wno-unused], [HAVE_WNO_UNUSED])
AC_DEFUN([OVS_CONDITIONAL_CC_OPTION],
[OVS_CHECK_CC_OPTION(
[$1], [ovs_have_cc_option=yes], [ovs_have_cc_option=no])
AM_CONDITIONAL([$2], [test $ovs_have_cc_option = yes])])
dnl ----------------------------------------------------------------------
3 changes: 2 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# limitations under the License.

AC_PREREQ(2.63)
AC_INIT(openvswitch, 0.90.6, [email protected])
AC_INIT(openvswitch, 0.99.1, [email protected])
NX_BUILDNR
AC_CONFIG_SRCDIR([datapath/datapath.c])
AC_CONFIG_MACRO_DIR([m4])
Expand Down Expand Up @@ -76,6 +76,7 @@ OVS_ENABLE_OPTION([-Wold-style-definition])
OVS_ENABLE_OPTION([-Wmissing-prototypes])
OVS_ENABLE_OPTION([-Wmissing-field-initializers])
OVS_ENABLE_OPTION([-Wno-override-init])
OVS_CONDITIONAL_CC_OPTION([-Wno-unused], [HAVE_WNO_UNUSED])

AC_ARG_VAR(KARCH, [Kernel Architecture String])
AC_SUBST(KARCH)
Expand Down
33 changes: 33 additions & 0 deletions datapath/actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,28 @@ output_control(struct datapath *dp, struct sk_buff *skb, u32 arg, gfp_t gfp)
return dp_output_control(dp, skb, _ODPL_ACTION_NR, arg);
}

/* Send a copy of this packet up to the sFlow agent, along with extra
* information about what happened to it. */
static void sflow_sample(struct datapath *dp, struct sk_buff *skb,
const union odp_action *a, int n_actions,
gfp_t gfp, struct net_bridge_port *nbp)
{
struct odp_sflow_sample_header *hdr;
unsigned int actlen = n_actions * sizeof(union odp_action);
unsigned int hdrlen = sizeof(struct odp_sflow_sample_header);
struct sk_buff *nskb;

nskb = skb_copy_expand(skb, actlen + hdrlen, 0, gfp);
if (!nskb)
return;

memcpy(__skb_push(nskb, actlen), a, actlen);
hdr = (struct odp_sflow_sample_header*)__skb_push(nskb, hdrlen);
hdr->n_actions = n_actions;
hdr->sample_pool = atomic_read(&nbp->sflow_pool);
dp_output_control(dp, nskb, _ODPL_SFLOW_NR, 0);
}

/* Execute a list of actions against 'skb'. */
int execute_actions(struct datapath *dp, struct sk_buff *skb,
struct odp_flow_key *key,
Expand All @@ -412,6 +434,17 @@ int execute_actions(struct datapath *dp, struct sk_buff *skb,
* is slightly obscure just to avoid that. */
int prev_port = -1;
int err;

if (dp->sflow_probability) {
struct net_bridge_port *p = skb->dev->br_port;
if (p) {
atomic_inc(&p->sflow_pool);
if (dp->sflow_probability == UINT_MAX ||
net_random() < dp->sflow_probability)
sflow_sample(dp, skb, a, n_actions, gfp, p);
}
}

for (; n_actions > 0; a++, n_actions--) {
WARN_ON_ONCE(skb_shared(skb));
if (prev_port != -1) {
Expand Down
19 changes: 14 additions & 5 deletions datapath/datapath.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ static int new_nbp(struct datapath *dp, struct net_device *dev, int port_no)
p->port_no = port_no;
p->dp = dp;
p->dev = dev;
atomic_set(&p->sflow_pool, 0);
if (!is_dp_dev(dev))
rcu_assign_pointer(dev->br_port, p);
else {
Expand Down Expand Up @@ -646,9 +647,7 @@ int vswitch_skb_checksum_setup(struct sk_buff *skb)
out:
return err;
}
#else
int vswitch_skb_checksum_setup(struct sk_buff *skb) { return 0; }
#endif /* CONFIG_XEN && linux == 2.6.18 */
#endif /* CONFIG_XEN && HAVE_PROTO_DATA_VALID */

/* Types of checksums that we can receive (these all refer to L4 checksums):
* 1. CHECKSUM_NONE: Device that did not compute checksum, contains full
Expand Down Expand Up @@ -796,8 +795,7 @@ dp_output_control(struct datapath *dp, struct sk_buff *skb, int queue_no,
int err;

WARN_ON_ONCE(skb_shared(skb));
BUG_ON(queue_no != _ODPL_MISS_NR && queue_no != _ODPL_ACTION_NR);

BUG_ON(queue_no != _ODPL_MISS_NR && queue_no != _ODPL_ACTION_NR && queue_no != _ODPL_SFLOW_NR);
queue = &dp->queues[queue_no];
err = -ENOBUFS;
if (skb_queue_len(queue) >= DP_MAX_QUEUE_LEN)
Expand Down Expand Up @@ -1499,6 +1497,7 @@ static long openvswitch_ioctl(struct file *f, unsigned int cmd,
int dp_idx = iminor(f->f_dentry->d_inode);
struct datapath *dp;
int drop_frags, listeners, port_no;
unsigned int sflow_probability;
int err;

/* Handle commands with special locking requirements up front. */
Expand Down Expand Up @@ -1562,6 +1561,16 @@ static long openvswitch_ioctl(struct file *f, unsigned int cmd,
set_listen_mask(f, listeners);
break;

case ODP_GET_SFLOW_PROBABILITY:
err = put_user(dp->sflow_probability, (unsigned int __user *)argp);
break;

case ODP_SET_SFLOW_PROBABILITY:
err = get_user(sflow_probability, (unsigned int __user *)argp);
if (!err)
dp->sflow_probability = sflow_probability;
break;

case ODP_PORT_QUERY:
err = query_port(dp, (struct odp_port __user *)argp);
break;
Expand Down
67 changes: 58 additions & 9 deletions datapath/datapath.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Nicira Networks.
* Copyright (c) 2009, 2010 Nicira Networks.
* Distributed under the terms of the GNU GPL version 2.
*
* Significant portions of this file may be copied from parts of the Linux
Expand Down Expand Up @@ -79,9 +79,22 @@ struct dp_bucket {
struct sw_flow *flows[];
};

#define DP_N_QUEUES 2
#define DP_N_QUEUES 3
#define DP_MAX_QUEUE_LEN 100

/**
* struct dp_stats_percpu - per-cpu packet processing statistics for a given
* datapath.
* @n_frags: Number of IP fragments processed by datapath.
* @n_hit: Number of received packets for which a matching flow was found in
* the flow table.
* @n_miss: Number of received packets that had no matching flow in the flow
* table. The sum of @n_hit and @n_miss is the number of packets that have
* been received by the datapath.
* @n_lost: Number of received packets that had no matching flow in the flow
* table that could not be sent to userspace (normally due to an overflow in
* one of the datapath's queues).
*/
struct dp_stats_percpu {
u64 n_frags;
u64 n_hit;
Expand All @@ -95,10 +108,29 @@ struct dp_port_group {
u16 ports[];
};

/**
* struct datapath - datapath for flow-based packet switching
* @mutex: Mutual exclusion for ioctls.
* @dp_idx: Datapath number (index into the dps[] array in datapath.c).
* @ifobj: Represents /sys/class/net/<devname>/brif.
* @drop_frags: Drop all IP fragments if nonzero.
* @queues: %DP_N_QUEUES sets of queued packets for userspace to handle.
* @waitqueue: Waitqueue, for waiting for new packets in @queues.
* @n_flows: Number of flows currently in flow table.
* @table: Current flow table (RCU protected).
* @groups: Port groups, used by ODPAT_OUTPUT_GROUP action (RCU protected).
* @n_ports: Number of ports currently in @ports.
* @ports: Map from port number to &struct net_bridge_port. %ODPP_LOCAL port
* always exists, other ports may be %NULL.
* @port_list: List of all ports in @ports in arbitrary order.
* @stats_percpu: Per-CPU datapath statistics.
* @sflow_probability: Number of packets out of UINT_MAX to sample to the
* %ODPL_SFLOW queue, e.g. (@sflow_probability/UINT_MAX) is the probability of
* sampling a given packet.
*/
struct datapath {
struct mutex mutex;
int dp_idx;

struct kobject ifobj;

int drop_frags;
Expand All @@ -117,19 +149,37 @@ struct datapath {
/* Switch ports. */
unsigned int n_ports;
struct net_bridge_port *ports[DP_MAX_PORTS];
struct list_head port_list; /* All ports, including local_port. */
struct list_head port_list;

/* Stats. */
struct dp_stats_percpu *stats_percpu;

/* sFlow Sampling */
unsigned int sflow_probability;
};

/**
* struct net_bridge_port - one port within a datapath
* @port_no: Index into @dp's @ports array.
* @dp: Datapath to which this port belongs.
* @dev: The network device attached to this port. The @br_port member in @dev
* points back to this &struct net_bridge_port.
* @kobj: Represents /sys/class/net/<devname>/brport.
* @linkname: The name of the link from /sys/class/net/<datapath>/brif to this
* &struct net_bridge_port. (We keep this around so that we can delete it
* if @dev gets renamed.) Set to the null string when no link exists.
* @node: Element in @dp's @port_list.
* @sflow_pool: Number of packets that were candidates for sFlow sampling,
* regardless of whether they were actually chosen and sent down to userspace.
*/
struct net_bridge_port {
u16 port_no;
struct datapath *dp;
struct net_device *dev;
struct kobject kobj;
char linkname[IFNAMSIZ];
struct list_head node; /* Element in datapath.ports. */
struct list_head node;
atomic_t sflow_pool;
};

extern struct notifier_block dp_device_notifier;
Expand Down Expand Up @@ -160,16 +210,15 @@ static inline const char *dp_name(const struct datapath *dp)
return dp->ports[ODPP_LOCAL]->dev->name;
}

#ifdef CONFIG_XEN
int skb_checksum_setup(struct sk_buff *skb);
#if defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID)
int vswitch_skb_checksum_setup(struct sk_buff *skb);
#else
static inline int skb_checksum_setup(struct sk_buff *skb)
static inline int vswitch_skb_checksum_setup(struct sk_buff *skb)
{
return 0;
}
#endif

int vswitch_skb_checksum_setup(struct sk_buff *skb);
void forward_ip_summed(struct sk_buff *skb);

#endif /* datapath.h */
7 changes: 6 additions & 1 deletion datapath/dp_dev.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Nicira Networks.
* Copyright (c) 2009, 2010 Nicira Networks.
* Distributed under the terms of the GNU GPL version 2.
*
* Significant portions of this file may be copied from parts of the Linux
Expand All @@ -10,6 +10,7 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/preempt.h>
#include <linux/rcupdate.h>
#include <linux/skbuff.h>
#include <linux/workqueue.h>
Expand Down Expand Up @@ -62,9 +63,13 @@ int dp_dev_recv(struct net_device *netdev, struct sk_buff *skb)
else
netif_rx_ni(skb);
netdev->last_rx = jiffies;

preempt_disable();
lb_stats = per_cpu_ptr(dp_dev->lstats, smp_processor_id());
lb_stats->rx_packets++;
lb_stats->rx_bytes += len;
preempt_enable();

return len;
}

Expand Down
Loading

0 comments on commit a4af004

Please sign in to comment.