xref: /linux/include/linux/mroute.h (revision e1d001fa5b477c4da46a29be1fcece91db7c7c6f)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef __LINUX_MROUTE_H
31da177e4SLinus Torvalds #define __LINUX_MROUTE_H
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds #include <linux/in.h>
67c19a3d2SDavid S. Miller #include <linux/pim.h>
7478e4c2fSYotam Gigi #include <net/fib_rules.h>
84d65b948SYotam Gigi #include <net/fib_notifier.h>
9607ca46eSDavid Howells #include <uapi/linux/mroute.h>
106853f21fSYuval Mintz #include <linux/mroute_base.h>
1101ccb5b4SChristoph Hellwig #include <linux/sockptr.h>
121da177e4SLinus Torvalds 
136a9fb947SPavel Emelyanov #ifdef CONFIG_IP_MROUTE
146a9fb947SPavel Emelyanov static inline int ip_mroute_opt(int opt)
156a9fb947SPavel Emelyanov {
16520191bbSNikolay Aleksandrov 	return opt >= MRT_BASE && opt <= MRT_MAX;
176a9fb947SPavel Emelyanov }
186a9fb947SPavel Emelyanov 
19*e1d001faSBreno Leitao static inline int sk_is_ipmr(struct sock *sk)
20*e1d001faSBreno Leitao {
21*e1d001faSBreno Leitao 	return sk->sk_family == AF_INET &&
22*e1d001faSBreno Leitao 		inet_sk(sk)->inet_num == IPPROTO_IGMP;
23*e1d001faSBreno Leitao }
24*e1d001faSBreno Leitao 
2501ccb5b4SChristoph Hellwig int ip_mroute_setsockopt(struct sock *, int, sockptr_t, unsigned int);
26728f064cSMartin KaFai Lau int ip_mroute_getsockopt(struct sock *, int, sockptr_t, sockptr_t);
27*e1d001faSBreno Leitao int ipmr_ioctl(struct sock *sk, int cmd, void *arg);
28520191bbSNikolay Aleksandrov int ipmr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
29520191bbSNikolay Aleksandrov int ip_mr_init(void);
30478e4c2fSYotam Gigi bool ipmr_rule_default(const struct fib_rule *rule);
31*e1d001faSBreno Leitao int ipmr_sk_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
32e0835f8fSYOSHIFUJI Hideaki #else
33520191bbSNikolay Aleksandrov static inline int ip_mroute_setsockopt(struct sock *sock, int optname,
3401ccb5b4SChristoph Hellwig 				       sockptr_t optval, unsigned int optlen)
35e0835f8fSYOSHIFUJI Hideaki {
36e0835f8fSYOSHIFUJI Hideaki 	return -ENOPROTOOPT;
37e0835f8fSYOSHIFUJI Hideaki }
38e0835f8fSYOSHIFUJI Hideaki 
39728f064cSMartin KaFai Lau static inline int ip_mroute_getsockopt(struct sock *sk, int optname,
40728f064cSMartin KaFai Lau 				       sockptr_t optval, sockptr_t optlen)
41e0835f8fSYOSHIFUJI Hideaki {
42e0835f8fSYOSHIFUJI Hideaki 	return -ENOPROTOOPT;
43e0835f8fSYOSHIFUJI Hideaki }
44e0835f8fSYOSHIFUJI Hideaki 
45*e1d001faSBreno Leitao static inline int ipmr_ioctl(struct sock *sk, int cmd, void *arg)
46e0835f8fSYOSHIFUJI Hideaki {
47e0835f8fSYOSHIFUJI Hideaki 	return -ENOIOCTLCMD;
48e0835f8fSYOSHIFUJI Hideaki }
49e0835f8fSYOSHIFUJI Hideaki 
50e0835f8fSYOSHIFUJI Hideaki static inline int ip_mr_init(void)
51e0835f8fSYOSHIFUJI Hideaki {
52e0835f8fSYOSHIFUJI Hideaki 	return 0;
53e0835f8fSYOSHIFUJI Hideaki }
54520191bbSNikolay Aleksandrov 
55520191bbSNikolay Aleksandrov static inline int ip_mroute_opt(int opt)
56520191bbSNikolay Aleksandrov {
57520191bbSNikolay Aleksandrov 	return 0;
58520191bbSNikolay Aleksandrov }
59478e4c2fSYotam Gigi 
60*e1d001faSBreno Leitao static inline int sk_is_ipmr(struct sock *sk)
61*e1d001faSBreno Leitao {
62*e1d001faSBreno Leitao 	return 0;
63*e1d001faSBreno Leitao }
64*e1d001faSBreno Leitao 
65478e4c2fSYotam Gigi static inline bool ipmr_rule_default(const struct fib_rule *rule)
66478e4c2fSYotam Gigi {
67478e4c2fSYotam Gigi 	return true;
68478e4c2fSYotam Gigi }
69*e1d001faSBreno Leitao 
70*e1d001faSBreno Leitao static inline int ipmr_sk_ioctl(struct sock *sk, unsigned int cmd,
71*e1d001faSBreno Leitao 				void __user *arg)
72*e1d001faSBreno Leitao {
73*e1d001faSBreno Leitao 	return 1;
74*e1d001faSBreno Leitao }
75e0835f8fSYOSHIFUJI Hideaki #endif
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds #define VIFF_STATIC 0x8000
781da177e4SLinus Torvalds 
798fb472c0SNikolay Aleksandrov struct mfc_cache_cmp_arg {
808fb472c0SNikolay Aleksandrov 	__be32 mfc_mcastgrp;
818fb472c0SNikolay Aleksandrov 	__be32 mfc_origin;
828fb472c0SNikolay Aleksandrov };
838fb472c0SNikolay Aleksandrov 
848fb472c0SNikolay Aleksandrov /**
858fb472c0SNikolay Aleksandrov  * struct mfc_cache - multicast routing entries
86494fff56SYuval Mintz  * @_c: Common multicast routing information; has to be first [for casting]
878fb472c0SNikolay Aleksandrov  * @mfc_mcastgrp: destination multicast group address
888fb472c0SNikolay Aleksandrov  * @mfc_origin: source address
898fb472c0SNikolay Aleksandrov  * @cmparg: used for rhashtable comparisons
908fb472c0SNikolay Aleksandrov  */
91d94d9feeSEric Dumazet struct mfc_cache {
92494fff56SYuval Mintz 	struct mr_mfc _c;
938fb472c0SNikolay Aleksandrov 	union {
948fb472c0SNikolay Aleksandrov 		struct {
958fb472c0SNikolay Aleksandrov 			__be32 mfc_mcastgrp;
968fb472c0SNikolay Aleksandrov 			__be32 mfc_origin;
978fb472c0SNikolay Aleksandrov 		};
988fb472c0SNikolay Aleksandrov 		struct mfc_cache_cmp_arg cmparg;
998fb472c0SNikolay Aleksandrov 	};
1001da177e4SLinus Torvalds };
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds struct rtmsg;
103520191bbSNikolay Aleksandrov int ipmr_get_route(struct net *net, struct sk_buff *skb,
1049a1b9496SDavid S. Miller 		   __be32 saddr, __be32 daddr,
1059f09eaeaSDavid Ahern 		   struct rtmsg *rtm, u32 portid);
1061da177e4SLinus Torvalds #endif
107