root/net/8021q/vlan.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. vlan_proto_idx
  2. __vlan_group_get_device
  3. vlan_group_get_device
  4. vlan_group_set_device
  5. vlan_find_dev
  6. vlan_tnl_features
  7. vlan_get_ingress_priority
  8. vlan_gvrp_request_join
  9. vlan_gvrp_request_leave
  10. vlan_gvrp_init_applicant
  11. vlan_gvrp_uninit_applicant
  12. vlan_gvrp_init
  13. vlan_gvrp_uninit
  14. vlan_mvrp_request_join
  15. vlan_mvrp_request_leave
  16. vlan_mvrp_init_applicant
  17. vlan_mvrp_uninit_applicant
  18. vlan_mvrp_init
  19. vlan_mvrp_uninit

   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 static inline unsigned int vlan_proto_idx(__be16 proto)
  40 {
  41         switch (proto) {
  42         case htons(ETH_P_8021Q):
  43                 return VLAN_PROTO_8021Q;
  44         case htons(ETH_P_8021AD):
  45                 return VLAN_PROTO_8021AD;
  46         default:
  47                 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         array = vg->vlan_devices_arrays[pidx]
  59                                        [vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
  60         return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL;
  61 }
  62 
  63 static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
  64                                                        __be16 vlan_proto,
  65                                                        u16 vlan_id)
  66 {
  67         return __vlan_group_get_device(vg, vlan_proto_idx(vlan_proto), vlan_id);
  68 }
  69 
  70 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         if (!vg)
  76                 return;
  77         array = vg->vlan_devices_arrays[vlan_proto_idx(vlan_proto)]
  78                                        [vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
  79         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         struct vlan_info *vlan_info = rcu_dereference_rtnl(real_dev->vlan_info);
  87 
  88         if (vlan_info)
  89                 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         ret = real_dev->hw_enc_features &
 100               (NETIF_F_CSUM_MASK | NETIF_F_ALL_TSO | NETIF_F_GSO_ENCAP_ALL);
 101 
 102         if ((ret & NETIF_F_GSO_ENCAP_ALL) && (ret & NETIF_F_CSUM_MASK))
 103                 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         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__) */

/* [<][>][^][v][top][bottom][index][help] */