git://git.onelab.eu
/
sliver-openvswitch.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of ssh://git.onelab.eu/git/sliver-openvswitch
[sliver-openvswitch.git]
/
lib
/
netdev-dummy.c
diff --git
a/lib/netdev-dummy.c
b/lib/netdev-dummy.c
index
8ad9af6
..
b2a7572
100644
(file)
--- a/
lib/netdev-dummy.c
+++ b/
lib/netdev-dummy.c
@@
-87,6
+87,7
@@
struct netdev_rx_dummy {
struct list node; /* In netdev_dummy's "rxes" list. */
struct list recv_queue;
int recv_queue_len; /* list_size(&recv_queue). */
struct list node; /* In netdev_dummy's "rxes" list. */
struct list recv_queue;
int recv_queue_len; /* list_size(&recv_queue). */
+ struct seq *seq; /* Reports newly queued packets. */
};
static unixctl_cb_func netdev_dummy_set_admin_state;
};
static unixctl_cb_func netdev_dummy_set_admin_state;
@@
-418,6
+419,7
@@
netdev_dummy_rx_construct(struct netdev_rx *rx_)
list_push_back(&netdev->rxes, &rx->node);
list_init(&rx->recv_queue);
rx->recv_queue_len = 0;
list_push_back(&netdev->rxes, &rx->node);
list_init(&rx->recv_queue);
rx->recv_queue_len = 0;
+ rx->seq = seq_create();
ovs_mutex_unlock(&netdev->mutex);
return 0;
ovs_mutex_unlock(&netdev->mutex);
return 0;
@@
-433,6
+435,7
@@
netdev_dummy_rx_destruct(struct netdev_rx *rx_)
list_remove(&rx->node);
ofpbuf_list_delete(&rx->recv_queue);
ovs_mutex_unlock(&netdev->mutex);
list_remove(&rx->node);
ofpbuf_list_delete(&rx->recv_queue);
ovs_mutex_unlock(&netdev->mutex);
+ seq_destroy(rx->seq);
}
static void
}
static void
@@
-444,7
+447,7
@@
netdev_dummy_rx_dealloc(struct netdev_rx *rx_)
}
static int
}
static int
-netdev_dummy_rx_recv(struct netdev_rx *rx_,
void *buffer, size_t size
)
+netdev_dummy_rx_recv(struct netdev_rx *rx_,
struct ofpbuf *buffer
)
{
struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
{
struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
@@
-461,19
+464,20
@@
netdev_dummy_rx_recv(struct netdev_rx *rx_, void *buffer, size_t size)
ovs_mutex_unlock(&netdev->mutex);
if (!packet) {
ovs_mutex_unlock(&netdev->mutex);
if (!packet) {
- return
-
EAGAIN;
+ return EAGAIN;
}
}
- if (packet->size <= size) {
- memcpy(buffer, packet->data, packet->size);
- retval = packet->size;
+ if (packet->size <= ofpbuf_tailroom(buffer)) {
+ memcpy(buffer->data, packet->data, packet->size);
+ buffer->size += packet->size;
+ retval = 0;
ovs_mutex_lock(&netdev->mutex);
netdev->stats.rx_packets++;
netdev->stats.rx_bytes += packet->size;
ovs_mutex_unlock(&netdev->mutex);
} else {
ovs_mutex_lock(&netdev->mutex);
netdev->stats.rx_packets++;
netdev->stats.rx_bytes += packet->size;
ovs_mutex_unlock(&netdev->mutex);
} else {
- retval =
-
EMSGSIZE;
+ retval = EMSGSIZE;
}
ofpbuf_delete(packet);
}
ofpbuf_delete(packet);
@@
-485,10
+489,13
@@
netdev_dummy_rx_wait(struct netdev_rx *rx_)
{
struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
{
struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
+ uint64_t seq = seq_read(rx->seq);
ovs_mutex_lock(&netdev->mutex);
if (!list_is_empty(&rx->recv_queue)) {
poll_immediate_wake();
ovs_mutex_lock(&netdev->mutex);
if (!list_is_empty(&rx->recv_queue)) {
poll_immediate_wake();
+ } else {
+ seq_wait(rx->seq, seq);
}
ovs_mutex_unlock(&netdev->mutex);
}
}
ovs_mutex_unlock(&netdev->mutex);
}
@@
-504,6
+511,8
@@
netdev_dummy_rx_drain(struct netdev_rx *rx_)
rx->recv_queue_len = 0;
ovs_mutex_unlock(&netdev->mutex);
rx->recv_queue_len = 0;
ovs_mutex_unlock(&netdev->mutex);
+ seq_change(rx->seq);
+
return 0;
}
return 0;
}
@@
-795,6
+804,7
@@
netdev_dummy_queue_packet__(struct netdev_rx_dummy *rx, struct ofpbuf *packet)
{
list_push_back(&rx->recv_queue, &packet->list_node);
rx->recv_queue_len++;
{
list_push_back(&rx->recv_queue, &packet->list_node);
rx->recv_queue_len++;
+ seq_change(rx->seq);
}
static void
}
static void