It doesn't seem like a good idea to allow the queue length to grow without
bound, even for a test-only device.

Signed-off-by: Ben Pfaff <b...@nicira.com>
---
 lib/netdev-dummy.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 6aa4084..2922965 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -50,6 +50,8 @@ struct netdev_dummy {
     struct netdev netdev;
     struct list node;           /* In netdev_dev_dummy's "devs" list. */
     struct list recv_queue;
+#define NETDEV_DUMMY_MAX_QUEUE 100
+    int recv_queue_len;         /* list_size(&recv_queue). */
     bool listening;
 };
 
@@ -133,6 +135,7 @@ netdev_dummy_open(struct netdev_dev *netdev_dev_, struct 
netdev **netdevp)
     netdev = xmalloc(sizeof *netdev);
     netdev_init(&netdev->netdev, netdev_dev_);
     list_init(&netdev->recv_queue);
+    netdev->recv_queue_len = 0;
     netdev->listening = false;
 
     *netdevp = &netdev->netdev;
@@ -169,6 +172,7 @@ netdev_dummy_recv(struct netdev *netdev_, void *buffer, 
size_t size)
     }
 
     packet = ofpbuf_from_list(list_pop_front(&netdev->recv_queue));
+    netdev->recv_queue_len--;
     if (packet->size > size) {
         return -EMSGSIZE;
     }
@@ -194,6 +198,7 @@ netdev_dummy_drain(struct netdev *netdev_)
 {
     struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
     ofpbuf_list_delete(&netdev->recv_queue);
+    netdev->recv_queue_len = 0;
     return 0;
 }
 
@@ -437,9 +442,11 @@ netdev_dummy_receive(struct unixctl_conn *conn,
 
         n_listeners = 0;
         LIST_FOR_EACH (dev, node, &dummy_dev->devs) {
-            if (dev->listening) {
+            if (dev->listening
+                && dev->recv_queue_len < NETDEV_DUMMY_MAX_QUEUE) {
                 struct ofpbuf *copy = ofpbuf_clone(packet);
                 list_push_back(&dev->recv_queue, &copy->list_node);
+                dev->recv_queue_len++;
                 n_listeners++;
             }
         }
-- 
1.7.2.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to