diff options
author | Steven <sluong@cisco.com> | 2017-05-16 21:26:13 -0700 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-05-17 09:49:44 +0000 |
commit | 025d4151e2d7627aa771d577d405464a276039ad (patch) | |
tree | 6129483f516c578a47f908cf8d2f5ee53f30b709 /src/vnet/devices | |
parent | 01034be6738b9bd072a3d3cfdeb1b900aac2b54f (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/devices')
-rw-r--r-- | src/vnet/devices/virtio/vhost-user.c | 3 |
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 6ccc0d879bf..64d55b65f15 100644 --- a/src/vnet/devices/virtio/vhost-user.c +++ b/src/vnet/devices/virtio/vhost-user.c @@ -1813,7 +1813,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; |