From 1aba330ae61ba25811e027cc78893c1e53d5cec6 Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Tue, 20 Jul 2021 18:36:26 +0200 Subject: [PATCH] dde_linux: fix packet size calc. of Nic drivers skb_push() already increases the skb->len by ETH_HLEN, hence adding ETH_HLEN to the packet_size is redundant. A too large packet size becomes a problem for large MTUs. With a maximum MTU of 1500, adding ETH_HLEN twice will lead to a packet size of 1528. Since this is larger than what we expect for good-old Ethernet (max. 1522), some clients (e.g. the e1000 model in vbox5) may drop these packets. Fixes genodelabs/genode#4228 --- repos/dde_linux/src/drivers/nic/fec/lxc.c | 6 +++--- repos/dde_linux/src/drivers/usb_modem/lxc.c | 6 +++--- repos/dde_linux/src/drivers/usb_net/lxc.c | 6 +++--- repos/dde_linux/src/lib/wifi/lxc_emul.c | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/repos/dde_linux/src/drivers/nic/fec/lxc.c b/repos/dde_linux/src/drivers/nic/fec/lxc.c index d264b82241..3f595cfea8 100644 --- a/repos/dde_linux/src/drivers/nic/fec/lxc.c +++ b/repos/dde_linux/src/drivers/nic/fec/lxc.c @@ -26,7 +26,7 @@ struct Skb skb_helper(struct sk_buff *skb) skb_push(skb, ETH_HLEN); helper.packet = skb->data; - helper.packet_size = ETH_HLEN; + helper.packet_size = skb->len; helper.frag = 0; helper.frag_size = 0; @@ -43,9 +43,9 @@ struct Skb skb_helper(struct sk_buff *skb) skb_frag_t *f = &skb_shinfo(skb)->frags[0]; helper.frag = skb_frag_address(f); helper.frag_size = skb_frag_size(f); + /* fragment contains payload but header is still found in packet */ + helper.packet_size = ETH_HLEN; } - else - helper.packet_size += skb->len; return helper; } diff --git a/repos/dde_linux/src/drivers/usb_modem/lxc.c b/repos/dde_linux/src/drivers/usb_modem/lxc.c index c78512773e..8b2214ded8 100644 --- a/repos/dde_linux/src/drivers/usb_modem/lxc.c +++ b/repos/dde_linux/src/drivers/usb_modem/lxc.c @@ -30,7 +30,7 @@ struct Skb skb_helper(struct sk_buff *skb) skb_push(skb, ETH_HLEN); helper.packet = skb->data; - helper.packet_size = ETH_HLEN; + helper.packet_size = skb->len; helper.frag = 0; helper.frag_size = 0; @@ -47,9 +47,9 @@ struct Skb skb_helper(struct sk_buff *skb) skb_frag_t *f = &skb_shinfo(skb)->frags[0]; helper.frag = skb_frag_address(f); helper.frag_size = skb_frag_size(f); + /* fragment contains payload but header is still found in packet */ + helper.packet_size = ETH_HLEN; } - else - helper.packet_size += skb->len; return helper; } diff --git a/repos/dde_linux/src/drivers/usb_net/lxc.c b/repos/dde_linux/src/drivers/usb_net/lxc.c index d264b82241..3f595cfea8 100644 --- a/repos/dde_linux/src/drivers/usb_net/lxc.c +++ b/repos/dde_linux/src/drivers/usb_net/lxc.c @@ -26,7 +26,7 @@ struct Skb skb_helper(struct sk_buff *skb) skb_push(skb, ETH_HLEN); helper.packet = skb->data; - helper.packet_size = ETH_HLEN; + helper.packet_size = skb->len; helper.frag = 0; helper.frag_size = 0; @@ -43,9 +43,9 @@ struct Skb skb_helper(struct sk_buff *skb) skb_frag_t *f = &skb_shinfo(skb)->frags[0]; helper.frag = skb_frag_address(f); helper.frag_size = skb_frag_size(f); + /* fragment contains payload but header is still found in packet */ + helper.packet_size = ETH_HLEN; } - else - helper.packet_size += skb->len; return helper; } diff --git a/repos/dde_linux/src/lib/wifi/lxc_emul.c b/repos/dde_linux/src/lib/wifi/lxc_emul.c index 3fbc320762..d050f903a5 100644 --- a/repos/dde_linux/src/lib/wifi/lxc_emul.c +++ b/repos/dde_linux/src/lib/wifi/lxc_emul.c @@ -38,7 +38,7 @@ struct Skb skb_helper(struct sk_buff *skb) skb_push(skb, ETH_HLEN); helper.packet = skb->data; - helper.packet_size = ETH_HLEN; + helper.packet_size = skb->len; helper.frag = 0; helper.frag_size = 0; @@ -55,9 +55,9 @@ struct Skb skb_helper(struct sk_buff *skb) skb_frag_t *f = &skb_shinfo(skb)->frags[0]; helper.frag = skb_frag_address(f); helper.frag_size = skb_frag_size(f); + /* fragment contains payload but header is still found in packet */ + helper.packet_size = ETH_HLEN; } - else - helper.packet_size += skb->len; return helper; }