Blob Blame History Raw
From 0dc151a72ce495d3d94704efba609505e465292b Mon Sep 17 00:00:00 2001
From: Niels Baggesen <nba@users.sourceforge.net>
Date: Mon, 13 Jun 2016 16:50:08 +0200
Subject: [PATCH] UCD-SNMP-MIB: Add 64-bit memory objects for large servers.

---
 agent/mibgroup/ucd-snmp/memory.c | 100 ++++++++++++++++++++++++--
 agent/mibgroup/ucd-snmp/memory.h |   9 +++
 mibs/UCD-SNMP-MIB.txt            | 116 ++++++++++++++++++++++++++++++-
 3 files changed, 220 insertions(+), 5 deletions(-)

diff --git a/agent/mibgroup/ucd-snmp/memory.c b/agent/mibgroup/ucd-snmp/memory.c
index 742186f3a..a7f060a50 100644
--- a/agent/mibgroup/ucd-snmp/memory.c
+++ b/agent/mibgroup/ucd-snmp/memory.c
@@ -26,7 +26,7 @@ init_memory(void)
         netsnmp_create_handler_registration("memory", handle_memory,
                                  memory_oid, OID_LENGTH(memory_oid),
                                              HANDLER_CAN_RONLY),
-                                 1, 17);
+                                 1, 26);
     netsnmp_register_scalar(
         netsnmp_create_handler_registration("memSwapError", handle_memory,
                            memSwapError_oid, OID_LENGTH(memSwapError_oid),
@@ -59,7 +59,9 @@ handle_memory(netsnmp_mib_handler *handler,
                 netsnmp_request_info *requests)
 {
     netsnmp_memory_info *mem_info;
-    int val;
+    unsigned long val;
+    struct counter64 c64;
+    int type = ASN_INTEGER;
     char buf[1024];
 
     /*
@@ -184,6 +186,92 @@ handle_memory(netsnmp_mib_handler *handler,
             val  = (mem_info->size - mem_info->free);      /* cached */
             val *= (mem_info->units/1024);
             break;
+	case MEMORY_SWAP_TOTAL_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->size;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_SWAP_AVAIL_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->free;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_REAL_TOTAL_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->size;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_REAL_AVAIL_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->free;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_SWAP_MIN_X:
+	    type = ASN_COUNTER64;
+	    val = minimum_swap;
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_FREE_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_VIRTMEM, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->free;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_SHARED_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->size;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_BUFFER_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_MBUF, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->size - mem_info->free;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
+	case MEMORY_CACHED_X:
+	    type = ASN_COUNTER64;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_CACHED, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  = mem_info->size - mem_info->free;
+            val *= (mem_info->units/1024);
+	    c64.low = val & 0xFFFFFFFF;
+	    c64.high = val >>32;
+            break;
         case MEMORY_SWAP_ERROR:
             mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 );
             if (!mem_info)
@@ -213,8 +301,12 @@ handle_memory(netsnmp_mib_handler *handler,
          * All non-integer objects (and errors) have already been
          * processed.  So return the integer value.
          */
-        snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
-                                 (u_char *)&val, sizeof(val));
+	if (type == ASN_INTEGER)
+	    snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+				     (u_char *)&val, sizeof(val));
+	else
+	    snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64,
+				     (u_char *)&c64, sizeof(c64));
         break;
 
     default:
diff --git a/agent/mibgroup/ucd-snmp/memory.h b/agent/mibgroup/ucd-snmp/memory.h
index a44d82e51..ded214022 100644
--- a/agent/mibgroup/ucd-snmp/memory.h
+++ b/agent/mibgroup/ucd-snmp/memory.h
@@ -32,6 +32,15 @@ Netsnmp_Node_Handler handle_memory;
 #define MEMORY_CACHED       15
 #define MEMORY_STXT_USED    16
 #define MEMORY_RTXT_USED    17
