|
@@ -342,11 +342,17 @@ bool net_tx_pkt_build_vheader(struct NetTxPkt *pkt, bool tso_enable,
|
|
if (csum_enable) {
|
|
if (csum_enable) {
|
|
switch (pkt->l4proto) {
|
|
switch (pkt->l4proto) {
|
|
case IP_PROTO_TCP:
|
|
case IP_PROTO_TCP:
|
|
|
|
+ if (pkt->payload_len < sizeof(struct tcp_hdr)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
pkt->virt_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
|
|
pkt->virt_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
|
|
pkt->virt_hdr.csum_start = pkt->hdr_len;
|
|
pkt->virt_hdr.csum_start = pkt->hdr_len;
|
|
pkt->virt_hdr.csum_offset = offsetof(struct tcp_hdr, th_sum);
|
|
pkt->virt_hdr.csum_offset = offsetof(struct tcp_hdr, th_sum);
|
|
break;
|
|
break;
|
|
case IP_PROTO_UDP:
|
|
case IP_PROTO_UDP:
|
|
|
|
+ if (pkt->payload_len < sizeof(struct udp_hdr)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
pkt->virt_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
|
|
pkt->virt_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
|
|
pkt->virt_hdr.csum_start = pkt->hdr_len;
|
|
pkt->virt_hdr.csum_start = pkt->hdr_len;
|
|
pkt->virt_hdr.csum_offset = offsetof(struct udp_hdr, uh_sum);
|
|
pkt->virt_hdr.csum_offset = offsetof(struct udp_hdr, uh_sum);
|