]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/snmp_agent.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / snmp_agent.cc
index b49e872e7a4b4413a751ed0486c5709297d2de65..7d6ec81d56772b7b02fc5b403c965c8f4f30fafa 100644 (file)
@@ -1,8 +1,7 @@
-
 /*
- * $Id: snmp_agent.cc,v 1.85 2003/01/17 05:49:34 robertc Exp $
+ * $Id$
  *
- * DEBUG: section 49     SNMP Interface
+ * DEBUG: section 49    SNMP Interface
  * AUTHOR: Kostas Anagnostakis
  *
  * SQUID Web Proxy Cache          http://www.squid-cache.org/
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
- *  
+ *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
- *  
+ *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  *
  */
 
-
 #include "squid.h"
 #include "cache_snmp.h"
+#include "globals.h"
+#include "mem_node.h"
+#include "protos.h"
+#include "StatCounters.h"
+#include "StatHist.h"
+#include "SquidMath.h"
+#include "SquidTime.h"
 #include "Store.h"
 
 /************************************************************************
 
  ************************************************************************/
 
+/*
+ * cacheSystem group
+ */
+
 variable_list *
 snmp_sysFn(variable_list * Var, snint * ErrP)
 {
     variable_list *Answer = NULL;
-    debug(49, 5) ("snmp_sysFn: Processing request:\n");
-    snmpDebugOid(5, Var->name, Var->name_length);
+    MemBuf tmp;
+    debugs(49, 5, "snmp_sysFn: Processing request:" << snmpDebugOid(Var->name, Var->name_length, tmp));
     *ErrP = SNMP_ERR_NOERROR;
+
     switch (Var->name[LEN_SQ_SYS]) {
+
     case SYSVMSIZ:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           store_mem_size >> 10,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      mem_node::StoreMemSize() >> 10,
+                                      ASN_INTEGER);
+        break;
+
     case SYSSTOR:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           store_swap_size,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      Store::Root().currentSize() >> 10,
+                                      ASN_INTEGER);
+        break;
+
     case SYS_UPTIME:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (int)(tvSubDsec(squid_start, current_time) * 100),
-           SMI_TIMETICKS);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (int)(tvSubDsec(squid_start, current_time) * 100),
+                                      SMI_TIMETICKS);
+        break;
+
     default:
-       *ErrP = SNMP_ERR_NOSUCHNAME;
-       break;
+        *ErrP = SNMP_ERR_NOSUCHNAME;
+        break;
     }
+
     return Answer;
 }
 