+#define MEMORY_SWAP_TOTAL_X 18
+#define MEMORY_SWAP_AVAIL_X 19
+#define MEMORY_REAL_TOTAL_X 20
+#define MEMORY_REAL_AVAIL_X 21
+#define MEMORY_FREE_X       22
+#define MEMORY_SWAP_MIN_X   23
+#define MEMORY_SHARED_X     24
+#define MEMORY_BUFFER_X     25
+#define MEMORY_CACHED_X     26
 #define MEMORY_SWAP_ERROR  100
 #define MEMORY_SWAP_ERRMSG 101
 #endif                          /* MEMORY_H */
diff --git a/mibs/UCD-SNMP-MIB.txt b/mibs/UCD-SNMP-MIB.txt
index e8acc8c0d..cde67feb5 100644
--- a/mibs/UCD-SNMP-MIB.txt
+++ b/mibs/UCD-SNMP-MIB.txt
@@ -33,11 +33,14 @@ IMPORTS
     Integer32, Opaque, enterprises, Counter32, Unsigned32
         FROM SNMPv2-SMI
 
+    CounterBasedGauge64
+        FROM HCNUM-TC
+
     TEXTUAL-CONVENTION, DisplayString, TruthValue
 	FROM SNMPv2-TC;
 
 ucdavis MODULE-IDENTITY
-    LAST-UPDATED "200901190000Z"
+    LAST-UPDATED "201606100000Z"
     ORGANIZATION "University of California, Davis"
     CONTACT-INFO    
 	"This mib is no longer being maintained by the University of
@@ -55,6 +58,10 @@ ucdavis MODULE-IDENTITY
     DESCRIPTION
 	"This file defines the private UCD SNMP MIB extensions."
 
+    REVISION	 "201606100000Z"
+    DESCRIPTION
+	"New 64-bit memory objects"
+
     REVISION	 "201105140000Z"
     DESCRIPTION
 	"New objects for monitoring CPU Steal, Guest and Nice values"
@@ -629,6 +636,113 @@ memUsedRealTXT OBJECT-TYPE
          pages from other uses of physical memory."
     ::= { memory 17 }
 
+memTotalSwapX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+	"The total amount of swap space configured for this host."
+    ::= { memory 18 }
+
+memAvailSwapX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+	"The amount of swap space currently unused or available."
+    ::= { memory 19 }
+
+memTotalRealX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+	"The total amount of real/physical memory installed
+         on this host."
+    ::= { memory 20 }
+
+memAvailRealX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+	"The amount of real/physical memory currently unused
+         or available."
+    ::= { memory 21 }
+
+
+memTotalFreeX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+        "The total amount of memory free or available for use on
+         this host.  This value typically covers both real memory
+         and swap space or virtual memory."
+    ::= { memory 22 }
+
+memMinimumSwapX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+	"The minimum amount of swap space expected to be kept
+         free or available during normal operation of this host.
+
+         If this value (as reported by 'memAvailSwap(4)') falls
+         below the specified level, then 'memSwapError(100)' will
+         be set to 1 and an error message made available via
+         'memSwapErrorMsg(101)'."
+    ::= { memory 23 }
+
+memSharedX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+        "The total amount of real or virtual memory currently
+         allocated for use as shared memory.
+
+         This object will not be implemented on hosts where the
+         underlying operating system does not explicitly identify
+         memory as specifically reserved for this purpose."
+    ::= { memory 24 }
+
+memBufferX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+        "The total amount of real or virtual memory currently
+         allocated for use as memory buffers.
+
+         This object will not be implemented on hosts where the
+         underlying operating system does not explicitly identify
+         memory as specifically reserved for this purpose."
+    ::= { memory 25 }
+
+memCachedX OBJECT-TYPE
+    SYNTAX	CounterBasedGauge64
+    UNITS       "kB"
+    MAX-ACCESS	read-only
+    STATUS	current
+    DESCRIPTION
+        "The total amount of real or virtual memory currently
+         allocated for use as cached memory.
+
+         This object will not be implemented on hosts where the
+         underlying operating system does not explicitly identify
+         memory as specifically reserved for this purpose."
+    ::= { memory 26 }
+
 memSwapError OBJECT-TYPE
     SYNTAX	UCDErrorFlag
     MAX-ACCESS	read-only