Juan Lang : inetmib1: Support the MIB2 IP statistics.

Alexandre Julliard julliard at winehq.org
Wed Jun 25 04:47:35 CDT 2008


Module: wine
Branch: master
Commit: b77719c7fb01064d9b42395b3b1d49d39b483b4b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b77719c7fb01064d9b42395b3b1d49d39b483b4b

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue May 20 20:55:20 2008 -0700

inetmib1: Support the MIB2 IP statistics.

---

 dlls/inetmib1/main.c |   93 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 93 insertions(+), 0 deletions(-)

diff --git a/dlls/inetmib1/main.c b/dlls/inetmib1/main.c
index edf80f4..1aff74d 100644
--- a/dlls/inetmib1/main.c
+++ b/dlls/inetmib1/main.c
@@ -316,10 +316,103 @@ static BOOL mib2IfEntryQuery(BYTE bPduType, SnmpVarBind *pVarBind,
     return TRUE;
 }
 
+static UINT mib2Ip[] = { 1,3,6,1,2,1,4 };
+static MIB_IPSTATS ipStats;
+
+static void mib2IpStatsInit(void)
+{
+    GetIpStatistics(&ipStats);
+}
+
+static struct structToAsnValue mib2IpMap[] = {
+    { FIELD_OFFSET(MIB_IPSTATS, dwForwarding), copyInt }, /* 1 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwDefaultTTL), copyInt }, /* 2 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwInReceives), copyInt }, /* 3 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwInHdrErrors), copyInt }, /* 4 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwInAddrErrors), copyInt }, /* 5 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwForwDatagrams), copyInt }, /* 6 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwInUnknownProtos), copyInt }, /* 7 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwInDiscards), copyInt }, /* 8 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwInDelivers), copyInt }, /* 9 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwOutRequests), copyInt }, /* 10 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwOutDiscards), copyInt }, /* 11 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwOutNoRoutes), copyInt }, /* 12 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwReasmTimeout), copyInt }, /* 13 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwReasmReqds), copyInt }, /* 14 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwReasmOks), copyInt }, /* 15 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwReasmFails), copyInt }, /* 16 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwFragOks), copyInt }, /* 17 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwFragFails), copyInt }, /* 18 */
+    { FIELD_OFFSET(MIB_IPSTATS, dwFragCreates), copyInt }, /* 19 */
+    { 0, NULL }, /* 20: not used, IP addr table */
+    { 0, NULL }, /* 21: not used, route table */
+    { 0, NULL }, /* 22: not used, net to media (ARP) table */
+    { FIELD_OFFSET(MIB_IPSTATS, dwRoutingDiscards), copyInt }, /* 23 */
+};
+
+static BOOL mib2IpStatsQuery(BYTE bPduType, SnmpVarBind *pVarBind,
+    AsnInteger32 *pErrorStatus)
+{
+    AsnObjectIdentifier myOid = DEFINE_OID(mib2Ip);
+    UINT item = 0;
+
+    TRACE("(0x%02x, %s, %p)\n", bPduType, SnmpUtilOidToA(&pVarBind->name),
+        pErrorStatus);
+
+    switch (bPduType)
+    {
+    case SNMP_PDU_GET:
+        if (!SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) &&
+            pVarBind->name.idLength == myOid.idLength + 1)
+        {
+            item = pVarBind->name.ids[pVarBind->name.idLength - 1];
+            *pErrorStatus = mapStructEntryToValue(mib2IpMap,
+                DEFINE_SIZEOF(mib2IpMap), &ipStats, item, bPduType, pVarBind);
+        }
+        else
+            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
+        break;
+    case SNMP_PDU_GETNEXT:
+        if (!SnmpUtilOidCmp(&pVarBind->name, &myOid) ||
+            SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) < 0)
+            item = 1;
+        else if (!SnmpUtilOidNCmp(&pVarBind->name, &myOid, myOid.idLength) &&
+            pVarBind->name.idLength == myOid.idLength + 1)
+            item = pVarBind->name.ids[pVarBind->name.idLength - 1] + 1;
+        else
+            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
+        if (item)
+        {
+            *pErrorStatus = mapStructEntryToValue(mib2IpMap,
+                DEFINE_SIZEOF(mib2IpMap), &ipStats, item, bPduType, pVarBind);
+            if (!*pErrorStatus)
+            {
+                AsnObjectIdentifier oid;
+
+                SnmpUtilOidCpy(&pVarBind->name, &myOid);
+                oid.idLength = 1;
+                oid.ids = &item;
+                SnmpUtilOidAppend(&pVarBind->name, &oid);
+            }
+        }
+        else
+            *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
+        break;
+    case SNMP_PDU_SET:
+        *pErrorStatus = SNMP_ERRORSTATUS_READONLY;
+        break;
+    default:
+        FIXME("0x%02x: unsupported PDU type\n", bPduType);
+        *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
+    }
+    return TRUE;
+}
+
 /* This list MUST BE lexicographically sorted */
 static struct mibImplementation supportedIDs[] = {
     { DEFINE_OID(mib2IfNumber), mib2IfNumberInit, mib2IfNumberQuery },
     { DEFINE_OID(mib2IfEntry), NULL, mib2IfEntryQuery },
+    { DEFINE_OID(mib2Ip), mib2IpStatsInit, mib2IpStatsQuery },
 };
 static UINT minSupportedIDLength;
 




More information about the wine-cvs mailing list