Thank you. I pushed this series.
On Thu, Feb 09, 2012 at 12:51:08PM -0800, Ethan Jackson wrote: > Looks good, > Ethan > > On Thu, Jan 26, 2012 at 15:53, Ben Pfaff <b...@nicira.com> wrote: > > An OpenFlow connection can start receiving asynchronous messages such as > > "packet-ins" immediately at connect time. If there is a lot of traffic on > > the network then this can swamp the controller before it gets a chance to > > set up an initial flow table. This setting overrides this OpenFlow > > behavior, changing it so that the connection initially enables no > > asynchronous messages at all. The controller can enable any messages that > > it actually wants when it is ready for them. > > > > Feature #7086. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > NEWS | 3 ++ > > ofproto/connmgr.c | 60 > > +++++++++++++++++++++++++++----------------- > > ofproto/ofproto.h | 5 ++- > > vswitchd/bridge.c | 3 ++ > > vswitchd/vswitch.ovsschema | 7 +++- > > vswitchd/vswitch.xml | 21 ++++++++++++++- > > 6 files changed, 71 insertions(+), 28 deletions(-) > > > > diff --git a/NEWS b/NEWS > > index 0b97149..f52f912 100644 > > --- a/NEWS > > +++ b/NEWS > > @@ -10,6 +10,9 @@ post-v1.5.0 > > - Added an OpenFlow extension NXT_SET_ASYNC_CONFIG that allows > > controllers more precise control over which OpenFlow messages they > > receive asynchronously. > > + - New "enable-async-messages" column in the Controller table. If set > > to > > + false, OpenFlow connections to the controller will initially have all > > + asynchronous messages disabled, overriding normal OpenFlow behavior. > > > > > > v1.5.0 - xx xxx xxxx > > diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c > > index 5caa6bf..12319fe 100644 > > --- a/ofproto/connmgr.c > > +++ b/ofproto/connmgr.c > > @@ -52,6 +52,7 @@ struct ofconn { > > struct rconn *rconn; /* OpenFlow connection. */ > > enum ofconn_type type; /* Type. */ > > enum ofproto_band band; /* In-band or out-of-band? */ > > + bool enable_async_msgs; /* Initially enable async messages? */ > > > > /* State that should be cleared from one connection to the next. */ > > > > @@ -90,7 +91,7 @@ struct ofconn { > > }; > > > > static struct ofconn *ofconn_create(struct connmgr *, struct rconn *, > > - enum ofconn_type); > > + enum ofconn_type, bool > > enable_async_msgs); > > static void ofconn_destroy(struct ofconn *); > > static void ofconn_flush(struct ofconn *); > > > > @@ -122,6 +123,7 @@ struct ofservice { > > int probe_interval; /* Max idle time before probing, in > > seconds. */ > > int rate_limit; /* Max packet-in rate in packets per > > second. */ > > int burst_limit; /* Limit on accumulating packet credits. */ > > + bool enable_async_msgs; /* Initially enable async messages? */ > > }; > > > > static void ofservice_reconfigure(struct ofservice *, > > @@ -285,7 +287,8 @@ connmgr_run(struct connmgr *mgr, > > rconn_connect_unreliably(rconn, vconn, name); > > free(name); > > > > - ofconn = ofconn_create(mgr, rconn, OFCONN_SERVICE); > > + ofconn = ofconn_create(mgr, rconn, OFCONN_SERVICE, > > + ofservice->enable_async_msgs); > > ofconn_set_rate_limit(ofconn, ofservice->rate_limit, > > ofservice->burst_limit); > > } else if (retval != EAGAIN) { > > @@ -563,7 +566,7 @@ add_controller(struct connmgr *mgr, const char *target) > > char *name = ofconn_make_name(mgr, target); > > struct ofconn *ofconn; > > > > - ofconn = ofconn_create(mgr, rconn_create(5, 8), OFCONN_PRIMARY); > > + ofconn = ofconn_create(mgr, rconn_create(5, 8), OFCONN_PRIMARY, true); > > ofconn->pktbuf = pktbuf_create(); > > rconn_connect(ofconn->rconn, target, name); > > hmap_insert(&mgr->controllers, &ofconn->hmap_node, hash_string(target, > > 0)); > > @@ -955,7 +958,8 @@ ofconn_get_target(const struct ofconn *ofconn) > > } > > > > static struct ofconn * > > -ofconn_create(struct connmgr *mgr, struct rconn *rconn, enum ofconn_type > > type) > > +ofconn_create(struct connmgr *mgr, struct rconn *rconn, enum ofconn_type > > type, > > + bool enable_async_msgs) > > { > > struct ofconn *ofconn; > > > > @@ -964,6 +968,7 @@ ofconn_create(struct connmgr *mgr, struct rconn *rconn, > > enum ofconn_type type) > > list_push_back(&mgr->all_conns, &ofconn->node); > > ofconn->rconn = rconn; > > ofconn->type = type; > > + ofconn->enable_async_msgs = enable_async_msgs; > > > > list_init(&ofconn->opgroups); > > > > @@ -977,8 +982,6 @@ ofconn_create(struct connmgr *mgr, struct rconn *rconn, > > enum ofconn_type type) > > static void > > ofconn_flush(struct ofconn *ofconn) > > { > > - uint32_t *master = ofconn->master_async_config; > > - uint32_t *slave = ofconn->slave_async_config; > > int i; > > > > ofconn->role = NX_ROLE_OTHER; > > @@ -1020,23 +1023,33 @@ ofconn_flush(struct ofconn *ofconn) > > rconn_packet_counter_destroy(ofconn->reply_counter); > > ofconn->reply_counter = rconn_packet_counter_create(); > > > > - /* "master" and "other" roles get all asynchronous messages by default, > > - * except that the controller needs to enable nonstandard "packet-in" > > - * reasons itself. */ > > - master[OAM_PACKET_IN] = (1u << OFPR_NO_MATCH) | (1u << OFPR_ACTION); > > - master[OAM_PORT_STATUS] = ((1u << OFPPR_ADD) > > - | (1u << OFPPR_DELETE) > > - | (1u << OFPPR_MODIFY)); > > - master[OAM_FLOW_REMOVED] = ((1u << OFPRR_IDLE_TIMEOUT) > > - | (1u << OFPRR_HARD_TIMEOUT) > > - | (1u << OFPRR_DELETE)); > > - > > - /* "slave" role gets port status updates by default. */ > > - slave[OAM_PACKET_IN] = 0; > > - slave[OAM_PORT_STATUS] = ((1u << OFPPR_ADD) > > - | (1u << OFPPR_DELETE) > > - | (1u << OFPPR_MODIFY)); > > - slave[OAM_FLOW_REMOVED] = 0; > > + if (ofconn->enable_async_msgs) { > > + uint32_t *master = ofconn->master_async_config; > > + uint32_t *slave = ofconn->slave_async_config; > > + > > + /* "master" and "other" roles get all asynchronous messages by > > default, > > + * except that the controller needs to enable nonstandard > > "packet-in" > > + * reasons itself. */ > > + master[OAM_PACKET_IN] = (1u << OFPR_NO_MATCH) | (1u << > > OFPR_ACTION); > > + master[OAM_PORT_STATUS] = ((1u << OFPPR_ADD) > > + | (1u << OFPPR_DELETE) > > + | (1u << OFPPR_MODIFY)); > > + master[OAM_FLOW_REMOVED] = ((1u << OFPRR_IDLE_TIMEOUT) > > + | (1u << OFPRR_HARD_TIMEOUT) > > + | (1u << OFPRR_DELETE)); > > + > > + /* "slave" role gets port status updates by default. */ > > + slave[OAM_PACKET_IN] = 0; > > + slave[OAM_PORT_STATUS] = ((1u << OFPPR_ADD) > > + | (1u << OFPPR_DELETE) > > + | (1u << OFPPR_MODIFY)); > > + slave[OAM_FLOW_REMOVED] = 0; > > + } else { > > + memset(ofconn->master_async_config, 0, > > + sizeof ofconn->master_async_config); > > + memset(ofconn->slave_async_config, 0, > > + sizeof ofconn->slave_async_config); > > + } > > } > > > > static void > > @@ -1599,6 +1612,7 @@ ofservice_reconfigure(struct ofservice *ofservice, > > ofservice->probe_interval = c->probe_interval; > > ofservice->rate_limit = c->rate_limit; > > ofservice->burst_limit = c->burst_limit; > > + ofservice->enable_async_msgs = c->enable_async_msgs; > > } > > > > /* Finds and returns the ofservice within 'mgr' that has the given > > diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h > > index 2d47878..ef9ccf5 100644 > > --- a/ofproto/ofproto.h > > +++ b/ofproto/ofproto.h > > @@ -1,5 +1,5 @@ > > /* > > - * Copyright (c) 2009, 2010, 2011 Nicira Networks. > > + * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks. > > * > > * Licensed under the Apache License, Version 2.0 (the "License"); > > * you may not use this file except in compliance with the License. > > @@ -121,7 +121,8 @@ struct ofproto_controller { > > char *target; /* e.g. "tcp:127.0.0.1" */ > > int max_backoff; /* Maximum reconnection backoff, in > > seconds. */ > > int probe_interval; /* Max idle time before probing, in > > seconds. */ > > - enum ofproto_band band; /* In-band or out-of-band? */ > > + enum ofproto_band band; /* In-band or out-of-band? */ > > + bool enable_async_msgs; /* Initially enable asynchronous messages? > > */ > > > > /* OpenFlow packet-in rate-limiting. */ > > int rate_limit; /* Max packet-in rate in packets per > > second. */ > > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c > > index c40bcb5..ad2ff22 100644 > > --- a/vswitchd/bridge.c > > +++ b/vswitchd/bridge.c > > @@ -2293,6 +2293,7 @@ bridge_ofproto_controller_for_mgmt(const struct > > bridge *br, > > oc->band = OFPROTO_OUT_OF_BAND; > > oc->rate_limit = 0; > > oc->burst_limit = 0; > > + oc->enable_async_msgs = true; > > } > > > > /* Converts ovsrec_controller 'c' into an ofproto_controller in 'oc'. */ > > @@ -2308,6 +2309,8 @@ bridge_ofproto_controller_from_ovsrec(const struct > > ovsrec_controller *c, > > oc->rate_limit = c->controller_rate_limit ? *c->controller_rate_limit : > > 0; > > oc->burst_limit = (c->controller_burst_limit > > ? *c->controller_burst_limit : 0); > > + oc->enable_async_msgs = (!c->enable_async_messages > > + || *c->enable_async_messages); > > } > > > > /* Configures the IP stack for 'br''s local interface properly according > > to the > > diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema > > index 9d91b0f..66fc39c 100644 > > --- a/vswitchd/vswitch.ovsschema > > +++ b/vswitchd/vswitch.ovsschema > > @@ -1,6 +1,6 @@ > > {"name": "Open_vSwitch", > > - "version": "6.4.0", > > - "cksum": "923041702 15687", > > + "version": "6.5.0", > > + "cksum": "870121236 15807", > > "tables": { > > "Open_vSwitch": { > > "columns": { > > @@ -367,6 +367,9 @@ > > "local_gateway": { > > "type": {"key": {"type": "string"}, > > "min": 0, "max": 1}}, > > + "enable_async_messages": { > > + "type": {"key": {"type": "boolean"}, > > + "min": 0, "max": 1}}, > > "controller_rate_limit": { > > "type": {"key": {"type": "integer", > > "minInteger": 100}, > > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml > > index 4b99b99..097ecb6 100644 > > --- a/vswitchd/vswitch.xml > > +++ b/vswitchd/vswitch.xml > > @@ -2336,7 +2336,26 @@ > > </column> > > </group> > > > > - <group title="OpenFlow Rate Limiting"> > > + <group title="Asynchronous Message Configuration"> > > + <p> > > + OpenFlow switches send certain messages to controllers > > spontanenously, > > + that is, not in response to any request from the controller. These > > + messages are called ``asynchronous messages.'' These columns allow > > + asynchronous messages to be limited or disabled to ensure the best > > use > > + of network resources. > > + </p> > > + > > + <column name="enable_async_messages"> > > + The OpenFlow protocol enables asynchronous messages at time of > > + connection establishment, which means that a controller can receive > > + asynchronous messages, potentially many of them, even if it turns > > them > > + off immediately after connecting. Set this column to > > + <code>false</code> to change Open vSwitch behavior to disable, by > > + default, all asynchronous messages. The controller can use the > > + <code>NXT_SET_ASYNC_CONFIG</code> Nicira extension to OpenFlow to > > turn > > + on any messages that it does want to receive, if any. > > + </column> > > + > > <column name="controller_rate_limit"> > > <p> > > The maximum rate at which the switch will forward packets to the > > -- > > 1.7.2.5 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev