Index: mibs/UCD-SNMP-MIB.txt
===================================================================
RCS file: /cvsroot/net-snmp/net-snmp/mibs/UCD-SNMP-MIB.txt,v
retrieving revision 5.7
diff -u -u -r5.7 UCD-SNMP-MIB.txt
--- mibs/UCD-SNMP-MIB.txt	7 Nov 2006 22:14:44 -0000	5.7
+++ mibs/UCD-SNMP-MIB.txt	7 Nov 2006 23:33:53 -0000
@@ -157,6 +157,12 @@
          is '07'h; and the value is '9f780442f60000'h."
     SYNTAX Opaque (SIZE (7))
 
+ErrorFlag ::= TEXTUAL-CONVENTION
+    STATUS      current
+    DESCRIPTION
+        "Represents a possible error condition"
+    SYNTAX INTEGER  { noError(0),  error(1) }
+
 --
 -- Process table checks
 --
@@ -471,7 +477,8 @@
     MAX-ACCESS	read-only
     STATUS	current
     DESCRIPTION
-	"Total Available Memory on the host"
+	"Total Available Memory on the host.
+         Typically covers both real memory and swap."
     ::= { memory 11 }
 
 memMinimumSwap OBJECT-TYPE
@@ -479,9 +486,10 @@
     MAX-ACCESS	read-only
     STATUS	current
     DESCRIPTION
-	"Minimum amount of free swap required to be free
-	 or else memErrorSwap is set to 1 and an error string is
-	 returned memSwapErrorMsg."
+	"Minimum amount of memory (real+swap) required to be kept
+         available.  If such memory (as reported by memTotalFree)
+         falls below this level, memSwapError is set to 1 and an
+         error message returned via memSwapErrorMsg."
     ::= { memory 12 }
 
 memShared OBJECT-TYPE
@@ -525,11 +533,13 @@
     ::= { memory 17 }
 
 memSwapError OBJECT-TYPE
-    SYNTAX	Integer32
+    SYNTAX	ErrorFlag
     MAX-ACCESS	read-only
     STATUS	current
     DESCRIPTION
-	"Error flag.  1 indicates very little swap space left"
+	"Indicates whether the amount of available memory
+         (real+swap) as reported by memTotalFree, is less
+         than the required threshold."
     ::= { memory 100 }
 	
 memSwapErrorMsg OBJECT-TYPE
@@ -537,7 +547,9 @@
     MAX-ACCESS	read-only
     STATUS	current
     DESCRIPTION
-	"Error message describing the Error Flag condition"
+	"Describes whether the amount of available memory
+         (real+swap) as reported by memTotalFree, is less
+         than the required threshold."
     ::= { memory 101 } 
 
 
Index: agent/mibgroup/ucd-snmp/memory.c
===================================================================
RCS file: /cvsroot/net-snmp/net-snmp/agent/mibgroup/ucd-snmp/memory.c,v
retrieving revision 5.19
diff -u -u -r5.19 memory.c
--- agent/mibgroup/ucd-snmp/memory.c	7 Nov 2006 23:33:15 -0000	5.19
+++ agent/mibgroup/ucd-snmp/memory.c	7 Nov 2006 23:42:36 -0000
@@ -155,11 +155,15 @@
             val  = (mem_info->size - mem_info->free);
             val *= (mem_info->units/1024);
             break;
-        case MEMORY_FREE:
-            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_VIRTMEM, 0 );
+        case MEMORY_FREE:          /* Swap + Real free */
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 );
+            if (!mem_info)
+               goto NOSUCH;
+            val  =  mem_info->free;
+            mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 0 );
             if (!mem_info)
                goto NOSUCH;
-            val  =  mem_info->free;     /* memfree + swapfree */
+            val +=  mem_info->free;
             val *= (mem_info->units/1024);
             break;
         case MEMORY_SWAP_MIN:
@@ -187,18 +191,32 @@
             val *= (mem_info->units/1024);
             break;
         case MEMORY_SWAP_ERROR:
-                                          /* XXX - or NS_MEM_TYPE_PHYSMEM */
+                                        /* Compare against memTotalFree */
             mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 );
             if (!mem_info)
                goto NOSUCH;
-            val = ((mem_info->units / 1024) * mem_info->free > minimum_swap) ? 0 : 1;
+            val  =  mem_info->free;
+            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);  /* memTotalFree */
+
+            val = (val > minimum_swap) ? 0 : 1;
             break;
         case MEMORY_SWAP_ERRMSG:
-                                          /* XXX - or NS_MEM_TYPE_PHYSMEM */
+                                        /* Compare against memTotalFree */
             mem_info = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 0 );
             if (!mem_info)
                goto NOSUCH;
-            if ((mem_info->units / 1024) * mem_info->free > minimum_swap)
+            val  =  mem_info->free;
+            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);  /* memTotalFree */
+
+            if (val > minimum_swap)
                 buf[0] = 0;
             else
                 sprintf(buf, "Running out of swap space (%ld)", mem_info->free);
