summaryrefslogtreecommitdiff
path: root/linux/src/include/net/ip.h
blob: 5437b3dd11dc1490f265f3204c0f7ff98d3332b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
 * 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
 *
 * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *		Alan Cox, <gw4pts@gw4pts.ampr.org>
 *
 *		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


#include <linux/config.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/ip.h>
#include <linux/netdevice.h>
#include <net/route.h>

#ifndef _SNMP_H
#include <net/snmp.h>
#endif

#include <net/sock.h>	/* struct sock */

/* 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	*/

#ifdef CONFIG_IP_MULTICAST
extern void		ip_mc_dropsocket(struct sock *);
extern void		ip_mc_dropdevice(struct device *dev);
extern int		ip_mc_procinfo(char *, char **, off_t, int, int);
#endif

#include <net/ip_forward.h> 

/* Describe an IP fragment. */
struct ipfrag 
{
	int		offset;		/* offset of fragment in IP datagram	*/
	int		end;		/* last byte of data in datagram	*/
	int		len;		/* length of this fragment		*/
	struct sk_buff	*skb;		/* complete received fragment		*/
	unsigned char	*ptr;		/* pointer into real fragment data	*/
	struct ipfrag	*next;		/* linked list pointers			*/
	struct ipfrag	*prev;
};

/*
 *	Describe an entry in the "incomplete datagrams" queue. 
 */
 
struct ipq	 
{
	unsigned char	*mac;		/* pointer to MAC header		*/
	struct iphdr	*iph;		/* pointer to IP header			*/
	int		len;		/* total length of original datagram	*/
	short		ihlen;		/* length of the IP header		*/	
	short 		maclen;		/* length of the MAC header		*/
	struct timer_list timer;	/* when will this queue expire?		*/
	struct ipfrag	*fragments;	/* linked list of received fragments	*/
	struct ipq	*next;		/* linked list pointers			*/
	struct ipq	*prev;
	struct device	*dev;		/* Device - for icmp replies */
};

/*
 *	Functions provided by ip.c
 */

extern void		ip_print(const struct iphdr *ip);
extern int		ip_ioctl(struct sock *sk, int cmd, unsigned long arg);
extern void		ip_route_check(__u32 daddr); 
extern int 		ip_send(struct rtable *rt, struct sk_buff *skb, __u32 daddr, int len, struct device *dev, __u32 saddr);
extern int 		ip_build_header(struct sk_buff *skb,
					__u32 saddr,
					__u32 daddr,
					struct device **dev, int type,
					struct options *opt, int len,
					int tos,int ttl,struct rtable **rp);
extern int		ip_rcv(struct sk_buff *skb, struct device *dev,
			       struct packet_type *pt);
extern int		ip_options_echo(struct options * dopt, struct options * sopt,
					__u32 daddr, __u32 saddr,
					struct sk_buff * skb);
extern int		ip_options_compile(struct options * opt, struct sk_buff * skb);
extern void		ip_send_check(struct iphdr *ip);
extern int		ip_id_count;			  
extern void		ip_queue_xmit(struct sock *sk,
				      struct device *dev, struct sk_buff *skb,
				      int free);
extern void		ip_init(void);
extern int		ip_build_xmit(struct sock *sk,
				      void getfrag (const void *,
						    __u32,
						    char *,
						    unsigned int,
						    unsigned int),
				      const void *frag,
				      unsigned short int length,
				      __u32 daddr,
				      __u32 saddr,
				      struct options * opt,
				      int flags,
				      int type,
				      int noblock);

extern struct ip_mib	ip_statistics;

extern int sysctl_ip_dynaddr;
int ip_rewrite_addrs(struct sock *sk, struct sk_buff *skb, struct device *dev);

/*
 *	Functions provided by ip_fragment.o
 */
 
struct sk_buff *ip_defrag(struct iphdr *iph, struct sk_buff *skb, struct device *dev);
void ip_fragment(struct sock *sk, struct sk_buff *skb, struct device *dev, int is_frag);

/*
 *	Functions provided by ip_forward.c
 */
 
extern int ip_forward(struct sk_buff *skb, struct device *dev, int is_frag, __u32 target_addr);
extern int sysctl_ip_forward; 

 
/*
 *	Functions provided by ip_options.c
 */
 
extern void ip_options_build(struct sk_buff *skb, struct options *opt, __u32 daddr, __u32 saddr, int is_frag);
extern int ip_options_echo(struct options *dopt, struct options *sopt, __u32 daddr, __u32 saddr, struct sk_buff *skb);
extern void ip_options_fragment(struct sk_buff *skb);
extern int ip_options_compile(struct options *opt, struct sk_buff *skb);

/*
 *	Functions provided by ip_sockglue.c
 */

extern int 		ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen);
extern int 		ip_getsockopt(struct sock *sk, int level, int optname, char *optval, int *optlen);
  
#endif	/* _IP_H */