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, ©->list_node); + dev->recv_queue_len++; n_listeners++; } } -- 1.7.2.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev