about summary refs log tree commit diff
path: root/cli/src/settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src/settings.c')
-rw-r--r--cli/src/settings.c416
1 files changed, 297 insertions, 119 deletions
diff --git a/cli/src/settings.c b/cli/src/settings.c
index ccbe9589..bf422920 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -14,11 +14,13 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * (C) Copyright 2010 - 2011 Red Hat, Inc.
+ * (C) Copyright 2010 - 2012 Red Hat, Inc.
  */
 
 #include "config.h"
 
+#include "net/if_arp.h"
+
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <libnm-util/nm-utils.h>
@@ -88,34 +90,36 @@ static NmcOutputField nmc_fields_setting_8021X[] = {
 	SETTING_FIELD (NM_SETTING_802_1X_EAP, 10),                          /* 1 */
 	SETTING_FIELD (NM_SETTING_802_1X_IDENTITY, 15),                     /* 2 */
 	SETTING_FIELD (NM_SETTING_802_1X_ANONYMOUS_IDENTITY, 15),           /* 3 */
-	SETTING_FIELD (NM_SETTING_802_1X_CA_CERT, 10),                      /* 4 */
-	SETTING_FIELD (NM_SETTING_802_1X_CA_PATH, 10),                      /* 5 */
-	SETTING_FIELD (NM_SETTING_802_1X_SUBJECT_MATCH, 10),                /* 6 */
-	SETTING_FIELD (NM_SETTING_802_1X_ALTSUBJECT_MATCHES, 10),           /* 7 */
-	SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT, 10),                  /* 8 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPVER, 10),               /* 9 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPLABEL, 10),             /* 10 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, 10),     /* 11 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTH, 10),                  /* 12 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTHEAP, 10),               /* 13 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT, 20),               /* 14 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_PATH, 20),               /* 15 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH, 10),         /* 16 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES, 10),    /* 17 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT, 20),           /* 18 */
-	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD, 10),                     /* 19 */
-	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY, 15),                  /* 20 */
-	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD, 20),         /* 21 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, 20),           /* 22 */
-	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, 20),  /* 23 */
-	SETTING_FIELD (NM_SETTING_802_1X_PIN, 8),                           /* 24 */
-	SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS, 17),              /* 25 */
+	SETTING_FIELD (NM_SETTING_802_1X_PAC_FILE, 15),                     /* 4 */
+	SETTING_FIELD (NM_SETTING_802_1X_CA_CERT, 10),                      /* 5 */
+	SETTING_FIELD (NM_SETTING_802_1X_CA_PATH, 10),                      /* 6 */
+	SETTING_FIELD (NM_SETTING_802_1X_SUBJECT_MATCH, 10),                /* 7 */
+	SETTING_FIELD (NM_SETTING_802_1X_ALTSUBJECT_MATCHES, 10),           /* 8 */
+	SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT, 10),                  /* 9 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPVER, 10),               /* 10 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPLABEL, 10),             /* 11 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, 10),     /* 12 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTH, 10),                  /* 13 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTHEAP, 10),               /* 14 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT, 20),               /* 15 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_PATH, 20),               /* 16 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH, 10),         /* 17 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES, 10),    /* 18 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT, 20),           /* 19 */
+	SETTING_FIELD (NM_SETTING_802_1X_PASSWORD, 10),                     /* 20 */
+	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY, 15),                  /* 21 */
+	SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD, 20),         /* 22 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, 20),           /* 23 */
+	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, 20),  /* 24 */
+	SETTING_FIELD (NM_SETTING_802_1X_PIN, 8),                           /* 25 */
+	SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS, 17),              /* 26 */
 	{NULL, NULL, 0, NULL, 0}
 };
 #define NMC_FIELDS_SETTING_802_1X_ALL     "name"","\
                                           NM_SETTING_802_1X_EAP","\
                                           NM_SETTING_802_1X_IDENTITY","\
                                           NM_SETTING_802_1X_ANONYMOUS_IDENTITY","\
+                                          NM_SETTING_802_1X_PAC_FILE","\
                                           NM_SETTING_802_1X_CA_CERT","\
                                           NM_SETTING_802_1X_CA_PATH","\
                                           NM_SETTING_802_1X_SUBJECT_MATCH","\
