@@ -2178,6 +2178,7 @@ handle_generic_vlans(NetplanParser* npp, yaml_node_t* node, GArray** entryptr, G
21782178 re_inited = TRUE;
21792179 }
21802180
2181+ unsigned pvids = 0 ;
21812182 for (yaml_node_item_t * i = node -> data .sequence .items .start ; i < node -> data .sequence .items .top ; i ++ ) {
21822183 g_autofree char * vlan = NULL ;
21832184 yaml_node_t * entry = yaml_document_get_node (& npp -> doc , * i );
@@ -2187,6 +2188,7 @@ handle_generic_vlans(NetplanParser* npp, yaml_node_t* node, GArray** entryptr, G
21872188
21882189 size_t maxGroups = 7 + 1 ;
21892190 regmatch_t groups [maxGroups ];
2191+
21902192 /* does it match the vlans= definition? */
21912193 if (regexec (& re , vlan , maxGroups , groups , 0 ) == 0 ) {
21922194 NetplanBridgeVlan * data = g_new0 (NetplanBridgeVlan , 1 );
@@ -2201,27 +2203,44 @@ handle_generic_vlans(NetplanParser* npp, yaml_node_t* node, GArray** entryptr, G
22012203 switch (g ) {
22022204 case 1 :
22032205 v = (guint ) g_ascii_strtoull (cursorCopy + groups [g ].rm_so , NULL , 10 );
2204- if (v < 1 || v > 4094 )
2206+ if (v < 1 || v > 4094 ) {
2207+ g_free (data );
22052208 return yaml_error (npp , node , error , "malformed vlan vid '%u', must be in range [1..4094]" , v );
2209+ }
22062210 data -> vid = v ;
22072211 break ;
22082212 case 3 :
22092213 v = (guint ) g_ascii_strtoull (cursorCopy + groups [g ].rm_so , NULL , 10 );
2210- if (v < 1 || v > 4094 )
2214+ if (v < 1 || v > 4094 ) {
2215+ g_free (data );
22112216 return yaml_error (npp , node , error , "malformed vlan vid '%u', must be in range [1..4094]" , v );
2212- else if (v <= data -> vid )
2213- return yaml_error (npp , node , error , "malformed vlan vid range '%s': %u > %u!" , scalar (entry ), data -> vid , v );
2217+ }
2218+
2219+ else if (v <= data -> vid ) {
2220+ guint vid = data -> vid ;
2221+ g_free (data );
2222+ return yaml_error (npp , node , error , "malformed vlan vid range '%s': %u > %u!" , scalar (entry ), vid , v );
2223+ }
2224+
22142225 data -> vid_to = v ;
22152226 break ;
22162227 case 5 :
22172228 data -> pvid = TRUE;
2229+ if (++ pvids > 1 ) {
2230+ g_free (data );
2231+ return yaml_error (npp , node , error , "malformed vlan pvid '%s': only single pvid can be defined" , scalar (entry ));
2232+ }
22182233 break ;
22192234 case 7 :
22202235 data -> untagged = TRUE;
22212236 break ;
22222237 default : g_assert_not_reached (); // LCOV_EXCL_LINE
22232238 }
22242239 }
2240+ if (data -> vid_to > 0 && data -> pvid ) {
2241+ g_free (data );
2242+ return yaml_error (npp , node , error , "malformed vlan '%s': pvid cannot be defined as a range" , scalar (entry ));
2243+ }
22252244 if (!* entryptr )
22262245 * entryptr = g_array_new (FALSE, FALSE, sizeof (NetplanBridgeVlan * ));
22272246 g_array_append_val (* entryptr , data );
@@ -2269,6 +2288,24 @@ handle_bridge_port_vlans(NetplanParser* npp, yaml_node_t* node, const char*, con
22692288 return TRUE;
22702289}
22712290
2291+ /**
2292+ * Handler for vlan-default-pvid.
2293+ * @data: offset into NetplanNetDefinition where the const char* field to write is
2294+ * located
2295+ */
2296+ STATIC gboolean
2297+ handle_vlan_default_pvid (NetplanParser * npp , yaml_node_t * node , const void * data , GError * * error )
2298+ {
2299+ const char * pvid = scalar (node );
2300+ GError * * err = NULL ;
2301+ guint64 val = 0 ;
2302+ if (strcmp (pvid , "none" ) != 0 && !g_ascii_string_to_unsigned (pvid , 10 , 1 , 4094 , & val , err )) {
2303+ return yaml_error (npp , node , error , "malformed value of vlan-default-pvid '%s': vlan-default-pvid can only be defined as a single port ID" , pvid );
2304+ }
2305+
2306+ return handle_netdef_str (npp , node , data , error );
2307+ }
2308+
22722309static const mapping_entry_handler bridge_params_handlers [] = {
22732310 {"ageing-time" , YAML_SCALAR_NODE , {.generic = handle_netdef_str }, netdef_offset (bridge_params .ageing_time )},
22742311 {"aging-time" , YAML_SCALAR_NODE , {.generic = handle_netdef_str }, netdef_offset (bridge_params .ageing_time )},
@@ -2282,6 +2319,7 @@ static const mapping_entry_handler bridge_params_handlers[] = {
22822319 {"port-vlans" , YAML_MAPPING_NODE , {.map = {.custom = handle_bridge_port_vlans }}, netdef_offset (bridge_params .port_vlans )},
22832320 {"vlans" , YAML_SEQUENCE_NODE , {.generic = handle_bridge_vlans }, netdef_offset (bridge_params .vlans )},
22842321 {"vlan-filtering" , YAML_SCALAR_NODE , {.generic = handle_netdef_bool }, netdef_offset (bridge_params .vlan_filtering )},
2322+ {"vlan-default-pvid" , YAML_SCALAR_NODE , {.generic = handle_vlan_default_pvid }, netdef_offset (bridge_params .vlan_default_pvid )},
22852323 {NULL }
22862324};
22872325
0 commit comments