1 /*
2  * INET		An implementation of the TCP/IP protocol suite for the LINUX
3  *		operating system.  INET is implemented using the  BSD Socket
4  *		interface as the means of communication with the user level.
5  *
6  *		Definitions for the protocol dispatcher.
7  *
8  * Version:	@(#)protocol.h	1.0.2	05/07/93
9  *
10  * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
11  *
12  *		This program is free software; you can redistribute it and/or
13  *		modify it under the terms of the GNU General Public License
14  *		as published by the Free Software Foundation; either version
15  *		2 of the License, or (at your option) any later version.
16  *
17  *	Changes:
18  *		Alan Cox	:	Added a name field and a frag handler
19  *					field for later.
20  *		Alan Cox	:	Cleaned up, and sorted types.
21  *		Pedro Roque	:	inet6 protocols
22  */
23 
24 #ifndef _PROTOCOL_H
25 #define _PROTOCOL_H
26 
27 #include <linux/config.h>
28 #include <linux/in6.h>
29 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
30 #include <linux/ipv6.h>
31 #endif
32 
33 #define MAX_INET_PROTOS	32		/* Must be a power of 2		*/
34 
35 
36 /* This is used to register protocols. */
37 struct inet_protocol
38 {
39 	int			(*handler)(struct sk_buff *skb);
40 	void			(*err_handler)(struct sk_buff *skb, u32 info);
41 	struct inet_protocol	*next;
42 	unsigned char		protocol;
43 	unsigned char		copy:1;
44 	void			*data;
45 	const char		*name;
46 };
47 
48 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
49 struct inet6_protocol
50 {
51 	int	(*handler)(struct sk_buff *skb);
52 
53 	void	(*err_handler)(struct sk_buff *skb,
54 			       struct inet6_skb_parm *opt,
55 			       int type, int code, int offset,
56 			       __u32 info);
57 	struct inet6_protocol *next;
58 	unsigned char	protocol;
59 	unsigned char	copy:1;
60 	void		*data;
61 	const char	*name;
62 };
63 
64 #endif
65 
66 /* This is used to register socket interfaces for IP protocols.  */
67 struct inet_protosw {
68 	struct list_head list;
69 
70         /* These two fields form the lookup key.  */
71 	unsigned short	 type;	   /* This is the 2nd argument to socket(2). */
72 	int		 protocol; /* This is the L4 protocol number.  */
73 
74 	struct proto	 *prot;
75 	struct proto_ops *ops;
76 
77 	int              capability; /* Which (if any) capability do
78 				      * we need to use this socket
79 				      * interface?
80                                       */
81 	char             no_check;   /* checksum on rcv/xmit/none? */
82 	unsigned char	 flags;      /* See INET_PROTOSW_* below.  */
83 };
84 #define INET_PROTOSW_REUSE 0x01	     /* Are ports automatically reusable? */
85 #define INET_PROTOSW_PERMANENT 0x02  /* Permanent protocols are unremovable. */
86 
87 extern struct inet_protocol *inet_protocol_base;
88 extern struct inet_protocol *inet_protos[MAX_INET_PROTOS];
89 extern struct list_head inetsw[SOCK_MAX];
90 
91 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
92 extern struct inet6_protocol *inet6_protos[MAX_INET_PROTOS];
93 extern struct list_head inetsw6[SOCK_MAX];
94 #endif
95 
96 extern void	inet_add_protocol(struct inet_protocol *prot);
97 extern int	inet_del_protocol(struct inet_protocol *prot);
98 extern void	inet_register_protosw(struct inet_protosw *p);
99 extern void	inet_unregister_protosw(struct inet_protosw *p);
100 
101 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
102 extern void	inet6_add_protocol(struct inet6_protocol *prot);
103 extern int	inet6_del_protocol(struct inet6_protocol *prot);
104 extern void	inet6_register_protosw(struct inet_protosw *p);
105 extern void	inet6_unregister_protosw(struct inet_protosw *p);
106 #endif
107 
108 #endif	/* _PROTOCOL_H */
109