@@ -438,6 +442,52 @@ static NmcOutputField nmc_fields_setting_wimax[] = {
                                          NM_SETTING_WIMAX_NETWORK_NAME
 #define NMC_FIELDS_SETTING_WIMAX_COMMON  NMC_FIELDS_SETTING_WIMAX_ALL
 
+/* Available fields for NM_SETTING_INFINIBAND_SETTING_NAME */
+static NmcOutputField nmc_fields_setting_infiniband[] = {
+	SETTING_FIELD ("name",  12),                                       /* 0 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_MAC_ADDRESS, 61),             /* 1 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_MTU, 6),                      /* 2 */
+	SETTING_FIELD (NM_SETTING_INFINIBAND_TRANSPORT_MODE, 12),          /* 3 */
+	{NULL, NULL, 0, NULL, 0}
+};
+#define NMC_FIELDS_SETTING_INFINIBAND_ALL     "name"","\
+                                              NM_SETTING_INFINIBAND_MAC_ADDRESS","\
+                                              NM_SETTING_INFINIBAND_MTU","\
+                                              NM_SETTING_INFINIBAND_TRANSPORT_MODE
+#define NMC_FIELDS_SETTING_INFINIBAND_COMMON  NMC_FIELDS_SETTING_INFINIBAND_ALL
+
+/* Available fields for NM_SETTING_BOND_SETTING_NAME */
+static NmcOutputField nmc_fields_setting_bond[] = {
+	SETTING_FIELD ("name",  8),                                        /* 0 */
+	SETTING_FIELD (NM_SETTING_BOND_INTERFACE_NAME, 15),                /* 1 */
+	SETTING_FIELD (NM_SETTING_BOND_OPTIONS, 30),                       /* 2 */
+	{NULL, NULL, 0, NULL, 0}
+};
+#define NMC_FIELDS_SETTING_BOND_ALL     "name"","\
+                                        NM_SETTING_BOND_INTERFACE_NAME","\
+                                        NM_SETTING_BOND_OPTIONS
+#define NMC_FIELDS_SETTING_BOND_COMMON  NMC_FIELDS_SETTING_BOND_ALL
+
+/* Available fields for NM_SETTING_VLAN_SETTING_NAME */
+static NmcOutputField nmc_fields_setting_vlan[] = {
+	SETTING_FIELD ("name",  6),                                        /* 0 */
+	SETTING_FIELD (NM_SETTING_VLAN_INTERFACE_NAME, 15),                /* 1 */
+	SETTING_FIELD (NM_SETTING_VLAN_PARENT, 8),                         /* 2 */
+	SETTING_FIELD (NM_SETTING_VLAN_ID, 6),                             /* 3 */
+	SETTING_FIELD (NM_SETTING_VLAN_FLAGS, 45),                         /* 4 */
+	SETTING_FIELD (NM_SETTING_VLAN_INGRESS_PRIORITY_MAP, 22),          /* 5 */
+	SETTING_FIELD (NM_SETTING_VLAN_EGRESS_PRIORITY_MAP, 22),           /* 6 */
+	{NULL, NULL, 0, NULL, 0}
+};
+#define NMC_FIELDS_SETTING_VLAN_ALL     "name"","\
+                                        NM_SETTING_VLAN_INTERFACE_NAME","\
+                                        NM_SETTING_VLAN_PARENT","\
+                                        NM_SETTING_VLAN_ID","\
+                                        NM_SETTING_VLAN_FLAGS","\
+                                        NM_SETTING_VLAN_INGRESS_PRIORITY_MAP","\
+                                        NM_SETTING_VLAN_EGRESS_PRIORITY_MAP
+#define NMC_FIELDS_SETTING_VLAN_COMMON  NMC_FIELDS_SETTING_VLAN_ALL
+
 
 static char *
 wep_key_type_to_string (NMWepKeyType type)
@@ -519,10 +569,57 @@ allowed_bands_to_string (guint32 bands)
 	return g_string_free (band_str, FALSE);
 }
 
