Commit 35f66ce9 authored by Alice Mikityanska's avatar Alice Mikityanska Committed by Jakub Kicinski
Browse files

net/ipv6: Remove HBH helpers



Now that the HBH jumbo helpers are not used by any driver or GSO, remove
them altogether.

Signed-off-by: default avatarAlice Mikityanska <alice@isovalent.com>
Acked-by: default avatarPaolo Abeni <pabeni@redhat.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260205133925.526371-13-alice.kernel@fastmail.im


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 28df1c69
Loading
Loading
Loading
Loading
+0 −77
Original line number Diff line number Diff line
@@ -149,17 +149,6 @@ struct frag_hdr {
	__be32	identification;
};

/*
 * Jumbo payload option, as described in RFC 2675 2.
 */
struct hop_jumbo_hdr {
	u8	nexthdr;
	u8	hdrlen;
	u8	tlv_type;	/* IPV6_TLV_JUMBO, 0xC2 */
	u8	tlv_len;	/* 4 */
	__be32	jumbo_payload_len;
};

#define	IP6_MF		0x0001
#define	IP6_OFFSET	0xFFF8

@@ -462,72 +451,6 @@ bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb,
struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
					   struct ipv6_txoptions *opt);

/* This helper is specialized for BIG TCP needs.
 * It assumes the hop_jumbo_hdr will immediately follow the IPV6 header.
 * It assumes headers are already in skb->head.
 * Returns: 0, or IPPROTO_TCP if a BIG TCP packet is there.
 */
static inline int ipv6_has_hopopt_jumbo(const struct sk_buff *skb)
{
	const struct hop_jumbo_hdr *jhdr;
	const struct ipv6hdr *nhdr;

	if (likely(skb->len <= GRO_LEGACY_MAX_SIZE))
		return 0;

	if (skb->protocol != htons(ETH_P_IPV6))
		return 0;

	if (skb_network_offset(skb) +
	    sizeof(struct ipv6hdr) +
	    sizeof(struct hop_jumbo_hdr) > skb_headlen(skb))
		return 0;

	nhdr = ipv6_hdr(skb);

	if (nhdr->nexthdr != NEXTHDR_HOP)
		return 0;

	jhdr = (const struct hop_jumbo_hdr *) (nhdr + 1);
	if (jhdr->tlv_type != IPV6_TLV_JUMBO || jhdr->hdrlen != 0 ||
	    jhdr->nexthdr != IPPROTO_TCP)
		return 0;
	return jhdr->nexthdr;
}

/* Return 0 if HBH header is successfully removed
 * Or if HBH removal is unnecessary (packet is not big TCP)
 * Return error to indicate dropping the packet
 */
static inline int ipv6_hopopt_jumbo_remove(struct sk_buff *skb)
{
	const int hophdr_len = sizeof(struct hop_jumbo_hdr);
	int nexthdr = ipv6_has_hopopt_jumbo(skb);
	struct ipv6hdr *h6;

	if (!nexthdr)
		return 0;

	if (skb_cow_head(skb, 0))
		return -1;

	/* Remove the HBH header.
	 * Layout: [Ethernet header][IPv6 header][HBH][L4 Header]
	 */
	memmove(skb_mac_header(skb) + hophdr_len, skb_mac_header(skb),
		skb_network_header(skb) - skb_mac_header(skb) +
		sizeof(struct ipv6hdr));

	__skb_pull(skb, hophdr_len);
	skb->network_header += hophdr_len;
	skb->mac_header += hophdr_len;

	h6 = ipv6_hdr(skb);
	h6->nexthdr = nexthdr;

	return 0;
}

static inline bool ipv6_accept_ra(const struct inet6_dev *idev)
{
	s32 accept_ra = READ_ONCE(idev->cnf.accept_ra);