Index: /branches/rel_apv_10_7/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB.txt
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB.txt	(revision 38697)
+++ /branches/rel_apv_10_7/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB.txt	(working copy)
@@ -5250,6 +5250,12 @@
 		linkUpTime	DisplayString,
 		linkDownTime    DisplayString,
 		linkDownCount	Integer32,
+		linkBandwidIn	DisplayString,
+		linkBandwidOut	DisplayString,
+		linkThresh	DisplayString,
+		linkHits	Integer32,
+		linkConn	Integer32,
+		linkUsage	Integer32,
 		linkDownEvent	DisplayString} 
 linkIndex	OBJECT-TYPE 
 		SYNTAX	       Integer32
@@ -5305,6 +5311,42 @@
 		STATUS	       current
 		DESCRIPTION "Link route down event." 
 		::= { linkStatsEntry 9 } 
+linkBandwidIn   OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Link avg. bandwidth in."
+		::= { linkStatsEntry 10 }
+linkBandwidOut   OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Link avg. bandwidth out."
+		::= { linkStatsEntry 11 }
+linkThresh      OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Link route max threshold."
+		::= { linkStatsEntry 12 }
+linkHits        OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Link route hits."
+		::= { linkStatsEntry 13 }
+linkConn        OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Link route connection."
+		::= { linkStatsEntry 14 }
+linkUsage       OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Link route usage."
+		::= { linkStatsEntry 15 }
 -- End of LLB MIB
 
 ---
Index: /branches/rel_apv_10_7/usr/click/lib/libca_snmp_mib/llbMIB.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libca_snmp_mib/llbMIB.c	(revision 38697)
+++ /branches/rel_apv_10_7/usr/click/lib/libca_snmp_mib/llbMIB.c	(working copy)
@@ -68,6 +68,24 @@
 #define LKDOWNEVENT		9
 {LKDOWNEVENT,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
  var_linkStatusTable, 5,  { 2,1,2,1,9 }},
+#define LKBANDIN		10
+{LKBANDIN,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkStatusTable, 5,  { 2,1,2,1,10 }},
+#define LKBANDOUT		11
+{LKBANDOUT,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkStatusTable, 5,  { 2,1,2,1,11 }},
+#define LKTHRESH		12
+{LKTHRESH,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkStatusTable, 5,  { 2,1,2,1,12 }},
+#define LKHITS		13
+{LKHITS,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkStatusTable, 5,  { 2,1,2,1,13 }},
+#define LKCONN		14
+{LKCONN,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkStatusTable, 5,  { 2,1,2,1,14 }},
+#define LKUSAGE		15
+{LKUSAGE,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkStatusTable, 5,  { 2,1,2,1,15 }},
 };
 
 /** Initializes the llbMIB module */
@@ -218,6 +236,33 @@
             return NULL;            
         } 		
         return (u_char *)string;		
+    case LKBANDIN:
+        *var_len = llb_mib_get_link_bandwidth_in(idx, string, SPRINT_MAX_LEN);
+        if (*var_len == 0) {
+            return NULL;
+        }
+        return (u_char *)string;
+    case LKBANDOUT:
+        *var_len = llb_mib_get_link_bandwidth_out(idx, string, SPRINT_MAX_LEN);
+        if (*var_len == 0) {
+            return NULL;
+        }
+        return (u_char *)string;
+    case LKTHRESH:
+        *var_len = llb_mib_get_link_threshold(idx, string, SPRINT_MAX_LEN);
+        if (*var_len == 0) {
+            return NULL;
+        }
+        return (u_char *)string;
+    case LKHITS:
+        long_ret = llb_mib_get_link_hits(idx);
+        return (u_char *)&long_ret;
+    case LKCONN:
+        long_ret = llb_mib_get_link_connection(idx);
+        return (u_char *)&long_ret;
+    case LKUSAGE:
+        long_ret = llb_mib_get_link_usage(idx);
+        return (u_char *)&long_ret;
     default:
       ERROR_MSG("");
     }
