at v4.16 135 lines 3.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __LINUX_MROUTE6_H 3#define __LINUX_MROUTE6_H 4 5 6#include <linux/pim.h> 7#include <linux/skbuff.h> /* for struct sk_buff_head */ 8#include <net/net_namespace.h> 9#include <uapi/linux/mroute6.h> 10 11#ifdef CONFIG_IPV6_MROUTE 12static inline int ip6_mroute_opt(int opt) 13{ 14 return (opt >= MRT6_BASE) && (opt <= MRT6_MAX); 15} 16#else 17static inline int ip6_mroute_opt(int opt) 18{ 19 return 0; 20} 21#endif 22 23struct sock; 24 25#ifdef CONFIG_IPV6_MROUTE 26extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, unsigned int); 27extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *); 28extern int ip6_mr_input(struct sk_buff *skb); 29extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg); 30extern int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); 31extern int ip6_mr_init(void); 32extern void ip6_mr_cleanup(void); 33#else 34static inline 35int ip6_mroute_setsockopt(struct sock *sock, 36 int optname, char __user *optval, unsigned int optlen) 37{ 38 return -ENOPROTOOPT; 39} 40 41static inline 42int ip6_mroute_getsockopt(struct sock *sock, 43 int optname, char __user *optval, int __user *optlen) 44{ 45 return -ENOPROTOOPT; 46} 47 48static inline 49int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg) 50{ 51 return -ENOIOCTLCMD; 52} 53 54static inline int ip6_mr_init(void) 55{ 56 return 0; 57} 58 59static inline void ip6_mr_cleanup(void) 60{ 61 return; 62} 63#endif 64 65struct mif_device { 66 struct net_device *dev; /* Device we are using */ 67 unsigned long bytes_in,bytes_out; 68 unsigned long pkt_in,pkt_out; /* Statistics */ 69 unsigned long rate_limit; /* Traffic shaping (NI) */ 70 unsigned char threshold; /* TTL threshold */ 71 unsigned short flags; /* Control flags */ 72 int link; /* Physical interface index */ 73}; 74 75#define VIFF_STATIC 0x8000 76 77struct mfc6_cache { 78 struct list_head list; 79 struct in6_addr mf6c_mcastgrp; /* Group the entry belongs to */ 80 struct in6_addr mf6c_origin; /* Source of packet */ 81 mifi_t mf6c_parent; /* Source interface */ 82 int mfc_flags; /* Flags on line */ 83 84 union { 85 struct { 86 unsigned long expires; 87 struct sk_buff_head unresolved; /* Unresolved buffers */ 88 } unres; 89 struct { 90 unsigned long last_assert; 91 int minvif; 92 int maxvif; 93 unsigned long bytes; 94 unsigned long pkt; 95 unsigned long wrong_if; 96 unsigned long lastuse; 97 unsigned char ttls[MAXMIFS]; /* TTL thresholds */ 98 } res; 99 } mfc_un; 100}; 101 102#define MFC_STATIC 1 103#define MFC_NOTIFY 2 104 105#define MFC6_LINES 64 106 107#define MFC6_HASH(a, g) (((__force u32)(a)->s6_addr32[0] ^ \ 108 (__force u32)(a)->s6_addr32[1] ^ \ 109 (__force u32)(a)->s6_addr32[2] ^ \ 110 (__force u32)(a)->s6_addr32[3] ^ \ 111 (__force u32)(g)->s6_addr32[0] ^ \ 112 (__force u32)(g)->s6_addr32[1] ^ \ 113 (__force u32)(g)->s6_addr32[2] ^ \ 114 (__force u32)(g)->s6_addr32[3]) % MFC6_LINES) 115 116#define MFC_ASSERT_THRESH (3*HZ) /* Maximal freq. of asserts */ 117 118struct rtmsg; 119extern int ip6mr_get_route(struct net *net, struct sk_buff *skb, 120 struct rtmsg *rtm, u32 portid); 121 122#ifdef CONFIG_IPV6_MROUTE 123extern struct sock *mroute6_socket(struct net *net, struct sk_buff *skb); 124extern int ip6mr_sk_done(struct sock *sk); 125#else 126static inline struct sock *mroute6_socket(struct net *net, struct sk_buff *skb) 127{ 128 return NULL; 129} 130static inline int ip6mr_sk_done(struct sock *sk) 131{ 132 return 0; 133} 134#endif 135#endif