@@ -346,6 +346,36 @@ process_mapping(NetplanParser* npp, yaml_node_t* node, const char* key_prefix, c
346
346
* Generic helper functions to extract data from scalar nodes.
347
347
*************************************************************/
348
348
349
+ /**
350
+ * Handler for setting a guint field from a scalar node, inside a given struct
351
+ * Supports hex (0x prefix) and decimal values
352
+ * @entryptr: pointer to the begining of the to-be-modified data structure
353
+ * @data: offset into entryptr struct where the guint field to write is located
354
+ */
355
+ STATIC gboolean
356
+ handle_generic_guint_hex_dec (NetplanParser * npp , yaml_node_t * node , const void * entryptr , const void * data , GError * * error )
357
+ {
358
+ g_assert (entryptr != NULL );
359
+ guint offset = GPOINTER_TO_UINT (data );
360
+ guint64 v ;
361
+ gchar * endptr ;
362
+
363
+ const char * s_node = scalar (node );
364
+
365
+ if (g_str_has_prefix (s_node , "0x" ) || g_str_has_prefix (s_node , "0X" )) {
366
+ v = g_ascii_strtoull (s_node , & endptr , 16 );
367
+ } else {
368
+ v = g_ascii_strtoull (s_node , & endptr , 10 );
369
+ }
370
+
371
+ if (* endptr != '\0' || v > G_MAXUINT )
372
+ return yaml_error (npp , node , error , "invalid unsigned int value '%s'" , s_node );
373
+
374
+ mark_data_as_dirty (npp , entryptr + offset );
375
+ * ((guint * ) ((void * ) entryptr + offset )) = (guint ) v ;
376
+ return TRUE;
377
+ }
378
+
349
379
/**
350
380
* Handler for setting a guint field from a scalar node, inside a given struct
351
381
* @entryptr: pointer to the begining of the to-be-modified data structure
@@ -733,6 +763,12 @@ handle_netdef_guint(NetplanParser* npp, yaml_node_t* node, const void* data, GEr
733
763
return handle_generic_guint (npp , node , npp -> current .netdef , data , error );
734
764
}
735
765
766
+ STATIC gboolean
767
+ handle_netdef_guint_hex_dec (NetplanParser * npp , yaml_node_t * node , const void * data , GError * * error )
768
+ {
769
+ return handle_generic_guint_hex_dec (npp , node , npp -> current .netdef , data , error );
770
+ }
771
+
736
772
STATIC gboolean
737
773
handle_netdef_ip4 (NetplanParser * npp , yaml_node_t * node , const void * data , GError * * error )
738
774
{
@@ -3141,6 +3177,15 @@ static const mapping_entry_handler tunnel_def_handlers[] = {
3141
3177
{NULL }
3142
3178
};
3143
3179
3180
+ static const mapping_entry_handler xfrm_def_handlers [] = {
3181
+ COMMON_LINK_HANDLERS ,
3182
+ COMMON_BACKEND_HANDLERS ,
3183
+ {"if_id" , YAML_SCALAR_NODE , {.generic = handle_netdef_guint_hex_dec }, netdef_offset (xfrm .interface_id )}, /* hex/dec like iproute2 */
3184
+ {"independent" , YAML_SCALAR_NODE , {.generic = handle_netdef_bool }, netdef_offset (xfrm .independent )},
3185
+ {"link" , YAML_SCALAR_NODE , {.generic = handle_netdef_id_ref }, netdef_offset (xfrm .link )},
3186
+ {NULL }
3187
+ };
3188
+
3144
3189
/****************************************************
3145
3190
* Grammar and handlers for network node
3146
3191
****************************************************/
@@ -3375,6 +3420,7 @@ handle_network_type(NetplanParser* npp, yaml_node_t* node, const char* key_prefi
3375
3420
case NETPLAN_DEF_TYPE_ETHERNET : handlers = ethernet_def_handlers ; break ;
3376
3421
case NETPLAN_DEF_TYPE_MODEM : handlers = modem_def_handlers ; break ;
3377
3422
case NETPLAN_DEF_TYPE_TUNNEL : handlers = tunnel_def_handlers ; break ;
3423
+ case NETPLAN_DEF_TYPE_XFRM : handlers = xfrm_def_handlers ; break ;
3378
3424
case NETPLAN_DEF_TYPE_VLAN : handlers = vlan_def_handlers ; break ;
3379
3425
case NETPLAN_DEF_TYPE_VRF : handlers = vrf_def_handlers ; break ;
3380
3426
case NETPLAN_DEF_TYPE_WIFI : handlers = wifi_def_handlers ; break ;
@@ -3427,6 +3473,10 @@ handle_network_type(NetplanParser* npp, yaml_node_t* node, const char* key_prefi
3427
3473
npp -> current .netdef -> vxlan -> independent = TRUE;
3428
3474
}
3429
3475
3476
+ if (!npp -> xfrm_if_ids ) {
3477
+ npp -> xfrm_if_ids = g_hash_table_new (g_direct_hash , g_direct_equal );
3478
+ }
3479
+
3430
3480
/* validate definition-level conditions */
3431
3481
int ret = validate_netdef_grammar (npp , npp -> current .netdef , error );
3432
3482
if (!ret && (npp -> flags & NETPLAN_PARSER_IGNORE_ERRORS ) == 0 )
@@ -3485,6 +3535,7 @@ static const mapping_entry_handler network_handlers[] = {
3485
3535
{"vlans" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_VLAN )},
3486
3536
{"vrfs" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_VRF )},
3487
3537
{"wifis" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_WIFI )},
3538
+ {"xfrm-interfaces" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_XFRM )},
3488
3539
{"modems" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_MODEM )},
3489
3540
{"dummy-devices" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_DUMMY )}, /* wokeignore:rule=dummy */
3490
3541
{"virtual-ethernets" , YAML_MAPPING_NODE , {.map = {.custom = handle_network_type }}, GUINT_TO_POINTER (NETPLAN_DEF_TYPE_VETH )},
@@ -3811,6 +3862,11 @@ netplan_parser_reset(NetplanParser* npp)
3811
3862
}
3812
3863
// LCOV_EXCL_STOP
3813
3864
3865
+ if (npp -> xfrm_if_ids ) {
3866
+ g_hash_table_destroy (npp -> xfrm_if_ids );
3867
+ npp -> xfrm_if_ids = NULL ;
3868
+ }
3869
+
3814
3870
if (npp -> missing_id ) {
3815
3871
g_hash_table_destroy (npp -> missing_id );
3816
3872
npp -> missing_id = NULL ;
@@ -3839,7 +3895,17 @@ netplan_parser_reset(NetplanParser* npp)
3839
3895
npp -> global_renderer = NULL ;
3840
3896
}
3841
3897
3898
+ if (npp -> xfrm_if_ids ) {
3899
+ g_hash_table_destroy (npp -> xfrm_if_ids );
3900
+ npp -> xfrm_if_ids = NULL ;
3901
+ }
3902
+
3842
3903
npp -> flags = 0 ;
3904
+
3905
+ if (npp -> xfrm_if_ids ) {
3906
+ g_hash_table_destroy (npp -> xfrm_if_ids );
3907
+ npp -> xfrm_if_ids = NULL ;
3908
+ }
3843
3909
npp -> error_count = 0 ;
3844
3910
}
3845
3911
0 commit comments