Index: /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB.txt
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB.txt	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB.txt	(working copy)
@@ -5233,6 +5233,10 @@
 llbStats		OBJECT IDENTIFIER ::= { llb 2 }
 linkStats		OBJECT IDENTIFIER ::= { llbStats 1 }
 natStats		OBJECT IDENTIFIER ::= { llbStats 2 }
+linkRtsStats		OBJECT IDENTIFIER ::= { llbStats 3 }
+linkRTS			OBJECT IDENTIFIER ::= { llbStats 4 }
+linkRtsStatsV6		OBJECT IDENTIFIER ::= { llbStats 5 }
+linkRTSV6		OBJECT IDENTIFIER ::= { llbStats 6 }
 
 linkCount	OBJECT-TYPE
 		SYNTAX		Integer32
@@ -5437,6 +5441,220 @@
                 DESCRIPTION "Destination port of this connection"
                 ::= { natStatsEntry 7 }
 
+linkRtsOvf	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts overflow deleted."
+		::= { linkRtsStats 1 }
+linkRtsLkp	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The total number of rts hits."
+		::= { linkRtsStats 2 }
+linkRtsEgw	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of ERT gateway matched."
+		::= { linkRtsStats 3 }
+linkRtsHgw	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of unknown gateway matched."
+		::= { linkRtsStats 4 }
+
+linkRtsNon	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway in gateway mode."
+		::= { linkRtsStats 5 }
+linkRtsAlloc	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway allocation."
+		::= { linkRtsStats 6 }
+
+linkRtsCount	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts entries."
+		::= { linkRtsStats 7 }
+linkRTSTable	OBJECT-TYPE
+		SYNTAX		SEQUENCE OF LinkRTSEntry
+		MAX-ACCESS	not-accessible
+		STATUS          current
+		DESCRIPTION "RTS table."
+		::= { linkRTS 1 }
+linkRTSEntry    OBJECT-TYPE
+		SYNTAX		LinkRTSEntry
+		MAX-ACCESS	not-accessible
+		STATUS		current
+		DESCRIPTION "A linkRTSTable entry containing status for one rts entry."
+		INDEX  { lkRTSIdx }
+		::= { linkRTSTable 1 }
+LinkRTSEntry       ::= SEQUENCE {
+		lkRtsIdx        Integer32,
+		lkRtsSip        DisplayString,
+		lkRtsDip        DisplayString,
+		lkRtsGip        DisplayString,
+		lkRtsMac        DisplayString,
+		lkRtsIfname	DisplayString,
+		lkRtsHits	Integer32}
+lkRtsIdx	OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Reference index for each link being checked."
+		::= { linkRTSEntry 1 }
+lkRtsSip        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Source IP in RTS entry."
+		::= { linkRTSEntry 2 }
+lkRtsDip        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Destination IP in RTS entry."
+		::= { linkRTSEntry 3 }
+lkRtsGip        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Gateway IP in RTS entry."
+		::= { linkRTSEntry 4 }
+lkRtsMac        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "MAC address in RTS entry"
+		::= { linkRTSEntry 5 }
+lkRtsIfname     OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Interface name in RTS entry"
+		::= { linkRTSEntry 6 }
+lkRtsHits       OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Hit count of the RTS entry."
+		::= { linkRTSEntry 7 }
+linkRtsOvfV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts overflow deleted (IPV6)."
+		::= { linkRtsStatsV6 1 }
+linkRtsLkpV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The total number of rts hits (IPV6)."
+		::= { linkRtsStatsV6 2 }
+linkRtsEgwV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of ERT gateway matched (IPV6)."
+		::= { linkRtsStatsV6 3 }
+linkRtsHgwV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of unknown gateway matched (IPV6)."
+		::= { linkRtsStatsV6 4 }
+linkRtsNonV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway in gateway mode (IPV6)."
+		::= { linkRtsStatsV6 5 }
+linkRtsAllocV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway allocation (IPV6)."
+		::= { linkRtsStatsV6 6 }
+
+linkRtsCountV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts entries (IPV6)."
+		::= { linkRtsStatsV6 7 }
+linkRTSTableV6	OBJECT-TYPE
+		SYNTAX		SEQUENCE OF LinkRTSEntryV6
+		MAX-ACCESS	not-accessible
+		STATUS          current
+		DESCRIPTION "RTS table (IPV6)."
+		::= { linkRTSV6 1 }
+linkRTSEntryV6    OBJECT-TYPE
+		SYNTAX		LinkRTSEntryV6
+		MAX-ACCESS	not-accessible
+		STATUS		current
+		DESCRIPTION "A linkRTSTableV6 entry containing status for IPV6 rts entry."
+		INDEX  { lkRTSIdx }
+		::= { linkRTSTableV6 1 }
+LinkRTSEntryV6       ::= SEQUENCE {
+		lkRtsIdxV6        Integer32,
+		lkRtsSipV6        DisplayString,
+		lkRtsDipV6        DisplayString,
+		lkRtsGipV6        DisplayString,
+		lkRtsMacV6        DisplayString,
+		lkRtsIfnameV6     DisplayString,
+		lkRtsHitsV6	  Integer32}
+lkRtsIdxV6	OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Reference index for each link being checked."
+		::= { linkRTSEntryV6 1 }
+lkRtsSipV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Source IP in IPV6 rts entry."
+		::= { linkRTSEntryV6 2 }
+lkRtsDipV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Destination IP in IPV6 rts entry."
+		::= { linkRTSEntryV6 3 }
+lkRtsGipV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Gateway IP in IPV6 rts entry."
+		::= { linkRTSEntryV6 4 }
+lkRtsMacV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "MAC address in IPV6 rts entry."
+		::= { linkRTSEntryV6 5 }
+lkRtsIfnameV6     OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Interface name in IPV6 rts entry."
+		::= { linkRTSEntryV6 6 }
+lkRtsHitsV6       OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Hit count of the IPV6 RTS entry."
+		::= { linkRTSEntryV6 7 }
+
 -- End of LLB MIB
 
 ---
