bridge: Add a default_pvid sysfs attribute
[firefly-linux-kernel-4.4.55.git] / net / bridge / br_vlan.c
index 3ba57fcdcd13fec638aa17e539e4baf0d3e010eb..dfa7c9a7e1935114fcd90e446c5710b16f5c4b83 100644 (file)
@@ -499,9 +499,38 @@ err_filt:
        goto unlock;
 }
 
+int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val)
+{
+       u16 pvid = val;
+       int err = 0;
+
+       if (!val || val >= VLAN_VID_MASK)
+               return -EINVAL;
+
+       if (!rtnl_trylock())
+               return restart_syscall();
+
+       if (pvid == br->default_pvid)
+               goto unlock;
+
+       /* Only allow default pvid change when filtering is disabled */
+       if (br->vlan_enabled) {
+               pr_info_once("Please disable vlan filtering to change default_pvid\n");
+               err = -EPERM;
+               goto unlock;
+       }
+
+       br->default_pvid = pvid;
+
+unlock:
+       rtnl_unlock();
+       return err;
+}
+
 void br_vlan_init(struct net_bridge *br)
 {
        br->vlan_proto = htons(ETH_P_8021Q);
+       br->default_pvid = 1;
 }
 
 /* Must be protected by RTNL.