Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef __BEN_VLAN_802_1Q_INC__ 3 : : #define __BEN_VLAN_802_1Q_INC__ 4 : : 5 : : #include <linux/if_vlan.h> 6 : : #include <linux/u64_stats_sync.h> 7 : : #include <linux/list.h> 8 : : 9 : : /* if this changes, algorithm will have to be reworked because this 10 : : * depends on completely exhausting the VLAN identifier space. Thus 11 : : * it gives constant time look-up, but in many cases it wastes memory. 12 : : */ 13 : : #define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 14 : : #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS) 15 : : 16 : : enum vlan_protos { 17 : : VLAN_PROTO_8021Q = 0, 18 : : VLAN_PROTO_8021AD, 19 : : VLAN_PROTO_NUM, 20 : : }; 21 : : 22 : : struct vlan_group { 23 : : unsigned int nr_vlan_devs; 24 : : struct hlist_node hlist; /* linked list */ 25 : : struct net_device **vlan_devices_arrays[VLAN_PROTO_NUM] 26 : : [VLAN_GROUP_ARRAY_SPLIT_PARTS]; 27 : : }; 28 : : 29 : : struct vlan_info { 30 : : struct net_device *real_dev; /* The ethernet(like) device 31 : : * the vlan is attached to. 32 : : */ 33 : : struct vlan_group grp; 34 : : struct list_head vid_list; 35 : : unsigned int nr_vids; 36 : : struct rcu_head rcu; 37 : : }; 38 : : 39 : 0 : static inline unsigned int vlan_proto_idx(__be16 proto) 40 : : { 41 : 0 : switch (proto) { 42 : : case htons(ETH_P_8021Q): 43 : : return VLAN_PROTO_8021Q; 44 : : case htons(ETH_P_8021AD): 45 : 0 : return VLAN_PROTO_8021AD; 46 : : default: 47 : 0 : BUG(); 48 : : return 0; 49 : : } 50 : : } 51 : : 52 : : static inline struct net_device *__vlan_group_get_device(struct vlan_group *vg, 53 : : unsigned int pidx, 54 : : u16 vlan_id) 55 : : { 56 : : struct net_device **array; 57 : : 58 : 0 : array = vg->vlan_devices_arrays[pidx] 59 : 0 : [vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; 60 : 0 : return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL; 61 : : } 62 : : 63 : 0 : static inline struct net_device *vlan_group_get_device(struct vlan_group *vg, 64 : : __be16 vlan_proto, 65 : : u16 vlan_id) 66 : : { 67 : 0 : return __vlan_group_get_device(vg, vlan_proto_idx(vlan_proto), vlan_id); 68 : : } 69 : : 70 : 0 : static inline void vlan_group_set_device(struct vlan_group *vg, 71 : : __be16 vlan_proto, u16 vlan_id, 72 : : struct net_device *dev) 73 : : { 74 : : struct net_device **array; 75 : 0 : if (!vg) 76 : 0 : return; 77 : 0 : array = vg->vlan_devices_arrays[vlan_proto_idx(vlan_proto)] 78 : 0 : [vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; 79 : 0 : array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev; 80 : : } 81 : : 82 : : /* Must be invoked with rcu_read_lock or with RTNL. */ 83 : : static inline struct net_device *vlan_find_dev(struct net_device *real_dev, 84 : : __be16 vlan_proto, u16 vlan_id) 85 : : { 86 : 0 : struct vlan_info *vlan_info = rcu_dereference_rtnl(real_dev->vlan_info); 87 : : 88 : 0 : if (vlan_info) 89 : 0 : return vlan_group_get_device(&vlan_info->grp, 90 : : vlan_proto, vlan_id); 91 : : 92 : : return NULL; 93 : : } 94 : : 95 : : static inline netdev_features_t vlan_tnl_features(struct net_device *real_dev) 96 : : { 97 : : netdev_features_t ret; 98 : : 99 : 0 : ret = real_dev->hw_enc_features & 100 : : (NETIF_F_CSUM_MASK | NETIF_F_ALL_TSO | NETIF_F_GSO_ENCAP_ALL); 101 : : 102 : 0 : if ((ret & NETIF_F_GSO_ENCAP_ALL) && (ret & NETIF_F_CSUM_MASK)) 103 : 0 : return (ret & ~NETIF_F_CSUM_MASK) | NETIF_F_HW_CSUM; 104 : : return 0; 105 : : } 106 : : 107 : : #define vlan_group_for_each_dev(grp, i, dev) \ 108 : : for ((i) = 0; i < VLAN_PROTO_NUM * VLAN_N_VID; i++) \ 109 : : if (((dev) = __vlan_group_get_device((grp), (i) / VLAN_N_VID, \ 110 : : (i) % VLAN_N_VID))) 111 : : 112 : : int vlan_filter_push_vids(struct vlan_info *vlan_info, __be16 proto); 113 : : void vlan_filter_drop_vids(struct vlan_info *vlan_info, __be16 proto); 114 : : 115 : : /* found in vlan_dev.c */ 116 : : void vlan_dev_set_ingress_priority(const struct net_device *dev, 117 : : u32 skb_prio, u16 vlan_prio); 118 : : int vlan_dev_set_egress_priority(const struct net_device *dev, 119 : : u32 skb_prio, u16 vlan_prio); 120 : : int vlan_dev_change_flags(const struct net_device *dev, u32 flag, u32 mask); 121 : : void vlan_dev_get_realdev_name(const struct net_device *dev, char *result); 122 : : 123 : : int vlan_check_real_dev(struct net_device *real_dev, 124 : : __be16 protocol, u16 vlan_id, 125 : : struct netlink_ext_ack *extack); 126 : : void vlan_setup(struct net_device *dev); 127 : : int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack); 128 : : void unregister_vlan_dev(struct net_device *dev, struct list_head *head); 129 : : void vlan_dev_uninit(struct net_device *dev); 130 : : bool vlan_dev_inherit_address(struct net_device *dev, 131 : : struct net_device *real_dev); 132 : : 133 : : static inline u32 vlan_get_ingress_priority(struct net_device *dev, 134 : : u16 vlan_tci) 135 : : { 136 : : struct vlan_dev_priv *vip = vlan_dev_priv(dev); 137 : : 138 : 0 : return vip->ingress_priority_map[(vlan_tci >> VLAN_PRIO_SHIFT) & 0x7]; 139 : : } 140 : : 141 : : #ifdef CONFIG_VLAN_8021Q_GVRP 142 : : int vlan_gvrp_request_join(const struct net_device *dev); 143 : : void vlan_gvrp_request_leave(const struct net_device *dev); 144 : : int vlan_gvrp_init_applicant(struct net_device *dev); 145 : : void vlan_gvrp_uninit_applicant(struct net_device *dev); 146 : : int vlan_gvrp_init(void); 147 : : void vlan_gvrp_uninit(void); 148 : : #else 149 : : static inline int vlan_gvrp_request_join(const struct net_device *dev) { return 0; } 150 : : static inline void vlan_gvrp_request_leave(const struct net_device *dev) {} 151 : : static inline int vlan_gvrp_init_applicant(struct net_device *dev) { return 0; } 152 : : static inline void vlan_gvrp_uninit_applicant(struct net_device *dev) {} 153 : : static inline int vlan_gvrp_init(void) { return 0; } 154 : : static inline void vlan_gvrp_uninit(void) {} 155 : : #endif 156 : : 157 : : #ifdef CONFIG_VLAN_8021Q_MVRP 158 : : int vlan_mvrp_request_join(const struct net_device *dev); 159 : : void vlan_mvrp_request_leave(const struct net_device *dev); 160 : : int vlan_mvrp_init_applicant(struct net_device *dev); 161 : : void vlan_mvrp_uninit_applicant(struct net_device *dev); 162 : : int vlan_mvrp_init(void); 163 : : void vlan_mvrp_uninit(void); 164 : : #else 165 : : static inline int vlan_mvrp_request_join(const struct net_device *dev) { return 0; } 166 : : static inline void vlan_mvrp_request_leave(const struct net_device *dev) {} 167 : : static inline int vlan_mvrp_init_applicant(struct net_device *dev) { return 0; } 168 : : static inline void vlan_mvrp_uninit_applicant(struct net_device *dev) {} 169 : : static inline int vlan_mvrp_init(void) { return 0; } 170 : : static inline void vlan_mvrp_uninit(void) {} 171 : : #endif 172 : : 173 : : extern const char vlan_fullname[]; 174 : : extern const char vlan_version[]; 175 : : int vlan_netlink_init(void); 176 : : void vlan_netlink_fini(void); 177 : : 178 : : extern struct rtnl_link_ops vlan_link_ops; 179 : : 180 : : extern unsigned int vlan_net_id; 181 : : 182 : : struct proc_dir_entry; 183 : : 184 : : struct vlan_net { 185 : : /* /proc/net/vlan */ 186 : : struct proc_dir_entry *proc_vlan_dir; 187 : : /* /proc/net/vlan/config */ 188 : : struct proc_dir_entry *proc_vlan_conf; 189 : : /* Determines interface naming scheme. */ 190 : : unsigned short name_type; 191 : : }; 192 : : 193 : : #endif /* !(__BEN_VLAN_802_1Q_INC__) */