+static char *
+vlan_flags_to_string (guint32 flags)
+{
+	GString *flag_str;
+
+	if (flags == 0)
+		return g_strdup (_("0 (NONE)"));
+
+	flag_str = g_string_new (NULL);
+	g_string_printf (flag_str, "%d (", flags);
+
+	if (flags & NM_VLAN_FLAG_REORDER_HEADERS)
+		g_string_append (flag_str, _("REORDER_HEADERS, "));
+	if (flags & NM_VLAN_FLAG_GVRP)
+		g_string_append (flag_str, _("GVRP, "));
+	if (flags & NM_VLAN_FLAG_LOOSE_BINDING)
+		g_string_append (flag_str, _("LOOSE_BINDING, "));
+
+	if (flag_str->str[flag_str->len-1] == '(')
+		g_string_assign (flag_str, _("unknown"));
+	else
+		g_string_truncate (flag_str, flag_str->len-2);  /* chop off trailing ', ' */
+
+	g_string_append_c (flag_str, ')');
+
+	return g_string_free (flag_str, FALSE);
+}
+
+static char *
+vlan_priorities_to_string (NMSettingVlan *s_vlan, NMVlanPriorityMap map)
+{
+	GString *priorities;
+	int i;
+
+	priorities = g_string_new (NULL);
+	for (i = 0; i < nm_setting_vlan_get_num_priorities (s_vlan, map); i++) {
+		guint32 from, to;
+
+		nm_setting_vlan_get_priority (s_vlan, map, i, &from, &to);
+		g_string_append_printf (priorities, "%d:%d,", from, to);
+	}
+	g_string_truncate (priorities, priorities->len-1);  /* chop off trailing ',' */
+
+	return g_string_free (priorities, FALSE);
+}
+
+/*----------------------------------------------------------------------------*/
+
 gboolean
-setting_connection_details (NMSetting *setting, NmCli *nmc)
+setting_connection_details (NMSettingConnection *s_con, NmCli *nmc)
 {
-	NMSettingConnection *s_con;
 	guint64 timestamp;
 	char *timestamp_str;
 	const char *perm_item;
@@ -533,8 +630,7 @@ setting_connection_details (NMSetting *setting, NmCli *nmc)
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), FALSE);
-	s_con = (NMSettingConnection *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_CONNECTION (s_con), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_connection;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CONNECTION_ALL, nmc->allowed_fields, NULL);
@@ -572,9 +668,8 @@ setting_connection_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_wired_details (NMSetting *setting, NmCli *nmc)
+setting_wired_details (NMSettingWired *s_wired, NmCli *nmc)
 {
-	NMSettingWired *s_wired;
 	const GByteArray *mac;
 	const GSList *iter;
 	const GPtrArray *s390_channels;
@@ -585,8 +680,7 @@ setting_wired_details (NMSetting *setting, NmCli *nmc)
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE);
-	s_wired = (NMSettingWired *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_WIRED (s_wired), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_wired;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRED_ALL, nmc->allowed_fields, NULL);
@@ -597,10 +691,10 @@ setting_wired_details (NMSetting *setting, NmCli *nmc)
 	mtu_str = g_strdup_printf ("%d", nm_setting_wired_get_mtu (s_wired));
 	mac = nm_setting_wired_get_mac_address (s_wired);
 	if (mac)
-		device_mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->data[0], mac->data[1], mac->data[2], mac->data[3], mac->data[4], mac->data[5]);
+		device_mac_str = nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
 	mac = nm_setting_wired_get_cloned_mac_address (s_wired);
 	if (mac)
-		cloned_mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->data[0], mac->data[1], mac->data[2], mac->data[3], mac->data[4], mac->data[5]);
+		cloned_mac_str = nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
 
 	mac_blacklist_s = g_string_new (NULL);
 	iter = nm_setting_wired_get_mac_address_blacklist (s_wired);
