Blame view

include/net/ip.h 17.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
  /*
   * INET		An implementation of the TCP/IP protocol suite for the LINUX
   *		operating system.  INET is implemented using the  BSD Socket
   *		interface as the means of communication with the user level.
   *
   *		Definitions for the IP module.
   *
   * Version:	@(#)ip.h	1.0.2	05/07/93
   *
02c30a84e   Jesper Juhl   [PATCH] update Ro...
10
   * Authors:	Ross Biro
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
17
18
19
20
21
22
23
   *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
   *		Alan Cox, <gw4pts@gw4pts.ampr.org>
   *
   * Changes:
   *		Mike McLagan    :       Routing by source
   *
   *		This program is free software; you can redistribute it and/or
   *		modify it under the terms of the GNU General Public License
   *		as published by the Free Software Foundation; either version
   *		2 of the License, or (at your option) any later version.
   */
  #ifndef _IP_H
  #define _IP_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
  #include <linux/ip.h>
  #include <linux/in.h>
c9bdd4b52   Arnaldo Carvalho de Melo   [IP]: Introduce i...
27
  #include <linux/skbuff.h>
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
28
29
  
  #include <net/inet_sock.h>
aa6615814   Francesco Fusco   ipv4: processing ...
30
  #include <net/route.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  #include <net/snmp.h>
86b08d867   KOVACS Krisztian   ipv4: Make Netfil...
32
  #include <net/flow.h>
1bd758eb1   Jiri Pirko   net: change name ...
33
  #include <net/flow_dissector.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
  
  struct sock;
fd2c3ef76   Eric Dumazet   net: cleanup incl...
36
  struct inet_skb_parm {
0b922b7a8   David Ahern   net: original ing...
37
  	int			iif;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  	struct ip_options	opt;		/* Compiled IP options		*/
a04a480d4   David Ahern   net: Require exac...
39
  	u16			flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

df4d92549   Hannes Frederic Sowa   ipv4: try to cach...
41
42
43
44
45
46
  #define IPSKB_FORWARDED		BIT(0)
  #define IPSKB_XFRM_TUNNEL_SIZE	BIT(1)
  #define IPSKB_XFRM_TRANSFORMED	BIT(2)
  #define IPSKB_FRAG_COMPLETE	BIT(3)
  #define IPSKB_REROUTED		BIT(4)
  #define IPSKB_DOREDIRECT	BIT(5)
d6b915e29   Florian Westphal   ip_fragment: don'...
47
  #define IPSKB_FRAG_PMTU		BIT(6)
9ee6c5dc8   Lance Richardson   ipv4: allow local...
48
  #define IPSKB_L3SLAVE		BIT(7)
5f2d04f1f   Patrick McHardy   ipv4: fix path MT...
49
50
  
  	u16			frag_max_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  };
a04a480d4   David Ahern   net: Require exac...
52
53
54
55
  static inline bool ipv4_l3mdev_skb(u16 flags)
  {
  	return !!(flags & IPSKB_L3SLAVE);
  }
c9bdd4b52   Arnaldo Carvalho de Melo   [IP]: Introduce i...
56
57
  static inline unsigned int ip_hdrlen(const struct sk_buff *skb)
  {
eddc9ec53   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
58
  	return ip_hdr(skb)->ihl * 4;
c9bdd4b52   Arnaldo Carvalho de Melo   [IP]: Introduce i...
59
  }
fd2c3ef76   Eric Dumazet   net: cleanup incl...
60
  struct ipcm_cookie {
24025c465   Soheil Hassas Yeganeh   ipv4: process soc...
61
  	struct sockcm_cookie	sockc;
c1d18f9fa   Al Viro   [IPV4]: struct ip...
62
  	__be32			addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
  	int			oif;
f6d8bd051   Eric Dumazet   inet: add RCU pro...
64
  	struct ip_options_rcu	*opt;
2244d07bf   Oliver Hartkopp   net: simplify fla...
65
  	__u8			tx_flags;
f02db315b   Francesco Fusco   ipv4: IP_TOS and ...
66
67
68
  	__u8			ttl;
  	__s16			tos;
  	char			priority;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
  };
  
  #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
4b261c75a   Hannes Frederic Sowa   ipv6: make IPV6_R...
72
  #define PKTINFO_SKB_CB(skb) ((struct in_pktinfo *)((skb)->cb))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73

