]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: apply bridge vlan configuration correct 3892/head
authorTobias Jungel <tobias.jungel@bisdn.de>
Thu, 4 Aug 2016 15:11:13 +0000 (17:11 +0200)
committerTobias Jungel <tobias.jungel@bisdn.de>
Thu, 4 Aug 2016 15:14:18 +0000 (17:14 +0200)
bridge vlan configuration was applied even if it wasn't configured.

fixes #3876

src/network/networkd-brvlan.c
src/network/networkd-brvlan.h
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.h

index 8bc330ebae529bd9687e5c87877154de0d19a893..18ecd86858f00573d0ff20c7ca96c6867c60dc79 100644 (file)
@@ -257,6 +257,24 @@ static int parse_vid_range(const char *rvalue, uint16_t *vid, uint16_t *vid_end)
         return r;
 }
 
+int config_parse_brvlan_pvid(const char *unit, const char *filename,
+                             unsigned line, const char *section,
+                             unsigned section_line, const char *lvalue,
+                             int ltype, const char *rvalue, void *data,
+                             void *userdata) {
+        Network *network = userdata;
+        int r;
+        uint16_t pvid;
+        r = parse_vlanid(rvalue, &pvid);
+        if (r < 0)
+                return r;
+
+        network->pvid = pvid;
+        network->use_br_vlan = true;
+
+        return 0;
+}
+
 int config_parse_brvlan_vlan(const char *unit, const char *filename,
                              unsigned line, const char *section,
                              unsigned section_line, const char *lvalue,
@@ -288,6 +306,7 @@ int config_parse_brvlan_vlan(const char *unit, const char *filename,
                 for (; vid <= vid_end; vid++)
                         set_bit(vid, network->br_vid_bitmap);
         }
+        network->use_br_vlan = true;
         return 0;
 }
 
@@ -325,5 +344,6 @@ int config_parse_brvlan_untagged(const char *unit, const char *filename,
                         set_bit(vid, network->br_untagged_bitmap);
                 }
         }
+        network->use_br_vlan = true;
         return 0;
 }
index 6aa6883bfcc21e51185ebad3223992c197be3ef6..b37633f94f506d427898183124f0e2e033aebe88 100644 (file)
@@ -25,5 +25,6 @@ typedef struct Link Link;
 
 int br_vlan_configure(Link *link, uint16_t pvid, uint32_t *br_vid_bitmap, uint32_t *br_untagged_bitmap);
 
+int config_parse_brvlan_pvid(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_brvlan_vlan(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_brvlan_untagged(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index 3e10ab1e040e444c63c06c033862c084e477fcf2..e1d07eb4b0ba9fb49fa0e5fb28239204d336c16a 100644 (file)
@@ -2060,7 +2060,8 @@ static int link_joined(Link *link) {
                         log_link_error_errno(link, r, "Could not set bridge message: %m");
         }
 
-        if (link->network->bridge || streq_ptr("bridge", link->kind)) {
+        if (link->network->use_br_vlan &&
+            (link->network->bridge || streq_ptr("bridge", link->kind))) {
                 r = link_set_bridge_vlan(link);
                 if (r < 0)
                         log_link_error_errno(link, r, "Could not set bridge vlan: %m");
index 19adac66b84291fd6ae45accb3218264605178f9..b96f0b7210f1eca0e2a8c213d0b742eb1bb1e4b6 100644 (file)
@@ -115,7 +115,7 @@ Bridge.AllowPortToBeRoot,               config_parse_bool,
 Bridge.UnicastFlood,                    config_parse_bool,                              0,                             offsetof(Network, unicast_flood)
 BridgeFDB.MACAddress,                   config_parse_fdb_hwaddr,                        0,                             0
 BridgeFDB.VLANId,                       config_parse_fdb_vlan_id,                       0,                             0
-BridgeVLAN.PVID,                        config_parse_vlanid,                            0,                             offsetof(Network, pvid)
+BridgeVLAN.PVID,                        config_parse_brvlan_pvid,                       0,                             0
 BridgeVLAN.VLAN,                        config_parse_brvlan_vlan,                       0,                             0
 BridgeVLAN.EgressUntagged,              config_parse_brvlan_untagged,                   0,                             0
 /* backwards compatibility: do not add new entries to this section */
index 7c0bdc1e4a990c03db727dc73277ef555d7e93da..5460eb4d1c2a03aa26a3c4ff794b7664b7efa99a 100644 (file)
@@ -151,6 +151,7 @@ struct Network {
         bool unicast_flood;
         unsigned cost;
 
+        bool use_br_vlan;
         uint16_t pvid;
         uint32_t br_vid_bitmap[BRIDGE_VLAN_BITMAP_LEN];
         uint32_t br_untagged_bitmap[BRIDGE_VLAN_BITMAP_LEN];