@@ -653,9 +747,8 @@ setting_wired_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_802_1X_details (NMSetting *setting, NmCli *nmc)
+setting_802_1X_details (NMSetting8021x *s_8021X, NmCli *nmc)
 {
-	NMSetting8021x *s_8021X;
 	NMSetting8021xCKScheme scheme;
 	GString *eap_str, *alt_sub_match, *phase2_alt_sub_match;
 	char *ca_cert_str = NULL, *client_cert_str = NULL, *phase2_ca_cert_str = NULL;
@@ -665,8 +758,7 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), FALSE);
-	s_8021X = (NMSetting8021x *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_802_1X (s_8021X), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_8021X;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_802_1X_ALL, nmc->allowed_fields, NULL);
@@ -729,28 +821,29 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 	nmc->allowed_fields[1].value = eap_str->str;
 	nmc->allowed_fields[2].value = nm_setting_802_1x_get_identity (s_8021X);
 	nmc->allowed_fields[3].value = nm_setting_802_1x_get_anonymous_identity (s_8021X);
-	nmc->allowed_fields[4].value = ca_cert_str;
-	nmc->allowed_fields[5].value = nm_setting_802_1x_get_ca_path (s_8021X);
-	nmc->allowed_fields[6].value = nm_setting_802_1x_get_subject_match (s_8021X);
-	nmc->allowed_fields[7].value = alt_sub_match->str;
-	nmc->allowed_fields[8].value = client_cert_str;
-	nmc->allowed_fields[9].value = nm_setting_802_1x_get_phase1_peapver (s_8021X);
-	nmc->allowed_fields[10].value = nm_setting_802_1x_get_phase1_peaplabel (s_8021X);
-	nmc->allowed_fields[11].value = nm_setting_802_1x_get_phase1_fast_provisioning (s_8021X);
-	nmc->allowed_fields[12].value = nm_setting_802_1x_get_phase2_auth (s_8021X);
-	nmc->allowed_fields[13].value = nm_setting_802_1x_get_phase2_autheap (s_8021X);
-	nmc->allowed_fields[14].value = phase2_ca_cert_str;
-	nmc->allowed_fields[15].value = nm_setting_802_1x_get_phase2_ca_path (s_8021X);
-	nmc->allowed_fields[16].value = nm_setting_802_1x_get_phase2_subject_match (s_8021X);
-	nmc->allowed_fields[17].value = phase2_alt_sub_match->str;
-	nmc->allowed_fields[18].value = phase2_client_cert_str;
-	nmc->allowed_fields[19].value = nm_setting_802_1x_get_password (s_8021X);
-	nmc->allowed_fields[20].value = private_key_str;
-	nmc->allowed_fields[21].value = nm_setting_802_1x_get_private_key_password (s_8021X);
-	nmc->allowed_fields[22].value = phase2_private_key_str;
-	nmc->allowed_fields[23].value = nm_setting_802_1x_get_phase2_private_key_password (s_8021X);
-	nmc->allowed_fields[24].value = nm_setting_802_1x_get_pin (s_8021X);
-	nmc->allowed_fields[25].value = nm_setting_802_1x_get_system_ca_certs (s_8021X) ? _("yes") : _("no");
+	nmc->allowed_fields[4].value = nm_setting_802_1x_get_pac_file (s_8021X);
+	nmc->allowed_fields[5].value = ca_cert_str;
+	nmc->allowed_fields[6].value = nm_setting_802_1x_get_ca_path (s_8021X);
+	nmc->allowed_fields[7].value = nm_setting_802_1x_get_subject_match (s_8021X);
+	nmc->allowed_fields[8].value = alt_sub_match->str;
+	nmc->allowed_fields[9].value = client_cert_str;
+	nmc->allowed_fields[10].value = nm_setting_802_1x_get_phase1_peapver (s_8021X);
+	nmc->allowed_fields[11].value = nm_setting_802_1x_get_phase1_peaplabel (s_8021X);
+	nmc->allowed_fields[12].value = nm_setting_802_1x_get_phase1_fast_provisioning (s_8021X);
+	nmc->allowed_fields[13].value = nm_setting_802_1x_get_phase2_auth (s_8021X);
+	nmc->allowed_fields[14].value = nm_setting_802_1x_get_phase2_autheap (s_8021X);
+	nmc->allowed_fields[15].value = phase2_ca_cert_str;
+	nmc->allowed_fields[16].value = nm_setting_802_1x_get_phase2_ca_path (s_8021X);
+	nmc->allowed_fields[17].value = nm_setting_802_1x_get_phase2_subject_match (s_8021X);
+	nmc->allowed_fields[18].value = phase2_alt_sub_match->str;
+	nmc->allowed_fields[19].value = phase2_client_cert_str;
+	nmc->allowed_fields[20].value = nm_setting_802_1x_get_password (s_8021X);
+	nmc->allowed_fields[21].value = private_key_str;
+	nmc->allowed_fields[22].value = nm_setting_802_1x_get_private_key_password (s_8021X);
+	nmc->allowed_fields[23].value = phase2_private_key_str;
+	nmc->allowed_fields[24].value = nm_setting_802_1x_get_phase2_private_key_password (s_8021X);
+	nmc->allowed_fields[25].value = nm_setting_802_1x_get_pin (s_8021X);
+	nmc->allowed_fields[26].value = nm_setting_802_1x_get_system_ca_certs (s_8021X) ? _("yes") : _("no");
 
 	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
 	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