fd2c3ef76   Eric Dumazet   net: cleanup incl...
74
  struct ip_ra_chain {
43a951e99   Eric Dumazet   ipv4: add __rcu a...
75
  	struct ip_ra_chain __rcu *next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
  	struct sock		*sk;
592fcb9df   Eric Dumazet   ip: ip_ra_control...
77
78
79
80
  	union {
  		void			(*destructor)(struct sock *);
  		struct sock		*saved_sk;
  	};
66018506e   Eric Dumazet   ip: Router Alert ...
81
  	struct rcu_head		rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
  };
43a951e99   Eric Dumazet   ipv4: add __rcu a...
83
  extern struct ip_ra_chain __rcu *ip_ra_chain;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
86
87
88
89
90
91
  
  /* IP flags. */
  #define IP_CE		0x8000		/* Flag: "Congestion"		*/
  #define IP_DF		0x4000		/* Flag: "Don't Fragment"	*/
  #define IP_MF		0x2000		/* Flag: "More Fragments"	*/
  #define IP_OFFSET	0x1FFF		/* "Fragment Offset" part	*/
  
  #define IP_FRAG_TIME	(30 * HZ)		/* fragment lifetime	*/
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
92
93
94
95
  struct msghdr;
  struct net_device;
  struct packet_type;
  struct rtable;
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
96
  struct sockaddr;
72c1d3bdd   WANG Cong   ipv4: register ig...
97
  int igmp_mc_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
101
  
  /*
   *	Functions provided by ip.c
   */
cfe673b0a   Eric Dumazet   ip: constify ip_b...
102
  int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
103
104
105
106
107
108
  			  __be32 saddr, __be32 daddr,
  			  struct ip_options_rcu *opt);
  int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
  	   struct net_device *orig_dev);
  int ip_local_deliver(struct sk_buff *skb);
  int ip_mr_input(struct sk_buff *skb);
ede2059db   Eric W. Biederman   dst: Pass net int...
109
110
  int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb);
  int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb);
694869b3c   Eric W. Biederman   ipv4: Pass struct...
111
112
  int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
  		   int (*output)(struct net *, struct sock *, struct sk_buff *));
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
113
  void ip_send_check(struct iphdr *ip);
cf91a99da   Eric W. Biederman   ipv4, ipv6: Pass ...
114
  int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
33224b16f   Eric W. Biederman   ipv4, ipv6: Pass ...
115
  int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
aad88724c   Eric Dumazet   ipv4: add a sock ...
116

b0270e910   Eric Dumazet   ipv4: add a sock ...
117
  int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
  void ip_init(void);
  int ip_append_data(struct sock *sk, struct flowi4 *fl4,
  		   int getfrag(void *from, char *to, int offset, int len,
  			       int odd, struct sk_buff *skb),
  		   void *from, int len, int protolen,
  		   struct ipcm_cookie *ipc,
  		   struct rtable **rt,
  		   unsigned int flags);
  int ip_generic_getfrag(void *from, char *to, int offset, int len, int odd,
  		       struct sk_buff *skb);
  ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
  		       int offset, size_t size, int flags);
  struct sk_buff *__ip_make_skb(struct sock *sk, struct flowi4 *fl4,
  			      struct sk_buff_head *queue,
  			      struct inet_cork *cork);
  int ip_send_skb(struct net *net, struct sk_buff *skb);
  int ip_push_pending_frames(struct sock *sk, struct flowi4 *fl4);
  void ip_flush_pending_frames(struct sock *sk);
  struct sk_buff *ip_make_skb(struct sock *sk, struct flowi4 *fl4,
  			    int getfrag(void *from, char *to, int offset,
  					int len, int odd, struct sk_buff *skb),
  			    void *from, int length, int transhdrlen,
  			    struct ipcm_cookie *ipc, struct rtable **rtp,
  			    unsigned int flags);
1c32c5ad6   Herbert Xu   inet: Add ip_make...
142

77968b782   David S. Miller   ipv4: Pass flow k...
143
  static inline struct sk_buff *ip_finish_skb(struct sock *sk, struct flowi4 *fl4)
