diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index cd8c358..c386a63 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -4593,6 +4593,7 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
 {
 	struct cmd_show_bonding_config_result *res = parsed_result;
 	int bonding_mode, agg_mode;
+	char bonding_str[BONDING_MODE_STRING_LEN];
 	uint8_t slaves[RTE_MAX_ETHPORTS];
 	int num_slaves, num_active_slaves;
 	int primary_id;
@@ -4600,13 +4601,17 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
 	portid_t port_id = res->port_id;
 
 	/* Display the bonding mode.*/
-	bonding_mode = rte_eth_bond_mode_get(port_id);
-	if (bonding_mode < 0) {
-		printf("\tFailed to get bonding mode for port = %d\n", port_id);
+	if (!rte_eth_bond_mode_string_get(port_id, bonding_str)) {
+		printf("\tFailed to get bonding mode string for port = %d\n", port_id);
 		return;
 	} else
-		printf("\tBonding mode: %d\n", bonding_mode);
+		printf("\tBonding mode: %s\n", bonding_str);
 
+	bonding_mode = rte_eth_bond_mode_get(port_id);
+	if (bonding_mode < 0) {
+		printf("\tFailed to get bonding mode for port = %d\n", port_id);
+		return;	
+	}
 	if (bonding_mode == BONDING_MODE_BALANCE) {
 		int balance_xmit_policy;
 
@@ -4685,13 +4690,15 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
 		printf("\tActive Slaves: []\n");
 
 	}
-
-	primary_id = rte_eth_bond_primary_get(port_id);
-	if (primary_id < 0) {
-		printf("\tFailed to get primary slave for port = %d\n", port_id);
-		return;
-	} else
-		printf("\tPrimary: [%d]\n", primary_id);
+	if (bonding_mode == BONDING_MODE_ACTIVE_BACKUP ||
+		bonding_mode == BONDING_MODE_TLB){
+		primary_id = rte_eth_bond_primary_get(port_id);
+		if (primary_id < 0) {
+			printf("\tFailed to get primary slave for port = %d\n", port_id);
+			return;
+		} else
+			printf("\tPrimary: [%d]\n", primary_id);
+	}
 
 }
 
diff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h
index 8efbf07..c25293a 100644
--- a/drivers/net/bonding/rte_eth_bond.h
+++ b/drivers/net/bonding/rte_eth_bond.h
@@ -117,6 +117,9 @@
 #define BALANCE_XMIT_POLICY_LAYER34		(2)
 /**< Layer 3+4 (IP Addresses + UDP Ports) transmit load balancing */
 
+/* Max length size for bond mode string */
+#define BONDING_MODE_STRING_LEN      (30)
+
 /**
  * Create a bonded rte_eth_dev device
  *
@@ -189,6 +192,18 @@
 rte_eth_bond_mode_get(uint8_t bonded_port_id);
 
 /**
+ * Get link bonding mode string of bonded device
+ *
+ * @param bonded_port_id	Port ID of bonded device.
+ *
+ * @param mode          mode string
+ * @return
+ *	link bonding mode on success, negative value otherwise
+ */
+int
+rte_eth_bond_mode_string_get(uint8_t bonded_port_id, char *mode);
+
+/**
  * Set slave rte_eth_dev as primary slave of bonded device
  *
  * @param bonded_port_id	Port ID of bonded device.
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index de1d9e0..5ba097c 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -510,6 +510,45 @@
 }
 
 int
+rte_eth_bond_mode_string_get(uint8_t bonded_port_id, char *mode)
+{
+	struct bond_dev_private *internals;
+
+	if (valid_bonded_port_id(bonded_port_id) != 0)
+		return -1;
+
+	internals = rte_eth_devices[bonded_port_id].data->dev_private;
+	
+	switch (internals->mode) {
+		case BONDING_MODE_ROUND_ROBIN:
+			memcpy(mode, "round-robin", BONDING_MODE_STRING_LEN);
+			break;
+		case BONDING_MODE_ACTIVE_BACKUP:
+			memcpy(mode, "active-backup", BONDING_MODE_STRING_LEN);
+			break;
+		case BONDING_MODE_BALANCE:
+			memcpy(mode, "link-aggregation", BONDING_MODE_STRING_LEN);
+			break;
+		case BONDING_MODE_BROADCAST:
+			memcpy(mode, "broadcast", BONDING_MODE_STRING_LEN);
+			break;
+		case BONDING_MODE_8023AD:
+			memcpy(mode, "link-aggregation-802.3ad", BONDING_MODE_STRING_LEN);
+			break;
+		case BONDING_MODE_TLB:
+			memcpy(mode, "transmit-load-balancing", BONDING_MODE_STRING_LEN);
+			break;
+		case BONDING_MODE_ALB:
+			memcpy(mode, "adaptive-load-balancing", BONDING_MODE_STRING_LEN);
+			break;
+		default:
+			memcpy(mode, "unknown-mode", BONDING_MODE_STRING_LEN);
+	}
+	
+	return 0;
+}
+
+int
 rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id)
 {
 	struct bond_dev_private *internals;
diff --git a/drivers/net/bonding/rte_eth_bond_version.map b/drivers/net/bonding/rte_eth_bond_version.map
index 0f4e847..c08f60e 100644
--- a/drivers/net/bonding/rte_eth_bond_version.map
+++ b/drivers/net/bonding/rte_eth_bond_version.map
@@ -53,6 +53,7 @@ DPDK_17.08 {
         rte_eth_bond_8023ad_agg_selection_set;
         rte_eth_bond_8023ad_conf_get;
         rte_eth_bond_8023ad_setup;
+        rte_eth_bond_mode_string_get;
 
 
 } DPDK_16.07;