+/*
+ * cacheConfig group
+ */
 variable_list *
 snmp_confFn(variable_list * Var, snint * ErrP)
 {
     variable_list *Answer = NULL;
     const char *cp = NULL;
-    debug(49, 5) ("snmp_confFn: Processing request with magic %d!\n", Var->name[8]);
+    debugs(49, 5, "snmp_confFn: Processing request with magic " << Var->name[8] << "!");
     *ErrP = SNMP_ERR_NOERROR;
+
     switch (Var->name[LEN_SQ_CONF]) {
+
     case CONF_ADMIN:
-       Answer = snmp_var_new(Var->name, Var->name_length);
-       Answer->type = ASN_OCTET_STR;
-       Answer->val_len = strlen(Config.adminEmail);
-       Answer->val.string = (u_char *) xstrdup(Config.adminEmail);
-       break;
+        Answer = snmp_var_new(Var->name, Var->name_length);
+        Answer->type = ASN_OCTET_STR;
+        Answer->val_len = strlen(Config.adminEmail);
+        Answer->val.string = (u_char *) xstrdup(Config.adminEmail);
+        break;
+
     case CONF_VERSION:
-       Answer = snmp_var_new(Var->name, Var->name_length);
-       Answer->type = ASN_OCTET_STR;
-       Answer->val_len = strlen(appname);
-       Answer->val.string = (u_char *) xstrdup(appname);
-       break;
+        Answer = snmp_var_new(Var->name, Var->name_length);
+        Answer->type = ASN_OCTET_STR;
+        Answer->val_len = strlen(APP_SHORTNAME);
+        Answer->val.string = (u_char *) xstrdup(APP_SHORTNAME);
+        break;
+
     case CONF_VERSION_ID:
-       Answer = snmp_var_new(Var->name, Var->name_length);
-       Answer->type = ASN_OCTET_STR;
-       Answer->val_len = strlen(VERSION);
-       Answer->val.string = (u_char *) xstrdup(VERSION);
-       break;
+        Answer = snmp_var_new(Var->name, Var->name_length);
+        Answer->type = ASN_OCTET_STR;
+        Answer->val_len = strlen(VERSION);
+        Answer->val.string = (u_char *) xstrdup(VERSION);
+        break;
+
     case CONF_STORAGE:
-       switch (Var->name[LEN_SQ_CONF + 1]) {
-       case CONF_ST_MMAXSZ:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) Config.memMaxSize >> 20,
-               ASN_INTEGER);
-           break;
-       case CONF_ST_SWMAXSZ:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) Config.Swap.maxSize >> 10,
-               ASN_INTEGER);
-           break;
-       case CONF_ST_SWHIWM:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) Config.Swap.highWaterMark,
-               ASN_INTEGER);
-           break;
-       case CONF_ST_SWLOWM:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) Config.Swap.lowWaterMark,
-               ASN_INTEGER);
-           break;
-       default:
-           *ErrP = SNMP_ERR_NOSUCHNAME;
-           break;
-       }
-       break;
+
+        switch (Var->name[LEN_SQ_CONF + 1]) {
+
+        case CONF_ST_MMAXSZ:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) (Config.memMaxSize >> 20),
+                                          ASN_INTEGER);
+            break;
+
+        case CONF_ST_SWMAXSZ:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) (Store::Root().maxSize() >> 20),
+                                          ASN_INTEGER);
+            break;
+
+        case CONF_ST_SWHIWM:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) Config.Swap.highWaterMark,
+                                          ASN_INTEGER);
+            break;
+
+        case CONF_ST_SWLOWM:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) Config.Swap.lowWaterMark,
+                                          ASN_INTEGER);
+            break;
+
+        default:
+            *ErrP = SNMP_ERR_NOSUCHNAME;
+            break;
+        }
+
+        break;
+
     case CONF_LOG_FAC:
-       Answer = snmp_var_new(Var->name, Var->name_length);
-       if (!(cp = Config.debugOptions))
-           cp = "None";
-       Answer->type = ASN_OCTET_STR;
-       Answer->val_len = strlen(cp);
-       Answer->val.string = (u_char *) xstrdup(cp);
-       break;
+        Answer = snmp_var_new(Var->name, Var->name_length);
+
+        if (!(cp = Debug::debugOptions))
+            cp = "None";
+
+        Answer->type = ASN_OCTET_STR;
+
+        Answer->val_len = strlen(cp);
+
+        Answer->val.string = (u_char *) xstrdup(cp);
+
+        break;
+
+    case CONF_UNIQNAME:
+        Answer = snmp_var_new(Var->name, Var->name_length);
+
+        cp = uniqueHostname();
+
+        Answer->type = ASN_OCTET_STR;
+
+        Answer->val_len = strlen(cp);
+
+        Answer->val.string = (u_char *) xstrdup(cp);
+
+        break;
+
     default:
-       *ErrP = SNMP_ERR_NOSUCHNAME;
-       break;
+        *ErrP = SNMP_ERR_NOSUCHNAME;
+
+        break;
     }
+
     return Answer;
 }
 
+/*
+ * cacheMesh group
+ *   - cachePeerTable
+ */
 variable_list *
 snmp_meshPtblFn(variable_list * Var, snint * ErrP)
 {
     variable_list *Answer = NULL;
-    struct in_addr *laddr;
+
+    Ip::Address laddr;
     char *cp = NULL;
     peer *p = NULL;
     int cnt = 0;
-    debug(49, 5) ("snmp_meshPtblFn: peer %d requested!\n", Var->name[LEN_SQ_MESH + 3]);
+    debugs(49, 5, "snmp_meshPtblFn: peer " << Var->name[LEN_SQ_MESH + 3] << " requested!");
     *ErrP = SNMP_ERR_NOERROR;
-    laddr = oid2addr(&Var->name[LEN_SQ_MESH + 3]);
-    for (p = Config.peers; p != NULL; p = p->next, cnt++)
-       if (p->in_addr.sin_addr.s_addr == laddr->s_addr)
-           break;
+
+    u_int index = Var->name[LEN_SQ_MESH + 3] ;
+    for (p = Config.peers; p != NULL; p = p->next, ++cnt) {
+        if (p->index == index) {
+            laddr = p->in_addr ;
+            break;
+        }
+    }
+
     if (p == NULL) {
-       *ErrP = SNMP_ERR_NOSUCHNAME;
-       return NULL;
+        *ErrP = SNMP_ERR_NOSUCHNAME;
+        return NULL;
     }
+
     switch (Var->name[LEN_SQ_MESH + 2]) {
+    case MESH_PTBL_INDEX: { // FIXME INET6: Should be visible?
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint)p->index, SMI_INTEGER);
+    }
+    break;
+
     case MESH_PTBL_NAME:
