Contributors: 29
	  
        
          | Author | 
          Tokens | 
          Token Proportion | 
          Commits | 
          Commit Proportion | 
        
	  
	  
        
        
          | Eric Dumazet | 
          148 | 
          31.90% | 
          5 | 
          11.63% | 
        
        
          | Alexander Duyck | 
          49 | 
          10.56% | 
          4 | 
          9.30% | 
        
        
          | Tom Herbert | 
          39 | 
          8.41% | 
          4 | 
          9.30% | 
        
        
          | Wei-Chun Chao | 
          31 | 
          6.68% | 
          1 | 
          2.33% | 
        
        
          | Pravin B Shelar | 
          24 | 
          5.17% | 
          1 | 
          2.33% | 
        
        
          | Xin Long | 
          24 | 
          5.17% | 
          3 | 
          6.98% | 
        
        
          | Jiri Benc | 
          21 | 
          4.53% | 
          1 | 
          2.33% | 
        
        
          | Steffen Klassert | 
          20 | 
          4.31% | 
          2 | 
          4.65% | 
        
        
          | Hideaki Yoshifuji / 吉藤英明 | 
          16 | 
          3.45% | 
          1 | 
          2.33% | 
        
        
          | Linus Torvalds (pre-git) | 
          12 | 
          2.59% | 
          1 | 
          2.33% | 
        
        
          | Eric W. Biedermann | 
          11 | 
          2.37% | 
          1 | 
          2.33% | 
        
        
          | Felix Fietkau | 
          9 | 
          1.94% | 
          1 | 
          2.33% | 
        
        
          | Florian Westphal | 
          6 | 
          1.29% | 
          2 | 
          4.65% | 
        
        
          | Willem de Bruijn | 
          6 | 
          1.29% | 
          1 | 
          2.33% | 
        
        
          | Yonghong Song | 
          6 | 
          1.29% | 
          1 | 
          2.33% | 
        
        
          | Eyal Birger | 
          5 | 
          1.08% | 
          1 | 
          2.33% | 
        
        
          | Paolo Abeni | 
          5 | 
          1.08% | 
          1 | 
          2.33% | 
        
        
          | Dong Chenchen | 
          4 | 
          0.86% | 
          1 | 
          2.33% | 
        
        
          | Edward Cree | 
          4 | 
          0.86% | 
          1 | 
          2.33% | 
        
        
          | Aditi Ghag | 
          3 | 
          0.65% | 
          1 | 
          2.33% | 
        
        
          | Jesse Gross | 
          3 | 
          0.65% | 
          1 | 
          2.33% | 
        
        
          | Gerrit Renker | 
          3 | 
          0.65% | 
          1 | 
          2.33% | 
        
        
          | Leon Romanovsky | 
          3 | 
          0.65% | 
          1 | 
          2.33% | 
        
        
          | Herbert Xu | 
          3 | 
          0.65% | 
          1 | 
          2.33% | 
        
        
          | Dongseok Yi | 
          2 | 
          0.43% | 
          1 | 
          2.33% | 
        
        
          | Jakub Kiciński | 
          2 | 
          0.43% | 
          1 | 
          2.33% | 
        
        
          | Arnaldo Carvalho de Melo | 
          2 | 
          0.43% | 
          1 | 
          2.33% | 
        
        
          | Michał Mirosław | 
          2 | 
          0.43% | 
          1 | 
          2.33% | 
        
        
          | Alexander Lobakin | 
          1 | 
          0.22% | 
          1 | 
          2.33% | 
        
	  
	  
        
          | Total | 
          464 | 
           | 
          43 | 
           | 
	    
	  
    
 
/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef _NET_GSO_H
#define _NET_GSO_H
#include <linux/skbuff.h>
/* Keeps track of mac header offset relative to skb->head.
 * It is useful for TSO of Tunneling protocol. e.g. GRE.
 * For non-tunnel skb it points to skb_mac_header() and for
 * tunnel skb it points to outer mac header.
 * Keeps track of level of encapsulation of network headers.
 */
struct skb_gso_cb {
	union {
		int	mac_offset;
		int	data_offset;
	};
	int	encap_level;
	__wsum	csum;
	__u16	csum_start;
};
#define SKB_GSO_CB_OFFSET	32
#define SKB_GSO_CB(skb) ((struct skb_gso_cb *)((skb)->cb + SKB_GSO_CB_OFFSET))
static inline int skb_tnl_header_len(const struct sk_buff *inner_skb)
{
	return (skb_mac_header(inner_skb) - inner_skb->head) -
		SKB_GSO_CB(inner_skb)->mac_offset;
}
static inline int gso_pskb_expand_head(struct sk_buff *skb, int extra)
{
	int new_headroom, headroom;
	int ret;
	headroom = skb_headroom(skb);
	ret = pskb_expand_head(skb, extra, 0, GFP_ATOMIC);
	if (ret)
		return ret;
	new_headroom = skb_headroom(skb);
	SKB_GSO_CB(skb)->mac_offset += (new_headroom - headroom);
	return 0;
}
static inline void gso_reset_checksum(struct sk_buff *skb, __wsum res)
{
	/* Do not update partial checksums if remote checksum is enabled. */
	if (skb->remcsum_offload)
		return;
	SKB_GSO_CB(skb)->csum = res;
	SKB_GSO_CB(skb)->csum_start = skb_checksum_start(skb) - skb->head;
}
/* Compute the checksum for a gso segment. First compute the checksum value
 * from the start of transport header to SKB_GSO_CB(skb)->csum_start, and
 * then add in skb->csum (checksum from csum_start to end of packet).
 * skb->csum and csum_start are then updated to reflect the checksum of the
 * resultant packet starting from the transport header-- the resultant checksum
 * is in the res argument (i.e. normally zero or ~ of checksum of a pseudo
 * header.
 */
static inline __sum16 gso_make_checksum(struct sk_buff *skb, __wsum res)
{
	unsigned char *csum_start = skb_transport_header(skb);
	int plen = (skb->head + SKB_GSO_CB(skb)->csum_start) - csum_start;
	__wsum partial = SKB_GSO_CB(skb)->csum;
	SKB_GSO_CB(skb)->csum = res;
	SKB_GSO_CB(skb)->csum_start = csum_start - skb->head;
	return csum_fold(csum_partial(csum_start, plen, partial));
}
struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
				  netdev_features_t features, bool tx_path);
static inline struct sk_buff *skb_gso_segment(struct sk_buff *skb,
					      netdev_features_t features)
{
	return __skb_gso_segment(skb, features, true);
}
struct sk_buff *skb_eth_gso_segment(struct sk_buff *skb,
				    netdev_features_t features, __be16 type);
struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb,
				    netdev_features_t features);
bool skb_gso_validate_network_len(const struct sk_buff *skb, unsigned int mtu);
bool skb_gso_validate_mac_len(const struct sk_buff *skb, unsigned int len);
static inline void skb_gso_error_unwind(struct sk_buff *skb, __be16 protocol,
					int pulled_hlen, u16 mac_offset,
					int mac_len)
{
	skb->protocol = protocol;
	skb->encapsulation = 1;
	skb_push(skb, pulled_hlen);
	skb_reset_transport_header(skb);
	skb->mac_header = mac_offset;
	skb->network_header = skb->mac_header + mac_len;
	skb->mac_len = mac_len;
}
#endif /* _NET_GSO_H */