0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
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
0031
0032
0033
0034 #define MAX_INET_PROTOS 256
0035
0036
0037 struct net_protocol {
0038 int (*handler)(struct sk_buff *skb);
0039
0040
0041 int (*err_handler)(struct sk_buff *skb, u32 info);
0042
0043 unsigned int no_policy:1,
0044
0045
0046
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
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;
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;
0071 };
0072
0073 #define INET6_PROTO_GSO_EXTHDR 0x1
0074
0075
0076 struct inet_protosw {
0077 struct list_head list;
0078
0079
0080 unsigned short type;
0081 unsigned short protocol;
0082
0083 struct proto *prot;
0084 const struct proto_ops *ops;
0085
0086 unsigned char flags;
0087 };
0088 #define INET_PROTOSW_REUSE 0x01
0089 #define INET_PROTOSW_PERMANENT 0x02
0090 #define INET_PROTOSW_ICSK 0x04
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