@@ -769,9 +862,8 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_wireless_details (NMSetting *setting, NmCli *nmc)
+setting_wireless_details (NMSettingWireless *s_wireless, NmCli *nmc)
 {
-	NMSettingWireless *s_wireless;
 	int i;
 	const GByteArray *ssid, *bssid, *mac;
 	char *ssid_str, *channel_str, *rate_str, *tx_power_str, *mtu_str;
@@ -782,8 +874,7 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc)
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE);
-	s_wireless = (NMSettingWireless *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_WIRELESS (s_wireless), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_wireless;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_ALL, nmc->allowed_fields, NULL);
@@ -796,15 +887,15 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc)
 	rate_str = g_strdup_printf ("%d", nm_setting_wireless_get_rate (s_wireless));
 	bssid = nm_setting_wireless_get_bssid (s_wireless);
 	if (bssid)
-		bssid_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", bssid->data[0], bssid->data[1], bssid->data[2], bssid->data[3], bssid->data[4], bssid->data[5]);
+		bssid_str = nm_utils_hwaddr_ntoa (bssid->data, ARPHRD_ETHER);
 	tx_power_str = g_strdup_printf ("%d", nm_setting_wireless_get_tx_power (s_wireless));
 	mtu_str = g_strdup_printf ("%d", nm_setting_wireless_get_mtu (s_wireless));
 	mac = nm_setting_wireless_get_mac_address (s_wireless);
 	if (mac)
-		device_mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->data[0], mac->data[1], mac->data[2], mac->data[3], mac->data[4], mac->data[5]);
+		device_mac_str = nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
 	mac = nm_setting_wireless_get_cloned_mac_address (s_wireless);
 	if (mac)
-		cloned_mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->data[0], mac->data[1], mac->data[2], mac->data[3], mac->data[4], mac->data[5]);
+		cloned_mac_str = nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
 
 	mac_blacklist = g_string_new (NULL);
 	iter = nm_setting_wireless_get_mac_address_blacklist (s_wireless);
@@ -854,9 +945,8 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
+setting_wireless_security_details (NMSettingWirelessSecurity *s_wireless_sec, NmCli *nmc)
 {
-	NMSettingWirelessSecurity *s_wireless_sec;
 	int i;
 	char *wep_tx_keyidx_str, *wep_key_type_str;
 	GString *protos, *pairwises, *groups;
@@ -864,8 +954,7 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (setting), FALSE);
-	s_wireless_sec = (NMSettingWirelessSecurity *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_WIRELESS_SECURITY (s_wireless_sec), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_wireless_security;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_SECURITY_ALL, nmc->allowed_fields, NULL);
@@ -922,17 +1011,15 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_ip4_config_details (NMSetting *setting, NmCli *nmc)
+setting_ip4_config_details (NMSettingIP4Config *s_ip4, NmCli *nmc)
 {
-	NMSettingIP4Config *s_ip4;
 	GString *dns_str, *dns_search_str, *addr_str, *route_str;
 	int i, num;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE);
