xref: /linux/include/linux/mroute6.h (revision cdd5b5a9761fd66d17586e4f4ba6588c70e640ea)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27bc570c8SYOSHIFUJI Hideaki #ifndef __LINUX_MROUTE6_H
37bc570c8SYOSHIFUJI Hideaki #define __LINUX_MROUTE6_H
47bc570c8SYOSHIFUJI Hideaki 
57bc570c8SYOSHIFUJI Hideaki 
67c19a3d2SDavid S. Miller #include <linux/pim.h>
77bc570c8SYOSHIFUJI Hideaki #include <linux/skbuff.h>	/* for struct sk_buff_head */
8bd91b8bfSBenjamin Thery #include <net/net_namespace.h>
9607ca46eSDavid Howells #include <uapi/linux/mroute6.h>
106853f21fSYuval Mintz #include <linux/mroute_base.h>
11b43c6153SChristoph Hellwig #include <linux/sockptr.h>
12d3c07e5bSYuval Mintz #include <net/fib_rules.h>
137bc570c8SYOSHIFUJI Hideaki 
147bc570c8SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE
ip6_mroute_opt(int opt)157bc570c8SYOSHIFUJI Hideaki static inline int ip6_mroute_opt(int opt)
167bc570c8SYOSHIFUJI Hideaki {
17bbb923a4SNicolas Dichtel 	return (opt >= MRT6_BASE) && (opt <= MRT6_MAX);
187bc570c8SYOSHIFUJI Hideaki }
197bc570c8SYOSHIFUJI Hideaki #else
ip6_mroute_opt(int opt)207bc570c8SYOSHIFUJI Hideaki static inline int ip6_mroute_opt(int opt)
217bc570c8SYOSHIFUJI Hideaki {
227bc570c8SYOSHIFUJI Hideaki 	return 0;
237bc570c8SYOSHIFUJI Hideaki }
247bc570c8SYOSHIFUJI Hideaki #endif
257bc570c8SYOSHIFUJI Hideaki 
267bc570c8SYOSHIFUJI Hideaki struct sock;
277bc570c8SYOSHIFUJI Hideaki 
28e0835f8fSYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE
29b43c6153SChristoph Hellwig extern int ip6_mroute_setsockopt(struct sock *, int, sockptr_t, unsigned int);
306dadbe4bSMartin KaFai Lau extern int ip6_mroute_getsockopt(struct sock *, int, sockptr_t, sockptr_t);
317bc570c8SYOSHIFUJI Hideaki extern int ip6_mr_input(struct sk_buff *skb);
32e2d57766SDavid S. Miller extern int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
33623d1a1aSWang Chen extern int ip6_mr_init(void);
34623d1a1aSWang Chen extern void ip6_mr_cleanup(void);
35e1d001faSBreno Leitao int ip6mr_ioctl(struct sock *sk, int cmd, void *arg);
36e0835f8fSYOSHIFUJI Hideaki #else
ip6_mroute_setsockopt(struct sock * sock,int optname,sockptr_t optval,unsigned int optlen)37b43c6153SChristoph Hellwig static inline int ip6_mroute_setsockopt(struct sock *sock, int optname,
38b43c6153SChristoph Hellwig 		sockptr_t optval, unsigned int optlen)
39e0835f8fSYOSHIFUJI Hideaki {
40e0835f8fSYOSHIFUJI Hideaki 	return -ENOPROTOOPT;
41e0835f8fSYOSHIFUJI Hideaki }
42e0835f8fSYOSHIFUJI Hideaki 
43e0835f8fSYOSHIFUJI Hideaki static inline
ip6_mroute_getsockopt(struct sock * sock,int optname,sockptr_t optval,sockptr_t optlen)44e0835f8fSYOSHIFUJI Hideaki int ip6_mroute_getsockopt(struct sock *sock,
456dadbe4bSMartin KaFai Lau 			  int optname, sockptr_t optval, sockptr_t optlen)
46e0835f8fSYOSHIFUJI Hideaki {
47e0835f8fSYOSHIFUJI Hideaki 	return -ENOPROTOOPT;
48e0835f8fSYOSHIFUJI Hideaki }
49e0835f8fSYOSHIFUJI Hideaki 
50e0835f8fSYOSHIFUJI Hideaki static inline
ip6mr_ioctl(struct sock * sk,int cmd,void * arg)51e1d001faSBreno Leitao int ip6mr_ioctl(struct sock *sk, int cmd, void *arg)
52e0835f8fSYOSHIFUJI Hideaki {
53e0835f8fSYOSHIFUJI Hideaki 	return -ENOIOCTLCMD;
54e0835f8fSYOSHIFUJI Hideaki }
55e0835f8fSYOSHIFUJI Hideaki 
ip6_mr_init(void)56e0835f8fSYOSHIFUJI Hideaki static inline int ip6_mr_init(void)
57e0835f8fSYOSHIFUJI Hideaki {
58e0835f8fSYOSHIFUJI Hideaki 	return 0;
59e0835f8fSYOSHIFUJI Hideaki }
60e0835f8fSYOSHIFUJI Hideaki 
ip6_mr_cleanup(void)61e0835f8fSYOSHIFUJI Hideaki static inline void ip6_mr_cleanup(void)
62e0835f8fSYOSHIFUJI Hideaki {
63e0835f8fSYOSHIFUJI Hideaki 	return;
64e0835f8fSYOSHIFUJI Hideaki }
65e0835f8fSYOSHIFUJI Hideaki #endif
667bc570c8SYOSHIFUJI Hideaki 
67d3c07e5bSYuval Mintz #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
68d3c07e5bSYuval Mintz bool ip6mr_rule_default(const struct fib_rule *rule);
69d3c07e5bSYuval Mintz #else
ip6mr_rule_default(const struct fib_rule * rule)70d3c07e5bSYuval Mintz static inline bool ip6mr_rule_default(const struct fib_rule *rule)
71d3c07e5bSYuval Mintz {
72d3c07e5bSYuval Mintz 	return true;
73d3c07e5bSYuval Mintz }
74d3c07e5bSYuval Mintz #endif
75d3c07e5bSYuval Mintz 
767bc570c8SYOSHIFUJI Hideaki #define VIFF_STATIC 0x8000
777bc570c8SYOSHIFUJI Hideaki 
7887c418bfSYuval Mintz struct mfc6_cache_cmp_arg {
7987c418bfSYuval Mintz 	struct in6_addr mf6c_mcastgrp;
8087c418bfSYuval Mintz 	struct in6_addr mf6c_origin;
8187c418bfSYuval Mintz };
8287c418bfSYuval Mintz 
83d94d9feeSEric Dumazet struct mfc6_cache {
84494fff56SYuval Mintz 	struct mr_mfc _c;
8587c418bfSYuval Mintz 	union {
8687c418bfSYuval Mintz 		struct {
8787c418bfSYuval Mintz 			struct in6_addr mf6c_mcastgrp;
8887c418bfSYuval Mintz 			struct in6_addr mf6c_origin;
8987c418bfSYuval Mintz 		};
9087c418bfSYuval Mintz 		struct mfc6_cache_cmp_arg cmparg;
9187c418bfSYuval Mintz 	};
927bc570c8SYOSHIFUJI Hideaki };
937bc570c8SYOSHIFUJI Hideaki 
947bc570c8SYOSHIFUJI Hideaki #define MFC_ASSERT_THRESH (3*HZ)		/* Maximal freq. of asserts */
957bc570c8SYOSHIFUJI Hideaki 
967bc570c8SYOSHIFUJI Hideaki struct rtmsg;
978229efdaSBenjamin Thery extern int ip6mr_get_route(struct net *net, struct sk_buff *skb,
98fd61c6baSDavid Ahern 			   struct rtmsg *rtm, u32 portid);
997bc570c8SYOSHIFUJI Hideaki 
1007bc570c8SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE
1018571ab47SYuval Mintz bool mroute6_is_socket(struct net *net, struct sk_buff *skb);
1027bc570c8SYOSHIFUJI Hideaki extern int ip6mr_sk_done(struct sock *sk);
ip6mr_sk_ioctl(struct sock * sk,unsigned int cmd,void __user * arg)103e1d001faSBreno Leitao static inline int ip6mr_sk_ioctl(struct sock *sk, unsigned int cmd,
104e1d001faSBreno Leitao 				 void __user *arg)
105e1d001faSBreno Leitao {
106e1d001faSBreno Leitao 	switch (cmd) {
107e1d001faSBreno Leitao 	/* These userspace buffers will be consumed by ip6mr_ioctl() */
108e1d001faSBreno Leitao 	case SIOCGETMIFCNT_IN6: {
109e1d001faSBreno Leitao 		struct sioc_mif_req6 buffer;
110e1d001faSBreno Leitao 
111e1d001faSBreno Leitao 		return sock_ioctl_inout(sk, cmd, arg, &buffer,
112e1d001faSBreno Leitao 					sizeof(buffer));
113e1d001faSBreno Leitao 		}
114e1d001faSBreno Leitao 	case SIOCGETSGCNT_IN6: {
115*3a4f0edbSEric Dumazet 		struct sioc_sg_req6 buffer;
116e1d001faSBreno Leitao 
117e1d001faSBreno Leitao 		return sock_ioctl_inout(sk, cmd, arg, &buffer,
118e1d001faSBreno Leitao 					sizeof(buffer));
119e1d001faSBreno Leitao 		}
120e1d001faSBreno Leitao 	}
121e1d001faSBreno Leitao 
122e1d001faSBreno Leitao 	return 1;
123e1d001faSBreno Leitao }
1247bc570c8SYOSHIFUJI Hideaki #else
mroute6_is_socket(struct net * net,struct sk_buff * skb)1258571ab47SYuval Mintz static inline bool mroute6_is_socket(struct net *net, struct sk_buff *skb)
126d1db275dSPatrick McHardy {
1278571ab47SYuval Mintz 	return false;
128d1db275dSPatrick McHardy }
ip6mr_sk_done(struct sock * sk)129d1db275dSPatrick McHardy static inline int ip6mr_sk_done(struct sock *sk)
130d1db275dSPatrick McHardy {
131d1db275dSPatrick McHardy 	return 0;
132d1db275dSPatrick McHardy }
133e1d001faSBreno Leitao 
ip6mr_sk_ioctl(struct sock * sk,unsigned int cmd,void __user * arg)134e1d001faSBreno Leitao static inline int ip6mr_sk_ioctl(struct sock *sk, unsigned int cmd,
135e1d001faSBreno Leitao 				 void __user *arg)
136e1d001faSBreno Leitao {
137e1d001faSBreno Leitao 	return 1;
138e1d001faSBreno Leitao }
1397bc570c8SYOSHIFUJI Hideaki #endif
1407bc570c8SYOSHIFUJI Hideaki #endif
141