forked from Minki/linux
qede: Disable tunnel offloads for non offloaded UDP ports
This patch disables tunnel offloads via ndo_features_check() if given UDP port is not offloaded to hardware. This in turn allows to run multiple tunnel interfaces using different UDP ports. Signed-off-by: Manish Chopra <manish.chopra@cavium.com> Signed-off-by: Yuval Mintz <yuval.mintz@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
19489c7f0d
commit
369bfd4ec7
@ -1697,14 +1697,25 @@ netdev_features_t qede_features_check(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
/* Disable offloads for geneve tunnels, as HW can't parse
|
||||
* the geneve header which has option length greater than 32B.
|
||||
* the geneve header which has option length greater than 32b
|
||||
* and disable offloads for the ports which are not offloaded.
|
||||
*/
|
||||
if ((l4_proto == IPPROTO_UDP) &&
|
||||
((skb_inner_mac_header(skb) -
|
||||
skb_transport_header(skb)) > QEDE_MAX_TUN_HDR_LEN))
|
||||
if (l4_proto == IPPROTO_UDP) {
|
||||
struct qede_dev *edev = netdev_priv(dev);
|
||||
u16 hdrlen, vxln_port, gnv_port;
|
||||
|
||||
hdrlen = QEDE_MAX_TUN_HDR_LEN;
|
||||
vxln_port = edev->vxlan_dst_port;
|
||||
gnv_port = edev->geneve_dst_port;
|
||||
|
||||
if ((skb_inner_mac_header(skb) -
|
||||
skb_transport_header(skb)) > hdrlen ||
|
||||
(ntohs(udp_hdr(skb)->dest) != vxln_port &&
|
||||
ntohs(udp_hdr(skb)->dest) != gnv_port))
|
||||
return features & ~(NETIF_F_CSUM_MASK |
|
||||
NETIF_F_GSO_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
return features;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user