LCOV - code coverage report
Current view: top level - net/8021q - vlan.h (source / functions) Hit Total Coverage
Test: gcov_data_raspi2_qemu_modules_combined.info Lines: 0 22 0.0 %
Date: 2020-09-30 20:25:01 Functions: 0 3 0.0 %
Branches: 0 29 0.0 %

           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__) */

Generated by: LCOV version 1.14