-	s_ip4 = (NMSettingIP4Config *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (s_ip4), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_ip4_config;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_IP4_CONFIG_ALL, nmc->allowed_fields, NULL);
@@ -1058,17 +1145,15 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_ip6_config_details (NMSetting *setting, NmCli *nmc)
+setting_ip6_config_details (NMSettingIP6Config *s_ip6, NmCli *nmc)
 {
-	NMSettingIP6Config *s_ip6;
 	GString *dns_str, *dns_search_str, *addr_str, *route_str;
 	int i, num;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE);
-	s_ip6 = (NMSettingIP6Config *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (s_ip6), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_ip6_config;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_IP6_CONFIG_ALL, nmc->allowed_fields, NULL);
@@ -1191,16 +1276,14 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_serial_details (NMSetting *setting, NmCli *nmc)
+setting_serial_details (NMSettingSerial *s_serial, NmCli *nmc)
 {
-	NMSettingSerial *s_serial;
 	char *baud_str, *bits_str, *parity_str, *stopbits_str, *send_delay_str;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), FALSE);
-	s_serial = (NMSettingSerial *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_SERIAL (s_serial), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_serial;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_SERIAL_ALL, nmc->allowed_fields, NULL);
@@ -1233,16 +1316,14 @@ setting_serial_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_ppp_details (NMSetting *setting, NmCli *nmc)
+setting_ppp_details (NMSettingPPP *s_ppp, NmCli *nmc)
 {
-	NMSettingPPP *s_ppp;
 	char *baud_str, *mru_str, *mtu_str, *lcp_echo_failure_str, *lcp_echo_interval_str;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_PPP (setting), FALSE);
-	s_ppp = (NMSettingPPP *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_PPP (s_ppp), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_ppp;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPP_ALL, nmc->allowed_fields, NULL);
@@ -1288,15 +1369,13 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_pppoe_details (NMSetting *setting, NmCli *nmc)
+setting_pppoe_details (NMSettingPPPOE *s_pppoe, NmCli *nmc)
 {
-	NMSettingPPPOE *s_pppoe;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_PPPOE (setting), FALSE);
-	s_pppoe = (NMSettingPPPOE *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_PPPOE (s_pppoe), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_pppoe;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPPOE_ALL, nmc->allowed_fields, NULL);
@@ -1315,16 +1394,14 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_gsm_details (NMSetting *setting, NmCli *nmc)
+setting_gsm_details (NMSettingGsm *s_gsm, NmCli *nmc)
 {
-	NMSettingGsm *s_gsm;
 	char *network_type_str, *allowed_bands_str;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_GSM (setting), FALSE);
-	s_gsm = (NMSettingGsm *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_GSM (s_gsm), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_gsm;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_GSM_ALL, nmc->allowed_fields, NULL);
@@ -1355,15 +1432,13 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_cdma_details (NMSetting *setting, NmCli *nmc)
+setting_cdma_details (NMSettingCdma *s_cdma, NmCli *nmc)
 {
-	NMSettingCdma *s_cdma;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_CDMA (setting), FALSE);
-	s_cdma = (NMSettingCdma *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_CDMA (s_cdma), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_cdma;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CDMA_ALL, nmc->allowed_fields, NULL);
@@ -1382,17 +1457,15 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
+setting_bluetooth_details (NMSettingBluetooth *s_bluetooth, NmCli *nmc)
 {
-	NMSettingBluetooth *s_bluetooth;
 	const GByteArray *bdaddr;
 	char *bdaddr_str = NULL;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_BLUETOOTH (setting), FALSE);
-	s_bluetooth = (NMSettingBluetooth *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_BLUETOOTH (s_bluetooth), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_bluetooth;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BLUETOOTH_ALL, nmc->allowed_fields, NULL);
@@ -1401,8 +1474,8 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
 
 	bdaddr = nm_setting_bluetooth_get_bdaddr (s_bluetooth);
 	if (bdaddr)
-		bdaddr_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", bdaddr->data[0], bdaddr->data[1], bdaddr->data[2],
-		                                                               bdaddr->data[3], bdaddr->data[4], bdaddr->data[5]);
+		bdaddr_str = nm_utils_hwaddr_ntoa (bdaddr->data, ARPHRD_ETHER);
+
 	nmc->allowed_fields[0].value = NM_SETTING_BLUETOOTH_SETTING_NAME;
 	nmc->allowed_fields[1].value = bdaddr_str;
 	nmc->allowed_fields[2].value = nm_setting_bluetooth_get_connection_type (s_bluetooth);