Index: /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB_foreign.txt
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB_foreign.txt	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/CA-SNMP-MIB_foreign.txt	(working copy)
@@ -5224,6 +5224,11 @@
 --llbGeneral		OBJECT IDENTIFIER ::= { llb 1 } 
 llbStats		OBJECT IDENTIFIER ::= { llb 2 } 
 linkStats		OBJECT IDENTIFIER ::= { llbStats 1 }
+natStats                OBJECT IDENTIFIER ::= { llbStats 2 }
+linkRtsStats		OBJECT IDENTIFIER ::= { llbStats 3 }
+linkRTS			OBJECT IDENTIFIER ::= { llbStats 4 }
+linkRtsStatsV6		OBJECT IDENTIFIER ::= { llbStats 5 }
+linkRTSV6		OBJECT IDENTIFIER ::= { llbStats 6 }
 
 linkCount	OBJECT-TYPE 
 		SYNTAX		Integer32 	
@@ -5350,6 +5355,298 @@
 		STATUS	       current
 		DESCRIPTION "Link route usage."
 		::= { linkStatsEntry 15 }
+
+natStatsCount   OBJECT-TYPE
+                SYNTAX          Integer32
+                MAX-ACCESS      read-only
+                STATUS          current
+                DESCRIPTION "The number of natted connections."
+                ::= { natStats 1 }
+natStatsTable   OBJECT-TYPE
+                SYNTAX          SEQUENCE OF natStatsEntry
+                MAX-ACCESS      not-accessible
+                STATUS          current
+                DESCRIPTION "NAT connection table."
+                ::= { natStats 2 }
+natStatsEntry  OBJECT-TYPE
+                SYNTAX          natStatsEntry
+                MAX-ACCESS      not-accessible
+                STATUS          current
+                DESCRIPTION "A natStatsTable entry containing information for one natted connection."
+                INDEX  { natIndex }
+                ::= { natStatsTable 1 }
+natStatsEntry       ::= SEQUENCE {
+                natIndex       Integer32,
+                natSourceIP    DisplayString,
+                natLocalIP     DisplayString,
+                natTargetIP    DisplayString,
+                natSourcePort  INTEGER,
+                natLocalPort   INTEGER,
+                natTargetPort  INTEGER}
+
+natIndex        OBJECT-TYPE
+                SYNTAX         Integer32
+                MAX-ACCESS     read-only
+                STATUS         current
+                DESCRIPTION "A unique value for each natted connection."
+                ::= { natStatsEntry 1 }
+
+natSourceIP     OBJECT-TYPE
+                SYNTAX         DisplayString
+                MAX-ACCESS     read-only
+                STATUS         current
+                DESCRIPTION "Source IP of this connection to be natted"
+                ::= { natStatsEntry 2 }
+
+natLocalIP      OBJECT-TYPE
+                SYNTAX         DisplayString
+                MAX-ACCESS     read-only
+                STATUS         current
+                DESCRIPTION "NAT IP of this connection"
+                ::= { natStatsEntry 3 }
+
+natTargetIP     OBJECT-TYPE
+                SYNTAX         DisplayString
+                MAX-ACCESS     read-only
+                STATUS         current
+                DESCRIPTION "Destination IP of this connection"
+                ::= { natStatsEntry 4 }
+
+natSourcePort   OBJECT-TYPE
+                SYNTAX              INTEGER(0..65535)
+                MAX-ACCESS          read-only
+                STATUS              current
+                DESCRIPTION "Source port of this connection to be natted"
+                ::= { natStatsEntry 5 }
+
+natLocalPort    OBJECT-TYPE
+                SYNTAX              INTEGER(0..65535)
+                MAX-ACCESS          read-only
+                STATUS              current
+                DESCRIPTION "NAT port of this connection"
+                ::= { natStatsEntry 6 }
+
+natTargetPort   OBJECT-TYPE
+                SYNTAX              INTEGER(0..65535)
+                MAX-ACCESS          read-only
+                STATUS              current
+                DESCRIPTION "Destination port of this connection"
+                ::= { natStatsEntry 7 }
+
+linkRtsOvf	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts overflow deleted."
+		::= { linkRtsStats 1 }
+linkRtsLkp	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The total number of rts hits."
+		::= { linkRtsStats 2 }
+linkRtsEgw	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of ERT gateway matched."
+		::= { linkRtsStats 3 }
+linkRtsHgw	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of unknown gateway matched."
+		::= { linkRtsStats 4 }
+
+linkRtsNon	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway in gateway mode."
+		::= { linkRtsStats 5 }
+linkRtsAlloc	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway allocation."
+		::= { linkRtsStats 6 }
+
+linkRtsCount	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts entries."
+		::= { linkRtsStats 7 }
+linkRTSTable	OBJECT-TYPE
+		SYNTAX		SEQUENCE OF LinkRTSEntry
+		MAX-ACCESS	not-accessible
+		STATUS          current
+		DESCRIPTION "RTS table."
+		::= { linkRTS 1 }
+linkRTSEntry    OBJECT-TYPE
+		SYNTAX		LinkRTSEntry
+		MAX-ACCESS	not-accessible
+		STATUS		current
+		DESCRIPTION "A linkRTSTable entry containing status for one rts entry."
+		INDEX  { lkRTSIdx }
+		::= { linkRTSTable 1 }
+LinkRTSEntry       ::= SEQUENCE {
+		lkRtsIdx        Integer32,
+		lkRtsSip        DisplayString,
+		lkRtsDip        DisplayString,
+		lkRtsGip        DisplayString,
+		lkRtsMac        DisplayString,
+		lkRtsIfname	DisplayString,
+		lkRtsHits	Integer32}
+lkRtsIdx	OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Reference index for each link being checked."
+		::= { linkRTSEntry 1 }
+lkRtsSip        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Source IP in RTS entry."
+		::= { linkRTSEntry 2 }
+lkRtsDip        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Destination IP in RTS entry."
+		::= { linkRTSEntry 3 }
+lkRtsGip        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Gateway IP in RTS entry."
+		::= { linkRTSEntry 4 }
+lkRtsMac        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "MAC address in RTS entry"
+		::= { linkRTSEntry 5 }
+lkRtsIfname     OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Interface name in RTS entry"
+		::= { linkRTSEntry 6 }
+lkRtsHits       OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Hit count of the RTS entry."
+		::= { linkRTSEntry 7 }
+linkRtsOvfV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts overflow deleted (IPV6)."
+		::= { linkRtsStatsV6 1 }
+linkRtsLkpV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The total number of rts hits (IPV6)."
+		::= { linkRtsStatsV6 2 }
+linkRtsEgwV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of ERT gateway matched (IPV6)."
+		::= { linkRtsStatsV6 3 }
+linkRtsHgwV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of unknown gateway matched (IPV6)."
+		::= { linkRtsStatsV6 4 }
+linkRtsNonV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway in gateway mode (IPV6)."
+		::= { linkRtsStatsV6 5 }
+linkRtsAllocV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of failed for unknown gateway allocation (IPV6)."
+		::= { linkRtsStatsV6 6 }
+
+linkRtsCountV6	OBJECT-TYPE
+		SYNTAX		Integer32
+		MAX-ACCESS	read-only
+		STATUS		current
+		DESCRIPTION "The number of rts entries (IPV6)."
+		::= { linkRtsStatsV6 7 }
+linkRTSTableV6	OBJECT-TYPE
+		SYNTAX		SEQUENCE OF LinkRTSEntryV6
+		MAX-ACCESS	not-accessible
+		STATUS          current
+		DESCRIPTION "RTS table (IPV6)."
+		::= { linkRTSV6 1 }
+linkRTSEntryV6    OBJECT-TYPE
+		SYNTAX		LinkRTSEntryV6
+		MAX-ACCESS	not-accessible
+		STATUS		current
+		DESCRIPTION "A linkRTSTableV6 entry containing status for IPV6 rts entry."
+		INDEX  { lkRTSIdx }
+		::= { linkRTSTableV6 1 }
+LinkRTSEntryV6       ::= SEQUENCE {
+		lkRtsIdxV6        Integer32,
+		lkRtsSipV6        DisplayString,
+		lkRtsDipV6        DisplayString,
+		lkRtsGipV6        DisplayString,
+		lkRtsMacV6        DisplayString,
+		lkRtsIfnameV6     DisplayString,
+		lkRtsHitsV6	  Integer32}
+lkRtsIdxV6	OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Reference index for each link being checked."
+		::= { linkRTSEntryV6 1 }
+lkRtsSipV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Source IP in IPV6 rts entry."
+		::= { linkRTSEntryV6 2 }
+lkRtsDipV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Destination IP in IPV6 rts entry."
+		::= { linkRTSEntryV6 3 }
+lkRtsGipV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Gateway IP in IPV6 rts entry."
+		::= { linkRTSEntryV6 4 }
+lkRtsMacV6        OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "MAC address in IPV6 rts entry."
+		::= { linkRTSEntryV6 5 }
+lkRtsIfnameV6     OBJECT-TYPE
+		SYNTAX	       DisplayString
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Interface name in IPV6 rts entry."
+		::= { linkRTSEntryV6 6 }
+lkRtsHitsV6       OBJECT-TYPE
+		SYNTAX	       Integer32
+		MAX-ACCESS     read-only
+		STATUS	       current
+		DESCRIPTION "Hit count of the IPV6 RTS entry."
+		::= { linkRTSEntryV6 7 }
+
 -- End of LLB MIB
 ---
 --- The statistics of arrayNetworks' orchestrator MIB
