11da177e4SLinus Torvalds #ifndef __LINUX_MROUTE_H 21da177e4SLinus Torvalds #define __LINUX_MROUTE_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds #include <linux/in.h> 57c19a3d2SDavid S. Miller #include <linux/pim.h> 61da177e4SLinus Torvalds #include <net/sock.h> 7607ca46eSDavid Howells #include <uapi/linux/mroute.h> 81da177e4SLinus Torvalds 96a9fb947SPavel Emelyanov #ifdef CONFIG_IP_MROUTE 106a9fb947SPavel Emelyanov static inline int ip_mroute_opt(int opt) 116a9fb947SPavel Emelyanov { 12*520191bbSNikolay Aleksandrov return opt >= MRT_BASE && opt <= MRT_MAX; 136a9fb947SPavel Emelyanov } 146a9fb947SPavel Emelyanov 15*520191bbSNikolay Aleksandrov int ip_mroute_setsockopt(struct sock *, int, char __user *, unsigned int); 16*520191bbSNikolay Aleksandrov int ip_mroute_getsockopt(struct sock *, int, char __user *, int __user *); 17*520191bbSNikolay Aleksandrov int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg); 18*520191bbSNikolay Aleksandrov int ipmr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); 19*520191bbSNikolay Aleksandrov int ip_mr_init(void); 20e0835f8fSYOSHIFUJI Hideaki #else 21*520191bbSNikolay Aleksandrov static inline int ip_mroute_setsockopt(struct sock *sock, int optname, 22*520191bbSNikolay Aleksandrov char __user *optval, unsigned int optlen) 23e0835f8fSYOSHIFUJI Hideaki { 24e0835f8fSYOSHIFUJI Hideaki return -ENOPROTOOPT; 25e0835f8fSYOSHIFUJI Hideaki } 26e0835f8fSYOSHIFUJI Hideaki 27*520191bbSNikolay Aleksandrov static inline int ip_mroute_getsockopt(struct sock *sock, int optname, 28*520191bbSNikolay Aleksandrov char __user *optval, int __user *optlen) 29e0835f8fSYOSHIFUJI Hideaki { 30e0835f8fSYOSHIFUJI Hideaki return -ENOPROTOOPT; 31e0835f8fSYOSHIFUJI Hideaki } 32e0835f8fSYOSHIFUJI Hideaki 33*520191bbSNikolay Aleksandrov static inline int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg) 34e0835f8fSYOSHIFUJI Hideaki { 35e0835f8fSYOSHIFUJI Hideaki return -ENOIOCTLCMD; 36e0835f8fSYOSHIFUJI Hideaki } 37e0835f8fSYOSHIFUJI Hideaki 38e0835f8fSYOSHIFUJI Hideaki static inline int ip_mr_init(void) 39e0835f8fSYOSHIFUJI Hideaki { 40e0835f8fSYOSHIFUJI Hideaki return 0; 41e0835f8fSYOSHIFUJI Hideaki } 42*520191bbSNikolay Aleksandrov 43*520191bbSNikolay Aleksandrov static inline int ip_mroute_opt(int opt) 44*520191bbSNikolay Aleksandrov { 45*520191bbSNikolay Aleksandrov return 0; 46*520191bbSNikolay Aleksandrov } 47e0835f8fSYOSHIFUJI Hideaki #endif 481da177e4SLinus Torvalds 49d94d9feeSEric Dumazet struct vif_device { 501da177e4SLinus Torvalds struct net_device *dev; /* Device we are using */ 511da177e4SLinus Torvalds unsigned long bytes_in,bytes_out; 521da177e4SLinus Torvalds unsigned long pkt_in,pkt_out; /* Statistics */ 531da177e4SLinus Torvalds unsigned long rate_limit; /* Traffic shaping (NI) */ 541da177e4SLinus Torvalds unsigned char threshold; /* TTL threshold */ 551da177e4SLinus Torvalds unsigned short flags; /* Control flags */ 56114c7844SAl Viro __be32 local,remote; /* Addresses(remote for tunnels)*/ 571da177e4SLinus Torvalds int link; /* Physical interface index */ 581da177e4SLinus Torvalds }; 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds #define VIFF_STATIC 0x8000 611da177e4SLinus Torvalds 6206bd6c03SNikolay Aleksandrov /* mfc_flags: 6306bd6c03SNikolay Aleksandrov * MFC_STATIC - the entry was added statically (not by a routing daemon) 6406bd6c03SNikolay Aleksandrov */ 6506bd6c03SNikolay Aleksandrov enum { 6606bd6c03SNikolay Aleksandrov MFC_STATIC = BIT(0), 6706bd6c03SNikolay Aleksandrov }; 6806bd6c03SNikolay Aleksandrov 69d94d9feeSEric Dumazet struct mfc_cache { 70862465f2SPatrick McHardy struct list_head list; 71114c7844SAl Viro __be32 mfc_mcastgrp; /* Group the entry belongs to */ 72114c7844SAl Viro __be32 mfc_origin; /* Source of packet */ 731da177e4SLinus Torvalds vifi_t mfc_parent; /* Source interface */ 741da177e4SLinus Torvalds int mfc_flags; /* Flags on line */ 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds union { 771da177e4SLinus Torvalds struct { 781da177e4SLinus Torvalds unsigned long expires; 791da177e4SLinus Torvalds struct sk_buff_head unresolved; /* Unresolved buffers */ 801da177e4SLinus Torvalds } unres; 811da177e4SLinus Torvalds struct { 821da177e4SLinus Torvalds unsigned long last_assert; 831da177e4SLinus Torvalds int minvif; 841da177e4SLinus Torvalds int maxvif; 851da177e4SLinus Torvalds unsigned long bytes; 861da177e4SLinus Torvalds unsigned long pkt; 871da177e4SLinus Torvalds unsigned long wrong_if; 881da177e4SLinus Torvalds unsigned char ttls[MAXVIFS]; /* TTL thresholds */ 891da177e4SLinus Torvalds } res; 901da177e4SLinus Torvalds } mfc_un; 91a8c9486bSEric Dumazet struct rcu_head rcu; 921da177e4SLinus Torvalds }; 931da177e4SLinus Torvalds 941da177e4SLinus Torvalds #define MFC_LINES 64 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds #ifdef __BIG_ENDIAN 97114c7844SAl Viro #define MFC_HASH(a,b) (((((__force u32)(__be32)a)>>24)^(((__force u32)(__be32)b)>>26))&(MFC_LINES-1)) 981da177e4SLinus Torvalds #else 99114c7844SAl Viro #define MFC_HASH(a,b) ((((__force u32)(__be32)a)^(((__force u32)(__be32)b)>>2))&(MFC_LINES-1)) 1001da177e4SLinus Torvalds #endif 1011da177e4SLinus Torvalds 1021da177e4SLinus Torvalds struct rtmsg; 103*520191bbSNikolay Aleksandrov int ipmr_get_route(struct net *net, struct sk_buff *skb, 1049a1b9496SDavid S. Miller __be32 saddr, __be32 daddr, 1054feb88e5SBenjamin Thery struct rtmsg *rtm, int nowait); 1061da177e4SLinus Torvalds #endif 107