xref: /linux/include/linux/mroute.h (revision 520191bb404c4b7b4cdb70a5480ada974b0c2d60)
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