Index: /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/llbMIB.h
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/llbMIB.h	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/llbMIB.h	(working copy)
@@ -11,5 +11,10 @@
 FindVarMethod var_linkStatusTable;
 FindVarMethod var_natTableCount;
 FindVarMethod var_natTable;
+FindVarMethod var_llbRtsStats;
+FindVarMethod var_linkRTSTable;
+FindVarMethod var_llbRtsStatsV6;
+FindVarMethod var_linkRTSTableV6;
+
 #endif /* LLBMIB_H */
 
Index: /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/llbMIB.c
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/llbMIB.c	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libca_snmp_mib/llbMIB.c	(working copy)
@@ -111,6 +111,95 @@
 #define NATTARGETPORT   7
 {NATTARGETPORT, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
  var_natTable, 5, { 2,2,2,1,7 }},
+#define LKRTSOVF		1
+{LKRTSOVF,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,1 }},
+#define LKRTSLOKP		2
+{LKRTSLOKP,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,2 }},
+#define LKRTSEGW		3
+{LKRTSEGW,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,3 }},
+#define LKRTSHGW		4
+{LKRTSHGW,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,4 }},
+#define LKRTSNON		5
+{LKRTSNON,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,5 }},
+#define LKRTSALLOC		6
+{LKRTSALLOC,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,6 }},
+
+#define LKRTSCOUNT		7
+{LKRTSCOUNT,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStats, 3,  { 2,3,7 }},
+
+#define LKRTSIDX		1
+{LKRTSIDX,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,1 }},
+#define LKRTSSIP		2
+{LKRTSSIP,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,2 }},
+#define LKRTSDIP		3
+{LKRTSDIP,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,3 }},
+#define LKRTSGIP		4
+{LKRTSGIP,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,4 }},
+#define LKRTSMAC		5
+{LKRTSMAC,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,5 }},
+#define LKRTSINF		6
+{LKRTSINF,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,6 }},
+#define LKRTSHITS		7
+{LKRTSHITS,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTable, 5,  { 2,4,1,1,7 }},
+
+#define LKRTSOVFV6		1
+{LKRTSOVFV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,1 }},
+#define LKRTSLOKPV6		2
+{LKRTSLOKPV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,2 }},
+#define LKRTSEGWV6		3
+{LKRTSEGWV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,3 }},
+#define LKRTSHGWV6		4
+{LKRTSHGWV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,4 }},
+#define LKRTSNONV6		5
+{LKRTSNONV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,5 }},
+#define LKRTSALLOCV6		6
+{LKRTSALLOCV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,6 }},
+
+#define LKRTSCOUNTV6		7
+{LKRTSCOUNTV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_llbRtsStatsV6, 3,  { 2,5,7 }},
+
+#define LKRTSIDXV6		1
+{LKRTSIDXV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,1 }},
+#define LKRTSSIPV6		2
+{LKRTSSIPV6,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,2 }},
+#define LKRTSDIPV6		3
+{LKRTSDIPV6,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,3 }},
+#define LKRTSGIPV6		4
+{LKRTSGIPV6,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,4 }},
+#define LKRTSMACV6		5
+{LKRTSMACV6,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,5 }},
+#define LKRTSINFV6		6
+{LKRTSINFV6,  ASN_OCTET_STR,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,6 }},
+#define LKRTSHITSV6		7
+{LKRTSHITSV6,  ASN_INTEGER,  NETSNMP_OLDAPI_RONLY,
+ var_linkRTSTableV6, 5,  { 2,6,1,1,7 }},
 };
 
 /** Initializes the llbMIB module */
