[PATCH 5/6] iphlpapi: Implement GetIcmpStatistics() on top of GetIcmpStatisticsEx().

Huw Davies huw at codeweavers.com
Thu Aug 12 04:38:17 CDT 2021


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/iphlpapi/iphlpapi_main.c |  41 ++++++++
 dlls/iphlpapi/ipstats.c       | 170 ----------------------------------
 2 files changed, 41 insertions(+), 170 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 9e484b7e4c2..14a2c719b95 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1495,6 +1495,47 @@ DWORD WINAPI GetFriendlyIfIndex(DWORD IfIndex)
   return IfIndex;
 }
 
+static void icmp_stats_ex_to_icmp_stats( MIBICMPSTATS_EX *stats_ex, MIBICMPSTATS *stats )
+{
+    stats->dwMsgs = stats_ex->dwMsgs;
+    stats->dwErrors = stats_ex->dwErrors;
+    stats->dwDestUnreachs = stats_ex->rgdwTypeCount[ICMP4_DST_UNREACH];
+    stats->dwTimeExcds = stats_ex->rgdwTypeCount[ICMP4_TIME_EXCEEDED];
+    stats->dwParmProbs = stats_ex->rgdwTypeCount[ICMP4_PARAM_PROB];
+    stats->dwSrcQuenchs = stats_ex->rgdwTypeCount[ICMP4_SOURCE_QUENCH];
+    stats->dwRedirects = stats_ex->rgdwTypeCount[ICMP4_REDIRECT];
+    stats->dwEchos = stats_ex->rgdwTypeCount[ICMP4_ECHO_REQUEST];
+    stats->dwEchoReps = stats_ex->rgdwTypeCount[ICMP4_ECHO_REPLY];
+    stats->dwTimestamps = stats_ex->rgdwTypeCount[ICMP4_TIMESTAMP_REQUEST];
+    stats->dwTimestampReps = stats_ex->rgdwTypeCount[ICMP4_TIMESTAMP_REPLY];
+    stats->dwAddrMasks = stats_ex->rgdwTypeCount[ICMP4_MASK_REQUEST];
+    stats->dwAddrMaskReps = stats_ex->rgdwTypeCount[ICMP4_MASK_REPLY];
+}
+
+/******************************************************************
+ *    GetIcmpStatistics (IPHLPAPI.@)
+ *
+ * Get the ICMP statistics for the local computer.
+ *
+ * PARAMS
+ *  stats [Out] buffer for ICMP statistics
+ *
+ * RETURNS
+ *  Success: NO_ERROR
+ *  Failure: error code from winerror.h
+ */
+DWORD WINAPI GetIcmpStatistics( MIB_ICMP *stats )
+{
+    MIB_ICMP_EX stats_ex;
+    DWORD err = GetIcmpStatisticsEx( &stats_ex, WS_AF_INET );
+
+    if (err) return err;
+
+    icmp_stats_ex_to_icmp_stats( &stats_ex.icmpInStats, &stats->stats.icmpInStats );
+    icmp_stats_ex_to_icmp_stats( &stats_ex.icmpOutStats, &stats->stats.icmpOutStats );
+    return err;
+}
+
 /******************************************************************
  *    GetIcmpStatisticsEx (IPHLPAPI.@)
  *
diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c
index ff33ed42777..c5621b52dd7 100644
--- a/dlls/iphlpapi/ipstats.c
+++ b/dlls/iphlpapi/ipstats.c
@@ -276,176 +276,6 @@ static void *read_mib_entry( int fd, int level, int name, int *len )
 }
 #endif /* HAVE_SYS_TIHDR_H && T_OPTMGMT_ACK */
 
