enum ofputil_packet_in_format packet_in_format;
/* OFPT_PACKET_IN related data. */
+ int packet_in_queue_size;
struct rconn_packet_counter *packet_in_counter; /* # queued on 'rconn'. */
#define N_SCHEDULERS 2
struct pinsched *schedulers[N_SCHEDULERS];
ofconn_set_protocol(ofconn, OFPUTIL_P_NONE);
ofconn->packet_in_format = OFPUTIL_PACKET_IN_STD;
+ ofconn->packet_in_queue_size = settings->max_pktq_size;
ofconn->packet_in_counter = rconn_packet_counter_create();
ofconn->miss_send_len = (ofconn->type == OFCONN_PRIMARY
? OFP_DEFAULT_MISS_SEND_LEN
rconn_set_probe_interval(ofconn->rconn, probe_interval);
ofconn->band = c->band;
+ ofconn->packet_in_queue_size = c->max_pktq_size;
ofconn_set_rate_limit(ofconn, c->rate_limit, c->burst_limit);
LIST_FOR_EACH_POP (pin, list_node, txq) {
if (rconn_send_with_limit(ofconn->rconn, pin,
- ofconn->packet_in_counter, 100) == EAGAIN) {
+ ofconn->packet_in_counter,
+ ofconn->packet_in_queue_size) == EAGAIN) {
static struct vlog_rate_limit rll = VLOG_RATE_LIMIT_INIT(5, 5);
VLOG_INFO_RL(&rll, "%s: dropping packet-in due to queue overflow",
* be negotiated for a session. */
/* OpenFlow packet-in rate-limiting. */
+ int max_pktq_size; /* Maximum number of packet-in to be queued. */
int rate_limit; /* Max packet-in rate in packets per second. */
int burst_limit; /* Limit on accumulating packet credits. */
static struct seq *ifaces_changed;
static uint64_t last_ifaces_changed;
+/* Default/min/max packet-in queue sizes towards the controllers. */
+#define BRIDGE_CONTROLLER_PACKET_QUEUE_DEFAULT_SIZE 100
+#define BRIDGE_CONTROLLER_PACKET_QUEUE_MIN_SIZE 1
+#define BRIDGE_CONTROLLER_PACKET_QUEUE_MAX_SIZE 512
+
static void add_del_bridges(const struct ovsrec_open_vswitch *);
static void bridge_run__(void);
static void bridge_create(const struct ovsrec_bridge *);
br->cfg->n_protocols);
}
+static int
+bridge_get_controller_queue_size(struct bridge *br,
+ struct ovsrec_controller *c)
+{
+ if (c && c->controller_queue_size) {
+ return *c->controller_queue_size;
+ }
+
+ int queue_size = smap_get_int(&br->cfg->other_config,
+ "controller-queue-size",
+ BRIDGE_CONTROLLER_PACKET_QUEUE_DEFAULT_SIZE);
+ if (queue_size < BRIDGE_CONTROLLER_PACKET_QUEUE_MIN_SIZE ||
+ queue_size > BRIDGE_CONTROLLER_PACKET_QUEUE_MAX_SIZE) {
+ return BRIDGE_CONTROLLER_PACKET_QUEUE_DEFAULT_SIZE;
+ }
+
+ return queue_size;
+}
+
/* Set NetFlow configuration on 'br'. */
static void
bridge_configure_netflow(struct bridge *br)
.band = OFPROTO_OUT_OF_BAND,
.enable_async_msgs = true,
.allowed_versions = bridge_get_allowed_versions(br),
+ .max_pktq_size = bridge_get_controller_queue_size(br, NULL),
};
shash_add_nocopy(
&ocs, xasprintf("punix:%s/%s.mgmt", ovs_rundir(), br->name), oc);
.enable_async_msgs = (!c->enable_async_messages
|| *c->enable_async_messages),
.allowed_versions = bridge_get_allowed_versions(br),
+ .max_pktq_size = bridge_get_controller_queue_size(br, c),
.rate_limit = (c->controller_rate_limit
? *c->controller_rate_limit : 0),
.burst_limit = (c->controller_burst_limit
{"name": "Open_vSwitch",
- "version": "8.1.0",
- "cksum": "1635647160 26090",
+ "version": "8.2.0",
+ "cksum": "4076590391 26298",
"tables": {
"Open_vSwitch": {
"columns": {
"enable_async_messages": {
"type": {"key": {"type": "boolean"},
"min": 0, "max": 1}},
+ "controller_queue_size": {
+ "type": {"key": {"type": "integer",
+ "minInteger": 1,
+ "maxInteger": 512},
+ "min": 0, "max": 1}},
"controller_rate_limit": {
"type": {"key": {"type": "integer",
"minInteger": 100},
ID, the default queue is used instead.
</column>
+ <column name="other_config" key="controller-queue-size"
+ type='{"type": "integer", "minInteger": 1, "maxInteger": 512}'>
+ This sets the maximum size of the queue of packets that need to be
+ sent to the OpenFlow management controller. The value must be less
+ than 512. If not specified the queue size is limited to 100 packets
+ by default. Note: increasing the queue size might have a negative
+ impact on latency.
+ </column>
+
<column name="protocols">
List of OpenFlow protocols that may be used when negotiating a
connection with a controller. OpenFlow 1.0, 1.1, 1.2, 1.3, 1.4, and
table="Interface"/> table for ingress policing configuration.
</p>
+ <column name="controller_queue_size">
+ <p>
+ This sets the maximum size of the queue of packets that need to be
+ sent to this OpenFlow controller. The value must be less than 512.
+ If not specified the queue size is limited to the value set for
+ the management controller in <ref table="Bridge"
+ column="other_config" key="controller-queue-size"/> if present or
+ 100 packets by default. Note: increasing the queue size might
+ have a negative impact on latency.
+ </p>
+ </column>
+
<column name="controller_rate_limit">
<p>
The maximum rate at which the switch will forward packets to the