@@ -406,4 +495,304 @@
     return NULL;
 }
 
+unsigned char *
+var_llbRtsStats(struct variable *vp,
+			oid     *name,
+			size_t  *length,
+			int     exact,
+			size_t  *var_len,
+			WriteMethod **write_method)
+{
+	/* variables we may use later */
+	static long long_ret;
+	static u_long ulong_ret;
+	static unsigned char string[SPRINT_MAX_LEN];
+	static oid objid[MAX_OID_LEN];
+	static struct counter64 c64;
+	int isipv6 = 0;
+
+	if (header_generic(vp,name,length,exact,var_len,write_method)
+			== MATCH_FAILED )
+		return NULL;
+
+	out_rts_tblstat *tmpdata = NULL;
+	out_rts_tblstat outdata;
+	int len;
+
+	bzero(&outdata, sizeof(out_rts_tblstat));
+	out_rts_table_kern((void **)&tmpdata, &len, 0, isipv6);
+	if (tmpdata != NULL) {
+		bcopy(tmpdata, &outdata, sizeof(out_rts_tblstat));
+		free(tmpdata);
+	}
+	/*
+	 * this is where we do the value assignments for the mib results.
+	 */
+	switch (vp->magic) {
+		case LKRTSOVF:
+			long_ret = outdata.rts_overflow_num[isipv6];
+			return (u_char *)&long_ret;
+		case LKRTSLOKP:
+			long_ret = outdata.rts_lokp;
+			return (u_char *)&long_ret;
+		case LKRTSEGW:
+			long_ret = outdata.match_egw_match;
+			return (u_char *)&long_ret;
+		case LKRTSHGW:
+			long_ret = outdata.match_hgw_match;
+			return (u_char *)&long_ret;
+		case LKRTSNON:
+			long_ret = outdata.match_non;
+			return (u_char *)&long_ret;
+		case LKRTSALLOC:
+			long_ret = outdata.match_hgw_fail;
+			return (u_char *)&long_ret;
+		case LKRTSCOUNT:
+			long_ret = rts_table_count(isipv6);
+			return (u_char *)&long_ret;
+		default:
+			ERROR_MSG("");
+	}
+	return NULL;
+}
+
+unsigned char *
+var_linkRTSTable(struct variable *vp,
+			oid     *name,
+			size_t  *length,
+			int     exact,
+			size_t  *var_len,
+			WriteMethod **write_method)
+{
+	/* variables we may use later */
+	static long long_ret;
+	static unsigned char string[SPRINT_MAX_LEN];
+	static oid objid[MAX_OID_LEN];
+	static struct counter64 c64;
+	int idx, lkcount;
+	int isipv6 = 0;
+
+	/*
+	 * This assumes that the table is a 'simple' table.
+	 *	See the implementation documentation for the meaning of this.
+	 *	You will need to provide the correct value for the TABLE_SIZE parameter
+	 *
+	 * If this table does not meet the requirements for a simple table,
+	 *	you will need to provide the replacement code yourself.
+	 *	Mib2c is not smart enough to write this for you.
+	 *    Again, see the implementation documentation for what is required.
+	 */
+
+	lkcount = rts_table_count(isipv6) ;
+	if (header_simple_table(vp,name,length,exact,var_len,write_method, lkcount)
+			== MATCH_FAILED )
+		return NULL;
+
+	idx = name[*length - 1];
+
+	out_rts_tblstat *tmpdata = NULL;
+	out_rts_tblstat outdata;
+	int out_len;
+
+	bzero(&outdata, sizeof(out_rts_tblstat));
+	out_rts_table_kern((void **)&tmpdata, &out_len, idx, isipv6);
+	if (tmpdata != NULL) {
+		bcopy(tmpdata, &outdata, sizeof(out_rts_tblstat));
+		free(tmpdata);
+	}
+	/*
+	 * this is where we do the value assignments for the mib results.
+	 */
+	switch (vp->magic) {
+		case LKRTSIDX:
+			long_ret = idx;
+			return (u_char *)&long_ret;
+		case LKRTSSIP:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.sip);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSDIP:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.dip);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSGIP:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.gip);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSMAC:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.mac);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSINF:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.ifname);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;;
+		case LKRTSHITS:
+			long_ret = outdata.update_rts.hits;
+			return (u_char *)&long_ret;
+		default:
+			ERROR_MSG("");
+	}
+	return NULL;
+}
 
