From: Amos Jeffries Date: Sun, 20 Dec 2009 08:54:51 +0000 (+1300) Subject: Author: Adrian Chadd X-Git-Tag: SQUID_3_2_0_1~502 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c5753707d56feca6abb7e0e3e351fd446a3e118a;p=thirdparty%2Fsquid.git Author: Adrian Chadd Polish SNMP tree generator. Alters the OID tree creation such that OID are easier for code developers to manage. Ported from Squid-2 patch (only applied to Lusca) by Amos Jeffries. --- diff --git a/include/cache_snmp.h b/include/cache_snmp.h index 545a39c414..058164549c 100644 --- a/include/cache_snmp.h +++ b/include/cache_snmp.h @@ -54,33 +54,31 @@ #define SQ_MESH SQUIDMIB, 5 /* cacheMesh group { squid 5 } */ #define LEN_SQ_MESH LEN_SQUIDMIB+1 -/* +/** * cacheSystem group { squid 1 } */ - enum { - SYS_START, - SYSVMSIZ, /* cacheSysVMsize */ - SYSSTOR, /* cacheSysStorage */ - SYS_UPTIME,/* cacheUptime */ + SYS_START = 0, + SYSVMSIZ = 1, /**< cacheSysVMsize */ + SYSSTOR = 2, /**< cacheSysStorage */ + SYS_UPTIME = 3, /**< cacheUptime */ SYS_END }; #define LEN_SYS LEN_SQ_SYS + 1 #define LEN_SYS_INST LEN_SQ_SYS + 2 -/* +/** * cacheConfig group { squid 2 } */ - enum { - CONF_START, - CONF_ADMIN, /* cacheAdmin */ - CONF_VERSION, /* cacheSoftware */ - CONF_VERSION_ID, /* cacheVersionId */ - CONF_LOG_FAC, /* cacheLoggingFacility */ - CONF_STORAGE, /* cacheStorageConfig group */ - CONF_UNIQNAME, /* cacheUniqName */ + CONF_START = 0, + CONF_ADMIN = 1, /**< cacheAdmin */ + CONF_VERSION = 2, /**< cacheSoftware */ + CONF_VERSION_ID = 3, /**< cacheVersionId */ + CONF_LOG_FAC = 4, /**< cacheLoggingFacility */ + CONF_STORAGE = 5, /**< cacheStorageConfig group */ + CONF_UNIQNAME = 6, /**< cacheUniqName */ CONF_END }; @@ -88,15 +86,15 @@ enum { #define LEN_CONF_INST LEN_SQ_CONF + 2 -/* +/** * cacheStorageConfig group { cacheConfig 5 } */ enum { - CONF_ST_START, - CONF_ST_MMAXSZ, /* cacheMemMaxSize */ - CONF_ST_SWMAXSZ, /* cacheSwapMaxSize */ - CONF_ST_SWHIWM, /* cacheSwapHighWM */ - CONF_ST_SWLOWM, /* cacheSwapLowWM */ + CONF_ST_START = 0, + CONF_ST_MMAXSZ = 1, /* cacheMemMaxSize */ + CONF_ST_SWMAXSZ = 2, /* cacheSwapMaxSize */ + CONF_ST_SWHIWM = 3, /* cacheSwapHighWM */ + CONF_ST_SWLOWM = 4, /* cacheSwapLowWM */ CONF_ST_END }; @@ -108,184 +106,173 @@ enum { */ enum { - PERF_START, - PERF_SYS, /* cacheSysPerf */ - PERF_PROTO, /* cacheProtoStats */ + PERF_START = 0, + PERF_SYS = 1, /* cacheSysPerf */ + PERF_PROTO = 2, /* cacheProtoStats */ PERF_END }; /* cacheSysPerf */ enum { - PERF_SYS_START, - PERF_SYS_PF, /* cacheSysPageFaults */ - PERF_SYS_NUMR, /* cacheSysNumReads */ - PERF_SYS_MEMUSAGE, /* cacheMemUsage */ - PERF_SYS_CPUTIME, /* cacheCpuTime */ - PERF_SYS_CPUUSAGE, /* cacheCpuUsage */ - PERF_SYS_MAXRESSZ, /* cacheMaxResSize */ - PERF_SYS_NUMOBJCNT, /* cacheNumObjCount */ - PERF_SYS_CURLRUEXP, /* cacheCurrentLRUExpiration */ - PERF_SYS_CURUNLREQ, /* cacheCurrentUnlinkRequests */ - PERF_SYS_CURUNUSED_FD, /* cacheCurrentUnusedFDescrCnt */ - PERF_SYS_CURRESERVED_FD, /* cacheCurrentResFileDescrCnt */ - PERF_SYS_CURUSED_FD, /* cacheCurrentFileDescrCnt */ - PERF_SYS_CURMAX_FD, /* cacheCurrentFileDescrMax */ + PERF_SYS_START = 0, + PERF_SYS_PF = 1, /* cacheSysPageFaults */ + PERF_SYS_NUMR = 2, /* cacheSysNumReads */ + PERF_SYS_MEMUSAGE = 3, /* cacheMemUsage */ + PERF_SYS_CPUTIME = 4, /* cacheCpuTime */ + PERF_SYS_CPUUSAGE = 5, /* cacheCpuUsage */ + PERF_SYS_MAXRESSZ = 6, /* cacheMaxResSize */ + PERF_SYS_NUMOBJCNT = 7, /* cacheNumObjCount */ + PERF_SYS_CURLRUEXP = 8, /* cacheCurrentLRUExpiration */ + PERF_SYS_CURUNLREQ = 9, /* cacheCurrentUnlinkRequests */ + PERF_SYS_CURUNUSED_FD = 10, /* cacheCurrentUnusedFDescrCnt */ + PERF_SYS_CURRESERVED_FD = 11, /* cacheCurrentResFileDescrCnt */ + PERF_SYS_CURUSED_FD = 12, /* cacheCurrentFileDescrCnt */ + PERF_SYS_CURMAX_FD = 13, /* cacheCurrentFileDescrMax */ PERF_SYS_END }; /* cacheProtoStats */ enum { PERF_PROTOSTAT_START, - PERF_PROTOSTAT_AGGR, /* cacheProtoAggregateStats */ - PERF_PROTOSTAT_MEDIAN, /* cacheMedianSvcTable */ + PERF_PROTOSTAT_AGGR = 1, /* cacheProtoAggregateStats */ + PERF_PROTOSTAT_MEDIAN = 2, /* cacheMedianSvcTable */ PERF_PROTOSTAT_END }; /* cacheProtoAggregateStats */ enum { - PERF_PROTOSTAT_AGGR_START, - PERF_PROTOSTAT_AGGR_HTTP_REQ, /* cacheProtoClientHttpRequests */ - PERF_PROTOSTAT_AGGR_HTTP_HITS, /* cacheHttpHits */ - PERF_PROTOSTAT_AGGR_HTTP_ERRORS, /* cacheHttpErrors */ - PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN, /* cacheHttpInKb */ - PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT, /* cacheHttpOutKb */ - PERF_PROTOSTAT_AGGR_ICP_S, /* cacheIcpPktsSent */ - PERF_PROTOSTAT_AGGR_ICP_R, /* cacheIcpPktsRecv */ - PERF_PROTOSTAT_AGGR_ICP_SKB, /* cacheIcpKbSent */ - PERF_PROTOSTAT_AGGR_ICP_RKB, /* cacheIcpKbRecv */ - PERF_PROTOSTAT_AGGR_REQ, /* cacheServerRequests */ - PERF_PROTOSTAT_AGGR_ERRORS, /* cacheServerErrors */ - PERF_PROTOSTAT_AGGR_KBYTES_IN, /* cacheServerInKb */ - PERF_PROTOSTAT_AGGR_KBYTES_OUT, /* cacheServerOutKb */ - PERF_PROTOSTAT_AGGR_CURSWAP, /* cacheCurrentSwapSize */ - PERF_PROTOSTAT_AGGR_CLIENTS, /* cacheClients */ + PERF_PROTOSTAT_AGGR_START = 0, + PERF_PROTOSTAT_AGGR_HTTP_REQ = 1, /* cacheProtoClientHttpRequests */ + PERF_PROTOSTAT_AGGR_HTTP_HITS = 2, /* cacheHttpHits */ + PERF_PROTOSTAT_AGGR_HTTP_ERRORS = 3, /* cacheHttpErrors */ + PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN = 4, /* cacheHttpInKb */ + PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT = 5, /* cacheHttpOutKb */ + PERF_PROTOSTAT_AGGR_ICP_S = 6, /* cacheIcpPktsSent */ + PERF_PROTOSTAT_AGGR_ICP_R = 7, /* cacheIcpPktsRecv */ + PERF_PROTOSTAT_AGGR_ICP_SKB = 8, /* cacheIcpKbSent */ + PERF_PROTOSTAT_AGGR_ICP_RKB = 9, /* cacheIcpKbRecv */ + PERF_PROTOSTAT_AGGR_REQ = 10, /* cacheServerRequests */ + PERF_PROTOSTAT_AGGR_ERRORS = 11, /* cacheServerErrors */ + PERF_PROTOSTAT_AGGR_KBYTES_IN = 12, /* cacheServerInKb */ + PERF_PROTOSTAT_AGGR_KBYTES_OUT = 13, /* cacheServerOutKb */ + PERF_PROTOSTAT_AGGR_CURSWAP = 14, /* cacheCurrentSwapSize */ + PERF_PROTOSTAT_AGGR_CLIENTS = 15, /* cacheClients */ PERF_PROTOSTAT_AGGR_END }; - -/* CacheMedianSvcEntry */ +/* cacheMedianSvcEntry */ enum { - PERF_MEDIAN_START, - PERF_MEDIAN_TIME, /* cacheMedianTime */ - PERF_MEDIAN_HTTP_ALL, /* cacheHttpAllSvcTime */ - PERF_MEDIAN_HTTP_MISS, /* cacheHttpMissSvcTime */ - PERF_MEDIAN_HTTP_NM, /* cacheHttpNmSvcTime */ - PERF_MEDIAN_HTTP_HIT, /* cacheHttpHitSvcTime */ - PERF_MEDIAN_ICP_QUERY, /* cacheIcpQuerySvcTime */ - PERF_MEDIAN_ICP_REPLY, /* cacheIcpReplySvcTime */ - PERF_MEDIAN_DNS, /* cacheDnsSvcTime */ - PERF_MEDIAN_RHR, /* cacheRequestHitRatio */ - PERF_MEDIAN_BHR, /* cacheRequestByteRatio */ - PERF_MEDIAN_HTTP_NH, /* cacheHttpNhSvcTime */ + PERF_MEDIAN_START = 0, + PERF_MEDIAN_TIME = 1, /* cacheMedianTime */ + PERF_MEDIAN_HTTP_ALL = 2, /* cacheHttpAllSvcTime */ + PERF_MEDIAN_HTTP_MISS = 3, /* cacheHttpMissSvcTime */ + PERF_MEDIAN_HTTP_NM = 4, /* cacheHttpNmSvcTime */ + PERF_MEDIAN_HTTP_HIT = 5, /* cacheHttpHitSvcTime */ + PERF_MEDIAN_ICP_QUERY = 6, /* cacheIcpQuerySvcTime */ + PERF_MEDIAN_ICP_REPLY = 7, /* cacheIcpReplySvcTime */ + PERF_MEDIAN_DNS = 8, /* cacheDnsSvcTime */ + PERF_MEDIAN_RHR = 9, /* cacheRequestHitRatio */ + PERF_MEDIAN_BHR = 10, /* cacheRequestByteRatio */ + PERF_MEDIAN_HTTP_NH = 11, /* cacheHttpNhSvcTime */ PERF_MEDIAN_END }; - - - /* * cacheNetwork group { squid 4 } */ - enum { - NET_START, - NET_IP_CACHE, /* cacheIpCache */ - NET_FQDN_CACHE, /* cacheFqdnCache */ - NET_DNS_CACHE, /* cacheDns */ + NET_START = 0, + NET_IP_CACHE = 1, /* cacheIpCache */ + NET_FQDN_CACHE = 2, /* cacheFqdnCache */ + NET_DNS_CACHE = 3, /* cacheDns */ NET_END }; /* cacheIpCache */ enum { - IP_START, - IP_ENT, /* cacheIpEntrie */ - IP_REQ, /* cacheIpRequests */ - IP_HITS, /* acheIpHits */ - IP_PENDHIT, /* cacheIpPendingHits */ - IP_NEGHIT, /* cacheIpNegativeHit */ - IP_MISS, /* cacheIpMisses */ - IP_GHBN, /* cacheBlockingGetHostByName */ - IP_LOC, /* cacheAttemptReleaseLckEntries */ + IP_START = 0, + IP_ENT = 1, /* cacheIpEntrie */ + IP_REQ = 2, /* cacheIpRequests */ + IP_HITS = 3, /* acheIpHits */ + IP_PENDHIT = 4, /* cacheIpPendingHits */ + IP_NEGHIT = 5, /* cacheIpNegativeHit */ + IP_MISS = 6, /* cacheIpMisses */ + IP_GHBN = 7, /* cacheBlockingGetHostByName */ + IP_LOC = 8, /* cacheAttemptReleaseLckEntries */ IP_END }; /* cacheFqdnCache */ enum { - FQDN_START, - FQDN_ENT, /* cacheFqdnEntries */ - FQDN_REQ, /* cacheFqdnRequests */ - FQDN_HITS, /* cacheFqdnHits */ - FQDN_PENDHIT, /* cacheFqdnPendingHits */ - FQDN_NEGHIT, /* cacheFqdnNegativeHits */ - FQDN_MISS, /* cacheFqdnMisses */ - FQDN_GHBN, /* cacheBlockingGetHostByAddr */ + FQDN_START = 0, + FQDN_ENT = 1, /* cacheFqdnEntries */ + FQDN_REQ = 2, /* cacheFqdnRequests */ + FQDN_HITS = 3, /* cacheFqdnHits */ + FQDN_PENDHIT = 4, /* cacheFqdnPendingHits */ + FQDN_NEGHIT = 5, /* cacheFqdnNegativeHits */ + FQDN_MISS = 6, /* cacheFqdnMisses */ + FQDN_GHBN = 7, /* cacheBlockingGetHostByAddr */ FQDN_END }; - /* cacheDNS */ enum { - DNS_START, - DNS_REQ, /* cacheDnsRequests */ - DNS_REP, /* cacheDnsReplies */ - DNS_SERVERS, /* cacheDnsNumberServers */ + DNS_START = 0, + DNS_REQ = 1, /* cacheDnsRequests */ + DNS_REP = 2, /* cacheDnsReplies */ + DNS_SERVERS = 3, /* cacheDnsNumberServers */ DNS_END }; - - - /* * cacheMesh group { squid 5 } */ enum { - MESH_START, - MESH_PTBL, /* cachePeerTable */ - MESH_CTBL, /* cacheClientTable */ + MESH_START = 0, + MESH_PTBL = 1, /* cachePeerTable */ + MESH_CTBL = 2, /* cacheClientTable */ MESH_END }; -/* cachePeerEntry */ +/* cachePeerTable CachePeerEntry */ enum { - MESH_PTBL_START, - MESH_PTBL_INDEX, /* cachePeerIndex */ - MESH_PTBL_NAME, /* cachePeerName */ - MESH_PTBL_ADDR_TYPE, /* cachePeerAddressType */ - MESH_PTBL_ADDR, /* cachePeerAddress */ - MESH_PTBL_HTTP, /* cachePortHttp */ - MESH_PTBL_ICP, /* cachePeerPortIcp */ - MESH_PTBL_TYPE, /* cachePeerType */ - MESH_PTBL_STATE, /* cachePeerStat */ - MESH_PTBL_SENT, /* cachePeerPingsSent */ - MESH_PTBL_PACKED, /* cachePeerPingsAcked */ - MESH_PTBL_FETCHES, /* cachePeerFetches */ - MESH_PTBL_RTT, /* cachePeerRtt */ - MESH_PTBL_IGN, /* cachePeerIgnored */ - MESH_PTBL_KEEPAL_S, /* cachePeerKeepAlSent */ - MESH_PTBL_KEEPAL_R, /* cachePeerKeepAlRecv */ + MESH_PTBL_START = 0, + MESH_PTBL_INDEX = 1, /* cachePeerIndex */ + MESH_PTBL_NAME = 2, /* cachePeerName */ + MESH_PTBL_ADDR_TYPE = 3, /* cachePeerAddressType */ + MESH_PTBL_ADDR = 4, /* cachePeerAddress */ + MESH_PTBL_HTTP = 5, /* cachePortHttp */ + MESH_PTBL_ICP = 6, /* cachePeerPortIcp */ + MESH_PTBL_TYPE = 7, /* cachePeerType */ + MESH_PTBL_STATE = 8, /* cachePeerStat */ + MESH_PTBL_SENT = 9, /* cachePeerPingsSent */ + MESH_PTBL_PACKED = 10, /* cachePeerPingsAcked */ + MESH_PTBL_FETCHES = 11, /* cachePeerFetches */ + MESH_PTBL_RTT = 12, /* cachePeerRtt */ + MESH_PTBL_IGN = 13, /* cachePeerIgnored */ + MESH_PTBL_KEEPAL_S = 14, /* cachePeerKeepAlSent */ + MESH_PTBL_KEEPAL_R = 15, /* cachePeerKeepAlRecv */ MESH_PTBL_END }; /* cacheClientEntry */ enum { - MESH_CTBL_START, - MESH_CTBL_ADDR_TYPE, /* cacheClientAddressType */ - MESH_CTBL_ADDR, /* cacheClientAddress */ - MESH_CTBL_HTREQ, /* cacheClientHttpRequests */ - MESH_CTBL_HTBYTES, /* cacheClientHttpKb */ - MESH_CTBL_HTHITS, /* cacheClientHttpHits */ - MESH_CTBL_HTHITBYTES, /* cacheClientHTTPHitKb */ - MESH_CTBL_ICPREQ, /* cacheClientIcpRequests */ - MESH_CTBL_ICPBYTES, /* cacheClientIcpKb */ - MESH_CTBL_ICPHITS, /* cacheClientIcpHits */ - MESH_CTBL_ICPHITBYTES,/* cacheClientIcpHitKb */ + MESH_CTBL_START = 0, + MESH_CTBL_ADDR_TYPE = 1, /* cacheClientAddressType */ + MESH_CTBL_ADDR = 2, /* cacheClientAddress */ + MESH_CTBL_HTREQ = 3, /* cacheClientHttpRequests */ + MESH_CTBL_HTBYTES = 4, /* cacheClientHttpKb */ + MESH_CTBL_HTHITS = 5, /* cacheClientHttpHits */ + MESH_CTBL_HTHITBYTES = 6, /* cacheClientHTTPHitKb */ + MESH_CTBL_ICPREQ = 7, /* cacheClientIcpRequests */ + MESH_CTBL_ICPBYTES = 8, /* cacheClientIcpKb */ + MESH_CTBL_ICPHITS = 9, /* cacheClientIcpHits */ + MESH_CTBL_ICPHITBYTES = 10, /* cacheClientIcpHitKb */ MESH_CTBL_END }; - - #endif /* SQUID_SNMP */ #endif /* SQUID_CACHE_SNMP_H */ diff --git a/src/mib.txt b/src/mib.txt index d928f63cf3..81b5ebd3d1 100644 --- a/src/mib.txt +++ b/src/mib.txt @@ -287,6 +287,7 @@ squid MODULE-IDENTITY DESCRIPTION " Highest file descriptors in use " ::= { cacheSysPerf 13 } + -- -- cacheProtoStats -- @@ -690,7 +691,7 @@ squid MODULE-IDENTITY MAX-ACCESS read-only STATUS current DESCRIPTION - " Number of external dnsserver requests " + " Number of external DNS server requests " ::= { cacheDns 1 } cacheDnsReplies OBJECT-TYPE @@ -698,7 +699,7 @@ squid MODULE-IDENTITY MAX-ACCESS read-only STATUS current DESCRIPTION - " Number of external dnsserver replies " + " Number of external DNS server replies " ::= { cacheDns 2 } cacheDnsNumberServers OBJECT-TYPE @@ -706,7 +707,7 @@ squid MODULE-IDENTITY MAX-ACCESS read-only STATUS current DESCRIPTION - " Number of external dnsserver processes " + " Number of external DNS server processes " ::= { cacheDns 3 } -- @@ -732,7 +733,7 @@ squid MODULE-IDENTITY ::= { cachePeerTable 1 } CachePeerEntry ::= SEQUENCE { - cachePeerIndex CachePeerIndex, + cachePeerIndex CachePeerTableIndex, cachePeerName DisplayString, cachePeerAddressType InetAddressType, cachePeerAddress InetAddress, @@ -757,7 +758,7 @@ squid MODULE-IDENTITY the appropriate port number for the connection." SYNTAX Integer32 (1..65535) - CachePeerIndex ::= TEXTUAL-CONVENTION + CachePeerTableIndex ::= TEXTUAL-CONVENTION DISPLAY-HINT "d" STATUS current DESCRIPTION @@ -772,7 +773,6 @@ squid MODULE-IDENTITY SYNTAX Integer32 (1..2147483647) - cachePeerIndex OBJECT-TYPE SYNTAX CachePeerIndex MAX-ACCESS read-only diff --git a/src/snmp_core.cc b/src/snmp_core.cc index 7bbdf893df..3f140057a1 100644 --- a/src/snmp_core.cc +++ b/src/snmp_core.cc @@ -58,8 +58,11 @@ struct _mib_tree_entry { mib_tree_entry *mib_tree_head; mib_tree_entry *mib_tree_last; +static mib_tree_entry * snmpAddNodeStr(const char *base_str, int o, oid_ParseFn * parsefunction, instance_Fn * instancefunction); static mib_tree_entry *snmpAddNode(oid * name, int len, oid_ParseFn * parsefunction, instance_Fn * instancefunction, int children,...); static oid *snmpCreateOid(int length,...); +mib_tree_entry * snmpLookupNodeStr(mib_tree_entry *entry, const char *str); +int snmpCreateOidFromStr(const char *str, oid **name, int *nl); SQUIDCEXTERN void (*snmplib_debug_hook) (int, char *); static oid *static_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn); static oid *time_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn); @@ -93,263 +96,178 @@ snmpInit(void) snmplib_debug_hook = snmpSnmplibDebug; - mib_tree_head = snmpAddNode(snmpCreateOid(1, 1), - 1, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(2, 1, 3), - 2, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(3, 1, 3, 6), - 3, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(4, 1, 3, 6, 1), - 4, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(5, 1, 3, 6, 1, 4), - 5, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(6, 1, 3, 6, 1, 4, 1), - 6, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(7, 1, 3, 6, 1, 4, 1, 3495), - 7, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(LEN_SQUIDMIB, SQUIDMIB), - 8, NULL, NULL, 5, - snmpAddNode(snmpCreateOid(LEN_SQ_SYS, SQ_SYS), - LEN_SQ_SYS, NULL, NULL, 3, - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_SYS, SYSVMSIZ), - LEN_SYS, snmp_sysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_SYS, SYSSTOR), - LEN_SYS, snmp_sysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_SYS, SYS_UPTIME), - LEN_SYS, snmp_sysFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SQ_CONF, SQ_CONF), - LEN_SQ_CONF, NULL, NULL, 6, - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_CONF, CONF_ADMIN), - LEN_SYS, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_CONF, CONF_VERSION), - LEN_SYS, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_CONF, CONF_VERSION_ID), - LEN_SYS, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_CONF, CONF_LOG_FAC), - LEN_SYS, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_CONF, CONF_STORAGE), - LEN_SYS, NULL, NULL, 4, - snmpAddNode(snmpCreateOid(LEN_CONF_ST, SQ_CONF, CONF_STORAGE, CONF_ST_MMAXSZ), - LEN_CONF_ST, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_CONF_ST, SQ_CONF, CONF_STORAGE, CONF_ST_SWMAXSZ), - LEN_CONF_ST, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_CONF_ST, SQ_CONF, CONF_STORAGE, CONF_ST_SWHIWM), - LEN_CONF_ST, snmp_confFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_CONF_ST, SQ_CONF, CONF_STORAGE, CONF_ST_SWLOWM), - LEN_CONF_ST, snmp_confFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SYS, SQ_CONF, CONF_UNIQNAME), - LEN_SYS, snmp_confFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF, SQ_PRF), - LEN_SQ_PRF, NULL, NULL, 2, - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 1, SQ_PRF, PERF_SYS), - LEN_SQ_PRF + 1, NULL, NULL, 13, - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_PF), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_NUMR), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_MEMUSAGE), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CPUTIME), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CPUUSAGE), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_MAXRESSZ), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_NUMOBJCNT), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CURLRUEXP), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CURUNLREQ), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CURUNUSED_FD), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CURRESERVED_FD), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CURUSED_FD), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_SYS, PERF_SYS_CURMAX_FD), - LEN_SQ_PRF + 2, snmp_prfSysFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 1, SQ_PRF, PERF_PROTO), - LEN_SQ_PRF + 1, NULL, NULL, 2, - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR), - LEN_SQ_PRF + 2, NULL, NULL, 15, - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_HTTP_REQ), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_HTTP_HITS), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_HTTP_ERRORS), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_ICP_S), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_ICP_R), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_ICP_SKB), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_ICP_RKB), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_REQ), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_ERRORS), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_KBYTES_IN), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_KBYTES_OUT), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_CURSWAP), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_AGGR, PERF_PROTOSTAT_AGGR_CLIENTS), - LEN_SQ_PRF + 3, snmp_prfProtoFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 2, SQ_PRF, PERF_PROTO, 2), - LEN_SQ_PRF + 2, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 3, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1), - LEN_SQ_PRF + 3, NULL, NULL, 11, - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_TIME), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_HTTP_ALL), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_HTTP_MISS), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_HTTP_NM), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_HTTP_HIT), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_ICP_QUERY), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_ICP_REPLY), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_DNS), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_RHR), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_BHR), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_PRF + 4, SQ_PRF, PERF_PROTO, PERF_PROTOSTAT_MEDIAN, 1, PERF_MEDIAN_HTTP_NH), - LEN_SQ_PRF + 4, snmp_prfProtoFn, time_Inst, 0))))), - snmpAddNode(snmpCreateOid(LEN_SQ_NET, SQ_NET), - LEN_SQ_NET, NULL, NULL, 3, - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 1, SQ_NET, NET_IP_CACHE), - LEN_SQ_NET + 1, NULL, NULL, 8, - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_ENT), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_REQ), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_HITS), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_PENDHIT), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_NEGHIT), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_MISS), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_GHBN), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_IP_CACHE, IP_LOC), - LEN_SQ_NET + 2, snmp_netIpFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 1, SQ_NET, NET_FQDN_CACHE), - LEN_SQ_NET + 1, NULL, NULL, 7, - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_ENT), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_REQ), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_HITS), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_PENDHIT), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_NEGHIT), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_MISS), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_FQDN_CACHE, FQDN_GHBN), - LEN_SQ_NET + 2, snmp_netFqdnFn, static_Inst, 0)), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 1, SQ_NET, NET_DNS_CACHE), - LEN_SQ_NET + 1, NULL, NULL, 3, -#if USE_DNSSERVERS - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_DNS_CACHE, DNS_REQ), - LEN_SQ_NET + 2, snmp_netDnsFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_DNS_CACHE, DNS_REP), - LEN_SQ_NET + 2, snmp_netDnsFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_DNS_CACHE, DNS_SERVERS), - LEN_SQ_NET + 2, snmp_netDnsFn, static_Inst, 0))), + /* + * This following bit of evil is to get the final node in the "squid" mib + * without having a "search" function. A search function should be written + * to make this and the other code much less evil. + */ + mib_tree_head = snmpAddNode(snmpCreateOid(1, 1), 1, NULL, NULL, 0); + + assert(mib_tree_head); + debugs(49, 5, "snmpInit: root is " << mib_tree_head); + snmpAddNodeStr("1", 3, NULL, NULL); + + snmpAddNodeStr("1.3", 6, NULL, NULL); + + snmpAddNodeStr("1.3.6", 1, NULL, NULL); + snmpAddNodeStr("1.3.6.1", 4, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4", 1, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1", 3495, NULL, NULL); + mib_tree_entry *m2 = snmpAddNodeStr("1.3.6.1.4.1.3495", 1, NULL, NULL); + + mib_tree_entry *n = snmpLookupNodeStr(NULL, "1.3.6.1.4.1.3495.1"); + assert(m2 == n); + + /* SQ_SYS - 1.3.6.1.4.1.3495.1.1 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1", 1, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.1", SYSVMSIZ, snmp_sysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.1", SYSSTOR, snmp_sysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.1", SYS_UPTIME, snmp_sysFn, static_Inst); + + /* SQ_CONF - 1.3.6.1.4.1.3495.1.2 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1", 2, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2", CONF_ADMIN, snmp_confFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2", CONF_VERSION, snmp_confFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2", CONF_VERSION_ID, snmp_confFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2", CONF_LOG_FAC, snmp_confFn, static_Inst); + + /* SQ_CONF + CONF_STORAGE - 1.3.6.1.4.1.3495.1.5 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2", CONF_STORAGE, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2.5", CONF_ST_MMAXSZ, snmp_confFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2.5", CONF_ST_SWMAXSZ, snmp_confFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2.5", CONF_ST_SWHIWM, snmp_confFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2.5", CONF_ST_SWLOWM, snmp_confFn, static_Inst); + + snmpAddNodeStr("1.3.6.1.4.1.3495.1.2", CONF_UNIQNAME, snmp_confFn, static_Inst); + + /* SQ_PRF - 1.3.6.1.4.1.3495.1.3 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1", 3, NULL, NULL); /* SQ_PRF */ + + /* PERF_SYS - 1.3.6.1.4.1.3495.1.3.1 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3", PERF_SYS, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_PF, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_NUMR, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_MEMUSAGE, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CPUTIME, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CPUUSAGE, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_MAXRESSZ, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_NUMOBJCNT, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CURLRUEXP, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CURUNLREQ, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CURUNUSED_FD, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CURRESERVED_FD, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CURUSED_FD, snmp_prfSysFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.1", PERF_SYS_CURMAX_FD, snmp_prfSysFn, static_Inst); + + /* PERF_PROTO - 1.3.6.1.4.1.3495.1.3.2 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3", PERF_PROTO, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2", PERF_PROTOSTAT_AGGR, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_HTTP_REQ, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_HTTP_HITS, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_HTTP_ERRORS, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_ICP_S, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_ICP_R, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_ICP_SKB, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_ICP_RKB, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_REQ, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_ERRORS, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_KBYTES_IN, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_KBYTES_OUT, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_CURSWAP, snmp_prfProtoFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.1", PERF_PROTOSTAT_AGGR_CLIENTS, snmp_prfProtoFn, static_Inst); + + /* Note this is time-series rather than 'static' */ + /* cacheMedianSvcTable */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2", PERF_PROTOSTAT_MEDIAN, NULL, NULL); + + /* cacheMedianSvcEntry */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2", 1, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_TIME, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_HTTP_ALL, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_HTTP_MISS, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_HTTP_NM, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_HTTP_HIT, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_ICP_QUERY, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_ICP_REPLY, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_DNS, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_RHR, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_BHR, snmp_prfProtoFn, time_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.3.2.2.1", PERF_MEDIAN_HTTP_NH, snmp_prfProtoFn, time_Inst); + + /* SQ_NET - 1.3.6.1.4.1.3495.1.4 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1", 4, NULL, NULL); + + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4", NET_IP_CACHE, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_ENT, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_REQ, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_HITS, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_PENDHIT, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_NEGHIT, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_MISS, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_GHBN, snmp_netIpFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.1", IP_LOC, snmp_netIpFn, static_Inst); + + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4", NET_FQDN_CACHE, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_ENT, snmp_netFqdnFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_REQ, snmp_netFqdnFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_HITS, snmp_netFqdnFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_PENDHIT, snmp_netFqdnFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_NEGHIT, snmp_netFqdnFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_MISS, snmp_netFqdnFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.2", FQDN_GHBN, snmp_netFqdnFn, static_Inst); + + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4", NET_DNS_CACHE, NULL, NULL); + #if USE_DNSSERVERS + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.3", DNS_REQ, snmp_netDnsFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.3", DNS_REP, snmp_netDnsFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.3", DNS_SERVERS, snmp_netDnsFn, static_Inst); #else - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_DNS_CACHE, DNS_REQ), - LEN_SQ_NET + 2, snmp_netIdnsFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_DNS_CACHE, DNS_REP), - LEN_SQ_NET + 2, snmp_netIdnsFn, static_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_NET + 2, SQ_NET, NET_DNS_CACHE, DNS_SERVERS), - LEN_SQ_NET + 2, snmp_netIdnsFn, static_Inst, 0))), + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.3", DNS_REQ, snmp_netIdnsFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.3", DNS_REP, snmp_netIdnsFn, static_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.4.3", DNS_SERVERS, snmp_netIdnsFn, static_Inst); #endif - snmpAddNode(snmpCreateOid(LEN_SQ_MESH, SQ_MESH), - LEN_SQ_MESH, NULL, NULL, 2, - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 1, SQ_MESH, MESH_PTBL), - LEN_SQ_MESH + 1, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 2, SQ_MESH, 1, 1), - LEN_SQ_MESH + 2, NULL, NULL, 15, - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_INDEX), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_NAME), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_ADDR_TYPE), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_ADDR), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_HTTP), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_ICP), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_TYPE), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_STATE), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_SENT), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_PACKED), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_FETCHES), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_RTT), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_IGN), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_KEEPAL_S), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_PTBL, 1, MESH_PTBL_KEEPAL_R), - LEN_SQ_MESH + 3, snmp_meshPtblFn, peer_Inst, 0))), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 1, SQ_MESH, MESH_CTBL), - LEN_SQ_MESH + 1, NULL, NULL, 1, - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 2, SQ_MESH, MESH_CTBL, 1), - LEN_SQ_MESH + 2, NULL, NULL, 10, - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_ADDR_TYPE), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_ADDR), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_HTREQ), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_HTBYTES), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_HTHITS), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_HTHITBYTES), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_ICPREQ), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_ICPBYTES), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_ICPHITS), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0), - (mib_tree_last = snmpAddNode(snmpCreateOid(LEN_SQ_MESH + 3, SQ_MESH, MESH_CTBL, 1, MESH_CTBL_ICPHITBYTES), - LEN_SQ_MESH + 3, snmp_meshCtblFn, client_Inst, 0))))) - ) - ) - ) - ) - ) - ) - ) - ); + + /* SQ_MESH - 1.3.6.1.4.1.3495.1.5 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1", 5, NULL, NULL); + + /* cachePeerTable - 1.3.6.1.4.1.3495.1.5.1 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5", MESH_PTBL, NULL, NULL); + + /* CachePeerEntry - 1.3.6.1.4.1.3495.1.5.1.1 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1", 1, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_INDEX, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_NAME, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_ADDR_TYPE, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_ADDR, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_HTTP, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_ICP, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_TYPE, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_STATE, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_SENT, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_PACKED, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_FETCHES, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_RTT, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_IGN, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_KEEPAL_S, snmp_meshPtblFn, peer_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.1.1", MESH_PTBL_KEEPAL_R, snmp_meshPtblFn, peer_Inst); + + /* cacheClientTable - 1.3.6.1.4.1.3495.1.5.2 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5", MESH_CTBL, NULL, NULL); + + /* cacheClientEntry - 1.3.6.1.4.1.3495.1.5.2.1 */ + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2", 1, NULL, NULL); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_ADDR_TYPE, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_ADDR, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_HTREQ, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_HTBYTES, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_HTHITS, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_HTHITBYTES, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_ICPREQ, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_ICPBYTES, snmp_meshCtblFn, client_Inst); + snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_ICPHITS, snmp_meshCtblFn, client_Inst); + mib_tree_last = snmpAddNodeStr("1.3.6.1.4.1.3495.1.5.2.1", MESH_CTBL_ICPHITBYTES, snmp_meshCtblFn, client_Inst); debugs(49, 9, "snmpInit: Completed SNMP mib tree structure"); } @@ -576,7 +494,6 @@ snmpConstructReponse(snmp_request_t * rq) */ static struct snmp_pdu * - snmpAgentResponse(struct snmp_pdu *PDU) { struct snmp_pdu *Answer = NULL; @@ -831,27 +748,31 @@ peer_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn) peer *peers = Config.peers; if (peers == NULL) { + debugs(49, 6, "snmp peer_Inst: No Peers."); current = current->parent->parent->parent->leaves[1]; while ((current) && (!current->parsefunction)) current = current->leaves[0]; instance = client_Inst(current->name, len, current, Fn); } else if (*len <= current->len) { + debugs(49, 6, "snmp peer_Inst: *len <= current->len ???"); instance = (oid *)xmalloc(sizeof(name) * ( *len + 1)); xmemcpy(instance, name, (sizeof(name) * *len)); instance[*len] = 1 ; *len += 1; } else { int no = name[current->len] ; - int i ; // Note: This works because the Confifg.peers - // keep its index acording to its position. + int i; + // Note: This works because the Config.peers keeps its index according to its position. for ( i=0 ; peers && (i < no) ; peers = peers->next , i++ ) ; if (peers) { + debugs(49, 6, "snmp peer_Inst: Encode peer #" << i); instance = (oid *)xmalloc(sizeof(name) * (current->len + 1 )); xmemcpy(instance, name, (sizeof(name) * current->len )); instance[current->len] = no + 1 ; // i.e. the next index on cache_peeer table. } else { + debugs(49, 6, "snmp peer_Inst: We have " << i << " peers. Can't find #" << no); return (instance); } } @@ -943,7 +864,7 @@ snmpTreeSiblingEntry(oid entry, snint len, mib_tree_entry * current) count++; } - /* Exactly the sibling on rigth */ + /* Exactly the sibling on right */ if (count < current->children) { next = current->leaves[count]; } else { @@ -973,6 +894,113 @@ snmpTreeEntry(oid entry, snint len, mib_tree_entry * current) return (next); } +void +snmpAddNodeChild(mib_tree_entry *entry, mib_tree_entry *child) +{ + debugs(49, 5, "snmpAddNodeChild: assigning " << child << " to parent " << entry); + entry->leaves = (mib_tree_entry **)xrealloc(entry->leaves, sizeof(mib_tree_entry *) * (entry->children + 1)); + entry->leaves[entry->children] = child; + entry->leaves[entry->children]->parent = entry; + entry->children++; +} + +mib_tree_entry * +snmpLookupNodeStr(mib_tree_entry *root, const char *str) +{ + oid *name; + int namelen; + mib_tree_entry *e; + + if (root) + e = root; + else + e = mib_tree_head; + + if (! snmpCreateOidFromStr(str, &name, &namelen)) + return NULL; + + /* I wish there were some kind of sensible existing tree traversal + * routine to use. I'll worry about that later */ + if (namelen <= 1) { + xfree(name); + return e; /* XXX it should only be this? */ + } + + int i, r = 1; + while(r <= namelen) { + + /* Find the child node which matches this */ + for (i = 0; i < e->children && e->leaves[i]->name[r] != name[r]; i++) ; // seek-loop + + /* Are we pointing to that node? */ + if (i >= e->children) + break; + assert(e->leaves[i]->name[r] == name[r]); + + /* Skip to that node! */ + e = e->leaves[i]; + r++; + } + + xfree(name); + return e; +} + +int +snmpCreateOidFromStr(const char *str, oid **name, int *nl) +{ + char const *delim = "."; + char *p; + + *name = NULL; + *nl = 0; + char *s = xstrdup(str); + + /* Parse the OID string into oid bits */ + while( (p = strsep(&s, delim)) != NULL) { + *name = (oid*)xrealloc(*name, sizeof(oid) * ((*nl) + 1)); + (*name)[*nl] = atoi(p); + (*nl)++; + } + + xfree(s); + return 1; +} + +/* + * Create an entry. Return a pointer to the newly created node, or NULL + * on failure. + */ +static mib_tree_entry * +snmpAddNodeStr(const char *base_str, int o, oid_ParseFn * parsefunction, instance_Fn * instancefunction) +{ + mib_tree_entry *m, *b; + oid *n; + int nl; + char s[1024]; + + /* Find base node */ + b = snmpLookupNodeStr(mib_tree_head, base_str); + if (! b) + return NULL; + debugs(49, 5, "snmpAddNodeStr: " << base_str << ": -> " << b); + + /* Create OID string for new entry */ + snprintf(s, 1024, "%s.%d", base_str, o); + if (! snmpCreateOidFromStr(s, &n, &nl)) + return NULL; + + /* Create a node */ + m = snmpAddNode(n, nl, parsefunction, instancefunction, 0); + + /* Link it into the existing tree */ + snmpAddNodeChild(b, m); + + /* Return the node */ + return m; +} + + /* * Adds a node to the MIB tree structure and adds the appropriate children */ @@ -994,6 +1022,7 @@ snmpAddNode(oid * name, int len, oid_ParseFn * parsefunction, instance_Fn * inst entry->parsefunction = parsefunction; entry->instancefunction = instancefunction; entry->children = children; + entry->leaves = NULL; if (children > 0) { entry->leaves = (mib_tree_entry **)xmalloc(sizeof(mib_tree_entry *) * children);