-       cp = p->host;
-       Answer = snmp_var_new(Var->name, Var->name_length);
-       Answer->type = ASN_OCTET_STR;
-       Answer->val_len = strlen(cp);
-       Answer->val.string = (u_char *) xstrdup(cp);
-       break;
-    case MESH_PTBL_IP:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) p->in_addr.sin_addr.s_addr,
-           SMI_IPADDRESS);
-       break;
+        cp = p->host;
+        Answer = snmp_var_new(Var->name, Var->name_length);
+        Answer->type = ASN_OCTET_STR;
+        Answer->val_len = strlen(cp);
+        Answer->val.string = (u_char *) xstrdup(cp);
+
+        break;
+
+    case MESH_PTBL_ADDR_TYPE: {
+        int ival;
+        ival = laddr.IsIPv4() ? INETADDRESSTYPE_IPV4 : INETADDRESSTYPE_IPV6 ;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      ival, SMI_INTEGER);
+    }
+    break;
+    case MESH_PTBL_ADDR: {
+        Answer = snmp_var_new(Var->name, Var->name_length);
+        // InetAddress doesn't have its own ASN.1 type,
+        // like IpAddr does (SMI_IPADDRESS)
+        // See: rfc4001.txt
+        Answer->type = ASN_OCTET_STR;
+        char host[MAX_IPSTRLEN];
+        laddr.NtoA(host,MAX_IPSTRLEN);
+        Answer->val_len = strlen(host);
+        Answer->val.string =  (u_char *) xstrdup(host);
+    }
+    break;
+
     case MESH_PTBL_HTTP:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) p->http_port,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) p->http_port,
+                                      ASN_INTEGER);
+        break;
+
     case MESH_PTBL_ICP:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) p->icp.port,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) p->icp.port,
+                                      ASN_INTEGER);
+        break;
+
     case MESH_PTBL_TYPE:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) p->type,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) p->type,
+                                      ASN_INTEGER);
+        break;
+
     case MESH_PTBL_STATE:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) neighborUp(p),
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) neighborUp(p),
+                                      ASN_INTEGER);
+        break;
+
     case MESH_PTBL_SENT:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.pings_sent,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.pings_sent,
+                                      SMI_COUNTER32);
+        break;
+
     case MESH_PTBL_PACKED:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.pings_acked,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.pings_acked,
+                                      SMI_COUNTER32);
+        break;
+
     case MESH_PTBL_FETCHES:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.fetches,
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.fetches,
+                                      SMI_COUNTER32);
+        break;
+
     case MESH_PTBL_RTT:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.rtt,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.rtt,
+                                      ASN_INTEGER);
+        break;
+
     case MESH_PTBL_IGN:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.ignored_replies,
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.ignored_replies,
+                                      SMI_COUNTER32);
+        break;
+
     case MESH_PTBL_KEEPAL_S:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.n_keepalives_sent,
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.n_keepalives_sent,
+                                      SMI_COUNTER32);
+        break;
+
     case MESH_PTBL_KEEPAL_R:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           p->stats.n_keepalives_recv,
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      p->stats.n_keepalives_recv,
+                                      SMI_COUNTER32);
+        break;
+
     default:
-       *ErrP = SNMP_ERR_NOSUCHNAME;
-       break;
+        *ErrP = SNMP_ERR_NOSUCHNAME;
+        break;
     }
+
     return Answer;
 }
 