+unsigned char *
+var_llbRtsStatsV6(struct variable *vp,
+			oid     *name,
+			size_t  *length,
+			int     exact,
+			size_t  *var_len,
+			WriteMethod **write_method)
+{
+	/* variables we may use later */
+	static long long_ret;
+	static u_long ulong_ret;
+	static unsigned char string[SPRINT_MAX_LEN];
+	static oid objid[MAX_OID_LEN];
+	static struct counter64 c64;
+	int isipv6 = 1;
+
+	if (header_generic(vp,name,length,exact,var_len,write_method)
+			== MATCH_FAILED )
+		return NULL;
+
+	out_rts_tblstat *tmpdata = NULL;
+	out_rts_tblstat outdata;
+	int len;
+
+	bzero(&outdata, sizeof(out_rts_tblstat));
+	out_rts_table_kern((void **)&tmpdata, &len, 0, isipv6);
+	if (tmpdata != NULL) {
+		bcopy(tmpdata, &outdata, sizeof(out_rts_tblstat));
+		free(tmpdata);
+	}
+	/*
+	 * this is where we do the value assignments for the mib results.
+	 */
+	switch (vp->magic) {
+		case LKRTSOVFV6:
+			long_ret = outdata.rts_overflow_num[isipv6];
+			return (u_char *)&long_ret;
+		case LKRTSLOKPV6:
+			long_ret = outdata.rts_lokp;
+			return (u_char *)&long_ret;
+		case LKRTSEGWV6:
+			long_ret = outdata.match_egw_match;
+			return (u_char *)&long_ret;
+		case LKRTSHGWV6:
+			long_ret = outdata.match_hgw_match;
+			return (u_char *)&long_ret;
+		case LKRTSNONV6:
+			long_ret = outdata.match_non;
+			return (u_char *)&long_ret;
+		case LKRTSALLOCV6:
+			long_ret = outdata.match_hgw_fail;
+			return (u_char *)&long_ret;
+		case LKRTSCOUNTV6:
+			long_ret = rts_table_count(isipv6);
+			return (u_char *)&long_ret;
+		default:
+			ERROR_MSG("");
+	}
+	return NULL;
+}
+
+unsigned char *
+var_linkRTSTableV6(struct variable *vp,
+			oid     *name,
+			size_t  *length,
+			int     exact,
+			size_t  *var_len,
+			WriteMethod **write_method)
+{
+	/* variables we may use later */
+	static long long_ret;
+	static unsigned char string[SPRINT_MAX_LEN];
+	static oid objid[MAX_OID_LEN];
+	static struct counter64 c64;
+	int idx, lkcount;
+	int isipv6 = 1;
+
+	/*
+	 * This assumes that the table is a 'simple' table.
+	 *	See the implementation documentation for the meaning of this.
+	 *	You will need to provide the correct value for the TABLE_SIZE parameter
+	 *
+	 * If this table does not meet the requirements for a simple table,
+	 *	you will need to provide the replacement code yourself.
+	 *	Mib2c is not smart enough to write this for you.
+	 *    Again, see the implementation documentation for what is required.
+	 */
+
+	lkcount = rts_table_count(isipv6) ;
+	if (header_simple_table(vp,name,length,exact,var_len,write_method, lkcount)
+			== MATCH_FAILED )
+		return NULL;
+
+	idx = name[*length - 1];
+
+	out_rts_tblstat *tmpdata = NULL;
+	out_rts_tblstat outdata;
+	int out_len;
+
+	bzero(&outdata, sizeof(out_rts_tblstat));
+	out_rts_table_kern((void **)&tmpdata, &out_len, idx, isipv6);
+	if (tmpdata != NULL) {
+		bcopy(tmpdata, &outdata, sizeof(out_rts_tblstat));
+		free(tmpdata);
+	}
+	/*
+	 * this is where we do the value assignments for the mib results.
+	 */
+	switch (vp->magic) {
+		case LKRTSIDXV6:
+			long_ret = idx;
+			return (u_char *)&long_ret;
+		case LKRTSSIPV6:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.sip6);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSDIPV6:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.dip6);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSGIPV6:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.gip6);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSMACV6:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.mac);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;
+		case LKRTSINFV6:
+			*var_len = snprintf(string, SPRINT_MAX_LEN, "%s", outdata.update_rts.ifname);
+			if (*var_len == 0) {
+				return NULL;
+			}
+			return (u_char *)string;;
+		case LKRTSHITSV6:
+			long_ret = outdata.update_rts.hits;
+			return (u_char *)&long_ret;
+		default:
+			ERROR_MSG("");
+	}
+	return NULL;
+}
Index: /branches/rel_apv_10_7_4/usr/click/lib/libip/sip.c
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libip/sip.c	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libip/sip.c	(working copy)
@@ -19418,6 +19418,7 @@
     size_t len;
     int num;
 	int num2;
+    int limit;
 
     len = 4;
     if (sysctlbyname("net.inet.ip.rts_enable", &num, &len, NULL, 0)) {
@@ -19445,7 +19446,10 @@
 	return -1;
     }
 
-    printf("ip rts expire %d", num/HZ);
+    printf("ip rts expire %d\n", num/HZ);
+
+    limit = show_snmp_rts_limit();
+    printf("ip rts limit %d", limit);
     return 0;
 }
 
@@ -19491,6 +19495,8 @@
     char *ret, *t;
     int num, num2;
     size_t len;
