lkml.org 
[lkml]   [2022]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Date
SubjectRe: [PATCH net-next v5 1/2] IPv6/GRO: generic helper to remove temporary HBH/jumbo header in driver
On Wed, Dec 7, 2022 at 11:54 PM Coco Li <lixiaoyan@google.com> wrote:
>
> IPv6/TCP and GRO stacks can build big TCP packets with an added
> temporary Hop By Hop header.
>
> Is GSO is not involved, then the temporary header needs to be removed in
> the driver. This patch provides a generic helper for drivers that need
> to modify their headers in place.
>
> Tested:
> Compiled and ran with ethtool -K eth1 tso off
> Could send Big TCP packets
>
> Signed-off-by: Coco Li <lixiaoyan@google.com>
> ---
> include/net/ipv6.h | 36 ++++++++++++++++++++++++++++++++++++
> net/ipv6/ip6_offload.c | 27 ++++-----------------------
> 2 files changed, 40 insertions(+), 23 deletions(-)
>
> diff --git a/include/net/ipv6.h b/include/net/ipv6.h
> index d383c895592a..6dcf93a1ec14 100644
> --- a/include/net/ipv6.h
> +++ b/include/net/ipv6.h
> @@ -500,6 +500,42 @@ static inline int ipv6_has_hopopt_jumbo(const struct sk_buff *skb)
> 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));
> +
> + if (unlikely(!pskb_may_pull(skb, hophdr_len)))
> + return -1;

ipv6_has_hopopt_jumbo() had a stronger condition already.

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

So this !pskb_may_pull(skb, hophdr_len) , especially if done after the
memmove(), is not needed.


> +
> + __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(struct inet6_dev *idev)
> {
> /* If forwarding is enabled, RA are not accepted unless the special
> diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
> index 3ee345672849..00dc2e3b0184 100644
> --- a/net/ipv6/ip6_offload.c
> +++ b/net/ipv6/ip6_offload.c
> @@ -77,7 +77,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
> struct sk_buff *segs = ERR_PTR(-EINVAL);
> struct ipv6hdr *ipv6h;
> const struct net_offload *ops;
> - int proto, nexthdr;
> + int proto, err;
> struct frag_hdr *fptr;
> unsigned int payload_len;
> u8 *prevhdr;
> @@ -87,28 +87,9 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
> bool gso_partial;
>
> skb_reset_network_header(skb);
> - nexthdr = ipv6_has_hopopt_jumbo(skb);
> - if (nexthdr) {
> - const int hophdr_len = sizeof(struct hop_jumbo_hdr);
> - int err;
> -
> - err = skb_cow_head(skb, 0);
> - if (err < 0)
> - return ERR_PTR(err);
> -
> - /* remove the HBH header.
> - * Layout: [Ethernet header][IPv6 header][HBH][TCP header]
> - */
> - memmove(skb_mac_header(skb) + hophdr_len,
> - skb_mac_header(skb),
> - ETH_HLEN + sizeof(struct ipv6hdr));
> - skb->data += hophdr_len;
> - skb->len -= hophdr_len;
> - skb->network_header += hophdr_len;
> - skb->mac_header += hophdr_len;
> - ipv6h = (struct ipv6hdr *)skb->data;
> - ipv6h->nexthdr = nexthdr;
> - }
> + err = ipv6_hopopt_jumbo_remove(skb);
> + if (err)
> + return ERR_PTR(err);
> nhoff = skb_network_header(skb) - skb_mac_header(skb);
> if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
> goto out;
> --
> 2.39.0.rc0.267.gcb52ba06e7-goog
>

\
 
 \ /
  Last update: 2022-12-08 03:22    [W:0.053 / U:0.448 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site