@@ -239,74 +337,101 @@ variable_list *
 snmp_prfSysFn(variable_list * Var, snint * ErrP)
 {
     variable_list *Answer = NULL;
+
     static struct rusage rusage;
-    debug(49, 5) ("snmp_prfSysFn: Processing request with magic %d!\n", Var->name[LEN_SQ_PRF + 1]);
+    debugs(49, 5, "snmp_prfSysFn: Processing request with magic " << Var->name[LEN_SQ_PRF + 1] << "!");
     *ErrP = SNMP_ERR_NOERROR;
+
     switch (Var->name[LEN_SQ_PRF + 1]) {
+
     case PERF_SYS_PF:
-       squid_getrusage(&rusage);
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           rusage_pagefaults(&rusage),
-           SMI_COUNTER32);
-       break;
+        squid_getrusage(&rusage);
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      rusage_pagefaults(&rusage),
+                                      SMI_COUNTER32);
+        break;
+
     case PERF_SYS_NUMR:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           IOStats.Http.reads,
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      IOStats.Http.reads,
+                                      SMI_COUNTER32);
+        break;
+
     case PERF_SYS_MEMUSAGE:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) statMemoryAccounted() >> 10,
-           ASN_INTEGER);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) statMemoryAccounted() >> 10,
+                                      ASN_INTEGER);
+        break;
+
     case PERF_SYS_CPUTIME:
-       squid_getrusage(&rusage);
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) rusage_cputime(&rusage),
-           ASN_INTEGER);
-       break;
+        squid_getrusage(&rusage);
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) rusage_cputime(&rusage),
+                                      ASN_INTEGER);
+        break;
+
     case PERF_SYS_CPUUSAGE:
-       squid_getrusage(&rusage);
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) dpercent(rusage_cputime(&rusage), tvSubDsec(squid_start, current_time)),
-           ASN_INTEGER);
-       break;
+        squid_getrusage(&rusage);
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) Math::doublePercent(rusage_cputime(&rusage), tvSubDsec(squid_start, current_time)),
+                                      ASN_INTEGER);
+        break;
+
     case PERF_SYS_MAXRESSZ:
-       squid_getrusage(&rusage);
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) rusage_maxrss(&rusage),
-           ASN_INTEGER);
-       break;
+        squid_getrusage(&rusage);
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) rusage_maxrss(&rusage),
+                                      ASN_INTEGER);
+        break;
+
     case PERF_SYS_CURLRUEXP:
-       /* No global LRU info anymore */
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           0,
-           SMI_TIMETICKS);
-       break;
+        /* No global LRU info anymore */
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      0,
+                                      SMI_TIMETICKS);
+        break;
+
     case PERF_SYS_CURUNLREQ:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) statCounter.unlink.requests,
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) statCounter.unlink.requests,
+                                      SMI_GAUGE32);
+        break;
+
     case PERF_SYS_CURUNUSED_FD:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) Squid_MaxFD - Number_FD,
-           SMI_GAUGE32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) Squid_MaxFD - Number_FD,
+                                      SMI_GAUGE32);
+        break;
+
     case PERF_SYS_CURRESERVED_FD:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) RESERVED_FD,
-           SMI_GAUGE32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) RESERVED_FD,
+                                      SMI_GAUGE32);
+        break;
+
+    case PERF_SYS_CURUSED_FD:
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) Number_FD,
+                                      SMI_GAUGE32);
+        break;
+
+    case PERF_SYS_CURMAX_FD:
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) Biggest_FD,
+                                      SMI_GAUGE32);
+        break;
+
     case PERF_SYS_NUMOBJCNT:
-       Answer = snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) StoreEntry::inUseCount(),
-           SMI_COUNTER32);
-       break;
+        Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                      (snint) StoreEntry::inUseCount(),
+                                      SMI_GAUGE32);
+        break;
+
     default:
-       *ErrP = SNMP_ERR_NOSUCHNAME;
-       break;
+        *ErrP = SNMP_ERR_NOSUCHNAME;
+        break;
     }
+
     return Answer;
 }
 
@@ -318,146 +443,190 @@ snmp_prfProtoFn(variable_list * Var, snint * ErrP)
     static StatCounters *l = NULL;
     double x;
     int minutes;
-    debug(49, 5) ("snmp_prfProtoFn: Processing request with magic %d!\n", Var->name[LEN_SQ_PRF]);
+    debugs(49, 5, "snmp_prfProtoFn: Processing request with magic " << Var->name[LEN_SQ_PRF] << "!");
     *ErrP = SNMP_ERR_NOERROR;
