cli: move information about valid connection settings to common

This commit is contained in:
Thomas Haller 2017-04-11 11:31:27 +02:00
parent 3ed0fc1b45
commit d32817999c
6 changed files with 524 additions and 480 deletions

File diff suppressed because it is too large Load diff

View file

@ -24,26 +24,31 @@
/*****************************************************************************/
const NMMetaSettingInfoEditor *
nm_meta_setting_info_editor_find_by_name (const char *setting_name)
nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use_alias)
{
const NMMetaSettingInfo *meta_setting_info;
const NMMetaSettingInfoEditor *setting_info;
guint i;
g_return_val_if_fail (setting_name, NULL);
meta_setting_info = nm_meta_setting_infos_by_name (setting_name);
if (!meta_setting_info)
return NULL;
g_return_val_if_fail (nm_streq0 (meta_setting_info->setting_name, setting_name), NULL);
if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor))
return NULL;
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
g_return_val_if_fail (setting_info->general == meta_setting_info, NULL);
setting_info = NULL;
if (meta_setting_info) {
nm_assert (nm_streq0 (meta_setting_info->setting_name, setting_name));
if (meta_setting_info->meta_type < G_N_ELEMENTS (nm_meta_setting_infos_editor)) {
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
nm_assert (setting_info->general == meta_setting_info);
}
}
if (!setting_info && use_alias) {
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_streq0 (nm_meta_setting_infos_editor[i].alias, setting_name)) {
setting_info = &nm_meta_setting_infos_editor[i];
break;
}
}
}
return setting_info;
}
@ -81,7 +86,7 @@ nm_meta_setting_info_editor_find_by_setting (NMSetting *setting)
setting_info = nm_meta_setting_info_editor_find_by_gtype (G_OBJECT_TYPE (setting));
nm_assert (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting)));
nm_assert (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting), FALSE));
nm_assert (!setting_info || G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ()));
return setting_info;
@ -111,7 +116,7 @@ nm_meta_property_info_find_by_name (const char *setting_name, const char *proper
const NMMetaSettingInfoEditor *setting_info;
const NMMetaPropertyInfo *property_info;
setting_info = nm_meta_setting_info_editor_find_by_name (setting_name);
setting_info = nm_meta_setting_info_editor_find_by_name (setting_name, FALSE);
if (!setting_info)
return NULL;

View file

@ -25,7 +25,7 @@
/*****************************************************************************/
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_name (const char *setting_name);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use_alias);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_gtype (GType gtype);
const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_setting (NMSetting *setting);

View file

