bridge: Log a warning when QoS misconfiguration is likely.
authorBen Pfaff <blp@nicira.com>
Wed, 20 Jul 2011 17:41:16 +0000 (10:41 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 20 Jul 2011 17:41:16 +0000 (10:41 -0700)
Queue 0 is documented as the "default queue" used when a packet is not
directed to any specific queue.  Many qdiscs drop packets not directed to a
queue if the default queue is not configured.  This is therefore likely to
be a misconfiguration, so warn about it.

Bug #5583.

vswitchd/bridge.c

index 449957a9f5372242a40fc1822e1cb5356f22b36c..fcd7a78d1b5d83068e18944b2485e6957d90ca0c 100644 (file)
@@ -2474,6 +2474,7 @@ iface_configure_qos(struct iface *iface, const struct ovsrec_qos *qos)
     } else {
         struct iface_delete_queues_cbdata cbdata;
         struct shash details;
+        bool queue_zero;
         size_t i;
 
         /* Configure top-level Qos for 'iface'. */
@@ -2489,16 +2490,28 @@ iface_configure_qos(struct iface *iface, const struct ovsrec_qos *qos)
         netdev_dump_queues(iface->netdev, iface_delete_queues, &cbdata);
 
         /* Configure queues for 'iface'. */
+        queue_zero = false;
         for (i = 0; i < qos->n_queues; i++) {
             const struct ovsrec_queue *queue = qos->value_queues[i];
             unsigned int queue_id = qos->key_queues[i];
 
+            if (queue_id == 0) {
+                queue_zero = true;
+            }
+
             shash_from_ovs_idl_map(queue->key_other_config,
                                    queue->value_other_config,
                                    queue->n_other_config, &details);
             netdev_set_queue(iface->netdev, queue_id, &details);
             shash_destroy(&details);
         }
+        if (!queue_zero) {
+            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+            VLOG_WARN_RL(&rl, "interface %s: QoS configured without a default "
+                         "queue (queue 0).  Packets not directed to a "
+                         "correctly configured queue may be dropped.",
+                         iface->name);
+        }
     }
 
     netdev_set_policing(iface->netdev,