eth: Extend vlan stripping functions
Make VLAN stripping functions return number of bytes copied to given Ethernet header buffer. This information should be used to re-compose packet IOV after VLAN stripping. Cc: qemu-stable@nongnu.org Signed-off-by: Dmitry Fleytman <dmitry@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
290e6e113b
commit
566342c312
@ -331,12 +331,12 @@ eth_get_pkt_tci(const void *p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
size_t
|
||||||
eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
||||||
uint8_t *new_ehdr_buf,
|
uint8_t *new_ehdr_buf,
|
||||||
uint16_t *payload_offset, uint16_t *tci);
|
uint16_t *payload_offset, uint16_t *tci);
|
||||||
|
|
||||||
bool
|
size_t
|
||||||
eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
|
eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
|
||||||
uint16_t vet, uint8_t *new_ehdr_buf,
|
uint16_t vet, uint8_t *new_ehdr_buf,
|
||||||
uint16_t *payload_offset, uint16_t *tci);
|
uint16_t *payload_offset, uint16_t *tci);
|
||||||
|
25
net/eth.c
25
net/eth.c
@ -232,7 +232,7 @@ void eth_get_protocols(const struct iovec *iov, int iovcnt,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
size_t
|
||||||
eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
||||||
uint8_t *new_ehdr_buf,
|
uint8_t *new_ehdr_buf,
|
||||||
uint16_t *payload_offset, uint16_t *tci)
|
uint16_t *payload_offset, uint16_t *tci)
|
||||||
@ -244,7 +244,7 @@ eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
|||||||
new_ehdr, sizeof(*new_ehdr));
|
new_ehdr, sizeof(*new_ehdr));
|
||||||
|
|
||||||
if (copied < sizeof(*new_ehdr)) {
|
if (copied < sizeof(*new_ehdr)) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (be16_to_cpu(new_ehdr->h_proto)) {
|
switch (be16_to_cpu(new_ehdr->h_proto)) {
|
||||||
@ -254,7 +254,7 @@ eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
|||||||
&vlan_hdr, sizeof(vlan_hdr));
|
&vlan_hdr, sizeof(vlan_hdr));
|
||||||
|
|
||||||
if (copied < sizeof(vlan_hdr)) {
|
if (copied < sizeof(vlan_hdr)) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_ehdr->h_proto = vlan_hdr.h_proto;
|
new_ehdr->h_proto = vlan_hdr.h_proto;
|
||||||
@ -268,18 +268,21 @@ eth_strip_vlan(const struct iovec *iov, int iovcnt, size_t iovoff,
|
|||||||
PKT_GET_VLAN_HDR(new_ehdr), sizeof(vlan_hdr));
|
PKT_GET_VLAN_HDR(new_ehdr), sizeof(vlan_hdr));
|
||||||
|
|
||||||
if (copied < sizeof(vlan_hdr)) {
|
if (copied < sizeof(vlan_hdr)) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*payload_offset += sizeof(vlan_hdr);
|
*payload_offset += sizeof(vlan_hdr);
|
||||||
|
|
||||||
|
return sizeof(struct eth_header) + sizeof(struct vlan_header);
|
||||||
|
} else {
|
||||||
|
return sizeof(struct eth_header);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
size_t
|
||||||
eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
|
eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
|
||||||
uint16_t vet, uint8_t *new_ehdr_buf,
|
uint16_t vet, uint8_t *new_ehdr_buf,
|
||||||
uint16_t *payload_offset, uint16_t *tci)
|
uint16_t *payload_offset, uint16_t *tci)
|
||||||
@ -291,7 +294,7 @@ eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
|
|||||||
new_ehdr, sizeof(*new_ehdr));
|
new_ehdr, sizeof(*new_ehdr));
|
||||||
|
|
||||||
if (copied < sizeof(*new_ehdr)) {
|
if (copied < sizeof(*new_ehdr)) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (be16_to_cpu(new_ehdr->h_proto) == vet) {
|
if (be16_to_cpu(new_ehdr->h_proto) == vet) {
|
||||||
@ -299,17 +302,17 @@ eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
|
|||||||
&vlan_hdr, sizeof(vlan_hdr));
|
&vlan_hdr, sizeof(vlan_hdr));
|
||||||
|
|
||||||
if (copied < sizeof(vlan_hdr)) {
|
if (copied < sizeof(vlan_hdr)) {
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_ehdr->h_proto = vlan_hdr.h_proto;
|
new_ehdr->h_proto = vlan_hdr.h_proto;
|
||||||
|
|
||||||
*tci = be16_to_cpu(vlan_hdr.h_tci);
|
*tci = be16_to_cpu(vlan_hdr.h_tci);
|
||||||
*payload_offset = iovoff + sizeof(*new_ehdr) + sizeof(vlan_hdr);
|
*payload_offset = iovoff + sizeof(*new_ehdr) + sizeof(vlan_hdr);
|
||||||
return true;
|
return sizeof(struct eth_header);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user