• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_ICMPV6_H
3  #define _LINUX_ICMPV6_H
4  
5  #include <linux/skbuff.h>
6  #include <linux/ipv6.h>
7  #include <uapi/linux/icmpv6.h>
8  
icmp6_hdr(const struct sk_buff * skb)9  static inline struct icmp6hdr *icmp6_hdr(const struct sk_buff *skb)
10  {
11  	return (struct icmp6hdr *)skb_transport_header(skb);
12  }
13  
14  #include <linux/netdevice.h>
15  
16  #if IS_ENABLED(CONFIG_IPV6)
17  
18  typedef void ip6_icmp_send_t(struct sk_buff *skb, u8 type, u8 code, __u32 info,
19  			     const struct in6_addr *force_saddr,
20  			     const struct inet6_skb_parm *parm);
21  void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
22  		const struct in6_addr *force_saddr,
23  		const struct inet6_skb_parm *parm);
24  #if IS_BUILTIN(CONFIG_IPV6)
__icmpv6_send(struct sk_buff * skb,u8 type,u8 code,__u32 info,const struct inet6_skb_parm * parm)25  static inline void __icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
26  				 const struct inet6_skb_parm *parm)
27  {
28  	icmp6_send(skb, type, code, info, NULL, parm);
29  }
inet6_register_icmp_sender(ip6_icmp_send_t * fn)30  static inline int inet6_register_icmp_sender(ip6_icmp_send_t *fn)
31  {
32  	BUILD_BUG_ON(fn != icmp6_send);
33  	return 0;
34  }
inet6_unregister_icmp_sender(ip6_icmp_send_t * fn)35  static inline int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn)
36  {
37  	BUILD_BUG_ON(fn != icmp6_send);
38  	return 0;
39  }
40  #else
41  extern void __icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
42  			  const struct inet6_skb_parm *parm);
43  extern int inet6_register_icmp_sender(ip6_icmp_send_t *fn);
44  extern int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn);
45  #endif
46  
icmpv6_send(struct sk_buff * skb,u8 type,u8 code,__u32 info)47  static inline void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
48  {
49  	__icmpv6_send(skb, type, code, info, IP6CB(skb));
50  }
51  
52  int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
53  			       unsigned int data_len);
54  
55  #if IS_ENABLED(CONFIG_NF_NAT)
56  void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info);
57  #else
icmpv6_ndo_send(struct sk_buff * skb_in,u8 type,u8 code,__u32 info)58  static inline void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info)
59  {
60  	struct inet6_skb_parm parm = { 0 };
61  	__icmpv6_send(skb_in, type, code, info, &parm);
62  }
63  #endif
64  
65  #else
66  
icmpv6_send(struct sk_buff * skb,u8 type,u8 code,__u32 info)67  static inline void icmpv6_send(struct sk_buff *skb,
68  			       u8 type, u8 code, __u32 info)
69  {
70  }
71  
icmpv6_ndo_send(struct sk_buff * skb,u8 type,u8 code,__u32 info)72  static inline void icmpv6_ndo_send(struct sk_buff *skb,
73  				   u8 type, u8 code, __u32 info)
74  {
75  }
76  #endif
77  
78  extern int				icmpv6_init(void);
79  extern int				icmpv6_err_convert(u8 type, u8 code,
80  							   int *err);
81  extern void				icmpv6_cleanup(void);
82  extern void				icmpv6_param_prob(struct sk_buff *skb,
83  							  u8 code, int pos);
84  
85  struct flowi6;
86  struct in6_addr;
87  extern void				icmpv6_flow_init(struct sock *sk,
88  							 struct flowi6 *fl6,
89  							 u8 type,
90  							 const struct in6_addr *saddr,
91  							 const struct in6_addr *daddr,
92  							 int oif);
93  
icmpv6_is_err(int type)94  static inline bool icmpv6_is_err(int type)
95  {
96  	switch (type) {
97  	case ICMPV6_DEST_UNREACH:
98  	case ICMPV6_PKT_TOOBIG:
99  	case ICMPV6_TIME_EXCEED:
100  	case ICMPV6_PARAMPROB:
101  		return true;
102  	}
103  
104  	return false;
105  }
106  
107  #endif
108