aboutsummaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorAkihiko Odaki <akihiko.odaki@daynix.com>2023-05-23 11:43:22 +0900
committerJason Wang <jasowang@redhat.com>2023-05-23 15:20:15 +0800
commitaaa8a15c96a8a7341a3667dcc932f8c5f227d6af (patch)
tree9597d186e23ba931b8a55b22ad18e60ef56505c2 /net
parent85427bf3884f42626208865f3fe594b3919566fb (diff)
downloadqemu-aaa8a15c96a8a7341a3667dcc932f8c5f227d6af.zip
qemu-aaa8a15c96a8a7341a3667dcc932f8c5f227d6af.tar.gz
qemu-aaa8a15c96a8a7341a3667dcc932f8c5f227d6af.tar.bz2
net/eth: Always add VLAN tag
It is possible to have another VLAN tag even if the packet is already tagged. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'net')
-rw-r--r--net/eth.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/net/eth.c b/net/eth.c
index f7ffbda..5307978 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -21,26 +21,16 @@
#include "net/checksum.h"
#include "net/tap.h"
-void eth_setup_vlan_headers(struct eth_header *ehdr, uint16_t vlan_tag,
- uint16_t vlan_ethtype, bool *is_new)
+void eth_setup_vlan_headers(struct eth_header *ehdr, size_t *ehdr_size,
+ uint16_t vlan_tag, uint16_t vlan_ethtype)
{
struct vlan_header *vhdr = PKT_GET_VLAN_HDR(ehdr);
- switch (be16_to_cpu(ehdr->h_proto)) {
- case ETH_P_VLAN:
- case ETH_P_DVLAN:
- /* vlan hdr exists */
- *is_new = false;
- break;
-
- default:
- /* No VLAN header, put a new one */
- vhdr->h_proto = ehdr->h_proto;
- ehdr->h_proto = cpu_to_be16(vlan_ethtype);
- *is_new = true;
- break;
- }
+ memmove(vhdr + 1, vhdr, *ehdr_size - ETH_HLEN);
vhdr->h_tci = cpu_to_be16(vlan_tag);
+ vhdr->h_proto = ehdr->h_proto;
+ ehdr->h_proto = cpu_to_be16(vlan_ethtype);
+ *ehdr_size += sizeof(*vhdr);
}
uint8_t