]> Pileus Git - ~andy/linux/blobdiff - net/bridge/br_private.h
bridge: Add vlan to unicast fdb entries
[~andy/linux] / net / bridge / br_private.h
index ce2235255c2f6a1c49a9d0b546f3bccab8b59fbe..f4ae87b5aa6ed032285c3ae6ea6024d7c2efc070 100644 (file)
@@ -67,6 +67,7 @@ struct br_ip
 
 struct net_port_vlans {
        u16                             port_idx;
+       u16                             pvid;
        union {
                struct net_bridge_port          *port;
                struct net_bridge               *br;
@@ -87,6 +88,7 @@ struct net_bridge_fdb_entry
        mac_addr                        addr;
        unsigned char                   is_local;
        unsigned char                   is_static;
+       __u16                           vlan_id;
 };
 
 struct net_bridge_port_group {
@@ -372,7 +374,8 @@ extern void br_fdb_cleanup(unsigned long arg);
 extern void br_fdb_delete_by_port(struct net_bridge *br,
                                  const struct net_bridge_port *p, int do_all);
 extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
-                                                const unsigned char *addr);
+                                                const unsigned char *addr,
+                                                __u16 vid);
 extern int br_fdb_test_addr(struct net_device *dev, unsigned char *addr);
 extern int br_fdb_fillbuf(struct net_bridge *br, void *buf,
                          unsigned long count, unsigned long off);
@@ -381,7 +384,8 @@ extern int br_fdb_insert(struct net_bridge *br,
                         const unsigned char *addr);
 extern void br_fdb_update(struct net_bridge *br,
                          struct net_bridge_port *source,
-                         const unsigned char *addr);
+                         const unsigned char *addr,
+                         u16 vid);
 
 extern int br_fdb_delete(struct ndmsg *ndm,
                         struct net_device *dev,
@@ -554,15 +558,18 @@ static inline void br_mdb_uninit(void)
 /* br_vlan.c */
 #ifdef CONFIG_BRIDGE_VLAN_FILTERING
 extern bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
-                              struct sk_buff *skb);
+                              struct sk_buff *skb, u16 *vid);
 extern bool br_allowed_egress(struct net_bridge *br,
                              const struct net_port_vlans *v,
                              const struct sk_buff *skb);
-extern int br_vlan_add(struct net_bridge *br, u16 vid);
+extern struct sk_buff *br_handle_vlan(struct net_bridge *br,
+                                     const struct net_port_vlans *v,
+                                     struct sk_buff *skb);
+extern int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags);
 extern int br_vlan_delete(struct net_bridge *br, u16 vid);
 extern void br_vlan_flush(struct net_bridge *br);
 extern int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
-extern int nbp_vlan_add(struct net_bridge_port *port, u16 vid);
+extern int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags);
 extern int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);
 extern void nbp_vlan_flush(struct net_bridge_port *port);
 
@@ -594,10 +601,23 @@ static inline int br_vlan_get_tag(const struct sk_buff *skb, u16 *vid)
 
        return err;
 }
+
+static inline u16 br_get_pvid(const struct net_port_vlans *v)
+{
+       /* Return just the VID if it is set, or VLAN_N_VID (invalid vid) if
+        * vid wasn't set
+        */
+       smp_rmb();
+       return (v->pvid & VLAN_TAG_PRESENT) ?
+                       (v->pvid & ~VLAN_TAG_PRESENT) :
+                       VLAN_N_VID;
+}
+
 #else
 static inline bool br_allowed_ingress(struct net_bridge *br,
                                      struct net_port_vlans *v,
-                                     struct sk_buff *skb)
+                                     struct sk_buff *skb,
+                                     u16 *vid)
 {
        return true;
 }
@@ -609,7 +629,14 @@ static inline bool br_allowed_egress(struct net_bridge *br,
        return true;
 }
 
-static inline int br_vlan_add(struct net_bridge *br, u16 vid)
+static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
+                                            const struct net_port_vlans *v,
+                                            struct sk_buff *skb)
+{
+       return skb;
+}
+
+static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)
 {
        return -EOPNOTSUPP;
 }
@@ -623,7 +650,7 @@ static inline void br_vlan_flush(struct net_bridge *br)
 {
 }
 
-static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid)
+static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)
 {
        return -EOPNOTSUPP;
 }
@@ -648,10 +675,14 @@ static inline struct net_port_vlans *nbp_get_vlan_info(
        return NULL;
 }
 
-static inline u16 br_vlan_get_tag(const struct sk_buff *skb)
+static inline u16 br_vlan_get_tag(const struct sk_buff *skb, u16 *tag)
 {
        return 0;
 }
+static inline u16 br_get_pvid(const struct net_port_vlans *v)
+{
+       return VLAN_N_VID;      /* Returns invalid vid */
+}
 #endif
 
 /* br_netfilter.c */