From f889440b96c254fb9bdd7aea82f628acfad792ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Fri, 13 Dec 2013 14:19:43 +0100 Subject: [PATCH 1/6] cli: more compact format for device info (nmcli device show) (rh #998003) https://bugzilla.redhat.com/show_bug.cgi?id=998003 --- cli/src/devices.c | 74 ++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/cli/src/devices.c b/cli/src/devices.c index f21e063644..42576a3fbc 100644 --- a/cli/src/devices.c +++ b/cli/src/devices.c @@ -99,11 +99,13 @@ static NmcOutputField nmc_fields_dev_show_general[] = { {"NM-MANAGED", N_("NM-MANAGED"), 15}, /* 13 */ {"AUTOCONNECT", N_("AUTOCONNECT"), 15}, /* 14 */ {"FIRMWARE-MISSING", N_("FIRMWARE-MISSING"), 18}, /* 15 */ - {"CONNECTION", N_("CONNECTION"), 51}, /* 16 */ + {"CONNECTION", N_("CONNECTION"), 20}, /* 16 */ + {"CON-UUID", N_("CON-UUID"), 38}, /* 17 */ + {"CON-PATH", N_("CON-PATH"), 51}, /* 18 */ {NULL, NULL, 0} }; -#define NMC_FIELDS_DEV_SHOW_GENERAL_ALL "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,DRIVER-VERSION,FIRMWARE-VERSION,HWADDR,STATE,REASON,UDI,IP-IFACE,"\ - "NM-MANAGED,AUTOCONNECT,FIRMWARE-MISSING,CONNECTION" +#define NMC_FIELDS_DEV_SHOW_GENERAL_ALL "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,DRIVER-VERSION,FIRMWARE-VERSION,HWADDR,STATE,REASON,"\ + "UDI,IP-IFACE,NM-MANAGED,AUTOCONNECT,FIRMWARE-MISSING,CONNECTION,CON-UUID,CON-PATH" #define NMC_FIELDS_DEV_SHOW_GENERAL_COMMON "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,HWADDR,STATE" /* Available fields for 'device show' - CONNECTIONS part */ @@ -247,11 +249,15 @@ static NmcOutputField nmc_fields_dev_show_sections[] = { {NULL, NULL, 0, NULL } }; #if WITH_WIMAX -#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6" -#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6" +#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\ + "WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6" +#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.STATE,GENERAL.CONNECTION,GENERAL.CON-PATH,"\ + "WIRED-PROPERTIES,IP4,IP6" #else -#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4,DHCP4,IP6,DHCP6" -#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4,DHCP4,IP6,DHCP6" +#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\ + "IP4,DHCP4,IP6,DHCP6" +#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.STATE,GENERAL.CONNECTION,GENERAL.CON-PATH,"\ + "WIRED-PROPERTIES,IP4,IP6" #endif @@ -564,6 +570,30 @@ construct_header_name (const char *base, const char *spec) return header_name; } +static const char * +get_active_connection_id (NMDevice *device) +{ + const GPtrArray *avail_cons; + NMActiveConnection *ac; + const char *ac_uuid; + int i; + + ac = nm_device_get_active_connection (device); + if (!ac) + return NULL; + ac_uuid = nm_active_connection_get_uuid (ac); + + avail_cons = nm_device_get_available_connections (device); + for (i = 0; avail_cons && (i < avail_cons->len); i++) { + NMRemoteConnection *candidate = g_ptr_array_index (avail_cons, i); + const char *test_uuid = nm_connection_get_uuid (NM_CONNECTION (candidate)); + + if (g_strcmp0 (ac_uuid, test_uuid) == 0) + return nm_connection_get_id (NM_CONNECTION (candidate)); + } + return NULL; +} + static void show_device_info (NMDevice *device, NmCli *nmc) { @@ -659,6 +689,7 @@ show_device_info (NMDevice *device, NmCli *nmc) state_str = g_strdup_printf ("%d (%s)", state, nmc_device_state_to_string (state)); reason_str = g_strdup_printf ("%d (%s)", reason, nmc_device_reason_to_string (reason)); + acon = nm_device_get_active_connection (device); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, nmc_fields_dev_show_sections[0].name); /* "GENERAL"*/ @@ -677,8 +708,9 @@ show_device_info (NMDevice *device, NmCli *nmc) set_val_strc (arr, 13, nm_device_get_managed (device) ? _("yes") : _("no")); set_val_strc (arr, 14, nm_device_get_autoconnect (device) ? _("yes") : _("no")); set_val_strc (arr, 15, nm_device_get_firmware_missing (device) ? _("yes") : _("no")); - set_val_strc (arr, 16, ((acon = nm_device_get_active_connection (device)) ? - nm_object_get_path (NM_OBJECT (acon)) : _("not connected"))); + set_val_strc (arr, 16, get_active_connection_id (device)); + set_val_strc (arr, 17, acon ? nm_active_connection_get_uuid (acon) : NULL); + set_val_strc (arr, 18, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -1012,30 +1044,6 @@ show_device_info (NMDevice *device, NmCli *nmc) g_ptr_array_free (fields_in_section, TRUE); } -static const char * -get_active_connection_id (NMDevice *device) -{ - const GPtrArray *avail_cons; - NMActiveConnection *ac; - const char *ac_uuid; - int i; - - ac = nm_device_get_active_connection (device); - if (!ac) - return NULL; - ac_uuid = nm_active_connection_get_uuid (ac); - - avail_cons = nm_device_get_available_connections (device); - for (i = 0; avail_cons && (i < avail_cons->len); i++) { - NMRemoteConnection *candidate = g_ptr_array_index (avail_cons, i); - const char *test_uuid = nm_connection_get_uuid (NM_CONNECTION (candidate)); - - if (g_strcmp0 (ac_uuid, test_uuid) == 0) - return nm_connection_get_id (NM_CONNECTION (candidate)); - } - return NULL; -} - static void fill_output_device_status (NMDevice *device, NmCli *nmc) { From 567cfa41f4b0524031f0cdca0455c39f8c3c5c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 16 Dec 2013 16:30:59 +0100 Subject: [PATCH 2/6] libnm-glib: add nm_device_get_hw_address() to NMDevice It simplifies code getting MAC addresses for clients. --- libnm-glib/libnm-glib.ver | 1 + libnm-glib/nm-device-bond.c | 7 +++++++ libnm-glib/nm-device-bridge.c | 7 +++++++ libnm-glib/nm-device-bt.c | 7 +++++++ libnm-glib/nm-device-ethernet.c | 7 +++++++ libnm-glib/nm-device-generic.c | 7 +++++++ libnm-glib/nm-device-infiniband.c | 7 +++++++ libnm-glib/nm-device-olpc-mesh.c | 7 +++++++ libnm-glib/nm-device-team.c | 7 +++++++ libnm-glib/nm-device-vlan.c | 7 +++++++ libnm-glib/nm-device-wifi.c | 7 +++++++ libnm-glib/nm-device-wimax.c | 7 +++++++ libnm-glib/nm-device.c | 22 ++++++++++++++++++++++ libnm-glib/nm-device.h | 3 ++- 14 files changed, 102 insertions(+), 1 deletion(-) diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver index 5247ce9fef..52f4b33741 100644 --- a/libnm-glib/libnm-glib.ver +++ b/libnm-glib/libnm-glib.ver @@ -129,6 +129,7 @@ global: nm_device_get_driver_version; nm_device_get_firmware_missing; nm_device_get_firmware_version; + nm_device_get_hw_address; nm_device_get_iface; nm_device_get_ip4_config; nm_device_get_ip6_config; diff --git a/libnm-glib/nm-device-bond.c b/libnm-glib/nm-device-bond.c index 18c10484d0..b6e40d2648 100644 --- a/libnm-glib/nm-device-bond.c +++ b/libnm-glib/nm-device-bond.c @@ -195,6 +195,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_bond_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_bond_get_hw_address (NM_DEVICE_BOND (device)); +} + /***********************************************************/ static void @@ -296,6 +302,7 @@ nm_device_bond_class_init (NMDeviceBondClass *eth_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-bridge.c b/libnm-glib/nm-device-bridge.c index 2bec00fbfb..f286c1a938 100644 --- a/libnm-glib/nm-device-bridge.c +++ b/libnm-glib/nm-device-bridge.c @@ -203,6 +203,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_bridge_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_bridge_get_hw_address (NM_DEVICE_BRIDGE (device)); +} + /***********************************************************/ static void @@ -304,6 +310,7 @@ nm_device_bridge_class_init (NMDeviceBridgeClass *bridge_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-bt.c b/libnm-glib/nm-device-bt.c index 20312a6261..1d634e2306 100644 --- a/libnm-glib/nm-device-bt.c +++ b/libnm-glib/nm-device-bt.c @@ -227,6 +227,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_bt_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_bt_get_hw_address (NM_DEVICE_BT (device)); +} + /************************************************************/ static void @@ -323,6 +329,7 @@ nm_device_bt_class_init (NMDeviceBtClass *bt_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-ethernet.c b/libnm-glib/nm-device-ethernet.c index 3831f64cdb..338c498c8b 100644 --- a/libnm-glib/nm-device-ethernet.c +++ b/libnm-glib/nm-device-ethernet.c @@ -231,6 +231,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device)); +} + /***********************************************************/ static void @@ -331,6 +337,7 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *eth_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-generic.c b/libnm-glib/nm-device-generic.c index f014e65d24..46836ede0e 100644 --- a/libnm-glib/nm-device-generic.c +++ b/libnm-glib/nm-device-generic.c @@ -128,6 +128,12 @@ get_type_description (NMDevice *device) return priv->type_description; } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_generic_get_hw_address (NM_DEVICE_GENERIC (device)); +} + static gboolean connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { @@ -246,6 +252,7 @@ nm_device_generic_class_init (NMDeviceGenericClass *klass) object_class->get_property = get_property; device_class->get_type_description = get_type_description; + device_class->get_hw_address = get_hw_address; device_class->connection_compatible = connection_compatible; /** diff --git a/libnm-glib/nm-device-infiniband.c b/libnm-glib/nm-device-infiniband.c index 070b8f8c63..0254dbf5c8 100644 --- a/libnm-glib/nm-device-infiniband.c +++ b/libnm-glib/nm-device-infiniband.c @@ -181,6 +181,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_infiniband_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_infiniband_get_hw_address (NM_DEVICE_INFINIBAND (device)); +} + /***********************************************************/ static void @@ -272,6 +278,7 @@ nm_device_infiniband_class_init (NMDeviceInfinibandClass *eth_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-olpc-mesh.c b/libnm-glib/nm-device-olpc-mesh.c index 6235569fff..8392e7ca13 100644 --- a/libnm-glib/nm-device-olpc-mesh.c +++ b/libnm-glib/nm-device-olpc-mesh.c @@ -154,6 +154,12 @@ nm_device_olpc_mesh_get_active_channel (NMDeviceOlpcMesh *device) return NM_DEVICE_OLPC_MESH_GET_PRIVATE (device)->active_channel; } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_olpc_mesh_get_hw_address (NM_DEVICE_OLPC_MESH (device)); +} + static gboolean connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { @@ -277,6 +283,7 @@ nm_device_olpc_mesh_class_init (NMDeviceOlpcMeshClass *olpc_mesh_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-team.c b/libnm-glib/nm-device-team.c index adf0113724..89d5b07541 100644 --- a/libnm-glib/nm-device-team.c +++ b/libnm-glib/nm-device-team.c @@ -154,6 +154,12 @@ nm_device_team_get_slaves (NMDeviceTeam *device) return handle_ptr_array_return (NM_DEVICE_TEAM_GET_PRIVATE (device)->slaves); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_team_get_hw_address (NM_DEVICE_TEAM (device)); +} + static gboolean connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { @@ -292,6 +298,7 @@ nm_device_team_class_init (NMDeviceTeamClass *eth_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-vlan.c b/libnm-glib/nm-device-vlan.c index 19342b93ea..807b306602 100644 --- a/libnm-glib/nm-device-vlan.c +++ b/libnm-glib/nm-device-vlan.c @@ -210,6 +210,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_vlan_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_vlan_get_hw_address (NM_DEVICE_VLAN (device)); +} + /***********************************************************/ static void @@ -305,6 +311,7 @@ nm_device_vlan_class_init (NMDeviceVlanClass *eth_class) object_class->finalize = finalize; object_class->get_property = get_property; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-wifi.c b/libnm-glib/nm-device-wifi.c index 69a3e0e5ca..327849da4c 100644 --- a/libnm-glib/nm-device-wifi.c +++ b/libnm-glib/nm-device-wifi.c @@ -555,6 +555,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_wifi_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (device)); +} + /**************************************************************/ static void @@ -719,6 +725,7 @@ nm_device_wifi_class_init (NMDeviceWifiClass *wifi_class) object_class->dispose = dispose; object_class->finalize = finalize; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device-wimax.c b/libnm-glib/nm-device-wimax.c index 012b926e98..5a9a21df3e 100644 --- a/libnm-glib/nm-device-wimax.c +++ b/libnm-glib/nm-device-wimax.c @@ -427,6 +427,12 @@ connection_compatible (NMDevice *device, NMConnection *connection, GError **erro return NM_DEVICE_CLASS (nm_device_wimax_parent_class)->connection_compatible (device, connection, error); } +static const char * +get_hw_address (NMDevice *device) +{ + return nm_device_wimax_get_hw_address (NM_DEVICE_WIMAX (device)); +} + /**************************************************************/ static void @@ -615,6 +621,7 @@ nm_device_wimax_class_init (NMDeviceWimaxClass *wimax_class) object_class->get_property = get_property; object_class->dispose = dispose; device_class->connection_compatible = connection_compatible; + device_class->get_hw_address = get_hw_address; /* properties */ diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c index 6d8e9f1b47..971baea822 100644 --- a/libnm-glib/nm-device.c +++ b/libnm-glib/nm-device.c @@ -1151,6 +1151,28 @@ nm_device_get_type_description (NMDevice *device) return priv->type_description; } +/** + * nm_device_get_hw_address: + * @device: a #NMDevice + * + * Gets the current a hardware address (MAC) for the @device. + * + * Returns: the current MAC of the device, or %NULL. + * This is the internal string used by the device, and must not be modified. + * + * Since: 0.9.10 + **/ +const char * +nm_device_get_hw_address (NMDevice *device) +{ + g_return_val_if_fail (NM_IS_DEVICE (device), NULL); + + if (NM_DEVICE_GET_CLASS (device)->get_hw_address) + return NM_DEVICE_GET_CLASS (device)->get_hw_address (device); + + return NULL; +} + /** * nm_device_get_capabilities: * @device: a #NMDevice diff --git a/libnm-glib/nm-device.h b/libnm-glib/nm-device.h index bd746b3b74..6a96cbc6ff 100644 --- a/libnm-glib/nm-device.h +++ b/libnm-glib/nm-device.h @@ -100,13 +100,13 @@ typedef struct { GError **error); const char * (*get_type_description) (NMDevice *device); + const char * (*get_hw_address) (NMDevice *device); /* Padding for future expansion */ void (*_reserved1) (void); void (*_reserved2) (void); void (*_reserved3) (void); void (*_reserved4) (void); - void (*_reserved5) (void); } NMDeviceClass; GType nm_device_get_type (void); @@ -121,6 +121,7 @@ const char * nm_device_get_driver (NMDevice *device); const char * nm_device_get_driver_version (NMDevice *device); const char * nm_device_get_firmware_version (NMDevice *device); const char * nm_device_get_type_description (NMDevice *device); +const char * nm_device_get_hw_address (NMDevice *device); NMDeviceCapabilities nm_device_get_capabilities (NMDevice *device); gboolean nm_device_get_managed (NMDevice *device); gboolean nm_device_get_autoconnect (NMDevice *device); From e3bd57575819ff7db26541164746443f1fa203a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 16 Dec 2013 16:36:49 +0100 Subject: [PATCH 3/6] cli: simplify getting device hardware addresses --- cli/src/devices.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/cli/src/devices.c b/cli/src/devices.c index 42576a3fbc..223f3ebdb2 100644 --- a/cli/src/devices.c +++ b/cli/src/devices.c @@ -670,25 +670,9 @@ show_device_info (NMDevice *device, NmCli *nmc) arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (nmc->output_data, arr); - if (NM_IS_DEVICE_ETHERNET (device)) - hwaddr = nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device)); - else if (NM_IS_DEVICE_WIFI (device)) - hwaddr = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (device)); -#if WITH_WIMAX - else if (NM_IS_DEVICE_WIMAX (device)) - hwaddr = nm_device_wimax_get_hw_address (NM_DEVICE_WIMAX (device)); -#endif - else if (NM_IS_DEVICE_INFINIBAND (device)) - hwaddr = nm_device_infiniband_get_hw_address (NM_DEVICE_INFINIBAND (device)); - else if (NM_IS_DEVICE_BOND (device)) - hwaddr = nm_device_bond_get_hw_address (NM_DEVICE_BOND (device)); - else if (NM_IS_DEVICE_VLAN (device)) - hwaddr = nm_device_vlan_get_hw_address (NM_DEVICE_VLAN (device)); - else if (NM_IS_DEVICE_BRIDGE (device)) - hwaddr = nm_device_bridge_get_hw_address (NM_DEVICE_BRIDGE (device)); - state_str = g_strdup_printf ("%d (%s)", state, nmc_device_state_to_string (state)); reason_str = g_strdup_printf ("%d (%s)", reason, nmc_device_reason_to_string (reason)); + hwaddr = nm_device_get_hw_address (device); acon = nm_device_get_active_connection (device); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); From 44bd2275e733fc0378648c36af0cb95a6c26f0a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 16 Dec 2013 15:16:43 +0100 Subject: [PATCH 4/6] device: add 'mtu' property --- introspection/nm-device.xml | 5 +++++ src/devices/nm-device.c | 42 +++++++++++++++++++++++++++++++++++-- src/devices/nm-device.h | 5 ++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/introspection/nm-device.xml b/introspection/nm-device.xml index d6f2e8594a..06f5781c8b 100644 --- a/introspection/nm-device.xml +++ b/introspection/nm-device.xml @@ -133,6 +133,11 @@ different virtual interfaces to the same physical port. + + + The device MTU (maximum transmission unit). + + diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 6f2383b753..f8caf5a8cb 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -15,7 +15,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright (C) 2005 - 2012 Red Hat, Inc. + * Copyright (C) 2005 - 2013 Red Hat, Inc. * Copyright (C) 2006 - 2008 Novell, Inc. */ @@ -117,6 +117,7 @@ enum { PROP_FIRMWARE_VERSION, PROP_CAPABILITIES, PROP_CARRIER, + PROP_MTU, PROP_IP4_ADDRESS, PROP_IP4_CONFIG, PROP_DHCP4_CONFIG, @@ -230,6 +231,7 @@ typedef struct { gboolean carrier; guint carrier_wait_id; gboolean ignore_carrier; + guint32 mtu; /* Generic DHCP stuff */ NMDHCPManager * dhcp_manager; @@ -616,6 +618,9 @@ constructed (GObject *object) priv->physical_port_id = nm_platform_link_get_physical_port_id (priv->ifindex); } + if (priv->ifindex > 0) + priv->mtu = nm_platform_link_get_mtu (priv->ifindex); + if (G_OBJECT_CLASS (nm_device_parent_class)->constructed) G_OBJECT_CLASS (nm_device_parent_class)->constructed (object); } @@ -1199,6 +1204,12 @@ link_changed_cb (NMPlatform *platform, int ifindex, NMPlatformLink *info, NMPlat g_object_notify (G_OBJECT (device), NM_DEVICE_UDI); } + /* Update MTU if it has changed. */ + if (priv->mtu != info->mtu) { + priv->mtu = info->mtu; + g_object_notify (G_OBJECT (device), NM_DEVICE_MTU); + } + if (klass->link_changed) klass->link_changed (device, info); } @@ -5393,7 +5404,7 @@ finalize (GObject *object) static void set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) + const GValue *value, GParamSpec *pspec) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object); NMPlatformLink *platform_device; @@ -5449,6 +5460,9 @@ set_property (GObject *object, guint prop_id, g_free (priv->firmware_version); priv->firmware_version = g_strdup (g_value_get_string (value)); break; + case PROP_MTU: + priv->mtu = g_value_get_uint (value); + break; case PROP_IP4_ADDRESS: priv->ip4_address = g_value_get_uint (value); break; @@ -5547,6 +5561,9 @@ get_property (GObject *object, guint prop_id, case PROP_CARRIER: g_value_set_boolean (value, priv->carrier); break; + case PROP_MTU: + g_value_set_uint (value, priv->mtu); + break; case PROP_IP4_CONFIG: if (ip_config_valid (priv->state) && priv->ip4_config) g_value_set_boxed (value, nm_ip4_config_get_dbus_path (priv->ip4_config)); @@ -5741,6 +5758,14 @@ nm_device_class_init (NMDeviceClass *klass) FALSE, G_PARAM_READABLE)); + g_object_class_install_property + (object_class, PROP_MTU, + g_param_spec_uint (NM_DEVICE_MTU, + "MTU", + "MTU", + 0, G_MAXUINT32, 1500, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_IP4_ADDRESS, g_param_spec_uint (NM_DEVICE_IP4_ADDRESS, @@ -7244,3 +7269,16 @@ nm_device_get_physical_port_id (NMDevice *device) return priv->physical_port_id; } + +/** + * nm_device_get_mtu: + * @device: the #NMDevice + * + * Returns: MTU of the #NMDevice + */ +guint32 +nm_device_get_mtu (NMDevice *device) +{ + return NM_DEVICE_GET_PRIVATE (device)->mtu; +} + diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h index 69d81754ce..4573db000c 100644 --- a/src/devices/nm-device.h +++ b/src/devices/nm-device.h @@ -15,7 +15,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright (C) 2005 - 2012 Red Hat, Inc. + * Copyright (C) 2005 - 2013 Red Hat, Inc. * Copyright (C) 2006 - 2008 Novell, Inc. */ @@ -61,6 +61,7 @@ #define NM_DEVICE_FIRMWARE_MISSING "firmware-missing" #define NM_DEVICE_AVAILABLE_CONNECTIONS "available-connections" #define NM_DEVICE_PHYSICAL_PORT_ID "physical-port-id" +#define NM_DEVICE_MTU "mtu" #define NM_DEVICE_TYPE_DESC "type-desc" /* Internal only */ #define NM_DEVICE_RFKILL_TYPE "rfkill-type" /* Internal only */ #define NM_DEVICE_IFINDEX "ifindex" /* Internal only */ @@ -324,6 +325,8 @@ GPtrArray *nm_device_get_available_connections (NMDevice *device, const char *nm_device_get_physical_port_id (NMDevice *device); +guint32 nm_device_get_mtu (NMDevice *device); + gboolean nm_device_connection_is_available (NMDevice *device, NMConnection *connection); G_END_DECLS From 17a7763d81bc3626106a2e23bfa9d881dfde5389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 16 Dec 2013 15:44:27 +0100 Subject: [PATCH 5/6] libnm-glib: add 'mtu' property to NMDevice --- libnm-glib/libnm-glib.ver | 1 + libnm-glib/nm-device.c | 40 +++++++++++++++++++++++++++++++++++++++ libnm-glib/nm-device.h | 4 +++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver index 52f4b33741..b8ce807e4c 100644 --- a/libnm-glib/libnm-glib.ver +++ b/libnm-glib/libnm-glib.ver @@ -135,6 +135,7 @@ global: nm_device_get_ip6_config; nm_device_get_ip_iface; nm_device_get_managed; + nm_device_get_mtu; nm_device_get_physical_port_id; nm_device_get_product; nm_device_get_state; diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c index 971baea822..806c9347d3 100644 --- a/libnm-glib/nm-device.c +++ b/libnm-glib/nm-device.c @@ -98,6 +98,7 @@ typedef struct { char *vendor; char *physical_port_id; + guint32 mtu; } NMDevicePrivate; enum { @@ -124,6 +125,7 @@ enum { PROP_ACTIVE_CONNECTION, PROP_AVAILABLE_CONNECTIONS, PROP_PHYSICAL_PORT_ID, + PROP_MTU, LAST_PROP }; @@ -203,6 +205,7 @@ register_properties (NMDevice *device) { NM_DEVICE_ACTIVE_CONNECTION, &priv->active_connection, NULL, NM_TYPE_ACTIVE_CONNECTION }, { NM_DEVICE_AVAILABLE_CONNECTIONS, &priv->available_connections, NULL, NM_TYPE_REMOTE_CONNECTION }, { NM_DEVICE_PHYSICAL_PORT_ID, &priv->physical_port_id }, + { NM_DEVICE_MTU, &priv->mtu }, /* Properties that exist in D-Bus but that we don't track */ { "ip4-address", NULL }, @@ -481,6 +484,9 @@ get_property (GObject *object, case PROP_PHYSICAL_PORT_ID: g_value_set_string (value, nm_device_get_physical_port_id (device)); break; + case PROP_MTU: + g_value_set_uint (value, nm_device_get_mtu (device)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -828,6 +834,21 @@ nm_device_class_init (NMDeviceClass *device_class) NULL, G_PARAM_READABLE)); + /** + * NMDevice:mtu: + * + * The MTU of the device. + * + * Since: 0.9.10 + **/ + g_object_class_install_property + (object_class, PROP_MTU, + g_param_spec_uint (NM_DEVICE_MTU, + "MTU", + "MTU", + 0, G_MAXUINT32, 1500, + G_PARAM_READABLE)); + /* signals */ /** @@ -1610,6 +1631,25 @@ nm_device_get_physical_port_id (NMDevice *device) return NULL; } +/** + * nm_device_get_mtu: + * @device: a #NMDevice + * + * Gets the MTU of the #NMDevice. + * + * Returns: the MTU of the device. + * + * Since: 0.9.10 + **/ +guint32 +nm_device_get_mtu (NMDevice *device) +{ + g_return_val_if_fail (NM_IS_DEVICE (device), 0); + + _nm_object_ensure_inited (NM_OBJECT (device)); + return NM_DEVICE_GET_PRIVATE (device)->mtu; +} + typedef struct { NMDevice *device; NMDeviceDeactivateFn fn; diff --git a/libnm-glib/nm-device.h b/libnm-glib/nm-device.h index 6a96cbc6ff..33ab8a3dcb 100644 --- a/libnm-glib/nm-device.h +++ b/libnm-glib/nm-device.h @@ -18,7 +18,7 @@ * Boston, MA 02110-1301 USA. * * Copyright (C) 2007 - 2008 Novell, Inc. - * Copyright (C) 2007 - 2012 Red Hat, Inc. + * Copyright (C) 2007 - 2013 Red Hat, Inc. */ #ifndef NM_DEVICE_H @@ -81,6 +81,7 @@ GQuark nm_device_error_quark (void); #define NM_DEVICE_VENDOR "vendor" #define NM_DEVICE_PRODUCT "product" #define NM_DEVICE_PHYSICAL_PORT_ID "physical-port-id" +#define NM_DEVICE_MTU "mtu" typedef struct { NMObject parent; @@ -138,6 +139,7 @@ const GPtrArray * nm_device_get_available_connections(NMDevice *device); const char * nm_device_get_product (NMDevice *device); const char * nm_device_get_vendor (NMDevice *device); const char * nm_device_get_physical_port_id (NMDevice *device); +guint32 nm_device_get_mtu (NMDevice *device); typedef void (*NMDeviceDeactivateFn) (NMDevice *device, GError *error, gpointer user_data); From 3668fd7cbcc2ab2aaaf7643595e6ec4260b6fc80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Mon, 16 Dec 2013 17:08:28 +0100 Subject: [PATCH 6/6] cli: display MTU for devices --- cli/src/devices.c | 57 ++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/cli/src/devices.c b/cli/src/devices.c index 223f3ebdb2..79bfe23de0 100644 --- a/cli/src/devices.c +++ b/cli/src/devices.c @@ -92,19 +92,20 @@ static NmcOutputField nmc_fields_dev_show_general[] = { {"DRIVER-VERSION", N_("DRIVER-VERSION"), 18}, /* 6 */ {"FIRMWARE-VERSION", N_("FIRMWARE-VERSION"), 18}, /* 7 */ {"HWADDR", N_("HWADDR"), 19}, /* 8 */ - {"STATE", N_("STATE"), 14}, /* 9 */ - {"REASON", N_("REASON"), 25}, /* 10 */ - {"UDI", N_("UDI"), 64}, /* 11 */ - {"IP-IFACE", N_("IP-IFACE"), 10}, /* 12 */ - {"NM-MANAGED", N_("NM-MANAGED"), 15}, /* 13 */ - {"AUTOCONNECT", N_("AUTOCONNECT"), 15}, /* 14 */ - {"FIRMWARE-MISSING", N_("FIRMWARE-MISSING"), 18}, /* 15 */ - {"CONNECTION", N_("CONNECTION"), 20}, /* 16 */ - {"CON-UUID", N_("CON-UUID"), 38}, /* 17 */ - {"CON-PATH", N_("CON-PATH"), 51}, /* 18 */ + {"MTU", N_("MTU"), 10}, /* 9 */ + {"STATE", N_("STATE"), 14}, /* 10 */ + {"REASON", N_("REASON"), 25}, /* 11 */ + {"UDI", N_("UDI"), 64}, /* 12 */ + {"IP-IFACE", N_("IP-IFACE"), 10}, /* 13 */ + {"NM-MANAGED", N_("NM-MANAGED"), 15}, /* 14 */ + {"AUTOCONNECT", N_("AUTOCONNECT"), 15}, /* 15 */ + {"FIRMWARE-MISSING", N_("FIRMWARE-MISSING"), 18}, /* 16 */ + {"CONNECTION", N_("CONNECTION"), 20}, /* 17 */ + {"CON-UUID", N_("CON-UUID"), 38}, /* 18 */ + {"CON-PATH", N_("CON-PATH"), 51}, /* 19 */ {NULL, NULL, 0} }; -#define NMC_FIELDS_DEV_SHOW_GENERAL_ALL "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,DRIVER-VERSION,FIRMWARE-VERSION,HWADDR,STATE,REASON,"\ +#define NMC_FIELDS_DEV_SHOW_GENERAL_ALL "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,DRIVER-VERSION,FIRMWARE-VERSION,HWADDR,MTU,STATE,REASON,"\ "UDI,IP-IFACE,NM-MANAGED,AUTOCONNECT,FIRMWARE-MISSING,CONNECTION,CON-UUID,CON-PATH" #define NMC_FIELDS_DEV_SHOW_GENERAL_COMMON "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,HWADDR,STATE" @@ -251,13 +252,13 @@ static NmcOutputField nmc_fields_dev_show_sections[] = { #if WITH_WIMAX #define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\ "WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6" -#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.STATE,GENERAL.CONNECTION,GENERAL.CON-PATH,"\ - "WIRED-PROPERTIES,IP4,IP6" +#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.MTU,GENERAL.STATE,"\ + "GENERAL.CONNECTION,GENERAL.CON-PATH,WIRED-PROPERTIES,IP4,IP6" #else #define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\ "IP4,DHCP4,IP6,DHCP6" -#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.STATE,GENERAL.CONNECTION,GENERAL.CON-PATH,"\ - "WIRED-PROPERTIES,IP4,IP6" +#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.MTU,GENERAL.STATE,"\ + "GENERAL.CONNECTION,GENERAL.CON-PATH,WIRED-PROPERTIES,IP4,IP6" #endif @@ -605,9 +606,7 @@ show_device_info (NMDevice *device, NmCli *nmc) NMDeviceCapabilities caps; NMActiveConnection *acon; guint32 speed; - char *speed_str = NULL; - char *state_str = NULL; - char *reason_str = NULL; + char *speed_str, *state_str, *reason_str, *mtu_str; GArray *sections_array; int k; char *fields_str; @@ -673,6 +672,7 @@ show_device_info (NMDevice *device, NmCli *nmc) state_str = g_strdup_printf ("%d (%s)", state, nmc_device_state_to_string (state)); reason_str = g_strdup_printf ("%d (%s)", reason, nmc_device_reason_to_string (reason)); hwaddr = nm_device_get_hw_address (device); + mtu_str = g_strdup_printf ("%u", nm_device_get_mtu (device)); acon = nm_device_get_active_connection (device); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); @@ -685,16 +685,17 @@ show_device_info (NMDevice *device, NmCli *nmc) set_val_strc (arr, 6, nm_device_get_driver_version (device)); set_val_strc (arr, 7, nm_device_get_firmware_version (device)); set_val_strc (arr, 8, hwaddr ? hwaddr : _("(unknown)")); - set_val_str (arr, 9, state_str); - set_val_str (arr, 10, reason_str); - set_val_strc (arr, 11, nm_device_get_udi (device)); - set_val_strc (arr, 12, nm_device_get_ip_iface (device)); - set_val_strc (arr, 13, nm_device_get_managed (device) ? _("yes") : _("no")); - set_val_strc (arr, 14, nm_device_get_autoconnect (device) ? _("yes") : _("no")); - set_val_strc (arr, 15, nm_device_get_firmware_missing (device) ? _("yes") : _("no")); - set_val_strc (arr, 16, get_active_connection_id (device)); - set_val_strc (arr, 17, acon ? nm_active_connection_get_uuid (acon) : NULL); - set_val_strc (arr, 18, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL); + set_val_str (arr, 9, mtu_str); + set_val_str (arr, 10, state_str); + set_val_str (arr, 11, reason_str); + set_val_strc (arr, 12, nm_device_get_udi (device)); + set_val_strc (arr, 13, nm_device_get_ip_iface (device)); + set_val_strc (arr, 14, nm_device_get_managed (device) ? _("yes") : _("no")); + set_val_strc (arr, 15, nm_device_get_autoconnect (device) ? _("yes") : _("no")); + set_val_strc (arr, 16, nm_device_get_firmware_missing (device) ? _("yes") : _("no")); + set_val_strc (arr, 17, get_active_connection_id (device)); + set_val_strc (arr, 18, acon ? nm_active_connection_get_uuid (acon) : NULL); + set_val_strc (arr, 19, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */