summaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
authorSteven <sluong@cisco.com>2017-05-16 21:26:13 -0700
committerDamjan Marion <damarion@cisco.com>2017-05-17 11:50:27 +0200
commit1da79ed89942dd27ea1d7c74311b91d02624722d (patch)
tree31979e991dd42bddd195b0b1b2c8cf87d2c20313 /src/vnet
parent99c0734e54f16456aed0c35b464d6d165e26d9b1 (diff)
vhost: bad packet assembled from descriptor chaining
When the descriptor is chained via multiple parts, vhost is supposed to reassemble the different parts to form a packet prior to passing the packet to the next input node. However, bad packet was seen, having bad ethertype, source, and destination mac addresses. The problem was due to the destination pointer not being incremented as each chain is processed. THe result was the first chain is copied to the beginning of the buffer, the next chain is copied, then the last chain is also copied to the beginning of the buffer. As a result, the ethertype, source and destination mac, etc, are being overwritten by the very last chain of the descriptor. Change-Id: I78f9a91de68c85574047912576dcc311d7597e21 Signed-off-by: Steven <sluong@cisco.com>
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/devices/virtio/vhost-user.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/vnet/devices/virtio/vhost-user.c b/src/vnet/devices/virtio/vhost-user.c
index 5ad4cb62bee..0593c713ae6 100644
--- a/src/vnet/devices/virtio/vhost-user.c
+++ b/src/vnet/devices/virtio/vhost-user.c
@@ -1829,7 +1829,8 @@ vhost_user_if_input (vlib_main_t * vm,
desc_table[desc_current].len - desc_data_offset;
cpy->len = VLIB_BUFFER_DATA_SIZE - b_current->current_length;
cpy->len = (cpy->len > desc_data_l) ? desc_data_l : cpy->len;
- cpy->dst = (uword) vlib_buffer_get_current (b_current);
+ cpy->dst = (uword) (vlib_buffer_get_current (b_current) +
+ b_current->current_length);
cpy->src = desc_table[desc_current].addr + desc_data_offset;
desc_data_offset += cpy->len;