2008-04-03 08:22:53 +08:00
|
|
|
#ifndef __LINUX_MROUTE6_H
|
|
|
|
#define __LINUX_MROUTE6_H
|
|
|
|
|
|
|
|
|
2008-08-30 05:37:23 +08:00
|
|
|
#include <linux/pim.h>
|
2008-04-03 08:22:53 +08:00
|
|
|
#include <linux/skbuff.h> /* for struct sk_buff_head */
|
2008-12-11 08:07:08 +08:00
|
|
|
#include <net/net_namespace.h>
|
2012-10-13 17:46:48 +08:00
|
|
|
#include <uapi/linux/mroute6.h>
|
2008-04-03 08:22:53 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_IPV6_MROUTE
|
|
|
|
static inline int ip6_mroute_opt(int opt)
|
|
|
|
{
|
|
|
|
return (opt >= MRT6_BASE) && (opt <= MRT6_BASE + 10);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
static inline int ip6_mroute_opt(int opt)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
struct sock;
|
|
|
|
|
2008-07-03 15:51:22 +08:00
|
|
|
#ifdef CONFIG_IPV6_MROUTE
|
2009-10-01 07:12:20 +08:00
|
|
|
extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, unsigned int);
|
2008-04-03 08:22:53 +08:00
|
|
|
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
|
|
|
extern int ip6_mr_input(struct sk_buff *skb);
|
|
|
|
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
2011-02-04 09:59:32 +08:00
|
|
|
extern int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
|
2008-07-03 12:13:30 +08:00
|
|
|
extern int ip6_mr_init(void);
|
|
|
|
extern void ip6_mr_cleanup(void);
|
2008-07-03 15:51:22 +08:00
|
|
|
#else
|
|
|
|
static inline
|
|
|
|
int ip6_mroute_setsockopt(struct sock *sock,
|
2009-10-01 07:12:20 +08:00
|
|
|
int optname, char __user *optval, unsigned int optlen)
|
2008-07-03 15:51:22 +08:00
|
|
|
{
|
|
|
|
return -ENOPROTOOPT;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline
|
|
|
|
int ip6_mroute_getsockopt(struct sock *sock,
|
|
|
|
int optname, char __user *optval, int __user *optlen)
|
|
|
|
{
|
|
|
|
return -ENOPROTOOPT;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline
|
|
|
|
int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
|
|
|
|
{
|
|
|
|
return -ENOIOCTLCMD;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int ip6_mr_init(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void ip6_mr_cleanup(void)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
2008-04-03 08:22:53 +08:00
|
|
|
|
2009-11-05 01:50:58 +08:00
|
|
|
struct mif_device {
|
2008-04-03 08:22:53 +08:00
|
|
|
struct net_device *dev; /* Device we are using */
|
|
|
|
unsigned long bytes_in,bytes_out;
|
|
|
|
unsigned long pkt_in,pkt_out; /* Statistics */
|
|
|
|
unsigned long rate_limit; /* Traffic shaping (NI) */
|
|
|
|
unsigned char threshold; /* TTL threshold */
|
|
|
|
unsigned short flags; /* Control flags */
|
|
|
|
int link; /* Physical interface index */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define VIFF_STATIC 0x8000
|
|
|
|
|
2009-11-05 01:50:58 +08:00
|
|
|
struct mfc6_cache {
|
2010-05-11 20:40:51 +08:00
|
|
|
struct list_head list;
|
2008-04-03 08:22:53 +08:00
|
|
|
struct in6_addr mf6c_mcastgrp; /* Group the entry belongs to */
|
|
|
|
struct in6_addr mf6c_origin; /* Source of packet */
|
|
|
|
mifi_t mf6c_parent; /* Source interface */
|
|
|
|
int mfc_flags; /* Flags on line */
|
|
|
|
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
unsigned long expires;
|
|
|
|
struct sk_buff_head unresolved; /* Unresolved buffers */
|
|
|
|
} unres;
|
|
|
|
struct {
|
|
|
|
unsigned long last_assert;
|
|
|
|
int minvif;
|
|
|
|
int maxvif;
|
|
|
|
unsigned long bytes;
|
|
|
|
unsigned long pkt;
|
|
|
|
unsigned long wrong_if;
|
|
|
|
unsigned char ttls[MAXMIFS]; /* TTL thresholds */
|
|
|
|
} res;
|
|
|
|
} mfc_un;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define MFC_STATIC 1
|
|
|
|
#define MFC_NOTIFY 2
|
|
|
|
|
|
|
|
#define MFC6_LINES 64
|
|
|
|
|
|
|
|
#define MFC6_HASH(a, g) (((__force u32)(a)->s6_addr32[0] ^ \
|
|
|
|
(__force u32)(a)->s6_addr32[1] ^ \
|
|
|
|
(__force u32)(a)->s6_addr32[2] ^ \
|
|
|
|
(__force u32)(a)->s6_addr32[3] ^ \
|
|
|
|
(__force u32)(g)->s6_addr32[0] ^ \
|
|
|
|
(__force u32)(g)->s6_addr32[1] ^ \
|
|
|
|
(__force u32)(g)->s6_addr32[2] ^ \
|
|
|
|
(__force u32)(g)->s6_addr32[3]) % MFC6_LINES)
|
|
|
|
|
|
|
|
#define MFC_ASSERT_THRESH (3*HZ) /* Maximal freq. of asserts */
|
|
|
|
|
|
|
|
struct rtmsg;
|
2008-12-11 08:30:15 +08:00
|
|
|
extern int ip6mr_get_route(struct net *net, struct sk_buff *skb,
|
|
|
|
struct rtmsg *rtm, int nowait);
|
2008-04-03 08:22:53 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_IPV6_MROUTE
|
ipv6: ip6mr: support multiple tables
This patch adds support for multiple independant multicast routing instances,
named "tables".
Userspace multicast routing daemons can bind to a specific table instance by
issuing a setsockopt call using a new option MRT6_TABLE. The table number is
stored in the raw socket data and affects all following ip6mr setsockopt(),
getsockopt() and ioctl() calls. By default, a single table (RT6_TABLE_DFLT)
is created with a default routing rule pointing to it. Newly created pim6reg
devices have the table number appended ("pim6regX"), with the exception of
devices created in the default table, which are named just "pim6reg" for
compatibility reasons.
Packets are directed to a specific table instance using routing rules,
similar to how regular routing rules work. Currently iif, oif and mark
are supported as keys, source and destination addresses could be supported
additionally.
Example usage:
- bind pimd/xorp/... to a specific table:
uint32_t table = 123;
setsockopt(fd, SOL_IPV6, MRT6_TABLE, &table, sizeof(table));
- create routing rules directing packets to the new table:
# ip -6 mrule add iif eth0 lookup 123
# ip -6 mrule add oif eth0 lookup 123
Signed-off-by: Patrick McHardy <kaber@trash.net>
2010-05-11 20:40:55 +08:00
|
|
|
extern struct sock *mroute6_socket(struct net *net, struct sk_buff *skb);
|
2008-04-03 08:22:53 +08:00
|
|
|
extern int ip6mr_sk_done(struct sock *sk);
|
|
|
|
#else
|
ipv6: ip6mr: support multiple tables
This patch adds support for multiple independant multicast routing instances,
named "tables".
Userspace multicast routing daemons can bind to a specific table instance by
issuing a setsockopt call using a new option MRT6_TABLE. The table number is
stored in the raw socket data and affects all following ip6mr setsockopt(),
getsockopt() and ioctl() calls. By default, a single table (RT6_TABLE_DFLT)
is created with a default routing rule pointing to it. Newly created pim6reg
devices have the table number appended ("pim6regX"), with the exception of
devices created in the default table, which are named just "pim6reg" for
compatibility reasons.
Packets are directed to a specific table instance using routing rules,
similar to how regular routing rules work. Currently iif, oif and mark
are supported as keys, source and destination addresses could be supported
additionally.
Example usage:
- bind pimd/xorp/... to a specific table:
uint32_t table = 123;
setsockopt(fd, SOL_IPV6, MRT6_TABLE, &table, sizeof(table));
- create routing rules directing packets to the new table:
# ip -6 mrule add iif eth0 lookup 123
# ip -6 mrule add oif eth0 lookup 123
Signed-off-by: Patrick McHardy <kaber@trash.net>
2010-05-11 20:40:55 +08:00
|
|
|
static inline struct sock *mroute6_socket(struct net *net, struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
static inline int ip6mr_sk_done(struct sock *sk)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2008-04-03 08:22:53 +08:00
|
|
|
#endif
|
|
|
|
#endif
|