at v4.14 3.8 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __LINUX_MROUTE_H 3#define __LINUX_MROUTE_H 4 5#include <linux/in.h> 6#include <linux/pim.h> 7#include <linux/rhashtable.h> 8#include <net/sock.h> 9#include <uapi/linux/mroute.h> 10 11#ifdef CONFIG_IP_MROUTE 12static inline int ip_mroute_opt(int opt) 13{ 14 return opt >= MRT_BASE && opt <= MRT_MAX; 15} 16 17int ip_mroute_setsockopt(struct sock *, int, char __user *, unsigned int); 18int ip_mroute_getsockopt(struct sock *, int, char __user *, int __user *); 19int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg); 20int ipmr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); 21int ip_mr_init(void); 22#else 23static inline int ip_mroute_setsockopt(struct sock *sock, int optname, 24 char __user *optval, unsigned int optlen) 25{ 26 return -ENOPROTOOPT; 27} 28 29static inline int ip_mroute_getsockopt(struct sock *sock, int optname, 30 char __user *optval, int __user *optlen) 31{ 32 return -ENOPROTOOPT; 33} 34 35static inline int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg) 36{ 37 return -ENOIOCTLCMD; 38} 39 40static inline int ip_mr_init(void) 41{ 42 return 0; 43} 44 45static inline int ip_mroute_opt(int opt) 46{ 47 return 0; 48} 49#endif 50 51struct vif_device { 52 struct net_device *dev; /* Device we are using */ 53 unsigned long bytes_in,bytes_out; 54 unsigned long pkt_in,pkt_out; /* Statistics */ 55 unsigned long rate_limit; /* Traffic shaping (NI) */ 56 unsigned char threshold; /* TTL threshold */ 57 unsigned short flags; /* Control flags */ 58 __be32 local,remote; /* Addresses(remote for tunnels)*/ 59 int link; /* Physical interface index */ 60}; 61 62#define VIFF_STATIC 0x8000 63 64#define VIF_EXISTS(_mrt, _idx) ((_mrt)->vif_table[_idx].dev != NULL) 65 66struct mr_table { 67 struct list_head list; 68 possible_net_t net; 69 u32 id; 70 struct sock __rcu *mroute_sk; 71 struct timer_list ipmr_expire_timer; 72 struct list_head mfc_unres_queue; 73 struct vif_device vif_table[MAXVIFS]; 74 struct rhltable mfc_hash; 75 struct list_head mfc_cache_list; 76 int maxvif; 77 atomic_t cache_resolve_queue_len; 78 bool mroute_do_assert; 79 bool mroute_do_pim; 80 int mroute_reg_vif_num; 81}; 82 83/* mfc_flags: 84 * MFC_STATIC - the entry was added statically (not by a routing daemon) 85 */ 86enum { 87 MFC_STATIC = BIT(0), 88}; 89 90struct mfc_cache_cmp_arg { 91 __be32 mfc_mcastgrp; 92 __be32 mfc_origin; 93}; 94 95/** 96 * struct mfc_cache - multicast routing entries 97 * @mnode: rhashtable list 98 * @mfc_mcastgrp: destination multicast group address 99 * @mfc_origin: source address 100 * @cmparg: used for rhashtable comparisons 101 * @mfc_parent: source interface (iif) 102 * @mfc_flags: entry flags 103 * @expires: unresolved entry expire time 104 * @unresolved: unresolved cached skbs 105 * @last_assert: time of last assert 106 * @minvif: minimum VIF id 107 * @maxvif: maximum VIF id 108 * @bytes: bytes that have passed for this entry 109 * @pkt: packets that have passed for this entry 110 * @wrong_if: number of wrong source interface hits 111 * @lastuse: time of last use of the group (traffic or update) 112 * @ttls: OIF TTL threshold array 113 * @list: global entry list 114 * @rcu: used for entry destruction 115 */ 116struct mfc_cache { 117 struct rhlist_head mnode; 118 union { 119 struct { 120 __be32 mfc_mcastgrp; 121 __be32 mfc_origin; 122 }; 123 struct mfc_cache_cmp_arg cmparg; 124 }; 125 vifi_t mfc_parent; 126 int mfc_flags; 127 128 union { 129 struct { 130 unsigned long expires; 131 struct sk_buff_head unresolved; 132 } unres; 133 struct { 134 unsigned long last_assert; 135 int minvif; 136 int maxvif; 137 unsigned long bytes; 138 unsigned long pkt; 139 unsigned long wrong_if; 140 unsigned long lastuse; 141 unsigned char ttls[MAXVIFS]; 142 } res; 143 } mfc_un; 144 struct list_head list; 145 struct rcu_head rcu; 146}; 147 148struct rtmsg; 149int ipmr_get_route(struct net *net, struct sk_buff *skb, 150 __be32 saddr, __be32 daddr, 151 struct rtmsg *rtm, u32 portid); 152#endif