Index: /branches/rel_apv_10_7/usr/click/lib/libkernelapi/addCommands.pm
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libkernelapi/addCommands.pm	(revision 38697)
+++ /branches/rel_apv_10_7/usr/click/lib/libkernelapi/addCommands.pm	(working copy)
@@ -2698,6 +2698,41 @@
     },
     {
         cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
+        function_name => "llb_get_link_avg_bandwidth_in_kern",
+	function_args => [
+            {type => "STRING"},
+	],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
+        function_name => "llb_get_link_avg_bandwidth_out_kern",
+	function_args => [
+            {type => "STRING"},
+	],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
+        function_name => "llb_get_link_connection_kern",
+	function_args => [
+            {type => "STRING"},
+	],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
+        function_name => "llb_get_link_hits_kern",
+	function_args => [
+            {type => "STRING"},
+	],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
+        function_name => "llb_get_link_max_bandwidth_kern",
+	function_args => [
+            {type => "STRING"},
+	],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
         function_name => "llb_clear_stat_kern",
 	function_args => [
             {type => "STRING"},
Index: /branches/rel_apv_10_7/usr/click/lib/libllb_hc/llb_snmp.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libllb_hc/llb_snmp.h	(revision 38697)
+++ /branches/rel_apv_10_7/usr/click/lib/libllb_hc/llb_snmp.h	(working copy)
@@ -3,6 +3,9 @@
 
 long llb_mib_get_link_count(void);
 long llb_mib_get_link_down_count(int id); 
+long llb_mib_get_link_hits(int id);
+long llb_mib_get_link_connection(int id);
+long llb_mib_get_link_usage(int id);
 
 int llb_mib_get_link_name(int id, char *buf, int len);
 int llb_mib_get_link_gateway(int id, char *buf, int len);
@@ -11,6 +14,9 @@
 int llb_mib_get_link_up_time(int id, char *buf, int len);
 int llb_mib_get_link_down_time(int id, char *buf, int len);
 int llb_mib_get_link_down_event(int id, char *buf, int len);
+int llb_mib_get_link_bandwidth_in(int id, char *buf, int len);
+int llb_mib_get_link_bandwidth_out(int id, char *buf, int len);
+int llb_mib_get_link_threshold(int id, char *buf, int len);
 
 
 #endif 
Index: /branches/rel_apv_10_7/usr/click/lib/libllb_hc/llb_snmp.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libllb_hc/llb_snmp.c	(revision 38697)
+++ /branches/rel_apv_10_7/usr/click/lib/libllb_hc/llb_snmp.c	(working copy)
@@ -10,6 +10,7 @@
 #include <stdarg.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <limits.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -239,6 +240,116 @@
 	return idx;
 }
 
+int llb_mib_get_link_bandwidth_in(int id, char *buf, int len)
+{
+	int lk_id;
+	uint64_t bandwidth;
 
-	
+	if ((lk_id = get_nth_link(id)) < 0) {
+		return 0;
+	}
+
+	/* We will get the return values converted to kbps
+	 * if bps value is greater than INT_MAX to prevent overflow
+	 */
+	bandwidth = (uint64_t)llb_get_link_avg_bandwidth_in_kern(llb_mib_config->link[lk_id].name);
+	if (bandwidth*1024 > INT_MAX) {
+		return snprintf(buf, len, "%llukbps", bandwidth);
+	}
+	return snprintf(buf, len, "%llubps", bandwidth);
+}
+
+int llb_mib_get_link_bandwidth_out(int id, char *buf, int len)
+{
+	int lk_id;
+	uint64_t bandwidth;
+
+	if ((lk_id = get_nth_link(id)) < 0) {
+		return 0;
+	}
+
+	/* We will get the return values converted to kbps
+	 * if bps value is greater than INT_MAX to prevent overflow
+	 */
+	bandwidth = (uint64_t)llb_get_link_avg_bandwidth_out_kern(llb_mib_config->link[lk_id].name);
+	if (bandwidth*1024 > INT_MAX) {
+		return snprintf(buf, len, "%llukbps", bandwidth);
+	}
+	return snprintf(buf, len, "%llubps", bandwidth);
+}
+
+int llb_mib_get_link_threshold(int id, char *buf, int len)
+{
+	int lk_id;
+	uint64_t max_bandwidth;
+
+	if ((lk_id = get_nth_link(id)) < 0) {
+		return 0;
+	}
+
+	max_bandwidth = (uint64_t)llb_get_link_max_bandwidth_kern(llb_mib_config->link[lk_id].name);
+	if (max_bandwidth*1024 > INT_MAX) {
+		return snprintf(buf, len, "%llukbps", max_bandwidth);
+	}
+	return snprintf(buf, len, "%llubps", max_bandwidth);
+}
 
+long llb_mib_get_link_hits(int id)
+{
+	int lk_id;
+
+	if ((lk_id = get_nth_link(id)) < 0) {
+		return 0;
+	}
+
+	return (uint64_t)llb_get_link_hits_kern(llb_mib_config->link[lk_id].name);
+}
+
+long llb_mib_get_link_connection(int id)
+{
+	int lk_id;
+
+	if ((lk_id = get_nth_link(id)) < 0) {
+		return 0;
+	}
+
+	return (uint32_t)llb_get_link_connection_kern(llb_mib_config->link[lk_id].name);
+}
+
+long llb_mib_get_link_usage(int id)
+{
+	uint64_t bandwidth_in = 0;
+	uint64_t bandwidth_out = 0;
+	uint64_t llb_max_bandwidth = 0;
+	uint32_t usage = 0;
+	int lk_id;
+
+	if ((lk_id = get_nth_link(id)) < 0) {
+		return 0;
+	}
+
+	/* We will get the return values converted to kbps
+	 * if bps value is greater than INT_MAX to prevent overflow
+	 */
+	bandwidth_in = (uint64_t)llb_get_link_avg_bandwidth_in_kern(llb_mib_config->link[lk_id].name);
+	/* check if return value been converted to kbps and
+	 * convert back to bps unit
+	 */
+	if (bandwidth_in * 1024 > INT_MAX) {
+		bandwidth_in*=1024;
+	}
+	bandwidth_out = (uint64_t)llb_get_link_avg_bandwidth_out_kern(llb_mib_config->link[lk_id].name);
+	if (bandwidth_out * 1024 > INT_MAX) {
+		bandwidth_out*=1024;
+	}
+	llb_max_bandwidth = (uint64_t)llb_get_link_max_bandwidth_kern(llb_mib_config->link[lk_id].name);
+	if (llb_max_bandwidth * 1024 > INT_MAX) {
+		llb_max_bandwidth*=1024;
+	}
+	if (bandwidth_in > bandwidth_out) {
+		usage = bandwidth_in * 100 / llb_max_bandwidth;
+	} else {
+		usage = bandwidth_out * 100 / llb_max_bandwidth;
+	}
+	return (uint32_t)usage;
+}
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/llb/llb_hc.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/llb/llb_hc.c	(revision 38697)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/llb/llb_hc.c	(working copy)
@@ -29,6 +29,7 @@
 #include <sys/pcpu.h>
 #include <sys/smp.h>
 #include <sys/sbuf.h>
+#include <sys/limits.h>
 
 #include <net/if.h>
 #include <net/if_types.h>
@@ -2367,6 +2368,90 @@
 	}
 	return llb_max_bandwidth;
 }