@@ -1416,17 +1489,15 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc)
+setting_olpc_mesh_details (NMSettingOlpcMesh *s_olpc_mesh, NmCli *nmc)
 {
-	NMSettingOlpcMesh *s_olpc_mesh;
 	const GByteArray *ssid, *dhcp_anycast;
 	char *ssid_str, *channel_str, *dhcp_anycast_str = NULL;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_OLPC_MESH (setting), FALSE);
-	s_olpc_mesh = (NMSettingOlpcMesh *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_OLPC_MESH (s_olpc_mesh), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_olpc_mesh;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_OLPC_MESH_ALL, nmc->allowed_fields, NULL);
@@ -1438,8 +1509,8 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc)
 	channel_str = g_strdup_printf ("%d", nm_setting_olpc_mesh_get_channel (s_olpc_mesh));
 	dhcp_anycast = nm_setting_olpc_mesh_get_dhcp_anycast_address (s_olpc_mesh);
 	if (dhcp_anycast)
-		dhcp_anycast_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", dhcp_anycast->data[0], dhcp_anycast->data[1], dhcp_anycast->data[2],
-		                                                                     dhcp_anycast->data[3], dhcp_anycast->data[4], dhcp_anycast->data[5]);
+		dhcp_anycast_str = nm_utils_hwaddr_ntoa (dhcp_anycast->data, ARPHRD_ETHER);
+
 	nmc->allowed_fields[0].value = NM_SETTING_OLPC_MESH_SETTING_NAME;
 	nmc->allowed_fields[1].value = ssid_str;
 	nmc->allowed_fields[2].value = channel_str;
@@ -1467,16 +1538,14 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
 }
 
 gboolean
-setting_vpn_details (NMSetting *setting, NmCli *nmc)
+setting_vpn_details (NMSettingVPN *s_vpn, NmCli *nmc)
 {
-	NMSettingVPN *s_vpn;
 	GString *data_item_str, *secret_str;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_VPN (setting), FALSE);
-	s_vpn = (NMSettingVPN *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_VPN (s_vpn), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_vpn;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VPN_ALL, nmc->allowed_fields, NULL);
@@ -1504,17 +1573,15 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
-setting_wimax_details (NMSetting *setting, NmCli *nmc)
+setting_wimax_details (NMSettingWimax *s_wimax, NmCli *nmc)
 {
-	NMSettingWimax *s_wimax;
 	const GByteArray *mac;
 	char *device_mac_str = NULL;
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
 
-	g_return_val_if_fail (NM_IS_SETTING_WIMAX (setting), FALSE);
-	s_wimax = (NMSettingWimax *) setting;
+	g_return_val_if_fail (NM_IS_SETTING_WIMAX (s_wimax), FALSE);
 
 	nmc->allowed_fields = nmc_fields_setting_wimax;
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIMAX_ALL, nmc->allowed_fields, NULL);
@@ -1523,7 +1590,7 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc)
 
 	mac = nm_setting_wimax_get_mac_address (s_wimax);
 	if (mac)
-		device_mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->data[0], mac->data[1], mac->data[2], mac->data[3], mac->data[4], mac->data[5]);
+		device_mac_str = nm_utils_hwaddr_ntoa (mac->data, ARPHRD_ETHER);
 
 	nmc->allowed_fields[0].value = NM_SETTING_WIMAX_SETTING_NAME;
 	nmc->allowed_fields[1].value = device_mac_str;
@@ -1537,3 +1604,114 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc)
 	return TRUE;
 }
 
