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 |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 908fef2..62d8a1b 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -54,10 +54,15 @@ struct netdev_dummy {
     struct list rxes;           /* List of child "netdev_rx_dummy"s. */
 };
 
+/* Max 'recv_queue_len' in struct netdev_dummy. */
+#define NETDEV_DUMMY_MAX_QUEUE 100
+
 struct netdev_rx_dummy {
     struct netdev_rx up;
     struct list node;           /* In netdev_dummy's "rxes" list. */
     struct list recv_queue;
+    int recv_queue_len;         /* list_size(&recv_queue). */
+    bool listening;
 };
 
 static struct shash dummy_netdevs = SHASH_INITIALIZER(&dummy_netdevs);
@@ -159,6 +164,7 @@ netdev_dummy_rx_open(struct netdev *netdev_, struct 
netdev_rx **rxp)
     netdev_rx_init(&rx->up, &netdev->up, &netdev_rx_dummy_class);
     list_push_back(&netdev->rxes, &rx->node);
     list_init(&rx->recv_queue);
+    rx->recv_queue_len = 0;
 
     *rxp = &rx->up;
     return 0;
@@ -176,6 +182,7 @@ netdev_rx_dummy_recv(struct netdev_rx *rx_, void *buffer, 
size_t size)
     }
 
     packet = ofpbuf_from_list(list_pop_front(&rx->recv_queue));
+    rx->recv_queue_len--;
     if (packet->size > size) {
         return -EMSGSIZE;
     }
@@ -210,6 +217,7 @@ netdev_rx_dummy_drain(struct netdev_rx *rx_)
 {
     struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
     ofpbuf_list_delete(&rx->recv_queue);
+    rx->recv_queue_len = 0;
     return 0;
 }
 
@@ -463,8 +471,11 @@ netdev_dummy_receive(struct unixctl_conn *conn,
 
         n_listeners = 0;
         LIST_FOR_EACH (rx, node, &dummy_dev->rxes) {
-            struct ofpbuf *copy = ofpbuf_clone(packet);
-            list_push_back(&rx->recv_queue, &copy->list_node);
+            if (rx->recv_queue_len < NETDEV_DUMMY_MAX_QUEUE) {
+                struct ofpbuf *copy = ofpbuf_clone(packet);
+                list_push_back(&rx->recv_queue, &copy->list_node);
+                rx->recv_queue_len++;
+            }
             n_listeners++;
         }
         ofpbuf_delete(packet);
-- 
1.7.2.5

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

Reply via email to