// 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::basetsd::ULONG64;
use shared::minwindef::ULONG;
use shared::ntdef::BOOLEAN;
ENUM!{enum NL_PREFIX_ORIGIN {
    IpPrefixOriginOther = 0,
    IpPrefixOriginManual,
    IpPrefixOriginWellKnown,
    IpPrefixOriginDhcp,
    IpPrefixOriginRouterAdvertisement,
    IpPrefixOriginUnchanged = 1 << 4,
}}
pub const NlpoOther: NL_PREFIX_ORIGIN = IpPrefixOriginOther;
pub const NlpoManual: NL_PREFIX_ORIGIN = IpPrefixOriginManual;
pub const NlpoWellKnown: NL_PREFIX_ORIGIN = IpPrefixOriginWellKnown;
pub const NlpoDhcp: NL_PREFIX_ORIGIN = IpPrefixOriginDhcp;
pub const NlpoRouterAdvertisement: NL_PREFIX_ORIGIN = IpPrefixOriginRouterAdvertisement;
ENUM!{enum NL_SUFFIX_ORIGIN {
    NlsoOther = 0,
    NlsoManual,
    NlsoWellKnown,
    NlsoDhcp,
    NlsoLinkLayerAddress,
    NlsoRandom,
    IpSuffixOriginOther = 0,
    IpSuffixOriginManual,
    IpSuffixOriginWellKnown,
    IpSuffixOriginDhcp,
    IpSuffixOriginLinkLayerAddress,
    IpSuffixOriginRandom,
    IpSuffixOriginUnchanged = 1 << 4,
}}
ENUM!{enum NL_DAD_STATE {
    NldsInvalid,
    NldsTentative,
    NldsDuplicate,
    NldsDeprecated,
    NldsPreferred,
    IpDadStateInvalid = 0,
    IpDadStateTentative,
    IpDadStateDuplicate,
    IpDadStateDeprecated,
    IpDadStatePreferred,
}}
pub const NL_MAX_METRIC_COMPONENT: ULONG = (1u32 << 31) - 1;
ENUM!{enum NL_ROUTE_PROTOCOL {
    RouteProtocolOther = 1,
    RouteProtocolLocal = 2,
    RouteProtocolNetMgmt = 3,
    RouteProtocolIcmp = 4,
    RouteProtocolEgp = 5,
    RouteProtocolGgp = 6,
    RouteProtocolHello = 7,
    RouteProtocolRip = 8,
    RouteProtocolIsIs = 9,
    RouteProtocolEsIs = 10,
    RouteProtocolCisco = 11,
    RouteProtocolBbn = 12,
    RouteProtocolOspf = 13,
    RouteProtocolBgp = 14,
    RouteProtocolIdpr = 15,
    RouteProtocolEigrp = 16,
    RouteProtocolDvmrp = 17,
    RouteProtocolRpl = 18,
    RouteProtocolDhcp = 19,
    MIB_IPPROTO_OTHER = 1,
    PROTO_IP_OTHER = 1,
    MIB_IPPROTO_LOCAL = 2,
    PROTO_IP_LOCAL = 2,
    MIB_IPPROTO_NETMGMT = 3,
    PROTO_IP_NETMGMT = 3,
    MIB_IPPROTO_ICMP = 4,
    PROTO_IP_ICMP = 4,
    MIB_IPPROTO_EGP = 5,
    PROTO_IP_EGP = 5,
    MIB_IPPROTO_GGP = 6,
    PROTO_IP_GGP = 6,
    MIB_IPPROTO_HELLO = 7,
    PROTO_IP_HELLO = 7,
    MIB_IPPROTO_RIP = 8,
    PROTO_IP_RIP = 8,
    MIB_IPPROTO_IS_IS = 9,
    PROTO_IP_IS_IS = 9,
    MIB_IPPROTO_ES_IS = 10,
    PROTO_IP_ES_IS = 10,
    MIB_IPPROTO_CISCO = 11,
    PROTO_IP_CISCO = 11,
    MIB_IPPROTO_BBN = 12,
    PROTO_IP_BBN = 12,
    MIB_IPPROTO_OSPF = 13,
    PROTO_IP_OSPF = 13,
    MIB_IPPROTO_BGP = 14,
    PROTO_IP_BGP = 14,
    MIB_IPPROTO_IDPR = 15,
    PROTO_IP_IDPR = 15,
    MIB_IPPROTO_EIGRP = 16,
    PROTO_IP_EIGRP = 16,
    MIB_IPPROTO_DVMRP = 17,
    PROTO_IP_DVMRP = 17,
    MIB_IPPROTO_RPL = 18,
    PROTO_IP_RPL = 18,
    MIB_IPPROTO_DHCP = 19,
    PROTO_IP_DHCP = 19,
    MIB_IPPROTO_NT_AUTOSTATIC = 10002,
    PROTO_IP_NT_AUTOSTATIC = 10002,
    MIB_IPPROTO_NT_STATIC = 10006,
    PROTO_IP_NT_STATIC = 10006,
    MIB_IPPROTO_NT_STATIC_NON_DOD = 10007,
    PROTO_IP_NT_STATIC_NON_DOD = 10007,
}}
pub type PNL_ROUTE_PROTOCOL = *mut NL_ROUTE_PROTOCOL;
ENUM!{enum NL_ADDRESS_TYPE {
    NlatUnspecified = 0,
    NlatUnicast = 1,
    NlatAnycast = 2,
    NlatMulticast = 3,
    NlatBroadcast = 4,
    NlatInvalid = 5,
}}
pub type PNL_ADDRESS_TYPE = *mut NL_ADDRESS_TYPE;
ENUM!{enum NL_ROUTE_ORIGIN {
    NlroManual = 0,
    NlroWellKnown = 1,
    NlroDHCP = 2,
    NlroRouterAdvertisement = 3,
    Nlro6to4 = 4,
}}
pub type PNL_ROUTE_ORIGIN = *mut NL_ROUTE_ORIGIN;
ENUM!{enum NL_NEIGHBOR_STATE {
    NlnsUnreachable = 0,
    NlnsIncomplete = 1,
    NlnsProbe = 2,
    NlnsDelay = 3,
    NlnsStale = 4,
    NlnsReachable = 5,
    NlnsPermanent = 6,
    NlnsMaximum = 7,
}}
pub type PNL_NEIGHBOR_STATE = *mut NL_NEIGHBOR_STATE;
ENUM!{enum NL_LINK_LOCAL_ADDRESS_BEHAVIOR {
    LinkLocalAlwaysOff = 0,
    LinkLocalDelayed = 1,
    LinkLocalAlwaysOn = 2,
    LinkLocalUnchanged = -1i32 as u32,
}}
STRUCT!{struct NL_INTERFACE_OFFLOAD_ROD {
    bitfield: BOOLEAN,
}}
BITFIELD!{NL_INTERFACE_OFFLOAD_ROD bitfield: BOOLEAN [
    NlChecksumSupported set_NlChecksumSupported[0..1],
    NlOptionsSupported set_NlOptionsSupported[1..2],
    TlDatagramChecksumSupported set_TlDatagramChecksumSupported[2..3],
    TlStreamChecksumSupported set_TlStreamChecksumSupported[3..4],
    TlStreamOptionsSupported set_TlStreamOptionsSupported[4..5],
    FastPathCompatible set_FastPathCompatible[5..6],
    TlLargeSendOffloadSupported set_TlLargeSendOffloadSupported[6..7],
    TlGiantSendOffloadSupported set_TlGiantSendOffloadSupported[7..8],
]}
pub type PNL_INTERFACE_OFFLOAD_ROD = *mut NL_INTERFACE_OFFLOAD_ROD;
ENUM!{enum NL_ROUTER_DISCOVERY_BEHAVIOR {
    RouterDiscoveryDisabled = 0,
    RouterDiscoveryEnabled = 1,
    RouterDiscoveryDhcp = 2,
    RouterDiscoveryUnchanged = -1i32 as u32,
}}
ENUM!{enum NL_BANDWIDTH_FLAG {
    NlbwDisabled = 0,
    NlbwEnabled = 1,
    NlbwUnchanged = -1i32 as u32,
}}
pub type PNL_BANDWIDTH_FLAG = *mut NL_BANDWIDTH_FLAG;
STRUCT!{struct NL_PATH_BANDWIDTH_ROD {
    Bandwidth: ULONG64,
    Instability: ULONG64,
    BandwidthPeaked: BOOLEAN,
}}
pub type PNL_PATH_BANDWIDTH_ROD = *mut NL_PATH_BANDWIDTH_ROD;
ENUM!{enum NL_NETWORK_CATEGORY {
    NetworkCategoryPublic = 0,
    NetworkCategoryPrivate = 1,
    NetworkCategoryDomainAuthenticated = 2,
    NetworkCategoryUnchanged = -1i32 as u32,
    NetworkCategoryUnknown = -1i32 as u32,
}}
pub type PNL_NETWORK_CATEGORY = *mut NL_NETWORK_CATEGORY;
ENUM!{enum NL_INTERFACE_NETWORK_CATEGORY_STATE {
    NlincCategoryUnknown = 0,
    NlincPublic = 1,
    NlincPrivate = 2,
    NlincDomainAuthenticated = 3,
    NlincCategoryStateMax = 4,
}}
pub type PNL_INTERFACE_NETWORK_CATEGORY_STATE = *mut NL_INTERFACE_NETWORK_CATEGORY_STATE;
pub const NET_IF_CURRENT_SESSION: ULONG = -1i32 as u32;
STRUCT!{struct NL_BANDWIDTH_INFORMATION {
    Bandwidth: ULONG64,
    Instability: ULONG64,
    BandwidthPeaked: BOOLEAN,
}}
pub type PNL_BANDWIDTH_INFORMATION = *mut NL_BANDWIDTH_INFORMATION;