+gboolean
+setting_infiniband_details (NMSettingInfiniband *s_infiniband, NmCli *nmc)
+{
+	const GByteArray *mac;
+	char *mtu_str, *mac_str = NULL;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (s_infiniband), FALSE);
+
+	nmc->allowed_fields = nmc_fields_setting_infiniband;
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_INFINIBAND_ALL, nmc->allowed_fields, NULL);
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+	print_fields (nmc->print_fields, nmc->allowed_fields);  /* Print field names */
+
+	mac = nm_setting_infiniband_get_mac_address (s_infiniband);
+	if (mac)
+		mac_str = nm_utils_hwaddr_ntoa (mac->data, ARPHRD_INFINIBAND);
+	mtu_str = g_strdup_printf ("%d", nm_setting_infiniband_get_mtu (s_infiniband));
+
+	nmc->allowed_fields[0].value = NM_SETTING_INFINIBAND_SETTING_NAME;
+	nmc->allowed_fields[1].value = mac_str;
+	nmc->allowed_fields[2].value = strcmp (mtu_str, "0") ? mtu_str : _("auto");
+	nmc->allowed_fields[3].value = nm_setting_infiniband_get_transport_mode (s_infiniband);
+
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+	g_free (mac_str);
+	g_free (mtu_str);
+
+	return TRUE;
+}
+
+gboolean
+setting_bond_details (NMSettingBond *s_bond, NmCli *nmc)
+{
+	GString *bond_options_s;
+	int i;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	g_return_val_if_fail (NM_IS_SETTING_BOND (s_bond), FALSE);
+
+	nmc->allowed_fields = nmc_fields_setting_bond;
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BOND_ALL, nmc->allowed_fields, NULL);
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+	print_fields (nmc->print_fields, nmc->allowed_fields);  /* Print field names */
+
+	bond_options_s = g_string_new (NULL);
+	for (i = 0; i < nm_setting_bond_get_num_options (s_bond); i++) {
+		const char *key, *value;
+
+		nm_setting_bond_get_option (s_bond, i, &key, &value);
+		g_string_append_printf (bond_options_s, "%s=%s,", key, value);
+	}
+	g_string_truncate (bond_options_s, bond_options_s->len-1);  /* chop off trailing ',' */
+
+	nmc->allowed_fields[0].value = NM_SETTING_BOND_SETTING_NAME;
+	nmc->allowed_fields[1].value = nm_setting_bond_get_interface_name (s_bond);
+	nmc->allowed_fields[2].value = bond_options_s->str;
+
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+	g_string_free (bond_options_s, TRUE);
+
+	return TRUE;
+}
+
+gboolean
+setting_vlan_details (NMSettingVlan *s_vlan, NmCli *nmc)
+{
+	char *vlan_id_str, *vlan_flags_str, *vlan_ingress_prio_str, *vlan_egress_prio_str;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	g_return_val_if_fail (NM_IS_SETTING_VLAN (s_vlan), FALSE);
+
+	nmc->allowed_fields = nmc_fields_setting_vlan;
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VLAN_ALL, nmc->allowed_fields, NULL);
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+	print_fields (nmc->print_fields, nmc->allowed_fields);  /* Print field names */
+
+	vlan_id_str = g_strdup_printf ("%d", nm_setting_vlan_get_id (s_vlan));
+	vlan_flags_str = vlan_flags_to_string (nm_setting_vlan_get_flags (s_vlan));
+	vlan_ingress_prio_str = vlan_priorities_to_string (s_vlan, NM_VLAN_INGRESS_MAP);
+	vlan_egress_prio_str = vlan_priorities_to_string (s_vlan, NM_VLAN_EGRESS_MAP);
+
+	nmc->allowed_fields[0].value = NM_SETTING_VLAN_SETTING_NAME;
+	nmc->allowed_fields[1].value = nm_setting_vlan_get_interface_name (s_vlan);
+	nmc->allowed_fields[2].value = nm_setting_vlan_get_parent (s_vlan);
+	nmc->allowed_fields[3].value = vlan_id_str;
+	nmc->allowed_fields[4].value = vlan_flags_str;
+	nmc->allowed_fields[5].value = vlan_ingress_prio_str;
+	nmc->allowed_fields[6].value = vlan_egress_prio_str;
+
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+	g_free (vlan_id_str);
+	g_free (vlan_flags_str);
+	g_free (vlan_ingress_prio_str);
+	g_free (vlan_egress_prio_str);
+
+	return TRUE;
+}
+