hw/net/net_tx_pkt: Align l3_hdr
Align the l3_hdr member of NetTxPkt by defining it as a union of
ip_header, ip6_header, and an array of octets.
Fixes: e263cd49c7
("Packet abstraction for VMWARE network devices")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1544
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
4cf3a63849
commit
2a5f744ef2
@ -43,7 +43,11 @@ struct NetTxPkt {
|
|||||||
struct iovec *vec;
|
struct iovec *vec;
|
||||||
|
|
||||||
uint8_t l2_hdr[ETH_MAX_L2_HDR_LEN];
|
uint8_t l2_hdr[ETH_MAX_L2_HDR_LEN];
|
||||||
uint8_t l3_hdr[ETH_MAX_IP_DGRAM_LEN];
|
union {
|
||||||
|
struct ip_header ip;
|
||||||
|
struct ip6_header ip6;
|
||||||
|
uint8_t octets[ETH_MAX_IP_DGRAM_LEN];
|
||||||
|
} l3_hdr;
|
||||||
|
|
||||||
uint32_t payload_len;
|
uint32_t payload_len;
|
||||||
|
|
||||||
@ -89,16 +93,14 @@ void net_tx_pkt_update_ip_hdr_checksum(struct NetTxPkt *pkt)
|
|||||||
{
|
{
|
||||||
uint16_t csum;
|
uint16_t csum;
|
||||||
assert(pkt);
|
assert(pkt);
|
||||||
struct ip_header *ip_hdr;
|
|
||||||
ip_hdr = pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base;
|
|
||||||
|
|
||||||
ip_hdr->ip_len = cpu_to_be16(pkt->payload_len +
|
pkt->l3_hdr.ip.ip_len = cpu_to_be16(pkt->payload_len +
|
||||||
pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_len);
|
pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_len);
|
||||||
|
|
||||||
ip_hdr->ip_sum = 0;
|
pkt->l3_hdr.ip.ip_sum = 0;
|
||||||
csum = net_raw_checksum((uint8_t *)ip_hdr,
|
csum = net_raw_checksum(pkt->l3_hdr.octets,
|
||||||
pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_len);
|
pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_len);
|
||||||
ip_hdr->ip_sum = cpu_to_be16(csum);
|
pkt->l3_hdr.ip.ip_sum = cpu_to_be16(csum);
|
||||||
}
|
}
|
||||||
|
|
||||||
void net_tx_pkt_update_ip_checksums(struct NetTxPkt *pkt)
|
void net_tx_pkt_update_ip_checksums(struct NetTxPkt *pkt)
|
||||||
@ -832,15 +834,14 @@ void net_tx_pkt_fix_ip6_payload_len(struct NetTxPkt *pkt)
|
|||||||
{
|
{
|
||||||
struct iovec *l2 = &pkt->vec[NET_TX_PKT_L2HDR_FRAG];
|
struct iovec *l2 = &pkt->vec[NET_TX_PKT_L2HDR_FRAG];
|
||||||
if (eth_get_l3_proto(l2, 1, l2->iov_len) == ETH_P_IPV6) {
|
if (eth_get_l3_proto(l2, 1, l2->iov_len) == ETH_P_IPV6) {
|
||||||
struct ip6_header *ip6 = (struct ip6_header *) pkt->l3_hdr;
|
|
||||||
/*
|
/*
|
||||||
* TODO: if qemu would support >64K packets - add jumbo option check
|
* TODO: if qemu would support >64K packets - add jumbo option check
|
||||||
* something like that:
|
* something like that:
|
||||||
* 'if (ip6->ip6_plen == 0 && !has_jumbo_option(ip6)) {'
|
* 'if (ip6->ip6_plen == 0 && !has_jumbo_option(ip6)) {'
|
||||||
*/
|
*/
|
||||||
if (ip6->ip6_plen == 0) {
|
if (pkt->l3_hdr.ip6.ip6_plen == 0) {
|
||||||
if (pkt->payload_len <= ETH_MAX_IP_DGRAM_LEN) {
|
if (pkt->payload_len <= ETH_MAX_IP_DGRAM_LEN) {
|
||||||
ip6->ip6_plen = htons(pkt->payload_len);
|
pkt->l3_hdr.ip6.ip6_plen = htons(pkt->payload_len);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* TODO: if qemu would support >64K packets
|
* TODO: if qemu would support >64K packets
|
||||||
|
Loading…
Reference in New Issue
Block a user