+
+int
+llb_get_link_avg_bandwidth_in_kern(void *pcb, char *link_name)
+{
+	struct llb_link* link_node;
+	uint64_t bandwidth = 0;
+
+	link_node = search_hc_by_name(&link_queue, link_name);
+	if (!link_node) {
+		return 0;
+	}
+
+	bandwidth = llb_get_link_avg_bandwidth_in(link_node);
+	if (bandwidth > INT_MAX) {
+		bandwidth/=1024;
+	}
+	return (int)bandwidth;
+}
+
+int
+llb_get_link_avg_bandwidth_out_kern(void *pcb, char *link_name)
+{
+	struct llb_link* link_node;
+	uint64_t bandwidth = 0;
+
+	link_node = search_hc_by_name(&link_queue, link_name);
+	if(!link_node){
+		return 0;
+	}
+
+	bandwidth = llb_get_link_avg_bandwidth_out(link_node);
+	if (bandwidth > INT_MAX) {
+		bandwidth/=1024;
+	}
+	return (int)bandwidth;
+}
+
+int
+llb_get_link_connection_kern(void *pcb, char *link_name)
+{
+	struct llb_link* link_node;
+	uint64_t conn;
+
+	link_node = search_hc_by_name(&link_queue, link_name);
+	if (!link_node) {
+		return 0;
+	}
+
+	conn = llb_get_link_connection(link_node);
+	return (int)conn;
+}
+
+int
+llb_get_link_hits_kern(void *pcb, char *link_name)
+{
+	struct llb_link* link_node;
+	uint32_t hits = 0;
+
+	link_node = search_hc_by_name(&link_queue, link_name);
+	if (!link_node) {
+		return 0;
+	}
+
+	hits = llb_get_link_hits(link_node);
+	return (int)hits;
+}
+
+int
+llb_get_link_max_bandwidth_kern(void *pcb, char *link_name)
+{
+	struct llb_link* link_node;
+	uint64_t llb_max_bandwidth = 0;
+
+	link_node = search_hc_by_name(&link_queue, link_name);
+	if (!link_node) {
+		return 0;
+	}
+
+	llb_max_bandwidth = llb_get_link_max_bandwidth(link_node);
+	if (llb_max_bandwidth > INT_MAX) {
+		llb_max_bandwidth/=1024;
+	}
+	return llb_max_bandwidth;
+}
 
 
 ca_errcode_t