+    int  limit;
+    int size;
 
     ret = (char *)malloc(256);
     if (ret == NULL) {
@@ -19528,7 +19534,11 @@
 	return ret;
     }
 
-    sprintf(t, "ip rts expire %d\n", num/HZ);
+    t += sprintf(t, "ip rts expire %d\n", num/HZ);
+
+    limit = show_snmp_rts_limit();
+    sprintf(t, "ip rts limit %d\n", limit);
+
     return ret;
 }
 
Index: /branches/rel_apv_10_7_4/usr/click/lib/libkernelapi/addCommands.pm
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libkernelapi/addCommands.pm	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libkernelapi/addCommands.pm	(working copy)
@@ -2739,6 +2739,27 @@
 	],
     },
     {
+        cmd_attribute => "CMD_KERN_API | CMD_KAPI_LOCK",
+        function_name => "out_rts_table_kern",
+        function_args => [
+            {type => "OUTDATA"},
+            {type => "U32"},
+            {type => "U32"},
+	],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API|CMD_KAPI_LOCK",
+        function_name => "rts_table_count",
+        function_args => [
+             {type => "U32"},
+        ],
+    },
+    {
+        cmd_attribute => "CMD_KERN_API|CMD_KAPI_NOLOCK",
+        function_name => "show_snmp_rts_limit",
+        function_args => [],
+    },
+    {
          cmd_attribute => "CMD_KERN_API|CMD_KAPI_NOLOCK",
         function_name => "write_eroute_kern",
         function_args => [
Index: /branches/rel_apv_10_7_4/usr/click/lib/libllb_hc/llb_snmp.h
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libllb_hc/llb_snmp.h	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libllb_hc/llb_snmp.h	(working copy)
@@ -1,6 +1,37 @@
 #ifndef _LLB_SNMP_H
 #define _LLB_SNMP_H
 
+#define IFSIZE 16 
+#define ETHER_ADDRSTRLENLONG 18
+enum{
+	EV_V_V4,
+	EV_V_V6,
+	EV_V_MAX
+};/* VERSION*/
+
+typedef struct rts_data {
+        char sip[INET_ADDRSTRLEN];
+        char dip[INET_ADDRSTRLEN];
+        char gip[INET_ADDRSTRLEN];
+        char sip6[INET6_ADDRSTRLEN];
+        char dip6[INET6_ADDRSTRLEN];
+        char gip6[INET6_ADDRSTRLEN];
+        char mac[ETHER_ADDRSTRLENLONG];
+        char ifname[IFSIZE];
+        uint32_t hits;
+} rts_tbldata;
+
+typedef struct out_rts_stat {
+	uint32_t rts_overflow_num[EV_V_MAX];
+	uint32_t rts_lokp;
+	uint32_t match_egw_match;
+	uint32_t match_hgw_match;
+	uint32_t match_non;
+	uint32_t match_hgw_fail;
+	uint32_t rts_count[EV_V_MAX];
+	struct rts_data update_rts;
+} out_rts_tblstat;
+
 long llb_mib_get_link_count(void);
 long llb_mib_get_link_down_count(int id); 
 long llb_mib_get_link_bandwidth_in(int id);
Index: /branches/rel_apv_10_7_4/usr/click/lib/libparser/commands.pm
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libparser/commands.pm	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libparser/commands.pm	(working copy)
@@ -22707,7 +22707,21 @@
 		parent_menu => "root_ip",
 		uniq_name => "root_ip_rts",
 	},
-
+	{
+		obj_type => "ITEM",
+		name => "limit",
+		help_string => "Limit for the number of RTS entries to be retuned in a SNMP query",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_KERN_API|CMD_NORMAL|CMD_MONITOR|CMD_GLOBAL",
+		user_level => "CLI_LEVEL_ENABLE",
+		menu => "root_ip_rts",
+		function_name => "llb_set_rts_limit",
+		function_args => [{
+			type => "U32",
+			help_string => "Enter limit for rts entries",
+			optional => "NO",
+			default_value => "1000",
+		},],
+	},
 	{
 		obj_type => "ITEM",
 		name => "on",
Index: /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_eroute.h
===================================================================
--- /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_eroute.h	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_eroute.h	(working copy)
@@ -1067,6 +1067,35 @@
 	struct eroute_rule *bw_first_erule;/* for bw check, save the first fitable erule without care bw */
 };
 
+#define ETHER_ADDRSTRLENLONG 18
+#define MAX_SNMP_RTS_ENTRIES 1000
+#ifndef IFNAMSIZ
+#define IFNAMSIZ 16
+#endif
+
+typedef struct rts_data {
+        char sip[INET_ADDRSTRLEN];
+        char dip[INET_ADDRSTRLEN];
+        char gip[INET_ADDRSTRLEN];
+        char sip6[INET6_ADDRSTRLEN];
+        char dip6[INET6_ADDRSTRLEN];
+        char gip6[INET6_ADDRSTRLEN];
+        char mac[ETHER_ADDRSTRLENLONG];
+        char ifname[IFNAMSIZ];
+        uint32_t hits;
+} rts_tbldata;
+
+typedef struct out_rts_stat {
+        uint32_t rts_overflow_num[EV_V_MAX];
+        uint32_t rts_lokp;
+        uint32_t match_egw_match;
+        uint32_t match_hgw_match;
+        uint32_t match_non;
+        uint32_t match_hgw_fail;
+        uint32_t rts_count[EV_V_MAX];
+        rts_tbldata update_rts;
+} out_rts_tblstat;
+
 static __inline uint8_t ev_v4mask2len(uint32_t mask)
 {
 	int x, y;
Index: /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_eroute.c
===================================================================
--- /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_eroute.c	(revision 39941)
+++ /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_eroute.c	(working copy)
@@ -163,6 +163,8 @@
 /* ev End */
 
 #define EROUTE_CLI_OK 0
+#define ERR_RTS_MEM_ALLOC 1
+#define ERR_RTS_DISABLE 2
 
 /* return codes for add and delete route functions */
 #define EROUTE_RULE_OK 0
@@ -391,6 +393,11 @@
 static uint32_t ipf_cur_num[EV_V_MAX];
 static uint32_t rts_overflow_num[EV_V_MAX];
 static uint32_t ipf_overflow_num[EV_V_MAX];
+
+uint32_t eng_rts_limit[EV_V_MAX] = {MAX_SNMP_RTS_ENTRIES, MAX_SNMP_RTS_ENTRIES};
+rts_tbldata *rts_stat = NULL;
+int snmpenable_flag = 0;
+
 static TIMER_HEAD(ipf_lru_head, rirtentry) ipf_lru[EV_V_MAX][RIRT_LRU_NUM] __cacheline_aligned;
 static TIMER_HEAD(rts_lru_head, rirtentry) rts_lru[EV_V_MAX][RIRT_LRU_NUM] __cacheline_aligned;
 static TIMER_HEAD(rts_h_lru_head, rirtentry) rts_h_lru[EV_V_MAX][RIRT_LRU_NUM] __cacheline_aligned;
@@ -11657,6 +11664,7 @@
 	uint32_t ori_key;
 	struct ifnet *ifp = NULL;
 	struct lltable *llt = NULL;
+	int rts_idx=0;
 
 	if (rts_cur_num[EV_V_V4] == 0 || 0xffffffff == ip) {
 		return;
@@ -11720,10 +11728,20 @@
 				strncpy(ifname, hwname, sizeof(ifname)-1);
 			}
 
-			app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n",
-				sip, dip, gip, mac, ifname, hits, 
-				(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
-				(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			if (snmpenable_flag && rts_idx < eng_rts_limit[0]) {
+				strncpy(rts_stat[rts_idx].sip, sip, INET_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].dip, dip, INET_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].gip, gip, INET_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].mac, mac, ETHER_ADDRSTRLENLONG);
+				strncpy(rts_stat[rts_idx].ifname, ifname, IFNAMSIZ);
+				rts_stat[rts_idx].hits = hits;
+				rts_idx++;
+			} else {
+				app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n",
+						sip, dip, gip, mac, ifname, hits, 
+						(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
+						(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			}
 		}
 		RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
 	}
@@ -11766,10 +11784,20 @@
 				strncpy(ifname, hwname, sizeof(ifname)-1);
 			}
 
