1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*
3   * INET		An implementation of the TCP/IP protocol suite for the LINUX
4   *		operating system.  INET is implemented using the  BSD Socket
5   *		interface as the means of communication with the user level.
6   *
7   *		Definitions for the IP protocol.
8   *
9   * Version:	@(#)ip.h	1.0.2	04/28/93
10   *
11   * Authors:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12   */
13  #ifndef _LINUX_IP_H
14  #define _LINUX_IP_H
15  
16  #include <linux/skbuff.h>
17  #include <uapi/linux/ip.h>
18  
ip_hdr(const struct sk_buff * skb)19  static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
20  {
21  	return (struct iphdr *)skb_network_header(skb);
22  }
23  
inner_ip_hdr(const struct sk_buff * skb)24  static inline struct iphdr *inner_ip_hdr(const struct sk_buff *skb)
25  {
26  	return (struct iphdr *)skb_inner_network_header(skb);
27  }
28  
ipip_hdr(const struct sk_buff * skb)29  static inline struct iphdr *ipip_hdr(const struct sk_buff *skb)
30  {
31  	return (struct iphdr *)skb_transport_header(skb);
32  }
33  
ip_transport_len(const struct sk_buff * skb)34  static inline unsigned int ip_transport_len(const struct sk_buff *skb)
35  {
36  	return ntohs(ip_hdr(skb)->tot_len) - skb_network_header_len(skb);
37  }
38  
iph_totlen(const struct sk_buff * skb,const struct iphdr * iph)39  static inline unsigned int iph_totlen(const struct sk_buff *skb, const struct iphdr *iph)
40  {
41  	u32 len = ntohs(iph->tot_len);
42  
43  	return (len || !skb_is_gso(skb) || !skb_is_gso_tcp(skb)) ?
44  	       len : skb->len - skb_network_offset(skb);
45  }
46  
skb_ip_totlen(const struct sk_buff * skb)47  static inline unsigned int skb_ip_totlen(const struct sk_buff *skb)
48  {
49  	return iph_totlen(skb, ip_hdr(skb));
50  }
51  
52  /* IPv4 datagram length is stored into 16bit field (tot_len) */
53  #define IP_MAX_MTU	0xFFFFU
54  
iph_set_totlen(struct iphdr * iph,unsigned int len)55  static inline void iph_set_totlen(struct iphdr *iph, unsigned int len)
56  {
57  	iph->tot_len = len <= IP_MAX_MTU ? htons(len) : 0;
58  }
59  #endif	/* _LINUX_IP_H */
60