Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 369bfd4e authored by Chopra, Manish's avatar Chopra, Manish Committed by David S. Miller
Browse files

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: default avatarManish Chopra <manish.chopra@cavium.com>
Signed-off-by: default avatarYuval Mintz <yuval.mintz@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 19489c7f
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -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;
}