#![cfg(target_pointer_width = "64")]
pub mod xfrm {
pub const USERPOLICY_INFO: usize = 168;
pub const USERPOLICY_ID: usize = 64;
pub const USERSA_INFO: usize = 224;
pub const SELECTOR: usize = 56;
pub const LIFETIME_CFG: usize = 64;
pub const LIFETIME_CUR: usize = 32;
pub const USER_TMPL: usize = 64;
}
pub mod nft_verdict {
pub const NF_DROP: i32 = 0;
pub const NF_ACCEPT: i32 = 1;
pub const NFT_CONTINUE: i32 = -1;
pub const NFT_BREAK: i32 = -2;
pub const NFT_JUMP: i32 = -3;
pub const NFT_GOTO: i32 = -4;
pub const NFT_RETURN: i32 = -5;
}
pub mod xfrm_msg_type {
pub const XFRM_MSG_NEWSA: u16 = 16;
pub const XFRM_MSG_DELSA: u16 = 17;
pub const XFRM_MSG_GETSA: u16 = 18;
pub const XFRM_MSG_NEWPOLICY: u16 = 19;
pub const XFRM_MSG_DELPOLICY: u16 = 20;
pub const XFRM_MSG_GETPOLICY: u16 = 21;
pub const XFRM_MSG_ALLOCSPI: u16 = 22;
pub const XFRM_MSG_ACQUIRE: u16 = 23;
pub const XFRM_MSG_EXPIRE: u16 = 24;
pub const XFRM_MSG_UPDPOLICY: u16 = 25;
pub const XFRM_MSG_UPDSA: u16 = 26;
pub const XFRM_MSG_POLEXPIRE: u16 = 27;
pub const XFRM_MSG_FLUSHSA: u16 = 28;
pub const XFRM_MSG_FLUSHPOLICY: u16 = 29;
pub const XFRM_MSG_NEWAE: u16 = 30;
pub const XFRM_MSG_GETAE: u16 = 31;
}
pub mod xfrm_attr {
pub const XFRMA_ALG_AUTH: u16 = 1;
pub const XFRMA_ALG_CRYPT: u16 = 2;
pub const XFRMA_ALG_COMP: u16 = 3;
pub const XFRMA_ENCAP: u16 = 4;
pub const XFRMA_TMPL: u16 = 5;
pub const XFRMA_SA: u16 = 6;
pub const XFRMA_POLICY: u16 = 7;
pub const XFRMA_SEC_CTX: u16 = 8;
pub const XFRMA_LTIME_VAL: u16 = 9;
pub const XFRMA_REPLAY_VAL: u16 = 10;
pub const XFRMA_REPLAY_THRESH: u16 = 11;
pub const XFRMA_ETIMER_THRESH: u16 = 12;
pub const XFRMA_SRCADDR: u16 = 13;
pub const XFRMA_COADDR: u16 = 14;
pub const XFRMA_LASTUSED: u16 = 15;
pub const XFRMA_POLICY_TYPE: u16 = 16;
pub const XFRMA_MIGRATE: u16 = 17;
pub const XFRMA_ALG_AEAD: u16 = 18;
pub const XFRMA_KMADDRESS: u16 = 19;
pub const XFRMA_ALG_AUTH_TRUNC: u16 = 20;
pub const XFRMA_MARK: u16 = 21;
pub const XFRMA_TFCPAD: u16 = 22;
pub const XFRMA_REPLAY_ESN_VAL: u16 = 23;
pub const XFRMA_SA_EXTRA_FLAGS: u16 = 24;
pub const XFRMA_PROTO: u16 = 25;
pub const XFRMA_ADDRESS_FILTER: u16 = 26;
pub const XFRMA_PAD: u16 = 27;
pub const XFRMA_OFFLOAD_DEV: u16 = 28;
pub const XFRMA_SET_MARK: u16 = 29;
pub const XFRMA_SET_MARK_MASK: u16 = 30;
pub const XFRMA_IF_ID: u16 = 31;
}
pub mod nft_ct_keys {
pub const NFT_CT_STATE: u32 = 0;
pub const NFT_CT_DIRECTION: u32 = 1;
pub const NFT_CT_STATUS: u32 = 2;
pub const NFT_CT_MARK: u32 = 3;
pub const NFT_CT_SECMARK: u32 = 4;
pub const NFT_CT_EXPIRATION: u32 = 5;
pub const NFT_CT_HELPER: u32 = 6;
pub const NFT_CT_L3PROTOCOL: u32 = 7;
pub const NFT_CT_SRC: u32 = 8;
pub const NFT_CT_DST: u32 = 9;
pub const NFT_CT_PROTOCOL: u32 = 10;
pub const NFT_CT_PROTO_SRC: u32 = 11;
pub const NFT_CT_PROTO_DST: u32 = 12;
pub const NFT_CT_LABELS: u32 = 13;
pub const NFT_CT_PKTS: u32 = 14;
pub const NFT_CT_BYTES: u32 = 15;
pub const NFT_CT_AVGPKT: u32 = 16;
pub const NFT_CT_ZONE: u32 = 17;
pub const NFT_CT_EVENTMASK: u32 = 18;
pub const NFT_CT_SRC_IP: u32 = 19;
pub const NFT_CT_DST_IP: u32 = 20;
pub const NFT_CT_SRC_IP6: u32 = 21;
pub const NFT_CT_DST_IP6: u32 = 22;
pub const NFT_CT_ID: u32 = 23;
}
pub const DEVLINK_MCGRP_CONFIG_NAME: &str = "config";
pub mod tca_htb_attr {
pub const TCA_HTB_UNSPEC: u16 = 0;
pub const TCA_HTB_PARMS: u16 = 1;
pub const TCA_HTB_INIT: u16 = 2;
pub const TCA_HTB_CTAB: u16 = 3;
pub const TCA_HTB_RTAB: u16 = 4;
pub const TCA_HTB_DIRECT_QLEN: u16 = 5;
pub const TCA_HTB_RATE64: u16 = 6;
pub const TCA_HTB_CEIL64: u16 = 7;
pub const TCA_HTB_OFFLOAD: u16 = 8;
}
pub mod tca_flower_key {
pub const TCA_FLOWER_KEY_ETH_DST: u16 = 4;
pub const TCA_FLOWER_KEY_ETH_DST_MASK: u16 = 5;
pub const TCA_FLOWER_KEY_ETH_SRC: u16 = 6;
pub const TCA_FLOWER_KEY_ETH_SRC_MASK: u16 = 7;
pub const TCA_FLOWER_KEY_ETH_TYPE: u16 = 8;
pub const TCA_FLOWER_KEY_IP_PROTO: u16 = 9;
pub const TCA_FLOWER_KEY_IPV4_SRC: u16 = 10;
pub const TCA_FLOWER_KEY_IPV4_SRC_MASK: u16 = 11;
pub const TCA_FLOWER_KEY_IPV4_DST: u16 = 12;
pub const TCA_FLOWER_KEY_IPV4_DST_MASK: u16 = 13;
pub const TCA_FLOWER_KEY_IPV6_SRC: u16 = 14;
pub const TCA_FLOWER_KEY_IPV6_DST: u16 = 16;
pub const TCA_FLOWER_KEY_TCP_SRC: u16 = 18;
pub const TCA_FLOWER_KEY_TCP_DST: u16 = 19;
pub const TCA_FLOWER_KEY_UDP_SRC: u16 = 20;
pub const TCA_FLOWER_KEY_UDP_DST: u16 = 21;
pub const TCA_FLOWER_KEY_VLAN_ID: u16 = 23;
pub const TCA_FLOWER_KEY_VLAN_PRIO: u16 = 24;
pub const TCA_FLOWER_KEY_VLAN_ETH_TYPE: u16 = 25;
pub const TCA_FLOWER_KEY_ENC_KEY_ID: u16 = 26;
}
pub mod ifla_attr {
pub const IFLA_ADDRESS: u16 = 1;
pub const IFLA_BROADCAST: u16 = 2;
pub const IFLA_IFNAME: u16 = 3;
pub const IFLA_MTU: u16 = 4;
pub const IFLA_LINK: u16 = 5;
pub const IFLA_QDISC: u16 = 6;
pub const IFLA_STATS: u16 = 7;
pub const IFLA_MASTER: u16 = 10;
pub const IFLA_TXQLEN: u16 = 13;
pub const IFLA_OPERSTATE: u16 = 16;
pub const IFLA_LINKMODE: u16 = 17;
pub const IFLA_LINKINFO: u16 = 18;
pub const IFLA_STATS64: u16 = 23;
pub const IFLA_GROUP: u16 = 27;
pub const IFLA_NUM_VF: u16 = 21;
pub const IFLA_PROMISCUITY: u16 = 30;
pub const IFLA_NUM_TX_QUEUES: u16 = 31;
pub const IFLA_NUM_RX_QUEUES: u16 = 32;
pub const IFLA_CARRIER: u16 = 33;
pub const IFLA_GSO_MAX_SEGS: u16 = 40;
pub const IFLA_GSO_MAX_SIZE: u16 = 41;
pub const IFLA_MIN_MTU: u16 = 50;
pub const IFLA_MAX_MTU: u16 = 51;
pub const IFLA_PERM_ADDRESS: u16 = 54;
pub const IFLA_GRO_MAX_SIZE: u16 = 58;
pub const IFLA_TSO_MAX_SIZE: u16 = 59;
pub const IFLA_TSO_MAX_SEGS: u16 = 60;
pub const IFLA_GSO_IPV4_MAX_SIZE: u16 = 63;
pub const IFLA_GRO_IPV4_MAX_SIZE: u16 = 64;
}
pub mod rta_attr {
pub const RTA_UNSPEC: u16 = 0;
pub const RTA_DST: u16 = 1;
pub const RTA_SRC: u16 = 2;
pub const RTA_IIF: u16 = 3;
pub const RTA_OIF: u16 = 4;
pub const RTA_GATEWAY: u16 = 5;
pub const RTA_PRIORITY: u16 = 6;
pub const RTA_PREFSRC: u16 = 7;
pub const RTA_METRICS: u16 = 8;
pub const RTA_MULTIPATH: u16 = 9;
pub const RTA_PROTOINFO: u16 = 10;
pub const RTA_FLOW: u16 = 11;
pub const RTA_CACHEINFO: u16 = 12;
pub const RTA_TABLE: u16 = 15;
pub const RTA_MARK: u16 = 16;
pub const RTA_PREF: u16 = 20;
pub const RTA_EXPIRES: u16 = 23;
}
pub mod ctnetlink_attr {
pub const CTA_UNSPEC: u16 = 0;
pub const CTA_TUPLE_ORIG: u16 = 1;
pub const CTA_TUPLE_REPLY: u16 = 2;
pub const CTA_STATUS: u16 = 3;
pub const CTA_PROTOINFO: u16 = 4;
pub const CTA_HELP: u16 = 5;
pub const CTA_NAT_SRC: u16 = 6;
pub const CTA_TIMEOUT: u16 = 7;
pub const CTA_MARK: u16 = 8;
pub const CTA_COUNTERS_ORIG: u16 = 9;
pub const CTA_COUNTERS_REPLY: u16 = 10;
pub const CTA_USE: u16 = 11;
pub const CTA_ID: u16 = 12;
pub const CTA_NAT_DST: u16 = 13;
pub const CTA_TUPLE_MASTER: u16 = 14;
pub const CTA_ZONE: u16 = 18;
}
pub mod dpll_a {
pub const ID: u16 = 1;
pub const MODULE_NAME: u16 = 2;
pub const PAD: u16 = 3;
pub const CLOCK_ID: u16 = 4;
pub const MODE: u16 = 5;
pub const MODE_SUPPORTED: u16 = 6;
pub const LOCK_STATUS: u16 = 7;
pub const TEMP: u16 = 8;
pub const TYPE: u16 = 9;
pub const LOCK_STATUS_ERROR: u16 = 10;
pub const CLOCK_QUALITY_LEVEL: u16 = 11;
pub const PHASE_OFFSET_MONITOR: u16 = 12;
pub const PIN_ID: u16 = 1;
pub const PIN_FREQUENCY: u16 = 11;
pub const PIN_STATE: u16 = 16;
pub const PIN_PHASE_OFFSET: u16 = 23;
pub const PIN_FRACTIONAL_FREQUENCY_OFFSET: u16 = 24;
pub const PIN_FRACTIONAL_FREQUENCY_OFFSET_PPT: u16 = 30;
pub const PIN_MEASURED_FREQUENCY: u16 = 31;
}
pub mod devlink_attr {
pub const DEVLINK_ATTR_UNSPEC: u16 = 0;
pub const DEVLINK_ATTR_BUS_NAME: u16 = 1;
pub const DEVLINK_ATTR_DEV_NAME: u16 = 2;
pub const DEVLINK_ATTR_PORT_INDEX: u16 = 3;
pub const DEVLINK_ATTR_PORT_TYPE: u16 = 4;
pub const DEVLINK_ATTR_PORT_NETDEV_IFINDEX: u16 = 6;
pub const DEVLINK_ATTR_PORT_NETDEV_NAME: u16 = 7;
pub const DEVLINK_ATTR_PORT_IBDEV_NAME: u16 = 8;
pub const DEVLINK_ATTR_PORT_SPLIT_COUNT: u16 = 9;
pub const DEVLINK_ATTR_PORT_SPLIT_GROUP: u16 = 10;
pub const DEVLINK_ATTR_PORT_FLAVOUR: u16 = 77;
pub const DEVLINK_ATTR_PORT_NUMBER: u16 = 78;
pub const DEVLINK_ATTR_INFO_DRIVER_NAME: u16 = 98;
pub const DEVLINK_ATTR_INFO_SERIAL_NUMBER: u16 = 99;
pub const DEVLINK_ATTR_INFO_VERSION_FIXED: u16 = 100;
pub const DEVLINK_ATTR_INFO_VERSION_RUNNING: u16 = 101;
pub const DEVLINK_ATTR_INFO_VERSION_STORED: u16 = 102;
}
pub mod ethtool_a {
pub const ETHTOOL_A_HEADER_UNSPEC: u16 = 0;
pub const ETHTOOL_A_HEADER_DEV_INDEX: u16 = 1;
pub const ETHTOOL_A_HEADER_DEV_NAME: u16 = 2;
pub const ETHTOOL_A_HEADER_FLAGS: u16 = 3;
pub const ETHTOOL_A_HEADER_PHY_INDEX: u16 = 4;
}
pub mod nf_hook {
pub const PRE_ROUTING: u32 = 0;
pub const LOCAL_IN: u32 = 1;
pub const FORWARD: u32 = 2;
pub const LOCAL_OUT: u32 = 3;
pub const POST_ROUTING: u32 = 4;
pub const INET_INGRESS: u32 = 5;
pub const NETDEV_INGRESS: u32 = 0;
pub const NETDEV_EGRESS: u32 = 1;
}
#[cfg(test)]
mod tests {
use super::*;
use std::mem::size_of;
#[test]
fn xfrm_userpolicy_info_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmUserpolicyInfo>(),
xfrm::USERPOLICY_INFO,
"XfrmUserpolicyInfo: kernel expects {} bytes (Plan 204 C2)",
xfrm::USERPOLICY_INFO,
);
}
#[test]
fn xfrm_userpolicy_id_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmUserpolicyId>(),
xfrm::USERPOLICY_ID,
"XfrmUserpolicyId: kernel expects {} bytes (Plan 204 C3)",
xfrm::USERPOLICY_ID,
);
}
#[test]
fn xfrm_usersa_info_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmUsersaInfo>(),
xfrm::USERSA_INFO,
);
}
#[test]
fn xfrm_selector_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmSelector>(),
xfrm::SELECTOR,
);
}
#[test]
fn xfrm_lifetime_cfg_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmLifetimeCfg>(),
xfrm::LIFETIME_CFG,
);
}
#[test]
fn xfrm_lifetime_cur_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmLifetimeCur>(),
xfrm::LIFETIME_CUR,
);
}
#[test]
fn xfrm_user_tmpl_size_matches_kernel() {
assert_eq!(
size_of::<crate::netlink::xfrm::XfrmUserTmpl>(),
xfrm::USER_TMPL,
);
}
#[test]
fn nft_verdict_constants_match_kernel_uapi() {
use crate::netlink::nftables::{
NF_ACCEPT, NF_DROP, NFT_BREAK, NFT_CONTINUE, NFT_GOTO, NFT_JUMP, NFT_RETURN,
};
assert_eq!(NF_DROP, nft_verdict::NF_DROP);
assert_eq!(NF_ACCEPT, nft_verdict::NF_ACCEPT);
assert_eq!(NFT_CONTINUE, nft_verdict::NFT_CONTINUE);
assert_eq!(
NFT_BREAK,
nft_verdict::NFT_BREAK,
"NFT_BREAK was missing in nlink pre-0.19 (Plan 204 C1)"
);
assert_eq!(
NFT_JUMP,
nft_verdict::NFT_JUMP,
"NFT_JUMP was -2 (= NFT_BREAK) pre-0.19 (Plan 204 C1)"
);
assert_eq!(
NFT_GOTO,
nft_verdict::NFT_GOTO,
"NFT_GOTO was -3 (= NFT_JUMP) pre-0.19 (Plan 204 C1)"
);
assert_eq!(NFT_RETURN, nft_verdict::NFT_RETURN);
}
#[test]
fn devlink_mcast_group_name_matches_kernel_uapi() {
use crate::netlink::genl::devlink::DEVLINK_MCGRP_NAME;
assert_eq!(
DEVLINK_MCGRP_NAME, DEVLINK_MCGRP_CONFIG_NAME,
"DEVLINK_MCGRP_NAME was \"devlink\" pre-0.19 (Plan 204 C4); \
kernel registers it as \"config\"."
);
}
#[test]
fn nft_hook_variants_match_kernel_uapi() {
use crate::netlink::nftables::Hook;
assert_eq!(Hook::Prerouting.to_u32(), nf_hook::PRE_ROUTING);
assert_eq!(Hook::Input.to_u32(), nf_hook::LOCAL_IN);
assert_eq!(Hook::Forward.to_u32(), nf_hook::FORWARD);
assert_eq!(Hook::Output.to_u32(), nf_hook::LOCAL_OUT);
assert_eq!(Hook::Postrouting.to_u32(), nf_hook::POST_ROUTING);
assert_eq!(
Hook::InetIngress.to_u32(),
nf_hook::INET_INGRESS,
"InetIngress was Hook::Ingress=0 pre-0.19 (Plan 211 M1); \
kernel expects NF_INET_INGRESS=5"
);
assert_eq!(Hook::NetdevIngress.to_u32(), nf_hook::NETDEV_INGRESS);
assert_eq!(Hook::NetdevEgress.to_u32(), nf_hook::NETDEV_EGRESS);
}
#[test]
fn nft_hook_is_valid_for_family_disambiguates_correctly() {
use crate::netlink::nftables::{Family, Hook};
assert!(Hook::NetdevIngress.is_valid_for_family(Family::Netdev));
assert!(!Hook::NetdevIngress.is_valid_for_family(Family::Inet));
assert!(Hook::InetIngress.is_valid_for_family(Family::Inet));
assert!(!Hook::InetIngress.is_valid_for_family(Family::Netdev));
assert!(Hook::Prerouting.is_valid_for_family(Family::Inet));
assert!(Hook::Forward.is_valid_for_family(Family::Ip6));
assert!(!Hook::Prerouting.is_valid_for_family(Family::Netdev));
assert!(Hook::NetdevEgress.is_valid_for_family(Family::Netdev));
assert!(!Hook::NetdevEgress.is_valid_for_family(Family::Bridge));
}
#[test]
fn plan_222_1_xfrm_msg_types_match_kernel_uapi() {
assert_eq!(xfrm_msg_type::XFRM_MSG_NEWSA, 16);
assert_eq!(xfrm_msg_type::XFRM_MSG_DELSA, 17);
assert_eq!(xfrm_msg_type::XFRM_MSG_GETSA, 18);
assert_eq!(xfrm_msg_type::XFRM_MSG_NEWPOLICY, 19);
assert_eq!(xfrm_msg_type::XFRM_MSG_DELPOLICY, 20);
assert_eq!(xfrm_msg_type::XFRM_MSG_GETPOLICY, 21);
assert_eq!(xfrm_msg_type::XFRM_MSG_UPDPOLICY, 25);
assert_eq!(xfrm_msg_type::XFRM_MSG_UPDSA, 26);
assert_eq!(
xfrm_msg_type::XFRM_MSG_FLUSHSA,
28,
"Plan 222.1: FLUSHSA was hardcoded to 25 (= UPDPOLICY) pre-Plan-221"
);
assert_eq!(
xfrm_msg_type::XFRM_MSG_FLUSHPOLICY,
29,
"Plan 222.1: FLUSHPOLICY was hardcoded to 28 (= FLUSHSA) pre-Plan-221 — \
flush_policy() was SILENTLY flushing all SAs"
);
}
#[test]
fn plan_222_1_xfrm_attr_ids_match_kernel_uapi() {
assert_eq!(xfrm_attr::XFRMA_LTIME_VAL, 9);
assert_eq!(
xfrm_attr::XFRMA_SRCADDR,
13,
"Plan 222.1: XFRMA_SRCADDR was hardcoded to 9 (= LTIME_VAL) pre-Plan-221"
);
assert_eq!(xfrm_attr::XFRMA_ADDRESS_FILTER, 26);
assert_eq!(
xfrm_attr::XFRMA_OFFLOAD_DEV,
28,
"Plan 222.1: XFRMA_OFFLOAD_DEV was hardcoded to 26 (= ADDRESS_FILTER) pre-Plan-221"
);
assert_eq!(xfrm_attr::XFRMA_IF_ID, 31);
}
#[test]
fn plan_222_1_nft_ct_keys_match_kernel_uapi() {
use crate::netlink::nftables::types::CtKey;
assert_eq!(CtKey::State as u32, nft_ct_keys::NFT_CT_STATE);
assert_eq!(CtKey::Direction as u32, nft_ct_keys::NFT_CT_DIRECTION);
assert_eq!(CtKey::Status as u32, nft_ct_keys::NFT_CT_STATUS);
assert_eq!(CtKey::Mark as u32, nft_ct_keys::NFT_CT_MARK);
assert_eq!(CtKey::Secmark as u32, nft_ct_keys::NFT_CT_SECMARK);
assert_eq!(
CtKey::Expiration as u32,
nft_ct_keys::NFT_CT_EXPIRATION,
"Plan 222.1: CtKey::Expiration was hardcoded to 7 (= NFT_CT_L3PROTOCOL) \
pre-Plan-221 — every Expr::Ct{{key:Expiration}} read the L3 protocol byte"
);
assert_eq!(CtKey::Helper as u32, nft_ct_keys::NFT_CT_HELPER);
assert_eq!(CtKey::L3Protocol as u32, nft_ct_keys::NFT_CT_L3PROTOCOL);
}
#[test]
fn plan_222_2_tca_htb_attr_ids_match_kernel_uapi() {
use crate::netlink::types::tc::qdisc::htb;
assert_eq!(htb::TCA_HTB_UNSPEC, tca_htb_attr::TCA_HTB_UNSPEC);
assert_eq!(htb::TCA_HTB_PARMS, tca_htb_attr::TCA_HTB_PARMS);
assert_eq!(htb::TCA_HTB_INIT, tca_htb_attr::TCA_HTB_INIT);
assert_eq!(htb::TCA_HTB_CTAB, tca_htb_attr::TCA_HTB_CTAB);
assert_eq!(htb::TCA_HTB_RTAB, tca_htb_attr::TCA_HTB_RTAB);
assert_eq!(htb::TCA_HTB_DIRECT_QLEN, tca_htb_attr::TCA_HTB_DIRECT_QLEN);
assert_eq!(htb::TCA_HTB_RATE64, tca_htb_attr::TCA_HTB_RATE64);
assert_eq!(htb::TCA_HTB_CEIL64, tca_htb_attr::TCA_HTB_CEIL64);
assert_eq!(htb::TCA_HTB_OFFLOAD, tca_htb_attr::TCA_HTB_OFFLOAD);
}
#[test]
fn plan_222_2_tca_flower_key_ids_match_kernel_uapi() {
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_ETH_DST, 4);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_ETH_TYPE, 8);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_IP_PROTO, 9);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_IPV4_DST, 12);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_IPV6_SRC, 14);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_TCP_DST, 19);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_UDP_SRC, 20);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_VLAN_ID, 23);
assert_eq!(tca_flower_key::TCA_FLOWER_KEY_ENC_KEY_ID, 26);
}
#[test]
fn plan_222_3_ifla_attr_ids_match_kernel_uapi() {
assert_eq!(ifla_attr::IFLA_IFNAME, 3);
assert_eq!(ifla_attr::IFLA_MTU, 4);
assert_eq!(ifla_attr::IFLA_LINK, 5);
assert_eq!(ifla_attr::IFLA_QDISC, 6);
assert_eq!(ifla_attr::IFLA_MASTER, 10);
assert_eq!(ifla_attr::IFLA_OPERSTATE, 16);
assert_eq!(ifla_attr::IFLA_LINKINFO, 18);
assert_eq!(ifla_attr::IFLA_STATS64, 23);
assert_eq!(ifla_attr::IFLA_CARRIER, 33);
assert_eq!(ifla_attr::IFLA_MIN_MTU, 50);
assert_eq!(ifla_attr::IFLA_MAX_MTU, 51);
assert_eq!(ifla_attr::IFLA_PERM_ADDRESS, 54);
}
#[test]
fn plan_222_3_rta_attr_ids_match_kernel_uapi() {
assert_eq!(rta_attr::RTA_DST, 1);
assert_eq!(rta_attr::RTA_SRC, 2);
assert_eq!(rta_attr::RTA_OIF, 4);
assert_eq!(rta_attr::RTA_GATEWAY, 5);
assert_eq!(rta_attr::RTA_PRIORITY, 6);
assert_eq!(rta_attr::RTA_PREFSRC, 7);
assert_eq!(rta_attr::RTA_MULTIPATH, 9);
assert_eq!(rta_attr::RTA_TABLE, 15);
assert_eq!(rta_attr::RTA_PREF, 20);
assert_eq!(rta_attr::RTA_EXPIRES, 23);
}
#[test]
fn plan_222_3_ctnetlink_attr_ids_match_kernel_uapi() {
assert_eq!(ctnetlink_attr::CTA_TUPLE_ORIG, 1);
assert_eq!(ctnetlink_attr::CTA_TUPLE_REPLY, 2);
assert_eq!(ctnetlink_attr::CTA_STATUS, 3);
assert_eq!(ctnetlink_attr::CTA_TIMEOUT, 7);
assert_eq!(ctnetlink_attr::CTA_MARK, 8);
assert_eq!(ctnetlink_attr::CTA_COUNTERS_ORIG, 9);
assert_eq!(ctnetlink_attr::CTA_COUNTERS_REPLY, 10);
assert_eq!(ctnetlink_attr::CTA_ID, 12);
assert_eq!(ctnetlink_attr::CTA_ZONE, 18);
}
#[test]
fn plan_222_4_dpll_a_attr_ids_match_kernel_uapi() {
use crate::netlink::genl::dpll::types::{DpllAttr, DpllPinAttr};
assert_eq!(DpllAttr::Id as u16, dpll_a::ID);
assert_eq!(DpllAttr::ModuleName as u16, dpll_a::MODULE_NAME);
assert_eq!(DpllAttr::ClockId as u16, dpll_a::CLOCK_ID);
assert_eq!(DpllAttr::Mode as u16, dpll_a::MODE);
assert_eq!(DpllAttr::LockStatus as u16, dpll_a::LOCK_STATUS);
assert_eq!(DpllAttr::Type as u16, dpll_a::TYPE);
assert_eq!(DpllAttr::LockStatusError as u16, dpll_a::LOCK_STATUS_ERROR);
assert_eq!(DpllPinAttr::Id as u16, dpll_a::PIN_ID);
assert_eq!(DpllPinAttr::Frequency as u16, dpll_a::PIN_FREQUENCY);
assert_eq!(DpllPinAttr::State as u16, dpll_a::PIN_STATE);
assert_eq!(DpllPinAttr::PhaseOffset as u16, dpll_a::PIN_PHASE_OFFSET);
assert_eq!(
DpllPinAttr::FractionalFrequencyOffset as u16,
dpll_a::PIN_FRACTIONAL_FREQUENCY_OFFSET
);
assert_eq!(
DpllPinAttr::FractionalFrequencyOffsetPpt as u16,
dpll_a::PIN_FRACTIONAL_FREQUENCY_OFFSET_PPT
);
assert_eq!(
DpllPinAttr::MeasuredFrequency as u16,
dpll_a::PIN_MEASURED_FREQUENCY
);
}
#[test]
fn plan_222_4_devlink_attr_ids_match_kernel_uapi() {
use crate::netlink::genl::devlink;
assert_eq!(
devlink::DEVLINK_ATTR_BUS_NAME,
devlink_attr::DEVLINK_ATTR_BUS_NAME
);
assert_eq!(
devlink::DEVLINK_ATTR_DEV_NAME,
devlink_attr::DEVLINK_ATTR_DEV_NAME
);
assert_eq!(
devlink::DEVLINK_ATTR_PORT_INDEX,
devlink_attr::DEVLINK_ATTR_PORT_INDEX
);
assert_eq!(
devlink::DEVLINK_ATTR_PORT_TYPE,
devlink_attr::DEVLINK_ATTR_PORT_TYPE
);
assert_eq!(
devlink::DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
devlink_attr::DEVLINK_ATTR_PORT_NETDEV_IFINDEX
);
assert_eq!(
devlink::DEVLINK_ATTR_PORT_FLAVOUR,
devlink_attr::DEVLINK_ATTR_PORT_FLAVOUR
);
assert_eq!(
devlink::DEVLINK_ATTR_PORT_NUMBER,
devlink_attr::DEVLINK_ATTR_PORT_NUMBER
);
assert_eq!(
devlink::DEVLINK_ATTR_INFO_DRIVER_NAME,
devlink_attr::DEVLINK_ATTR_INFO_DRIVER_NAME
);
}
#[test]
fn plan_222_4_ethtool_a_header_attr_ids_match_kernel_uapi() {
use crate::netlink::genl::ethtool::EthtoolHeaderAttr;
assert_eq!(
EthtoolHeaderAttr::Unspec as u16,
ethtool_a::ETHTOOL_A_HEADER_UNSPEC
);
assert_eq!(
EthtoolHeaderAttr::DevIndex as u16,
ethtool_a::ETHTOOL_A_HEADER_DEV_INDEX
);
assert_eq!(
EthtoolHeaderAttr::DevName as u16,
ethtool_a::ETHTOOL_A_HEADER_DEV_NAME
);
assert_eq!(
EthtoolHeaderAttr::Flags as u16,
ethtool_a::ETHTOOL_A_HEADER_FLAGS
);
assert_eq!(
EthtoolHeaderAttr::PhyIndex as u16,
ethtool_a::ETHTOOL_A_HEADER_PHY_INDEX
);
}
}