-			app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n", 
-				sip, dip, gip, mac, ifname, hits, 
-				(TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
-				(TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			if (snmpenable_flag && rts_idx < eng_rts_limit[0]) {
+				strncpy(rts_stat[rts_idx].sip, sip, INET_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].dip, dip, INET_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].gip, gip, INET_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].mac, mac, ETHER_ADDRSTRLENLONG);
+				strncpy(rts_stat[rts_idx].ifname, ifname, IFNAMSIZ);
+				rts_stat[rts_idx].hits = hits;
+				rts_idx++;
+			} else {
+				app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n", 
+						sip, dip, gip, mac, ifname, hits, 
+						(TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
+						 (TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V4][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			}
 		}
 		RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
 	}
@@ -11798,6 +11826,7 @@
 	uint32_t ori_key;
 	struct ifnet *ifp = NULL;
 	struct lltable *llt = NULL;
+	int rts_idx = 0;
 
         char buffer[] = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
         struct in6_addr tmpip6;
@@ -11869,11 +11898,20 @@
 			if (hwid2caid(hwname, ifname) != IP_SUCCESS) {
 				strncpy(ifname, hwname, sizeof(ifname)-1);
 			}
-
-			app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n",
-				sip, dip, gip, mac, ifname, hits, 
-				(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
-				(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			if (snmpenable_flag && rts_idx < eng_rts_limit[1]) {
+				strncpy(rts_stat[rts_idx].sip6, sip, INET6_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].dip6, dip, INET6_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].gip6, gip, INET6_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].mac, mac, ETHER_ADDRSTRLENLONG);
+				strncpy(rts_stat[rts_idx].ifname, ifname, IFNAMSIZ);
+				rts_stat[rts_idx].hits = hits;
+				rts_idx++;
+			} else {
+				app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n",
+						sip, dip, gip, mac, ifname, hits, 
+						(TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
+						 (TIMER_EXPIRES_IN(rirt, &(rts_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			}
 		}
 		RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
 	}
@@ -11911,16 +11949,26 @@
 			sdl = SDL(ERT_HRULE_MAC(erule));
 			
 			strcpy(mac, ether_ntoa((struct ether_addr*)LLADDR(sdl)));
-			snprintf(hwname, 20, "%s%d", ERT_IFP(erule)->if_dname, 
+			snprintf(hwname, 20, "%s%d", ERT_IFP(erule)->if_dname,
 					ERT_IFP(erule)->if_dunit);
 			if (hwid2caid(hwname, ifname) != IP_SUCCESS){
 				strncpy(ifname, hwname, sizeof(ifname)-1);
 			}
 
-			app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n", 
-				sip, dip, gip, mac, ifname, hits, 
-				(TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
-				(TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			if (snmpenable_flag && rts_idx < eng_rts_limit[1]) {
+				strncpy(rts_stat[rts_idx].sip6, sip, INET6_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].dip6, dip, INET6_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].gip6, gip, INET6_ADDRSTRLEN);
+				strncpy(rts_stat[rts_idx].mac, mac, ETHER_ADDRSTRLENLONG);
+				strncpy(rts_stat[rts_idx].ifname, ifname, IFNAMSIZ);
+				rts_stat[rts_idx].hits = hits;
+				rts_idx++;
+			} else {
+				app_printf(pcb, "\t%-18s %-18s %-18s %-18s %-10s %10u %6d\n", 
+						sip, dip, gip, mac, ifname, hits, 
+						(TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo) > 0 ? 
+						 (TIMER_EXPIRES_IN(rirt, &(rts_h_lru[EV_V_V6][RIRT_LI(ori_key)]), rir_itimo)/hz ) : 0));
+			}
 		}
 		RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
 	}