+
     switch (Var->name[LEN_SQ_PRF + 1]) {
+
     case PERF_PROTOSTAT_AGGR:  /* cacheProtoAggregateStats */
-       switch (Var->name[LEN_SQ_PRF + 2]) {
-       case PERF_PROTOSTAT_AGGR_HTTP_REQ:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.client_http.requests,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_HTTP_HITS:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.client_http.hits,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_HTTP_ERRORS:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.client_http.errors,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.client_http.kbytes_in.kb,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.client_http.kbytes_out.kb,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_ICP_S:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.icp.pkts_sent,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_ICP_R:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.icp.pkts_recv,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_ICP_SKB:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.icp.kbytes_sent.kb,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_ICP_RKB:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.icp.kbytes_recv.kb,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_REQ:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.server.all.requests,
-               SMI_INTEGER);
-           break;
-       case PERF_PROTOSTAT_AGGR_ERRORS:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.server.all.errors,
-               SMI_INTEGER);
-           break;
-       case PERF_PROTOSTAT_AGGR_KBYTES_IN:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.server.all.kbytes_in.kb,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_KBYTES_OUT:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.server.all.kbytes_out.kb,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_CURSWAP:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) store_swap_size,
-               SMI_COUNTER32);
-           break;
-       case PERF_PROTOSTAT_AGGR_CLIENTS:
-           Answer = snmp_var_new_integer(Var->name, Var->name_length,
-               (snint) statCounter.client_http.clients,
-               SMI_COUNTER32);
-           break;
-       default:
-           *ErrP = SNMP_ERR_NOSUCHNAME;
-           break;
-       }
-       return Answer;
+
+        switch (Var->name[LEN_SQ_PRF + 2]) {
+
+        case PERF_PROTOSTAT_AGGR_HTTP_REQ:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.client_http.requests,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_HTTP_HITS:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.client_http.hits,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_HTTP_ERRORS:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.client_http.errors,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.client_http.kbytes_in.kb,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.client_http.kbytes_out.kb,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_ICP_S:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.icp.pkts_sent,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_ICP_R:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.icp.pkts_recv,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_ICP_SKB:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.icp.kbytes_sent.kb,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_ICP_RKB:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.icp.kbytes_recv.kb,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_REQ:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.server.all.requests,
+                                          SMI_INTEGER);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_ERRORS:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.server.all.errors,
+                                          SMI_INTEGER);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_KBYTES_IN:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.server.all.kbytes_in.kb,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_KBYTES_OUT:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.server.all.kbytes_out.kb,
+                                          SMI_COUNTER32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_CURSWAP:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) Store::Root().currentSize() >> 10,
+                                          SMI_GAUGE32);
+            break;
+
+        case PERF_PROTOSTAT_AGGR_CLIENTS:
+            Answer = snmp_var_new_integer(Var->name, Var->name_length,
+                                          (snint) statCounter.client_http.clients,
+                                          SMI_GAUGE32);
+            break;
+
+        default:
+            *ErrP = SNMP_ERR_NOSUCHNAME;
+            break;
+        }
+
+        return Answer;
+
     case PERF_PROTOSTAT_MEDIAN:
