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