// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
use shared::ifdef::IF_INDEX;
use shared::ifmib::MAXLEN_PHYSADDR;
use shared::minwindef::DWORD;
use shared::nldef::NL_ROUTE_PROTOCOL;
use shared::ntdef::{PVOID, UCHAR, ULONG, USHORT};
const ANY_SIZE: usize = 1;
STRUCT!{struct MIB_IPADDRROW_XP {
    dwAddr: DWORD,
    dwIndex: IF_INDEX,
    dwMask: DWORD,
    dwBCastAddr: DWORD,
    dwReasmSize: DWORD,
    unused1: USHORT,
    wType: USHORT,
}}
pub type PMIB_IPADDRROW_XP = *mut MIB_IPADDRROW_XP;
STRUCT!{struct MIB_IPADDRROW_W2K {
    dwAddr: DWORD,
    dwIndex: DWORD,
    dwMask: DWORD,
    dwBCastAddr: DWORD,
    dwReasmSize: DWORD,
    unused1: USHORT,
    unused2: USHORT,
}}
pub type PMIB_IPADDRROW_W2K = *mut MIB_IPADDRROW_W2K;
pub type MIB_IPADDRROW = MIB_IPADDRROW_XP;
pub type PMIB_IPADDRROW = *mut MIB_IPADDRROW;
STRUCT!{struct MIB_IPADDRTABLE {
    dwNumEntries: DWORD,
    table: [MIB_IPADDRROW; ANY_SIZE],
}}
pub type PMIB_IPADDRTABLE = *mut MIB_IPADDRTABLE;
// FIXME: SIZEOF_IPADDRTABLE(x)
STRUCT!{struct MIB_IPFORWARDNUMBER {
    dwValue: DWORD,
}}
pub type PMIB_IPFORWARDNUMBER = *mut MIB_IPFORWARDNUMBER;
pub type MIB_IPFORWARD_PROTO = NL_ROUTE_PROTOCOL;
ENUM!{enum MIB_IPFORWARD_TYPE {
    MIB_IPROUTE_TYPE_OTHER = 1,
    MIB_IPROUTE_TYPE_INVALID = 2,
    MIB_IPROUTE_TYPE_DIRECT = 3,
    MIB_IPROUTE_TYPE_INDIRECT = 4,
}}
STRUCT!{struct MIB_IPFORWARDROW {
    dwForwardDest: DWORD,
    dwForwardMask: DWORD,
    dwForwardPolicy: DWORD,
    dwForwardNextHop: DWORD,
    dwForwardIfIndex: IF_INDEX,
    ForwardType: MIB_IPFORWARD_TYPE,
    ForwardProto: MIB_IPFORWARD_PROTO,
    dwForwardAge: DWORD,
    dwForwardNextHopAS: DWORD,
    dwForwardMetric1: DWORD,
    dwForwardMetric2: DWORD,
    dwForwardMetric3: DWORD,
    dwForwardMetric4: DWORD,
    dwForwardMetric5: DWORD,
}}
pub type PMIB_IPFORWARDROW = *mut MIB_IPFORWARDROW;
STRUCT!{struct MIB_IPFORWARDTABLE {
    dwNumEntries: DWORD,
    table: [MIB_IPFORWARDROW; ANY_SIZE],
}}
pub type PMIB_IPFORWARDTABLE = *mut MIB_IPFORWARDTABLE;
// FIXME: SIZEOF_IPFORWARDTABLE(x)
ENUM!{enum MIB_IPNET_TYPE {
    MIB_IPNET_TYPE_OTHER = 1,
    MIB_IPNET_TYPE_INVALID = 2,
    MIB_IPNET_TYPE_DYNAMIC = 3,
    MIB_IPNET_TYPE_STATIC = 4,
}}
STRUCT!{struct MIB_IPNETROW_LH {
    dwIndex: IF_INDEX,
    dwPhysAddrLen: DWORD,
    bPhysAddr: [UCHAR; MAXLEN_PHYSADDR],
    dwAddr: DWORD,
    Type: MIB_IPNET_TYPE,
}}
pub type PMIB_IPNETROW_LH = *mut MIB_IPNETROW_LH;
STRUCT!{struct MIB_IPNETROW_W2K {
    dwIndex: IF_INDEX,
    dwPhysAddrLen: DWORD,
    bPhysAddr: [UCHAR; MAXLEN_PHYSADDR],
    dwAddr: DWORD,
    dwType: DWORD,
}}
pub type PMIB_IPNETROW_W2K = *mut MIB_IPNETROW_W2K;
pub type MIB_IPNETROW = MIB_IPNETROW_LH;
pub type PMIB_IPNETROW = *mut MIB_IPNETROW;
STRUCT!{struct MIB_IPNETTABLE {
    dwNumEntries: DWORD,
    table: [MIB_IPNETROW; ANY_SIZE],
}}
pub type PMIB_IPNETTABLE = *mut MIB_IPNETTABLE;
// FIXME: SIZEOF_IPNETTABLE(x)
ENUM!{enum MIB_IPSTATS_FORWARDING {
    MIB_IP_FORWARDING = 1,
    MIB_IP_NOT_FORWARDING = 2,
}}
pub type PMIB_IPSTATS_FORWARDING = *mut MIB_IPSTATS_FORWARDING;
STRUCT!{struct MIB_IPSTATS_LH {
    Forwarding: MIB_IPSTATS_FORWARDING,
    dwDefaultTTL: DWORD,
    dwInReceives: DWORD,
    dwInHdrErrors: DWORD,
    dwInAddrErrors: DWORD,
    dwForwDatagrams: DWORD,
    dwInUnknownProtos: DWORD,
    dwInDiscards: DWORD,
    dwInDelivers: DWORD,
    dwOutRequests: DWORD,
    dwRoutingDiscards: DWORD,
    dwOutDiscards: DWORD,
    dwOutNoRoutes: DWORD,
    dwReasmTimeout: DWORD,
    dwReasmReqds: DWORD,
    dwReasmOks: DWORD,
    dwReasmFails: DWORD,
    dwFragOks: DWORD,
    dwFragFails: DWORD,
    dwFragCreates: DWORD,
    dwNumIf: DWORD,
    dwNumAddr: DWORD,
    dwNumRoutes: DWORD,
}}
pub type PMIB_IPSTATS_LH = *mut MIB_IPSTATS_LH;
STRUCT!{struct MIB_IPSTATS_W2K {
    dwForwarding: DWORD,
    dwDefaultTTL: DWORD,
    dwInReceives: DWORD,
    dwInHdrErrors: DWORD,
    dwInAddrErrors: DWORD,
    dwForwDatagrams: DWORD,
    dwInUnknownProtos: DWORD,
    dwInDiscards: DWORD,
    dwInDelivers: DWORD,
    dwOutRequests: DWORD,
    dwRoutingDiscards: DWORD,
    dwOutDiscards: DWORD,
    dwOutNoRoutes: DWORD,
    dwReasmTimeout: DWORD,
    dwReasmReqds: DWORD,
    dwReasmOks: DWORD,
    dwReasmFails: DWORD,
    dwFragOks: DWORD,
    dwFragFails: DWORD,
    dwFragCreates: DWORD,
    dwNumIf: DWORD,
    dwNumAddr: DWORD,
    dwNumRoutes: DWORD,
}}
pub type PMIB_IPSTATS_W2K = *mut MIB_IPSTATS_W2K;
pub type MIB_IPSTATS = MIB_IPSTATS_LH;
pub type PMIB_IPSTATS = *mut MIB_IPSTATS;
STRUCT!{struct MIBICMPSTATS {
    dwMsgs: DWORD,
    dwErrors: DWORD,
    dwDestUnreachs: DWORD,
    dwTimeExcds: DWORD,
    dwParmProbs: DWORD,
    dwSrcQuenchs: DWORD,
    dwRedirects: DWORD,
    dwEchos: DWORD,
    dwEchoReps: DWORD,
    dwTimestamps: DWORD,
    dwTimestampReps: DWORD,
    dwAddrMasks: DWORD,
    dwAddrMaskReps: DWORD,
}}
pub type PMIBICMPSTATS = *mut MIBICMPSTATS;
STRUCT!{struct MIBICMPINFO {
    icmpInStats: MIBICMPSTATS,
    icmpOutStats: MIBICMPSTATS,
}}
STRUCT!{struct MIB_ICMP {
    stats: MIBICMPINFO,
}}
pub type PMIB_ICMP = *mut MIB_ICMP;
STRUCT!{struct MIBICMPSTATS_EX_XPSP1 {
    dwMsgs: DWORD,
    dwErrors: DWORD,
    rgdwTypeCount: [DWORD; 256],
}}
pub type PMIBICMPSTATS_EX_XPSP1 = *mut MIBICMPSTATS_EX_XPSP1;
pub type MIBICMPSTATS_EX = MIBICMPSTATS_EX_XPSP1;
pub type PMIBICMPSTATS_EX = *mut MIBICMPSTATS_EX_XPSP1;
STRUCT!{struct MIB_ICMP_EX_XPSP1 {
    icmpInStats: MIBICMPSTATS_EX,
    icmpOutStats: MIBICMPSTATS_EX,
}}
pub type PMIB_ICMP_EX_XPSP1 = *mut MIB_ICMP_EX_XPSP1;
pub type MIB_ICMP_EX = MIB_ICMP_EX_XPSP1;
pub type PMIB_ICMP_EX = *mut MIB_ICMP_EX_XPSP1;
ENUM!{enum ICMP6_TYPE {
    ICMP6_DST_UNREACH = 1,
    ICMP6_PACKET_TOO_BIG = 2,
    ICMP6_TIME_EXCEEDED = 3,
    ICMP6_PARAM_PROB = 4,
    ICMP6_ECHO_REQUEST = 128,
    ICMP6_ECHO_REPLY = 129,
    ICMP6_MEMBERSHIP_QUERY = 130,
    ICMP6_MEMBERSHIP_REPORT = 131,
    ICMP6_MEMBERSHIP_REDUCTION = 132,
    ND_ROUTER_SOLICIT = 133,
    ND_ROUTER_ADVERT = 134,
    ND_NEIGHBOR_SOLICIT = 135,
    ND_NEIGHBOR_ADVERT = 136,
    ND_REDIRECT = 137,
    ICMP6_V2_MEMBERSHIP_REPORT = 143,
}}
pub type PICMP6_TYPE = *mut ICMP6_TYPE;
ENUM!{enum ICMP4_TYPE {
    ICMP4_ECHO_REPLY = 0,
    ICMP4_DST_UNREACH = 3,
    ICMP4_SOURCE_QUENCH = 4,
    ICMP4_REDIRECT = 5,
    ICMP4_ECHO_REQUEST = 8,
    ICMP4_ROUTER_ADVERT = 9,
    ICMP4_ROUTER_SOLICIT = 10,
    ICMP4_TIME_EXCEEDED = 11,
    ICMP4_PARAM_PROB = 12,
    ICMP4_TIMESTAMP_REQUEST = 13,
    ICMP4_TIMESTAMP_REPLY = 14,
    ICMP4_MASK_REQUEST = 17,
    ICMP4_MASK_REPLY = 18,
}}
pub type PICMP4_TYPE = *mut ICMP4_TYPE;
STRUCT!{struct MIB_IPMCAST_OIF_XP {
    dwOutIfIndex: DWORD,
    dwNextHopAddr: DWORD,
    dwReserved: DWORD,
    dwReserved1: DWORD,
}}
pub type PMIB_IPMCAST_OIF_XP = *mut MIB_IPMCAST_OIF_XP;
STRUCT!{struct MIB_IPMCAST_OIF_W2K {
    dwOutIfIndex: DWORD,
    dwNextHopAddr: DWORD,
    pvReserved: PVOID,
    dwReserved: DWORD,
}}
pub type PMIB_IPMCAST_OIF_W2K = *mut MIB_IPMCAST_OIF_W2K;
pub type MIB_IPMCAST_OIF = MIB_IPMCAST_OIF_XP;
pub type PMIB_IPMCAST_OIF = *mut MIB_IPMCAST_OIF;
STRUCT!{struct MIB_IPMCAST_MFE {
    dwGroup: DWORD,
    dwSource: DWORD,
    dwSrcMask: DWORD,
    dwUpStrmNgbr: DWORD,
    dwInIfIndex: DWORD,
    dwInIfProtocol: DWORD,
    dwRouteProtocol: DWORD,
    dwRouteNetwork: DWORD,
    dwRouteMask: DWORD,
    ulUpTime: ULONG,
    ulExpiryTime: ULONG,
    ulTimeOut: ULONG,
    ulNumOutIf: ULONG,
    fFlags: DWORD,
    dwReserved: DWORD,
    rgmioOutInfo: [MIB_IPMCAST_OIF; ANY_SIZE],
}}
pub type PMIB_IPMCAST_MFE = *mut MIB_IPMCAST_MFE;
STRUCT!{struct MIB_MFE_TABLE {
    dwNumEntries: DWORD,
    table: [MIB_IPMCAST_MFE; ANY_SIZE],
}}
pub type PMIB_MFE_TABLE = *mut MIB_MFE_TABLE;
// FIXME: SIZEOF_BASIC_MIB_MFE
// FIXME: SIZEOF_MIB_MFE(x)
STRUCT!{struct MIB_IPMCAST_OIF_STATS_LH {
    dwOutIfIndex: DWORD,
    dwNextHopAddr: DWORD,
    dwDialContext: DWORD,
    ulTtlTooLow: ULONG,
    ulFragNeeded: ULONG,
    ulOutPackets: ULONG,
    ulOutDiscards: ULONG,
}}
pub type PMIB_IPMCAST_OIF_STATS_LH = *mut MIB_IPMCAST_OIF_STATS_LH;
STRUCT!{struct MIB_IPMCAST_OIF_STATS_W2K {
    dwOutIfIndex: DWORD,
    dwNextHopAddr: DWORD,
    pvDialContext: PVOID,
    ulTtlTooLow: ULONG,
    ulFragNeeded: ULONG,
    ulOutPackets: ULONG,
    ulOutDiscards: ULONG,
}}
pub type PMIB_IPMCAST_OIF_STATS_W2K = *mut MIB_IPMCAST_OIF_STATS_W2K;
pub type MIB_IPMCAST_OIF_STATS = MIB_IPMCAST_OIF_STATS_LH;
pub type PMIB_IPMCAST_OIF_STATS = *mut MIB_IPMCAST_OIF_STATS;
STRUCT!{struct MIB_IPMCAST_MFE_STATS {
    dwGroup: DWORD,
    dwSource: DWORD,
    dwSrcMask: DWORD,
    dwUpStrmNgbr: DWORD,
    dwInIfIndex: DWORD,
    dwInIfProtocol: DWORD,
    dwRouteProtocol: DWORD,
    dwRouteNetwork: DWORD,
    dwRouteMask: DWORD,
    ulUpTime: ULONG,
    ulExpiryTime: ULONG,
    ulNumOutIf: ULONG,
    ulInPkts: ULONG,
    ulInOctets: ULONG,
    ulPktsDifferentIf: ULONG,
    ulQueueOverflow: ULONG,
    rgmiosOutStats: [MIB_IPMCAST_OIF_STATS; ANY_SIZE],
}}
pub type PMIB_IPMCAST_MFE_STATS = *mut MIB_IPMCAST_MFE_STATS;
STRUCT!{struct MIB_MFE_STATS_TABLE {
    dwNumEntries: DWORD,
    table: [MIB_IPMCAST_MFE_STATS; ANY_SIZE],
}}
pub type PMIB_MFE_STATS_TABLE = *mut MIB_MFE_STATS_TABLE;
// FIXME: SIZEOF_BASIC_MIB_MFE_STATS
// FIXME: SIZEOF_MIB_MFE_STATS(x)
STRUCT!{struct MIB_IPMCAST_MFE_STATS_EX_XP {
    dwGroup: DWORD,
    dwSource: DWORD,
    dwSrcMask: DWORD,
    dwUpStrmNgbr: DWORD,
    dwInIfIndex: DWORD,
    dwInIfProtocol: DWORD,
    dwRouteProtocol: DWORD,
    dwRouteNetwork: DWORD,
    dwRouteMask: DWORD,
    ulUpTime: ULONG,
    ulExpiryTime: ULONG,
    ulNumOutIf: ULONG,
    ulInPkts: ULONG,
    ulInOctets: ULONG,
    ulPktsDifferentIf: ULONG,
    ulQueueOverflow: ULONG,
    ulUninitMfe: ULONG,
    ulNegativeMfe: ULONG,
    ulInDiscards: ULONG,
    ulInHdrErrors: ULONG,
    ulTotalOutPackets: ULONG,
    rgmiosOutStats: [MIB_IPMCAST_OIF_STATS; ANY_SIZE],
}}
pub type PMIB_IPMCAST_MFE_STATS_EX_XP = *mut MIB_IPMCAST_MFE_STATS_EX_XP;
pub type MIB_IPMCAST_MFE_STATS_EX = MIB_IPMCAST_MFE_STATS_EX_XP;
pub type PMIB_IPMCAST_MFE_STATS_EX = *mut MIB_IPMCAST_MFE_STATS_EX;
STRUCT!{struct MIB_MFE_STATS_TABLE_EX_XP {
    dwNumEntries: DWORD,
    table: [PMIB_IPMCAST_MFE_STATS_EX_XP; ANY_SIZE],
}}
pub type PMIB_MFE_STATS_TABLE_EX_XP = *mut MIB_MFE_STATS_TABLE_EX_XP;
pub type MIB_MFE_STATS_TABLE_EX = MIB_MFE_STATS_TABLE_EX_XP;
pub type PMIB_MFE_STATS_TABLE_EX = *mut MIB_MFE_STATS_TABLE_EX;
// FIXME: SIZEOF_BASIC_MIB_MFE_STATS_EX
// FIXME: SIZEOF_MIB_MFE_STATS_EX(x)
STRUCT!{struct MIB_IPMCAST_GLOBAL {
    dwEnable: DWORD,
}}
pub type PMIB_IPMCAST_GLOBAL = *mut MIB_IPMCAST_GLOBAL;
STRUCT!{struct MIB_IPMCAST_IF_ENTRY {
    dwIfIndex: DWORD,
    dwTtl: DWORD,
    dwProtocol: DWORD,
    dwRateLimit: DWORD,
    ulInMcastOctets: ULONG,
    ulOutMcastOctets: ULONG,
}}
pub type PMIB_IPMCAST_IF_ENTRY = *mut MIB_IPMCAST_IF_ENTRY;
STRUCT!{struct MIB_IPMCAST_IF_TABLE {
    dwNumEntries: DWORD,
    table: [MIB_IPMCAST_IF_ENTRY; ANY_SIZE],
}}
pub type PMIB_IPMCAST_IF_TABLE = *mut MIB_IPMCAST_IF_TABLE;
// FIXME: SIZEOF_MCAST_IF_TABLE(x)