Chip Davis : nsiproxy.sys: Implement IPv6 ipstats get_all_parameters on Mac OS and BSD.
Alexandre Julliard
julliard at winehq.org
Fri May 13 15:45:13 CDT 2022
Module: wine
Branch: master
Commit: 2264663c743a01c815909b9e44e71a475964b58f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2264663c743a01c815909b9e44e71a475964b58f
Author: Chip Davis <cdavis5x at gmail.com>
Date: Sun May 8 16:32:21 2022 -0500
nsiproxy.sys: Implement IPv6 ipstats get_all_parameters on Mac OS and BSD.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
configure | 46 +++++++++++++++++++++++++++++++
configure.ac | 14 ++++++++++
dlls/nsiproxy.sys/ip.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++
include/config.h.in | 6 ++++
4 files changed, 141 insertions(+)
diff --git a/configure b/configure
index 5bfc9202f33..64396a1c69b 100755
--- a/configure
+++ b/configure
@@ -8761,6 +8761,32 @@ if test "x$ac_cv_header_netinet_udp_h" = xyes
then :
printf "%s\n" "#define HAVE_NETINET_UDP_H 1" >>confdefs.h
+fi
+ac_fn_c_check_header_compile "$LINENO" "netinet6/ip6_var.h" "ac_cv_header_netinet6_ip6_var_h" "#include <sys/types.h>
+ #include <sys/socket.h>
+ #ifdef HAVE_SYS_SOCKETVAR_H
+ # include <sys/socketvar.h>
+ #endif
+ #ifdef HAVE_NET_ROUTE_H
+ # include <net/route.h>
+ #endif
+ #ifdef HAVE_NETINET_IN_H
+ # include <netinet/in.h>
+ #endif
+ #ifdef HAVE_NETINET_IN_SYSTM_H
+ # include <netinet/in_systm.h>
+ #endif
+ #ifdef HAVE_NET_IF_H
+ # include <net/if.h>
+ #endif
+ #ifdef HAVE_NETINET_IP_H
+ # include <netinet/ip.h>
+ #endif
+"
+if test "x$ac_cv_header_netinet6_ip6_var_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NETINET6_IP6_VAR_H 1" >>confdefs.h
+
fi
ac_fn_c_check_header_compile "$LINENO" "netipx/ipx.h" "ac_cv_header_netipx_ipx_h" "#include <sys/types.h>
#include <sys/socket.h>
@@ -20651,6 +20677,26 @@ printf "%s\n" "#define HAVE_STRUCT_IP_STATS_IPS_TOTAL 1" >>confdefs.h
fi
+ac_fn_c_check_member "$LINENO" "struct ip6stat" "ip6s_total" "ac_cv_member_struct_ip6stat_ip6s_total" "#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKETVAR_H
+#include <sys/socketvar.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET6_IP6_VAR_H
+#include <netinet6/ip6_var.h>
+#endif
+"
+if test "x$ac_cv_member_struct_ip6stat_ip6s_total" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_IP6STAT_IP6S_TOTAL 1" >>confdefs.h
+
+
+fi
+
+
ac_fn_c_check_member "$LINENO" "struct icmpstat" "icps_error" "ac_cv_member_struct_icmpstat_icps_error" "#include <sys/types.h>
#ifdef HAVE_SYS_SOCKETVAR_H
#include <sys/socketvar.h>
diff --git a/configure.ac b/configure.ac
index c2ea705bc63..e4abc79997b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -532,6 +532,7 @@ AC_CHECK_HEADERS(\
netinet/ip_icmp.h \
netinet/ip_var.h \
netinet/udp.h \
+ netinet6/ip6_var.h \
netipx/ipx.h \
sys/un.h \
,,,[#include <sys/types.h>
@@ -2218,6 +2219,19 @@ AC_CHECK_MEMBERS([struct ip_stats.ips_total],,,
#include <netinet/ip_var.h>
#endif])
+dnl Check for struct ip6stat
+AC_CHECK_MEMBERS([struct ip6stat.ip6s_total],,,
+[#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKETVAR_H
+#include <sys/socketvar.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET6_IP6_VAR_H
+#include <netinet6/ip6_var.h>
+#endif])
+
dnl Check for struct icmpstat
AC_CHECK_MEMBERS([struct icmpstat.icps_error],,,
[#include <sys/types.h>
diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c
index 18e88f493bb..27344756580 100644
--- a/dlls/nsiproxy.sys/ip.c
+++ b/dlls/nsiproxy.sys/ip.c
@@ -55,6 +55,50 @@
#include <netinet/ip_var.h>
#endif
+#ifdef HAVE_NETINET6_IP6_VAR_H
+#include <netinet6/ip6_var.h>
+#endif
+
+#ifdef __APPLE__
+/* For reasons unknown, Mac OS doesn't export <netinet6/ip6_var.h> to user-
+ * space. We'll have to define the needed struct ourselves.
+ */
+struct ip6stat {
+ u_quad_t ip6s_total;
+ u_quad_t ip6s_tooshort;
+ u_quad_t ip6s_toosmall;
+ u_quad_t ip6s_fragments;
+ u_quad_t ip6s_fragdropped;
+ u_quad_t ip6s_fragtimeout;
+ u_quad_t ip6s_fragoverflow;
+ u_quad_t ip6s_forward;
+ u_quad_t ip6s_cantforward;
+ u_quad_t ip6s_redirectsent;
+ u_quad_t ip6s_delivered;
+ u_quad_t ip6s_localout;
+ u_quad_t ip6s_odropped;
+ u_quad_t ip6s_reassembled;
+ u_quad_t ip6s_atmfrag_rcvd;
+ u_quad_t ip6s_fragmented;
+ u_quad_t ip6s_ofragments;
+ u_quad_t ip6s_cantfrag;
+ u_quad_t ip6s_badoptions;
+ u_quad_t ip6s_noroute;
+ u_quad_t ip6s_badvers;
+ u_quad_t ip6s_rawout;
+ u_quad_t ip6s_badscope;
+ u_quad_t ip6s_notmember;
+ u_quad_t ip6s_nxthist[256];
+ u_quad_t ip6s_m1;
+ u_quad_t ip6s_m2m[32];
+ u_quad_t ip6s_mext1;
+ u_quad_t ip6s_mext2m;
+ u_quad_t ip6s_exthdrtoolong;
+ u_quad_t ip6s_nogif;
+ u_quad_t ip6s_toomanyhdr;
+};
+#endif
+
#ifdef HAVE_NETINET_ICMP_VAR_H
#include <netinet/icmp_var.h>
#endif
@@ -729,6 +773,37 @@ static NTSTATUS ipv6_ipstats_get_all_parameters( const void *key, UINT key_size,
if (static_data) *(struct nsi_ip_ipstats_static *)static_data = stat;
return status;
}
+#elif defined(HAVE_SYS_SYSCTL_H) && defined(IPV6CTL_STATS) && (defined(HAVE_STRUCT_IP6STAT_IP6S_TOTAL) || defined(__APPLE__))
+ {
+ int mib[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, IPV6CTL_STATS };
+ struct ip6stat ip_stat;
+ size_t needed;
+
+ needed = sizeof(ip_stat);
+ if (sysctl( mib, ARRAY_SIZE(mib), &ip_stat, &needed, NULL, 0 ) == -1) return STATUS_NOT_SUPPORTED;
+
+ dyn.in_recv = ip_stat.ip6s_total;
+ dyn.in_hdr_errs = ip_stat.ip6s_tooshort + ip_stat.ip6s_toosmall + ip_stat.ip6s_badvers +
+ ip_stat.ip6s_badoptions + ip_stat.ip6s_exthdrtoolong + ip_stat.ip6s_toomanyhdr;
+ dyn.in_addr_errs = ip_stat.ip6s_cantforward + ip_stat.ip6s_badscope + ip_stat.ip6s_notmember;
+ dyn.fwd_dgrams = ip_stat.ip6s_forward;
+ dyn.in_discards = ip_stat.ip6s_fragdropped;
+ dyn.in_delivers = ip_stat.ip6s_delivered;
+ dyn.out_reqs = ip_stat.ip6s_localout;
+ dyn.out_discards = ip_stat.ip6s_odropped;
+ dyn.out_no_routes = ip_stat.ip6s_noroute;
+ stat.reasm_timeout = ip_stat.ip6s_fragtimeout;
+ dyn.reasm_reqds = ip_stat.ip6s_fragments;
+ dyn.reasm_oks = ip_stat.ip6s_reassembled;
+ dyn.reasm_fails = ip_stat.ip6s_fragments - ip_stat.ip6s_reassembled;
+ dyn.frag_oks = ip_stat.ip6s_fragmented;
+ dyn.frag_fails = ip_stat.ip6s_cantfrag;
+ dyn.frag_creates = ip_stat.ip6s_ofragments;
+
+ if (dynamic_data) *(struct nsi_ip_ipstats_dynamic *)dynamic_data = dyn;
+ if (static_data) *(struct nsi_ip_ipstats_static *)static_data = stat;
+ return STATUS_SUCCESS;
+ }
#else
FIXME( "not implemented\n" );
return STATUS_NOT_IMPLEMENTED;
diff --git a/include/config.h.in b/include/config.h.in
index 8cbf23d417e..de1bf6c61eb 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -257,6 +257,9 @@
/* Define to 1 if you have the <netdb.h> header file. */
#undef HAVE_NETDB_H
+/* Define to 1 if you have the <netinet6/ip6_var.h> header file. */
+#undef HAVE_NETINET6_IP6_VAR_H
+
/* Define to 1 if you have the <netinet/icmp6.h> header file. */
#undef HAVE_NETINET_ICMP6_H
@@ -458,6 +461,9 @@
/* Define to 1 if `ipi6_addr' is a member of `struct in6_pktinfo'. */
#undef HAVE_STRUCT_IN6_PKTINFO_IPI6_ADDR
+/* Define to 1 if `ip6s_total' is a member of `struct ip6stat'. */
+#undef HAVE_STRUCT_IP6STAT_IP6S_TOTAL
+
/* Define to 1 if `ips_total' is a member of `struct ipstat'. */
#undef HAVE_STRUCT_IPSTAT_IPS_TOTAL
More information about the wine-cvs
mailing list