X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fnetdev-dummy.c;h=e7dfe9f18a8bf93e0a249512d7b88c9f8160ff09;hb=4a1b8f30e5956655b59200d673964b9f3f9ad711;hp=82473a177dc94e8aea0781df8e83998dcabd4ee5;hpb=01cdb3a111ca9613c8dd5a33aaf752d8ad746f87;p=sliver-openvswitch.git diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 82473a177..e7dfe9f18 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -241,16 +241,11 @@ static int netdev_dummy_create(const struct netdev_class *class, const char *name, struct netdev **netdevp) { - static unsigned int next_n = 0xaa550000; - static pthread_mutex_t mutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER; - + static atomic_uint next_n = ATOMIC_VAR_INIT(0xaa550000); struct netdev_dummy *netdev; unsigned int n; - xpthread_mutex_lock(&mutex); - n = next_n++; - xpthread_mutex_unlock(&mutex); - + atomic_add(&next_n, 1, &n); netdev = xzalloc(sizeof *netdev); netdev_init(&netdev->up, name, class); netdev->hwaddr[0] = 0xaa; @@ -356,7 +351,7 @@ netdev_rx_dummy_recv(struct netdev_rx *rx_, void *buffer, size_t size) { struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_); struct ofpbuf *packet; - size_t packet_size; + int retval; if (list_is_empty(&rx->recv_queue)) { return -EAGAIN; @@ -364,15 +359,15 @@ 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; + if (packet->size <= size) { + memcpy(buffer, packet->data, packet->size); + retval = packet->size; + } else { + retval = -EMSGSIZE; } - packet_size = packet->size; - - memcpy(buffer, packet->data, packet->size); ofpbuf_delete(packet); - return packet_size; + return retval; } static void