nsiproxy.sys: Implement IPv6 ipstats get_all_parameters on Mac OS and BSD.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Chip Davis 2022-05-08 16:32:21 -05:00 committed by Alexandre Julliard
parent 84e9696078
commit 2264663c74
4 changed files with 141 additions and 0 deletions

46
configure vendored
View File

@ -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>

View File

@ -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>

View File

@ -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;

View File

@ -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