1c32c5ad6   Herbert Xu   inet: Add ip_make...
144
  {
77968b782   David S. Miller   ipv4: Pass flow k...
145
  	return __ip_make_skb(sk, fl4, &sk->sk_write_queue, &inet_sk(sk)->cork.base);
1c32c5ad6   Herbert Xu   inet: Add ip_make...
146
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147

aa6615814   Francesco Fusco   ipv4: processing ...
148
149
150
151
152
153
154
155
156
  static inline __u8 get_rttos(struct ipcm_cookie* ipc, struct inet_sock *inet)
  {
  	return (ipc->tos != -1) ? RT_TOS(ipc->tos) : RT_TOS(inet->tos);
  }
  
  static inline __u8 get_rtconn_flags(struct ipcm_cookie* ipc, struct sock* sk)
  {
  	return (ipc->tos != -1) ? RT_CONN_FLAGS_TOS(sk, ipc->tos) : RT_CONN_FLAGS(sk);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  /* datagram.c */
03645a11a   Eric Dumazet   ipv6: lock socket...
158
  int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
159
  int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
161
  void ip4_datagram_release_cb(struct sock *sk);
8141ed9fc   Steffen Klassert   ipv4: Add a socke...
162

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
  struct ip_reply_arg {
  	struct kvec iov[1];   
88ef4a5a7   KOVACS Krisztian   tcp: Handle TCP S...
165
  	int	    flags;
d6f5493c1   Al Viro   [NET]: Annotate c...
166
  	__wsum 	    csum;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
  	int	    csumoffset; /* u16 offset of csum in iov[0].iov_base */
  				/* -1 if not needed */ 
f0e48dbfc   Patrick McHardy   [TCP]: Honour sk_...
169
  	int	    bound_dev_if;
66b13d99d   Eric Dumazet   ipv4: tcp: fix TO...
170
  	u8  	    tos;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  }; 
88ef4a5a7   KOVACS Krisztian   tcp: Handle TCP S...
172
  #define IP_REPLY_ARG_NOSRCCHECK 1
86b08d867   KOVACS Krisztian   ipv4: Make Netfil...
173
174
175
176
  static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg)
  {
  	return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0;
  }
bdbbb8527   Eric Dumazet   ipv4: tcp: get ri...
177
  void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
24a2d43d8   Eric Dumazet   ipv4: rename ip_o...
178
179
180
  			   const struct ip_options *sopt,
  			   __be32 daddr, __be32 saddr,
  			   const struct ip_reply_arg *arg,
70e734167   David S. Miller   ipv4: Show that i...
181
  			   unsigned int len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182

4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
183
  #define IP_INC_STATS(net, field)	SNMP_INC_STATS64((net)->mib.ip_statistics, field)
13415e46c   Eric Dumazet   net: snmp: kill S...
184
  #define __IP_INC_STATS(net, field)	__SNMP_INC_STATS64((net)->mib.ip_statistics, field)
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
185
  #define IP_ADD_STATS(net, field, val)	SNMP_ADD_STATS64((net)->mib.ip_statistics, field, val)
13415e46c   Eric Dumazet   net: snmp: kill S...
186
  #define __IP_ADD_STATS(net, field, val) __SNMP_ADD_STATS64((net)->mib.ip_statistics, field, val)
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
187
  #define IP_UPD_PO_STATS(net, field, val) SNMP_UPD_PO_STATS64((net)->mib.ip_statistics, field, val)
13415e46c   Eric Dumazet   net: snmp: kill S...
188
  #define __IP_UPD_PO_STATS(net, field, val) __SNMP_UPD_PO_STATS64((net)->mib.ip_statistics, field, val)
61a7e2602   Pavel Emelyanov   mib: put net stat...
189
  #define NET_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.net_statistics, field)
13415e46c   Eric Dumazet   net: snmp: kill S...
190
  #define __NET_INC_STATS(net, field)	__SNMP_INC_STATS((net)->mib.net_statistics, field)
f7324acd9   David S. Miller   tcp: Use NET_ADD_...
191
  #define NET_ADD_STATS(net, field, adnd)	SNMP_ADD_STATS((net)->mib.net_statistics, field, adnd)
13415e46c   Eric Dumazet   net: snmp: kill S...
192
  #define __NET_ADD_STATS(net, field, adnd) __SNMP_ADD_STATS((net)->mib.net_statistics, field, adnd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193

c4c6bc314   Raghavendra K T   net: Introduce he...
194
  u64 snmp_get_cpu_field(void __percpu *mib, int cpu, int offct);
698365fa1   WANG Cong   net: clean up snm...
195
  unsigned long snmp_fold_field(void __percpu *mib, int offt);
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
196
  #if BITS_PER_LONG==32
c4c6bc314   Raghavendra K T   net: Introduce he...
197
198
  u64 snmp_get_cpu_field64(void __percpu *mib, int cpu, int offct,
  			 size_t syncp_offset);
698365fa1   WANG Cong   net: clean up snm...
199
  u64 snmp_fold_field64(void __percpu *mib, int offt, size_t sync_off);
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
200
  #else
c4c6bc314   Raghavendra K T   net: Introduce he...
201
202
203
204
205
206
  static inline u64  snmp_get_cpu_field64(void __percpu *mib, int cpu, int offct,
  					size_t syncp_offset)
  {
  	return snmp_get_cpu_field(mib, cpu, offct);
  
  }
698365fa1   WANG Cong   net: clean up snm...
207
  static inline u64 snmp_fold_field64(void __percpu *mib, int offt, size_t syncp_off)
4ce3c183f   Eric Dumazet   snmp: 64bit ipsta...
208
209
210
211
  {
  	return snmp_fold_field(mib, offt);
  }
  #endif
334901700   YOSHIFUJI Hideaki   [IPV4] SNMP: Move...
212

6348ef2db   Jia He   net:snmp: Introdu...
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
  #define snmp_get_cpu_field64_batch(buff64, stats_list, mib_statistic, offset) \
  { \
  	int i, c; \
  	for_each_possible_cpu(c) { \
  		for (i = 0; stats_list[i].name; i++) \
  			buff64[i] += snmp_get_cpu_field64( \
  					mib_statistic, \
  					c, stats_list[i].entry, \
  					offset); \
  	} \
  }
  
  #define snmp_get_cpu_field_batch(buff, stats_list, mib_statistic) \
  { \
  	int i, c; \
  	for_each_possible_cpu(c) { \
  		for (i = 0; stats_list[i].name; i++) \
  			buff[i] += snmp_get_cpu_field( \
  						mib_statistic, \
  						c, stats_list[i].entry); \
  	} \
  }
0bbf87d85   Eric W. Biederman   net ipv4: Convert...
235
  void inet_get_local_port_range(struct net *net, int *low, int *high);
227b60f51   Stephen Hemminger   [INET]: local por...
236

fcd77db07   David S. Miller   net: Fix CONFIG_S...
237
  #ifdef CONFIG_SYSCTL
122ff243f   WANG Cong   ipv4: make ip_loc...
238
  static inline int inet_is_local_reserved_port(struct net *net, int port)
e3826f1e9   Amerigo Wang   net: reserve port...
239
  {
122ff243f   WANG Cong   ipv4: make ip_loc...
240
241
242
  	if (!net->ipv4.sysctl_local_reserved_ports)
  		return 0;
  	return test_bit(port, net->ipv4.sysctl_local_reserved_ports);
e3826f1e9   Amerigo Wang   net: reserve port...
243
  }
20e61da7f   WANG Cong   ipv4: fail early ...
244
245
246
247
248
  
  static inline bool sysctl_dev_name_is_allowed(const char *name)
  {
  	return strcmp(name, "default") != 0  && strcmp(name, "all") != 0;
  }
122ff243f   WANG Cong   ipv4: make ip_loc...
249
250
251
252
253
254
  #else
  static inline int inet_is_local_reserved_port(struct net *net, int port)
  {
  	return 0;
  }
  #endif
e3826f1e9   Amerigo Wang   net: reserve port...
255

822c86853   Deepa Dinamani   net: ipv4: Conver...
256
  __be32 inet_current_timestamp(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
257
258
259
260
  /* From inetpeer.c */
  extern int inet_peer_threshold;
  extern int inet_peer_minttl;
  extern int inet_peer_maxttl;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
261

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
262
  void ipfrag_init(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
263

5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
264
  void ip_static_sysctl_init(void);
bd7b1533c   Al Viro   [PATCH] sysctl: m...
265

e110861f8   Lorenzo Colitti   net: add a sysctl...
266
267
  #define IP4_REPLY_MARK(net, mark) \
  	((net)->ipv4.sysctl_fwmark_reflect ? (mark) : 0)
d18cd551d   David S. Miller   net: Fix build fa...
268
269
270
271
  static inline bool ip_is_fragment(const struct iphdr *iph)
  {
  	return (iph->frag_off & htons(IP_MF | IP_OFFSET)) != 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
  #ifdef CONFIG_INET
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
273
  #include <net/dst.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
275
276
277
278
  /* The function in 2.2 was invalid, producing wrong result for
   * check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */
  static inline
  int ip_decrease_ttl(struct iphdr *iph)
  {
5c78f275e   Al Viro   [NET]: IP header ...
279
280
281
  	u32 check = (__force u32)iph->check;
  	check += (__force u32)htons(0x0100);
  	iph->check = (__force __sum16)(check + (check>=0xFFFF));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
284
285
  	return --iph->ttl;
  }
  
  static inline
4e3f5d727   Eric Dumazet   inet: constify ip...
286
  int ip_dont_fragment(const struct sock *sk, const struct dst_entry *dst)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
  {
4e3f5d727   Eric Dumazet   inet: constify ip...
288
289
290
291
  	u8 pmtudisc = READ_ONCE(inet_sk(sk)->pmtudisc);
  
  	return  pmtudisc == IP_PMTUDISC_DO ||
  		(pmtudisc == IP_PMTUDISC_WANT &&
a02cec215   Eric Dumazet   net: return opera...
292
  		 !(dst_metric_locked(dst, RTAX_MTU)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  }
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
294
295
  static inline bool ip_sk_accept_pmtu(const struct sock *sk)
  {
1b3465763   Hannes Frederic Sowa   ipv4: yet another...
296
297
  	return inet_sk(sk)->pmtudisc != IP_PMTUDISC_INTERFACE &&
  	       inet_sk(sk)->pmtudisc != IP_PMTUDISC_OMIT;
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
298
299
300
301
302
303
  }
  
  static inline bool ip_sk_use_pmtu(const struct sock *sk)
  {
  	return inet_sk(sk)->pmtudisc < IP_PMTUDISC_PROBE;
  }
60ff74673   WANG Cong   net: rename local...
304
  static inline bool ip_sk_ignore_df(const struct sock *sk)
1b3465763   Hannes Frederic Sowa   ipv4: yet another...
305
306
307
308
  {
  	return inet_sk(sk)->pmtudisc < IP_PMTUDISC_DO ||
  	       inet_sk(sk)->pmtudisc == IP_PMTUDISC_OMIT;
  }
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
309
310
311
312
313
314
315
316
317
318
319
320
  static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
  						    bool forwarding)
  {
  	struct net *net = dev_net(dst->dev);
  
  	if (net->ipv4.sysctl_ip_fwd_use_pmtu ||
  	    dst_metric_locked(dst, RTAX_MTU) ||
  	    !forwarding)
  		return dst_mtu(dst);
  
  	return min(dst->dev->mtu, IP_MAX_MTU);
  }
fedbb6b4f   Shmulik Ladkani   ipv4: Fix ip_skb_...
321
322
  static inline unsigned int ip_skb_dst_mtu(struct sock *sk,
  					  const struct sk_buff *skb)
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
323
  {
caf3f2676   Eric Dumazet   inet: ip_skb_dst_...
324
  	if (!sk || !sk_fullsock(sk) || ip_sk_use_pmtu(sk)) {
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
325
  		bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED;
caf3f2676   Eric Dumazet   inet: ip_skb_dst_...
326

f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
327
  		return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding);
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
328
  	}
caf3f2676   Eric Dumazet   inet: ip_skb_dst_...
329
330
  
  	return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU);
f87c10a8a   Hannes Frederic Sowa   ipv4: introduce i...
331
  }
04ca6973f   Eric Dumazet   ip: make IP ident...
332
  u32 ip_idents_reserve(u32 hash, int segs);
b6a7719ae   Hannes Frederic Sowa   ipv4: hash net pt...
333
  void __ip_select_ident(struct net *net, struct iphdr *iph, int segs);
73f156a6e   Eric Dumazet   inetpeer: get rid...
334

b6a7719ae   Hannes Frederic Sowa   ipv4: hash net pt...
335
336
  static inline void ip_select_ident_segs(struct net *net, struct sk_buff *skb,
  					struct sock *sk, int segs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
  {
703133de3   Ansis Atteka   ip: generate uniq...
338
  	struct iphdr *iph = ip_hdr(skb);
60ff74673   WANG Cong   net: rename local...
339
  	if ((iph->frag_off & htons(IP_DF)) && !skb->ignore_df) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
341
342
343
344
  		/* This is only to work around buggy Windows95/2000
  		 * VJ compression implementations.  If the ID field
  		 * does not change, they drop every other packet in
  		 * a TCP stream using header compression.
  		 */
c720c7e83   Eric Dumazet   inet: rename some...
345
346
  		if (sk && inet_sk(sk)->inet_daddr) {
  			iph->id = htons(inet_sk(sk)->inet_id);
73f156a6e   Eric Dumazet   inetpeer: get rid...
347
348
  			inet_sk(sk)->inet_id += segs;
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  			iph->id = 0;
73f156a6e   Eric Dumazet   inetpeer: get rid...
350
351
  		}
  	} else {
b6a7719ae   Hannes Frederic Sowa   ipv4: hash net pt...
352
  		__ip_select_ident(net, iph, segs);
73f156a6e   Eric Dumazet   inetpeer: get rid...
353
354
  	}
  }
b6a7719ae   Hannes Frederic Sowa   ipv4: hash net pt...
355
356
  static inline void ip_select_ident(struct net *net, struct sk_buff *skb,
  				   struct sock *sk)
73f156a6e   Eric Dumazet   inetpeer: get rid...
357
  {
b6a7719ae   Hannes Frederic Sowa   ipv4: hash net pt...
358
  	ip_select_ident_segs(net, skb, sk, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
  }
ed70fcfce   Tom Herbert   net: Call skb_che...
360
361
362
363
364
  static inline __wsum inet_compute_pseudo(struct sk_buff *skb, int proto)
  {
  	return csum_tcpudp_nofold(ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
  				  skb->len, proto, 0);
  }
c3f832418   Tom Herbert   net: Add full IPv...
365
366
367
368
369
370
371
372
373
374
375
376
377
  /* copy IPv4 saddr & daddr to flow_keys, possibly using 64bit load/store
   * Equivalent to :	flow->v4addrs.src = iph->saddr;
   *			flow->v4addrs.dst = iph->daddr;
   */
  static inline void iph_to_flow_copy_v4addrs(struct flow_keys *flow,
  					    const struct iphdr *iph)
  {
  	BUILD_BUG_ON(offsetof(typeof(flow->addrs), v4addrs.dst) !=
  		     offsetof(typeof(flow->addrs), v4addrs.src) +
  			      sizeof(flow->addrs.v4addrs.src));
  	memcpy(&flow->addrs.v4addrs, &iph->saddr, sizeof(flow->addrs.v4addrs));
  	flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
  }
1933a7852   Tom Herbert   net: add gro_comp...
378
379
380
381
382
383
384
  static inline __wsum inet_gro_compute_pseudo(struct sk_buff *skb, int proto)
  {
  	const struct iphdr *iph = skb_gro_network_header(skb);
  
  	return csum_tcpudp_nofold(iph->saddr, iph->daddr,
  				  skb_gro_len(skb), proto, 0);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385
386
387
  /*
   *	Map a multicast IP onto multicast MAC for type ethernet.
   */
714e85be3   Al Viro   [IPV6]: Assorted ...
388
  static inline void ip_eth_mc_map(__be32 naddr, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389
  {
714e85be3   Al Viro   [IPV6]: Assorted ...
390
  	__u32 addr=ntohl(naddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
393
394
395
396
397
398
399
400
401
402
403
404
  	buf[0]=0x01;
  	buf[1]=0x00;
  	buf[2]=0x5e;
  	buf[5]=addr&0xFF;
  	addr>>=8;
  	buf[4]=addr&0xFF;
  	addr>>=8;
  	buf[3]=addr&0x7F;
  }
  
  /*
   *	Map a multicast IP onto multicast MAC for type IP-over-InfiniBand.
   *	Leave P_Key as 0 to be filled in by driver.
   */
a9e527e3f   Rolf Manderscheid   IPoIB: improve IP...
405
  static inline void ip_ib_mc_map(__be32 naddr, const unsigned char *broadcast, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
406
  {
714e85be3   Al Viro   [IPV6]: Assorted ...
407
  	__u32 addr;
a9e527e3f   Rolf Manderscheid   IPoIB: improve IP...
408
  	unsigned char scope = broadcast[5] & 0xF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
411
412
  	buf[0]  = 0;		/* Reserved */
  	buf[1]  = 0xff;		/* Multicast QPN */
  	buf[2]  = 0xff;
  	buf[3]  = 0xff;
714e85be3   Al Viro   [IPV6]: Assorted ...
413
  	addr    = ntohl(naddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
  	buf[4]  = 0xff;
a9e527e3f   Rolf Manderscheid   IPoIB: improve IP...
415
  	buf[5]  = 0x10 | scope;	/* scope from broadcast address */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
417
  	buf[6]  = 0x40;		/* IPv4 signature */
  	buf[7]  = 0x1b;
a9e527e3f   Rolf Manderscheid   IPoIB: improve IP...
418
419
  	buf[8]  = broadcast[8];		/* P_Key */
  	buf[9]  = broadcast[9];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
421
422
423
424
425
426
427
428
429
430
431
432
433
  	buf[10] = 0;
  	buf[11] = 0;
  	buf[12] = 0;
  	buf[13] = 0;
  	buf[14] = 0;
  	buf[15] = 0;
  	buf[19] = addr & 0xff;
  	addr  >>= 8;
  	buf[18] = addr & 0xff;
  	addr  >>= 8;
  	buf[17] = addr & 0xff;
  	addr  >>= 8;
  	buf[16] = addr & 0x0f;
  }
93ca3bb5d   Timo Teräs   net: gre: provide...
434
435
436
437
438
439
440
  static inline void ip_ipgre_mc_map(__be32 naddr, const unsigned char *broadcast, char *buf)
  {
  	if ((broadcast[0] | broadcast[1] | broadcast[2] | broadcast[3]) != 0)
  		memcpy(buf, broadcast, 4);
  	else
  		memcpy(buf, &naddr, sizeof(naddr));
  }
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
441
  #if IS_ENABLED(CONFIG_IPV6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
443
444
445
446
  #include <linux/ipv6.h>
  #endif
  
  static __inline__ void inet_reset_saddr(struct sock *sk)
  {
c720c7e83   Eric Dumazet   inet: rename some...
447
  	inet_sk(sk)->inet_rcv_saddr = inet_sk(sk)->inet_saddr = 0;
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
448
  #if IS_ENABLED(CONFIG_IPV6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
451
452
  	if (sk->sk_family == PF_INET6) {
  		struct ipv6_pinfo *np = inet6_sk(sk);
  
  		memset(&np->saddr, 0, sizeof(np->saddr));
efe4208f4   Eric Dumazet   ipv6: make lookup...
453
  		memset(&sk->sk_v6_rcv_saddr, 0, sizeof(sk->sk_v6_rcv_saddr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
455
456
457
458
  	}
  #endif
  }
  
  #endif
72afa352d   David Ahern   net: Introduce ip...
459
460
461
462
  static inline unsigned int ipv4_addr_hash(__be32 ip)
  {
  	return (__force unsigned int) ip;
  }
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
463
  bool ip_call_ra_chain(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
465
  
  /*
b798232fc   Rami Rosen   [IPV4]: Remove th...
466
   *	Functions provided by ip_fragment.c
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
467
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
468
  enum ip_defrag_users {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
470
471
  	IP_DEFRAG_LOCAL_DELIVER,
  	IP_DEFRAG_CALL_RA_CHAIN,
  	IP_DEFRAG_CONNTRACK_IN,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
472
  	__IP_DEFRAG_CONNTRACK_IN_END	= IP_DEFRAG_CONNTRACK_IN + USHRT_MAX,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
473
  	IP_DEFRAG_CONNTRACK_OUT,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
474
  	__IP_DEFRAG_CONNTRACK_OUT_END	= IP_DEFRAG_CONNTRACK_OUT + USHRT_MAX,
8fa9ff684   Patrick McHardy   netfilter: fix cr...
475
  	IP_DEFRAG_CONNTRACK_BRIDGE_IN,
4be929be3   Alexey Dobriyan   kernel-wide: repl...
476
  	__IP_DEFRAG_CONNTRACK_BRIDGE_IN = IP_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
478
  	IP_DEFRAG_VS_IN,
  	IP_DEFRAG_VS_OUT,
595fc71ba   David S. Miller   ipv4: Add ip_defr...
479
480
  	IP_DEFRAG_VS_FWD,
  	IP_DEFRAG_AF_PACKET,
bc416d976   Eric Dumazet   macvlan: handle f...
481
  	IP_DEFRAG_MACVLAN,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
  };
5cf422808   Andy Zhou   ipv4: introduce f...
483
484
485
486
487
488
489
490
491
  /* Return true if the value of 'user' is between 'lower_bond'
   * and 'upper_bond' inclusively.
   */
  static inline bool ip_defrag_user_in_between(u32 user,
  					     enum ip_defrag_users lower_bond,
  					     enum ip_defrag_users upper_bond)
  {
  	return user >= lower_bond && user <= upper_bond;
  }
19bcf9f20   Eric W. Biederman   ipv4: Pass struct...
492
  int ip_defrag(struct net *net, struct sk_buff *skb, u32 user);
bc416d976   Eric Dumazet   macvlan: handle f...
493
  #ifdef CONFIG_INET
19bcf9f20   Eric W. Biederman   ipv4: Pass struct...
494
  struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user);
bc416d976   Eric Dumazet   macvlan: handle f...
495
  #else
19bcf9f20   Eric W. Biederman   ipv4: Pass struct...
496
  static inline struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user)
bc416d976   Eric Dumazet   macvlan: handle f...
497
498
499
500
  {
  	return skb;
  }
  #endif
6ddc08222   Pavel Emelyanov   [NETNS][FRAGS]: M...
501
  int ip_frag_mem(struct net *net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
503
504
505
506
  
  /*
   *	Functions provided by ip_forward.c
   */
   
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
507
  int ip_forward(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
508
509
510
511
512
   
  /*
   *	Functions provided by ip_options.c
   */
   
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
513
514
  void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
  		      __be32 daddr, struct rtable *rt, int is_frag);
24a2d43d8   Eric Dumazet   ipv4: rename ip_o...
515
516
517
518
519
520
521
  
  int __ip_options_echo(struct ip_options *dopt, struct sk_buff *skb,
  		      const struct ip_options *sopt);
  static inline int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb)
  {
  	return __ip_options_echo(dopt, skb, &IPCB(skb)->opt);
  }
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
522
523
524
525
526
527
528
529
530
531
  void ip_options_fragment(struct sk_buff *skb);
  int ip_options_compile(struct net *net, struct ip_options *opt,
  		       struct sk_buff *skb);
  int ip_options_get(struct net *net, struct ip_options_rcu **optp,
  		   unsigned char *data, int optlen);
  int ip_options_get_from_user(struct net *net, struct ip_options_rcu **optp,
  			     unsigned char __user *data, int optlen);
  void ip_options_undo(struct ip_options *opt);
  void ip_forward_options(struct sk_buff *skb);
  int ip_options_rcv_srr(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
533
534
535
  
  /*
   *	Functions provided by ip_sockglue.c
   */
fbf8866d6   Shawn Bohrer   net: ipv4 only po...
536
  void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb);
10df8e615   Eric Dumazet   udp: fix IP_CHECK...
537
  void ip_cmsg_recv_offset(struct msghdr *msg, struct sk_buff *skb, int tlen, int offset);
24025c465   Soheil Hassas Yeganeh   ipv4: process soc...
538
  int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
c8e6ad082   Hannes Frederic Sowa   ipv6: honor IPV6_...
539
  		 struct ipcm_cookie *ipc, bool allow_ipv6);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
540
541
542
543
544
545
546
547
548
549
  int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
  		  unsigned int optlen);
  int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
  		  int __user *optlen);
  int compat_ip_setsockopt(struct sock *sk, int level, int optname,
  			 char __user *optval, unsigned int optlen);
  int compat_ip_getsockopt(struct sock *sk, int level, int optname,
  			 char __user *optval, int __user *optlen);
  int ip_ra_control(struct sock *sk, unsigned char on,
  		  void (*destructor)(struct sock *));
85fbaa750   Hannes Frederic Sowa   inet: fix addr_le...
550
  int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len);
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
551
552
553
554
  void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
  		   u32 info, u8 *payload);
  void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport,
  		    u32 info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555

5961de9f1   Tom Herbert   ip: Add offset pa...
556
557
  static inline void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb)
  {
10df8e615   Eric Dumazet   udp: fix IP_CHECK...
558
  	ip_cmsg_recv_offset(msg, skb, 0, 0);
5961de9f1   Tom Herbert   ip: Add offset pa...
559
  }
4cdf507d5   Eric Dumazet   icmp: add a globa...
560
561
562
  bool icmp_global_allow(void);
  extern int sysctl_icmp_msgs_per_sec;
  extern int sysctl_icmp_msgs_burst;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
563
  #ifdef CONFIG_PROC_FS
5c3a0fd7d   Joe Perches   ip*.h: Remove ext...
564
  int ip_misc_proc_init(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
565
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
  #endif	/* _IP_H */