-       if (Var->name_length == LEN_SQ_PRF + 5)
-           minutes = Var->name[LEN_SQ_PRF + 4];
-       else
-           break;
-       if ((minutes < 1) || (minutes > 60))
-           break;
-       f = snmpStatGet(0);
-       l = snmpStatGet(minutes);
-       debug(49, 8) ("median: min= %d, %d l= %p , f = %p\n", minutes,
-           Var->name[LEN_SQ_PRF + 3], l, f);
-       debug(49, 8) ("median: l= %p , f = %p\n", l, f);
-       switch (Var->name[LEN_SQ_PRF + 3]) {
-       case PERF_MEDIAN_TIME:
-           x = minutes;
-           break;
-       case PERF_MEDIAN_HTTP_ALL:
-           x = statHistDeltaMedian(&l->client_http.all_svc_time,
-               &f->client_http.all_svc_time);
-           break;
-       case PERF_MEDIAN_HTTP_MISS:
-           x = statHistDeltaMedian(&l->client_http.miss_svc_time,
-               &f->client_http.miss_svc_time);
-           break;
-       case PERF_MEDIAN_HTTP_NM:
-           x = statHistDeltaMedian(&l->client_http.nm_svc_time,
-               &f->client_http.nm_svc_time);
-           break;
-       case PERF_MEDIAN_HTTP_HIT:
-           x = statHistDeltaMedian(&l->client_http.hit_svc_time,
-               &f->client_http.hit_svc_time);
-           break;
-       case PERF_MEDIAN_ICP_QUERY:
-           x = statHistDeltaMedian(&l->icp.query_svc_time, &f->icp.query_svc_time);
-           break;
-       case PERF_MEDIAN_ICP_REPLY:
-           x = statHistDeltaMedian(&l->icp.reply_svc_time, &f->icp.reply_svc_time);
-           break;
-       case PERF_MEDIAN_DNS:
-           x = statHistDeltaMedian(&l->dns.svc_time, &f->dns.svc_time);
-           break;
-       case PERF_MEDIAN_RHR:
-           x = statRequestHitRatio(minutes);
-           break;
-       case PERF_MEDIAN_BHR:
-           x = statByteHitRatio(minutes);
-           break;
-       default:
-           *ErrP = SNMP_ERR_NOSUCHNAME;
-           return NULL;
-       }
-       return snmp_var_new_integer(Var->name, Var->name_length,
-           (snint) x,
-           SMI_INTEGER);
+
+        if (Var->name_length == LEN_SQ_PRF + 5)
+            minutes = Var->name[LEN_SQ_PRF + 4];
+        else
+            break;
+
+        if ((minutes < 1) || (minutes > 60))
+            break;
+
+        f = snmpStatGet(0);
+
+        l = snmpStatGet(minutes);
+
+        debugs(49, 8, "median: min= " << minutes << ", " << Var->name[LEN_SQ_PRF + 3] << " l= " << l << " , f = " << f);
+        debugs(49, 8, "median: l= " << l << " , f = " << f);
+
+        switch (Var->name[LEN_SQ_PRF + 3]) {
+
+        case PERF_MEDIAN_TIME:
+            x = minutes;
+            break;
+
+        case PERF_MEDIAN_HTTP_ALL:
+            x = statHistDeltaMedian(l->client_http.allSvcTime,
+                                    f->client_http.allSvcTime);
+            break;
+
+        case PERF_MEDIAN_HTTP_MISS:
+            x = statHistDeltaMedian(l->client_http.missSvcTime,
+                                    f->client_http.missSvcTime);
+            break;
+
+        case PERF_MEDIAN_HTTP_NM:
+            x = statHistDeltaMedian(l->client_http.nearMissSvcTime,
+                                    f->client_http.nearMissSvcTime);
+            break;
+
+        case PERF_MEDIAN_HTTP_HIT:
+            x = statHistDeltaMedian(l->client_http.hitSvcTime,
+                                    f->client_http.hitSvcTime);
+            break;
+
+        case PERF_MEDIAN_ICP_QUERY:
+            x = statHistDeltaMedian(l->icp.querySvcTime, f->icp.querySvcTime);
+            break;
+
+        case PERF_MEDIAN_ICP_REPLY:
+            x = statHistDeltaMedian(l->icp.replySvcTime, f->icp.replySvcTime);
+            break;
+
+        case PERF_MEDIAN_DNS:
+            x = statHistDeltaMedian(l->dns.svcTime, f->dns.svcTime);
+            break;
+
+        case PERF_MEDIAN_RHR:
+            x = statRequestHitRatio(minutes);
+            break;
+
+        case PERF_MEDIAN_BHR:
+            x = statByteHitRatio(minutes);
+            break;
+
+        case PERF_MEDIAN_HTTP_NH:
+            x = statHistDeltaMedian(l->client_http.nearHitSvcTime,
+                                    f->client_http.nearHitSvcTime);
+            break;
+
+        default:
+            *ErrP = SNMP_ERR_NOSUCHNAME;
+            return NULL;
+        }
+
+        return snmp_var_new_integer(Var->name, Var->name_length,
+                                    (snint) x,
+                                    SMI_INTEGER);
     }
+
     *ErrP = SNMP_ERR_NOSUCHNAME;
     return NULL;
 }