Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * INET     An implementation of the TCP/IP protocol suite for the LINUX
0004  *      operating system.  INET is implemented using the  BSD Socket
0005  *      interface as the means of communication with the user level.
0006  *
0007  *      Definitions for the protocol dispatcher.
0008  *
0009  * Version: @(#)protocol.h  1.0.2   05/07/93
0010  *
0011  * Author:  Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
0012  *
0013  *  Changes:
0014  *      Alan Cox    :   Added a name field and a frag handler
0015  *                  field for later.
0016  *      Alan Cox    :   Cleaned up, and sorted types.
0017  *      Pedro Roque :   inet6 protocols
0018  */
0019  
0020 #ifndef _PROTOCOL_H
0021 #define _PROTOCOL_H
0022 
0023 #include <linux/in6.h>
0024 #include <linux/skbuff.h>
0025 #if IS_ENABLED(CONFIG_IPV6)
0026 #include <linux/ipv6.h>
0027 #endif
0028 #include <linux/netdevice.h>
0029 
0030 /* This is one larger than the largest protocol value that can be
0031  * found in an ipv4 or ipv6 header.  Since in both cases the protocol
0032  * value is presented in a __u8, this is defined to be 256.
0033  */
0034 #define MAX_INET_PROTOS     256
0035 
0036 /* This is used to register protocols. */
0037 struct net_protocol {
0038     int         (*handler)(struct sk_buff *skb);
0039 
0040     /* This returns an error if we weren't able to handle the error. */
0041     int         (*err_handler)(struct sk_buff *skb, u32 info);
0042 
0043     unsigned int        no_policy:1,
0044                 /* does the protocol do more stringent
0045                  * icmp tag validation than simple
0046                  * socket lookup?
0047                  */
0048                 icmp_strict_tag_validation:1;
0049 };
0050 
0051 #if IS_ENABLED(CONFIG_IPV6)
0052 struct inet6_protocol {
0053     int (*handler)(struct sk_buff *skb);
0054 
0055     /* This returns an error if we weren't able to handle the error. */
0056     int (*err_handler)(struct sk_buff *skb,
0057                    struct inet6_skb_parm *opt,
0058                    u8 type, u8 code, int offset,
0059                    __be32 info);
0060 
0061     unsigned int    flags;  /* INET6_PROTO_xxx */
0062 };
0063 
0064 #define INET6_PROTO_NOPOLICY    0x1
0065 #define INET6_PROTO_FINAL   0x2
0066 #endif
0067 
0068 struct net_offload {
0069     struct offload_callbacks callbacks;
0070     unsigned int         flags; /* Flags used by IPv6 for now */
0071 };
0072 /* This should be set for any extension header which is compatible with GSO. */
0073 #define INET6_PROTO_GSO_EXTHDR  0x1
0074 
0075 /* This is used to register socket interfaces for IP protocols.  */
0076 struct inet_protosw {
0077     struct list_head list;
0078 
0079         /* These two fields form the lookup key.  */
0080     unsigned short   type;     /* This is the 2nd argument to socket(2). */
0081     unsigned short   protocol; /* This is the L4 protocol number.  */
0082 
0083     struct proto     *prot;
0084     const struct proto_ops *ops;
0085   
0086     unsigned char    flags;      /* See INET_PROTOSW_* below.  */
0087 };
0088 #define INET_PROTOSW_REUSE 0x01      /* Are ports automatically reusable? */
0089 #define INET_PROTOSW_PERMANENT 0x02  /* Permanent protocols are unremovable. */
0090 #define INET_PROTOSW_ICSK      0x04  /* Is this an inet_connection_sock? */
0091 
0092 extern struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS];
0093 extern const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS];
0094 extern const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS];
0095 
0096 #if IS_ENABLED(CONFIG_IPV6)
0097 extern struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS];
0098 #endif
0099 
0100 int inet_add_protocol(const struct net_protocol *prot, unsigned char num);
0101 int inet_del_protocol(const struct net_protocol *prot, unsigned char num);
0102 int inet_add_offload(const struct net_offload *prot, unsigned char num);
0103 int inet_del_offload(const struct net_offload *prot, unsigned char num);
0104 void inet_register_protosw(struct inet_protosw *p);
0105 void inet_unregister_protosw(struct inet_protosw *p);
0106 
0107 #if IS_ENABLED(CONFIG_IPV6)
0108 int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char num);
0109 int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char num);
0110 int inet6_register_protosw(struct inet_protosw *p);
0111 void inet6_unregister_protosw(struct inet_protosw *p);
0112 #endif
0113 int inet6_add_offload(const struct net_offload *prot, unsigned char num);
0114 int inet6_del_offload(const struct net_offload *prot, unsigned char num);
0115 
0116 #endif  /* _PROTOCOL_H */