@@ -18352,6 +18400,118 @@
 }
 /* for segment - end*/
 
+int rts_table_count(void *pcb, uint32_t isipv6)
+{
+	if (rts_cur_num[isipv6] <= eng_rts_limit[isipv6]) {
+		return rts_cur_num[isipv6];
+	}
+	return eng_rts_limit[isipv6];
+}
+
+int llb_set_rts_limit(void *pcb, uint32_t limit)
+{
+	if (limit >= max_rts_route) {
+		app_printf(pcb, "Exceeded the max limit: %d\n", max_rts_route);
+		return -1;
+	} else if (limit <= 0) {
+		app_printf(pcb, "Please enter limit greater than 0\n");
+		return -1;
+	}
+	eng_rts_limit[EV_V_V4] = limit;
+	eng_rts_limit[EV_V_V6] = limit;
+	return 0;
+}
+
+int show_snmp_rts_limit( void *pcb)
+{
+	int limit = MAX_SNMP_RTS_ENTRIES;
+
+	if (eng_rts_limit[EV_V_V4]) {
+		limit = eng_rts_limit[EV_V_V4];
+	}
+
+	return limit;
+}
+
+int out_rts_table_kern(void* pcb, void **data, int32_t *len, uint32_t index, uint32_t isipv6)
+{
+	out_rts_tblstat *outdata = NULL;
+	int idx = index - 1;
+	int i;
+	uint32_t rts_lokp = 0;
+	uint32_t match_non = 0, match_hgw_fail =0, match_hgw_match = 0, match_egw_match = 0;
+	struct in_addr ip4;
+	struct in6_addr ip6;
+
+	if (!rts_enable) {
+		app_printf(pcb, "RTS is disabled\n");
+		return ERR_RTS_DISABLE;
+	}
+
+	MALLOC(outdata, out_rts_tblstat *, sizeof(out_rts_tblstat), M_TEMP, M_NOWAIT);
+	if (outdata == NULL) {
+		*data = NULL;
+		*len = 0;
+		return ERR_RTS_MEM_ALLOC;
+	}
+	bzero(outdata, sizeof(out_rts_tblstat));
+	rts_stat = (rts_tbldata*) malloc(eng_rts_limit[isipv6] * sizeof(rts_tbldata),M_SLOW_EROUTE, M_NOWAIT);
+	if (rts_stat == NULL){
+		app_printf(pcb, "Invalid memory:\n");
+		return ERR_RTS_MEM_ALLOC;
+	}
+	bzero(rts_stat, eng_rts_limit[isipv6] * sizeof(rts_tbldata));
+
+	for (i = 0; i < atcp_nthreads; i++) {
+		rts_lokp += ADAPTER_VAR(_eroute_rtsstatth,i)[isipv6].rts_lokp;
+		match_non += ADAPTER_VAR(_rts_match_non,i)[isipv6];
+		match_hgw_fail += ADAPTER_VAR(_rts_hgw_fail,i)[isipv6];
+		match_egw_match += ADAPTER_VAR(_rts_egw_match,i)[isipv6];
+		match_hgw_match += ADAPTER_VAR(_rts_hgw_match,i)[isipv6];
+	}
+
+	if (index == 0) {
+		outdata->rts_overflow_num[isipv6] = rts_overflow_num[isipv6];
+		outdata->rts_lokp = rts_lokp;
+		outdata->match_egw_match = match_egw_match;
+		outdata->match_hgw_match =  match_hgw_match;
+		outdata->match_non =  match_non;
+		outdata->match_hgw_fail =  match_hgw_fail;
+	}
+	if (rts_cur_num[isipv6] == 0 || index == 0) {
+		*data = outdata;
+		*len = sizeof(out_rts_tblstat) - sizeof(rts_tbldata);
+
+		FREE(rts_stat, M_SLOW_EROUTE);
+		return EROUTE_CLI_OK;
+	}
+	snmpenable_flag = 1;
+	if (isipv6) {
+		dump_rts6_table(pcb, NULL);
+	}else {
+		dump_rts_table(pcb,	0);
+	}
+	snmpenable_flag = 0;
+	if (isipv6) {
+		strncpy(outdata->update_rts.sip6, rts_stat[idx].sip6, INET6_ADDRSTRLEN);
+		strncpy(outdata->update_rts.dip6, rts_stat[idx].dip6, INET6_ADDRSTRLEN);
+		strncpy(outdata->update_rts.gip6, rts_stat[idx].gip6, INET6_ADDRSTRLEN);
+	} else {
+		strncpy(outdata->update_rts.sip, rts_stat[idx].sip, INET_ADDRSTRLEN);
+		strncpy(outdata->update_rts.dip, rts_stat[idx].dip, INET_ADDRSTRLEN);
+		strncpy(outdata->update_rts.gip, rts_stat[idx].gip, INET_ADDRSTRLEN);
+	}
+	strncpy(outdata->update_rts.mac, rts_stat[idx].mac, ETHER_ADDRSTRLENLONG);
+	strncpy(outdata->update_rts.ifname, rts_stat[idx].ifname, IFNAMSIZ);
+	outdata->update_rts.hits = rts_stat[idx].hits;
+
+	FREE(rts_stat, M_SLOW_EROUTE);
+	*data = outdata;
+	*len = sizeof(out_rts_tblstat);
+
+	return 0;
+}
+
 int
 get_eroute_count(void *pcb)
 {