-/******************************************************************
- *    GetIcmpStatistics (IPHLPAPI.@)
- *
- * Get the ICMP statistics for the local computer.
- *
- * PARAMS
- *  stats [Out] buffer for ICMP statistics
- *
- * RETURNS
- *  Success: NO_ERROR
- *  Failure: error code from winerror.h
- */
-DWORD WINAPI GetIcmpStatistics(PMIB_ICMP stats)
-{
-    DWORD ret = ERROR_NOT_SUPPORTED;
-
-    if (!stats) return ERROR_INVALID_PARAMETER;
-    memset( stats, 0, sizeof(MIB_ICMP) );
-
-#ifdef __linux__
-    {
-        FILE *fp;
-
-        if ((fp = fopen("/proc/net/snmp", "r")))
-        {
-            static const char hdr[] = "Icmp:";
-            char buf[512], *ptr;
-
-            while ((ptr = fgets(buf, sizeof(buf), fp)))
-            {
-                if (_strnicmp(buf, hdr, sizeof(hdr) - 1)) continue;
-                /* last line was a header, get another */
-                if (!(ptr = fgets(buf, sizeof(buf), fp))) break;
-                if (!_strnicmp(buf, hdr, sizeof(hdr) - 1))
-                {
-                    ptr += sizeof(hdr);
-                    sscanf( ptr, "%u %u %*u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
-                            &stats->stats.icmpInStats.dwMsgs,
-                            &stats->stats.icmpInStats.dwErrors,
-                            &stats->stats.icmpInStats.dwDestUnreachs,
-                            &stats->stats.icmpInStats.dwTimeExcds,
-                            &stats->stats.icmpInStats.dwParmProbs,
-                            &stats->stats.icmpInStats.dwSrcQuenchs,
-                            &stats->stats.icmpInStats.dwRedirects,
-                            &stats->stats.icmpInStats.dwEchos,
-                            &stats->stats.icmpInStats.dwEchoReps,
-                            &stats->stats.icmpInStats.dwTimestamps,
-                            &stats->stats.icmpInStats.dwTimestampReps,
-                            &stats->stats.icmpInStats.dwAddrMasks,
-                            &stats->stats.icmpInStats.dwAddrMaskReps,
-                            &stats->stats.icmpOutStats.dwMsgs,
-                            &stats->stats.icmpOutStats.dwErrors,
-                            &stats->stats.icmpOutStats.dwDestUnreachs,
-                            &stats->stats.icmpOutStats.dwTimeExcds,
-                            &stats->stats.icmpOutStats.dwParmProbs,
-                            &stats->stats.icmpOutStats.dwSrcQuenchs,
-                            &stats->stats.icmpOutStats.dwRedirects,
-                            &stats->stats.icmpOutStats.dwEchos,
-                            &stats->stats.icmpOutStats.dwEchoReps,
-                            &stats->stats.icmpOutStats.dwTimestamps,
-                            &stats->stats.icmpOutStats.dwTimestampReps,
-                            &stats->stats.icmpOutStats.dwAddrMasks,
-                            &stats->stats.icmpOutStats.dwAddrMaskReps );
-                    break;
-                }
-            }
-            fclose(fp);
-            ret = NO_ERROR;
-        }
-    }
-#elif defined(HAVE_LIBKSTAT)
-    {
-        static char ip[] = "ip", icmp[] = "icmp";
-        kstat_ctl_t *kc;
-        kstat_t *ksp;
-
-        if ((kc = kstat_open()) &&
-            (ksp = kstat_lookup( kc, ip, 0, icmp )) &&
-            kstat_read( kc, ksp, NULL ) != -1 &&
-            ksp->ks_type == KSTAT_TYPE_NAMED)
-        {
-            stats->stats.icmpInStats.dwMsgs           = kstat_get_ui32( ksp, "inMsgs" );
-            stats->stats.icmpInStats.dwErrors         = kstat_get_ui32( ksp, "inErrors" );
-            stats->stats.icmpInStats.dwDestUnreachs   = kstat_get_ui32( ksp, "inDestUnreachs" );
-            stats->stats.icmpInStats.dwTimeExcds      = kstat_get_ui32( ksp, "inTimeExcds" );
-            stats->stats.icmpInStats.dwParmProbs      = kstat_get_ui32( ksp, "inParmProbs" );
-            stats->stats.icmpInStats.dwSrcQuenchs     = kstat_get_ui32( ksp, "inSrcQuenchs" );
-            stats->stats.icmpInStats.dwRedirects      = kstat_get_ui32( ksp, "inRedirects" );
-            stats->stats.icmpInStats.dwEchos          = kstat_get_ui32( ksp, "inEchos" );
-            stats->stats.icmpInStats.dwEchoReps       = kstat_get_ui32( ksp, "inEchoReps" );
-            stats->stats.icmpInStats.dwTimestamps     = kstat_get_ui32( ksp, "inTimestamps" );
-            stats->stats.icmpInStats.dwTimestampReps  = kstat_get_ui32( ksp, "inTimestampReps" );
-            stats->stats.icmpInStats.dwAddrMasks      = kstat_get_ui32( ksp, "inAddrMasks" );
-            stats->stats.icmpInStats.dwAddrMaskReps   = kstat_get_ui32( ksp, "inAddrMaskReps" );
-            stats->stats.icmpOutStats.dwMsgs          = kstat_get_ui32( ksp, "outMsgs" );
-            stats->stats.icmpOutStats.dwErrors        = kstat_get_ui32( ksp, "outErrors" );
-            stats->stats.icmpOutStats.dwDestUnreachs  = kstat_get_ui32( ksp, "outDestUnreachs" );
-            stats->stats.icmpOutStats.dwTimeExcds     = kstat_get_ui32( ksp, "outTimeExcds" );
-            stats->stats.icmpOutStats.dwParmProbs     = kstat_get_ui32( ksp, "outParmProbs" );
-            stats->stats.icmpOutStats.dwSrcQuenchs    = kstat_get_ui32( ksp, "outSrcQuenchs" );
-            stats->stats.icmpOutStats.dwRedirects     = kstat_get_ui32( ksp, "outRedirects" );
-            stats->stats.icmpOutStats.dwEchos         = kstat_get_ui32( ksp, "outEchos" );
-            stats->stats.icmpOutStats.dwEchoReps      = kstat_get_ui32( ksp, "outEchoReps" );
-            stats->stats.icmpOutStats.dwTimestamps    = kstat_get_ui32( ksp, "outTimestamps" );
-            stats->stats.icmpOutStats.dwTimestampReps = kstat_get_ui32( ksp, "outTimestampReps" );
-            stats->stats.icmpOutStats.dwAddrMasks     = kstat_get_ui32( ksp, "outAddrMasks" );
-            stats->stats.icmpOutStats.dwAddrMaskReps  = kstat_get_ui32( ksp, "outAddrMaskReps" );
-            ret = NO_ERROR;
-        }
-        if (kc) kstat_close( kc );
-    }
-#elif defined(HAVE_SYS_SYSCTL_H) && defined(ICMPCTL_STATS) && (defined(HAVE_STRUCT_ICMPSTAT_ICPS_INHIST) || defined(HAVE_STRUCT_ICMPSTAT_ICPS_OUTHIST))
-    {
-        int mib[] = {CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_STATS};
-        struct icmpstat icmp_stat;
-        size_t needed  = sizeof(icmp_stat);
-        int i;
-
-        if(sysctl(mib, ARRAY_SIZE(mib), &icmp_stat, &needed, NULL, 0) != -1)
-        {
-#ifdef HAVE_STRUCT_ICMPSTAT_ICPS_INHIST
-            /*in stats */
-            stats->stats.icmpInStats.dwMsgs = icmp_stat.icps_badcode + icmp_stat.icps_checksum + icmp_stat.icps_tooshort + icmp_stat.icps_badlen;
-            for(i = 0; i <= ICMP_MAXTYPE; i++)
-                stats->stats.icmpInStats.dwMsgs += icmp_stat.icps_inhist[i];
-
-            stats->stats.icmpInStats.dwErrors = icmp_stat.icps_badcode + icmp_stat.icps_tooshort + icmp_stat.icps_checksum + icmp_stat.icps_badlen;
-
-            stats->stats.icmpInStats.dwDestUnreachs = icmp_stat.icps_inhist[ICMP_UNREACH];
-            stats->stats.icmpInStats.dwTimeExcds = icmp_stat.icps_inhist[ICMP_TIMXCEED];
-            stats->stats.icmpInStats.dwParmProbs = icmp_stat.icps_inhist[ICMP_PARAMPROB];
-            stats->stats.icmpInStats.dwSrcQuenchs = icmp_stat.icps_inhist[ICMP_SOURCEQUENCH];
-            stats->stats.icmpInStats.dwRedirects = icmp_stat.icps_inhist[ICMP_REDIRECT];
-            stats->stats.icmpInStats.dwEchos = icmp_stat.icps_inhist[ICMP_ECHO];
-            stats->stats.icmpInStats.dwEchoReps = icmp_stat.icps_inhist[ICMP_ECHOREPLY];
-            stats->stats.icmpInStats.dwTimestamps = icmp_stat.icps_inhist[ICMP_TSTAMP];
-            stats->stats.icmpInStats.dwTimestampReps = icmp_stat.icps_inhist[ICMP_TSTAMPREPLY];
-            stats->stats.icmpInStats.dwAddrMasks = icmp_stat.icps_inhist[ICMP_MASKREQ];
-            stats->stats.icmpInStats.dwAddrMaskReps = icmp_stat.icps_inhist[ICMP_MASKREPLY];
-#endif
-
-#ifdef HAVE_STRUCT_ICMPSTAT_ICPS_OUTHIST
-            /* out stats */
-            stats->stats.icmpOutStats.dwMsgs = icmp_stat.icps_oldshort + icmp_stat.icps_oldicmp;
-            for(i = 0; i <= ICMP_MAXTYPE; i++)
-                stats->stats.icmpOutStats.dwMsgs += icmp_stat.icps_outhist[i];
-
-            stats->stats.icmpOutStats.dwErrors = icmp_stat.icps_oldshort + icmp_stat.icps_oldicmp;
-
-            stats->stats.icmpOutStats.dwDestUnreachs = icmp_stat.icps_outhist[ICMP_UNREACH];
-            stats->stats.icmpOutStats.dwTimeExcds = icmp_stat.icps_outhist[ICMP_TIMXCEED];
-            stats->stats.icmpOutStats.dwParmProbs = icmp_stat.icps_outhist[ICMP_PARAMPROB];
-            stats->stats.icmpOutStats.dwSrcQuenchs = icmp_stat.icps_outhist[ICMP_SOURCEQUENCH];
-            stats->stats.icmpOutStats.dwRedirects = icmp_stat.icps_outhist[ICMP_REDIRECT];
-            stats->stats.icmpOutStats.dwEchos = icmp_stat.icps_outhist[ICMP_ECHO];
-            stats->stats.icmpOutStats.dwEchoReps = icmp_stat.icps_outhist[ICMP_ECHOREPLY];
-            stats->stats.icmpOutStats.dwTimestamps = icmp_stat.icps_outhist[ICMP_TSTAMP];
-            stats->stats.icmpOutStats.dwTimestampReps = icmp_stat.icps_outhist[ICMP_TSTAMPREPLY];
-            stats->stats.icmpOutStats.dwAddrMasks = icmp_stat.icps_outhist[ICMP_MASKREQ];
-            stats->stats.icmpOutStats.dwAddrMaskReps = icmp_stat.icps_outhist[ICMP_MASKREPLY];
-#endif /* HAVE_STRUCT_ICMPSTAT_ICPS_OUTHIST */
-            ret = NO_ERROR;
-        }
-    }
-#else /* ICMPCTL_STATS */
-    FIXME( "unimplemented\n" );
-#endif
-    return ret;
-}
-
 /******************************************************************
  *    GetTcpStatisticsEx (IPHLPAPI.@)
  *
-- 
2.23.0




More information about the wine-devel mailing list