@ -7112,12 +7112,22 @@ static const NMMetaPropertyInfo property_infos_WIRELESS_SECURITY[] = {
#define SETTING_PRETTY_NAME_WIRELESS "Wi-Fi connection"
#define SETTING_PRETTY_NAME_WIRELESS_SECURITY "Wi-Fi security settings"
#define NM_META_SETTING_VALID_PARTS(...) \
((const NMMetaSettingValidPartItem *const[]) { __VA_ARGS__ NULL })
#define NM_META_SETTING_VALID_PART_ITEM(type, mand) \
(&((const NMMetaSettingValidPartItem) { \
.setting_info = &nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_##type], \
.mandatory = mand, \
}))
const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
#define SETTING_INFO_EMPTY(type) \
#define SETTING_INFO_EMPTY(type, ...) \
[NM_META_SETTING_TYPE_##type] = { \
.meta_type = &nm_meta_type_setting_info_editor, \
.general = &nm_meta_setting_infos[NM_META_SETTING_TYPE_##type], \
.pretty_name = N_(SETTING_PRETTY_NAME_##type), \
__VA_ARGS__ \
}
#define SETTING_INFO(type, ...) \
[NM_META_SETTING_TYPE_##type] = { \
@ -7129,43 +7139,174 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
__VA_ARGS__ \
}
SETTING_INFO (802_1X),
SETTING_INFO (ADSL),
SETTING_INFO (BLUETOOTH),
SETTING_INFO (BOND),
SETTING_INFO (BRIDGE),
SETTING_INFO (ADSL,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (ADSL, TRUE),
),
),
SETTING_INFO (BLUETOOTH,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (BLUETOOTH, TRUE),
),
),
SETTING_INFO (BOND,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (BOND, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO (BRIDGE,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (BRIDGE, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO (BRIDGE_PORT),
SETTING_INFO (CDMA),
SETTING_INFO (CDMA,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (CDMA, TRUE),
NM_META_SETTING_VALID_PART_ITEM (SERIAL, FALSE),
NM_META_SETTING_VALID_PART_ITEM (PPP, FALSE),
),
),
SETTING_INFO (CONNECTION),
SETTING_INFO (DCB),
SETTING_INFO_EMPTY (DUMMY),
SETTING_INFO_EMPTY (GENERIC),
SETTING_INFO (GSM),
SETTING_INFO (INFINIBAND),
SETTING_INFO_EMPTY (DUMMY,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (DUMMY, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO_EMPTY (GENERIC,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (GENERIC, TRUE),
),
),
SETTING_INFO (GSM,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (GSM, TRUE),
NM_META_SETTING_VALID_PART_ITEM (SERIAL, FALSE),
NM_META_SETTING_VALID_PART_ITEM (PPP, FALSE),
),
),
SETTING_INFO (INFINIBAND,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (INFINIBAND, TRUE),
),
),
SETTING_INFO (IP4_CONFIG),
SETTING_INFO (IP6_CONFIG),
SETTING_INFO (IP_TUNNEL),
SETTING_INFO (MACSEC),
SETTING_INFO (MACVLAN),
SETTING_INFO (IP_TUNNEL,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (IP_TUNNEL, TRUE),
),
),
SETTING_INFO (MACSEC,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (MACSEC, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
),
),
SETTING_INFO (MACVLAN,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (MACVLAN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO (OLPC_MESH,
.alias = "olpc-mesh",
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (OLPC_MESH, TRUE),
),
),
SETTING_INFO (PPPOE,
/* PPPoE is a base connection type from historical reasons.
* See libnm-core/nm-setting.c:_nm_setting_is_base_type()
*/
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (PPPOE, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, TRUE),
NM_META_SETTING_VALID_PART_ITEM (PPP, FALSE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
),
),
SETTING_INFO (PPPOE),
SETTING_INFO (PPP),
SETTING_INFO (PROXY),
SETTING_INFO (SERIAL),
SETTING_INFO (TEAM),
SETTING_INFO (TEAM,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (TEAM, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO (TEAM_PORT),
SETTING_INFO (TUN),
SETTING_INFO (TUN,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (TUN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO_EMPTY (USER),
SETTING_INFO (VLAN),
SETTING_INFO (VPN),
SETTING_INFO (VXLAN),
SETTING_INFO (WIMAX),
SETTING_INFO (VLAN,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (VLAN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO (VPN,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (VPN, TRUE),
),
),
SETTING_INFO (VXLAN,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (VXLAN, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
),
),
SETTING_INFO (WIMAX,
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIMAX, TRUE),
),
),
SETTING_INFO (WIRED,
.alias = "ethernet",
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRED, TRUE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
NM_META_SETTING_VALID_PART_ITEM (DCB, FALSE),
),
),
SETTING_INFO (WIRELESS,
.alias = "wifi",
.valid_parts = NM_META_SETTING_VALID_PARTS (
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRELESS, TRUE),
NM_META_SETTING_VALID_PART_ITEM (WIRELESS_SECURITY, FALSE),
NM_META_SETTING_VALID_PART_ITEM (802_1X, FALSE),
),
),
SETTING_INFO (WIRELESS_SECURITY,
.alias = "wifi-sec",
@ -7174,6 +7315,54 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
/*****************************************************************************/
const NMMetaSettingValidPartItem *const nm_meta_setting_info_valid_parts_default[] = {
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
NULL
};
/*****************************************************************************/
static const NMMetaSettingValidPartItem *const valid_settings_noslave[] = {
NM_META_SETTING_VALID_PART_ITEM (IP4_CONFIG, FALSE),
NM_META_SETTING_VALID_PART_ITEM (IP6_CONFIG, FALSE),
NM_META_SETTING_VALID_PART_ITEM (PROXY, FALSE),
NULL,
};
static const NMMetaSettingValidPartItem *const valid_settings_slave_bridge[] = {
NM_META_SETTING_VALID_PART_ITEM (BRIDGE_PORT, TRUE),
NULL,
};
static const NMMetaSettingValidPartItem *const valid_settings_slave_team[] = {
NM_META_SETTING_VALID_PART_ITEM (TEAM_PORT, TRUE),
NULL,
};
const NMMetaSettingValidPartItem *const*
nm_meta_setting_info_valid_parts_for_slave_type (const char *slave_type, const char **out_slave_name)
{
if (!slave_type) {
NM_SET_OUT (out_slave_name, NULL);
return valid_settings_noslave;
}
if (nm_streq (slave_type, NM_SETTING_BOND_SETTING_NAME)) {
NM_SET_OUT (out_slave_name, "bond-slave");
return NM_PTRARRAY_EMPTY (const NMMetaSettingValidPartItem *);
}
if (nm_streq (slave_type, NM_SETTING_BRIDGE_SETTING_NAME)) {
NM_SET_OUT (out_slave_name, "bridge-slave");
return valid_settings_slave_bridge;
}
if (nm_streq (slave_type, NM_SETTING_TEAM_SETTING_NAME)) {
NM_SET_OUT (out_slave_name, "team-slave");
return valid_settings_slave_team;
}
return NULL;
}
/*****************************************************************************/
static const char *
_meta_type_setting_info_editor_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header)
{

View file

@ -269,6 +269,11 @@ struct _NMMetaPropertyInfo {
const NMMetaPropertyTypData *property_typ_data;
};
typedef struct _NMMetaSettingValidPartItem {
const NMMetaSettingInfoEditor *setting_info;
bool mandatory;
} NMMetaSettingValidPartItem;
struct _NMMetaSettingInfoEditor {
const NMMetaType *meta_type;
const NMMetaSettingInfo *general;
@ -278,6 +283,18 @@ struct _NMMetaSettingInfoEditor {
* "name", and then the order is as they are listed by default. */
const NMMetaPropertyInfo *properties;
guint properties_num;
/* a NMConnection has a main type (connection.type), which is a
* main NMSetting instance. Depending on the type, a connection
* may have a list of other allowed settings.
*
* For example, a connection of type "vlan" may have settings
* of type "connection", "vlan", and "wired".
*
* Some setting types a not a main type (NMSettingProxy). They
* don't have valid_settings but are usually referenced by other
* settings to be valid for them. */
const NMMetaSettingValidPartItem *const*valid_parts;
};
struct _NMMetaType {
@ -309,6 +326,10 @@ extern const NMMetaType nm_meta_type_property_info;
extern const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[_NM_META_SETTING_TYPE_NUM];
extern const NMMetaSettingValidPartItem *const nm_meta_setting_info_valid_parts_default[];
const NMMetaSettingValidPartItem *const*nm_meta_setting_info_valid_parts_for_slave_type (const char *slave_type, const char **out_slave_name);
/*****************************************************************************/
typedef enum {

View file

@ -95,6 +95,29 @@ test_client_meta_check (void)
}
} else
g_assert (!info->properties);
if (info->valid_parts) {
gsize i, l;
gs_unref_hashtable GHashTable *dup = g_hash_table_new (NULL, NULL);
l = NM_PTRARRAY_LEN (info->valid_parts);
g_assert (l >= 2);
for (i = 0; info->valid_parts[i]; i++) {
g_assert (info->valid_parts[i]->setting_info);
g_assert (nm_g_hash_table_add (dup, (gpointer) info->valid_parts[i]->setting_info));
if (i == 0) {
g_assert (info->valid_parts[i]->setting_info == &nm_meta_setting_infos_editor[NM_META_SETTING_TYPE_CONNECTION]);
g_assert (info->valid_parts[i]->mandatory);
}
if (i == 1) {
g_assert (info->valid_parts[i]->setting_info == &nm_meta_setting_infos_editor[m]);
g_assert (info->valid_parts[i]->mandatory);
}
}
g_assert (i == l);
}
}
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++) {
@ -112,7 +135,7 @@ test_client_meta_check (void)
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++) {
const NMMetaSettingInfoEditor *info = &nm_meta_setting_infos_editor[m];
g_assert (nm_meta_setting_info_editor_find_by_name (info->general->setting_name) == info);
g_assert (nm_meta_setting_info_editor_find_by_name (info->general->setting_name, FALSE) == info);
g_assert (nm_meta_setting_info_editor_find_by_gtype (info->general->get_setting_gtype ()) == info);
for (p = 0; p < info->properties_num; p++) {