From 883105d74429176e16caf485c777c3c226429331 Mon Sep 17 00:00:00 2001 From: LeChatP Date: Fri, 29 Mar 2024 09:59:53 +0100 Subject: [PATCH 01/42] first commit for json impl --- .vscode/settings.json | 2 +- Cargo.toml | 44 +- README.md | 2 +- build.rs | 53 +- capable-ebpf/Cargo.toml | 4 +- capable/Cargo.toml | 2 +- configure.sh | 84 +-- dependencies.sh | 93 +++ resources/rootasrole.json | 118 ++++ resources/rootasrole_storage.json | 6 + src/api.rs | 269 +++++++++ src/config.rs | 158 +++++ src/config/libxml2.rs | 274 --------- src/config/load.rs | 422 -------------- src/config/mod.rs | 245 -------- src/config/options.rs | 633 -------------------- src/config/save.rs | 874 ---------------------------- src/config/structs.rs | 575 ------------------- src/config/version.rs | 354 ------------ src/database/migration.rs | 130 +++++ src/database/mod.rs | 77 +++ src/database/options.rs | 922 ++++++++++++++++++++++++++++++ src/database/structs.rs | 874 ++++++++++++++++++++++++++++ src/database/version.rs | 40 ++ src/database/wrapper.rs | 37 ++ src/descriptions.rs | 290 ++++------ src/mod.rs | 18 + src/plugin/hashchecker.rs | 83 +++ src/plugin/hierarchy.rs | 0 src/plugin/mod.rs | 7 + src/plugin/ssd.rs | 133 +++++ src/sr/command.rs | 41 +- src/sr/finder.rs | 853 +++++++++++++++------------ src/sr/main.rs | 245 +++++--- src/sr/timeout.rs | 51 +- src/util.rs | 40 +- src/version.rs | 4 + src/xml_version.rs | 40 -- xtask/Cargo.toml | 2 +- 39 files changed, 3855 insertions(+), 4244 deletions(-) mode change 100755 => 100644 configure.sh create mode 100755 dependencies.sh create mode 100644 resources/rootasrole.json create mode 100644 resources/rootasrole_storage.json create mode 100644 src/api.rs create mode 100644 src/config.rs delete mode 100644 src/config/libxml2.rs delete mode 100644 src/config/load.rs delete mode 100644 src/config/mod.rs delete mode 100644 src/config/options.rs delete mode 100644 src/config/save.rs delete mode 100644 src/config/structs.rs delete mode 100644 src/config/version.rs create mode 100644 src/database/migration.rs create mode 100644 src/database/mod.rs create mode 100644 src/database/options.rs create mode 100644 src/database/structs.rs create mode 100644 src/database/version.rs create mode 100644 src/database/wrapper.rs create mode 100644 src/mod.rs create mode 100644 src/plugin/hashchecker.rs create mode 100644 src/plugin/hierarchy.rs create mode 100644 src/plugin/mod.rs create mode 100644 src/plugin/ssd.rs create mode 100644 src/version.rs delete mode 100644 src/xml_version.rs diff --git a/.vscode/settings.json b/.vscode/settings.json index 07f87f89..8470483d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,7 +27,7 @@ "typeinfo": "c" }, "rust-analyzer.linkedProjects": [ - "sudoers-reader/Cargo.toml", + //"sudoers-reader/Cargo.toml", "Cargo.toml", "./capable/Cargo.toml" ], diff --git a/Cargo.toml b/Cargo.toml index 10aa0448..91871883 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["xtask", "capable", "capable-common"] [package] name = "RootAsRole" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" authors = ["Eddie Billoir "] edition = "2021" default-run = "sr" @@ -25,28 +25,36 @@ path = "src/chsr/main.rs" reqwest = { version = "0.11.18", features = ["blocking", "json"] } pcre2 = "0.2.4" regex = "1.9.1" +serde = { version = "1.0.185" } +serde_json = "1.0.113" [dependencies] -tracing = "0.1.37" -tracing-subscriber = "0.3.16" -libc = "0.2.139" -semver = "1.0.18" -nix = { version = "0.26.2", features = ["user"] } +tracing = "0.1.40" +tracing-subscriber = "0.3.18" +libc = "0.2.153" +strum = { version = "0.26.2", features = ["derive"] } +semver = { version = "1.0.22", features = ["serde"] } +nix = { version = "0.28.0", features = ["user","process", "signal", "fs"] } #sudoers-reader = { path = "sudoers-reader" } -clap = { version = "4.3.0", features = ["derive"] } -cursive = { version = "0.20.0", default-features = false, features = ["termion-backend"] } -capctl = "0.2.3" -pcre2 = "0.2.4" -chrono = "0.4.26" -sxd-document = "0.3.2" -sxd-xpath = "0.4.2" -serde = "1.0.185" -ciborium = "0.2.1" +clap = { version = "4.5.3", features = ["derive"] } +capctl = "0.2.4" +pcre2 = "0.2.6" +serde = { version = "1.0.197", features=["rc"] } +serde_json = "1.0.114" +ciborium = "0.2.2" glob = "0.3.1" -pam-client = { version = "0.5.0" } -bitflags = { version = "2.4.0" } +pam-client = { version = "0.5.0", git = "https://gitlab.com/LeChatP/rust-pam-client.git" } +bitflags = { version = "2.5.0" } shell-words = "1.1.0" -syslog-tracing = "0.2.0" +syslog-tracing = "0.3.0" +linked_hash_set = { version = "0.1.4" } +derivative = "2.2.0" +sha2 = "0.10.8" +sha1 = "0.10.6" +md5 = "0.7.0" +chrono = "0.4.37" +pty-process = "0.4.0" +once_cell = "1.19.0" [dev-dependencies] env_logger = "*" diff --git a/README.md b/README.md index a203b037..17398136 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@

-# RootAsRole (V3.0.0-alpha.3) : a secure alternative to sudo/su on Linux systems +# RootAsRole (V3.0.0-alpha.4) : a secure alternative to sudo/su on Linux systems This tool allows you to configure your privilege access management more securely on a single operating system. diff --git a/build.rs b/build.rs index 9e979a41..cb38b9d7 100644 --- a/build.rs +++ b/build.rs @@ -1,18 +1,18 @@ use pcre2::bytes::RegexBuilder; +use serde_json::Value; use std::error::Error; use std::fs::File; use std::io::{BufRead, BufReader, Write}; use std::process::Command; -fn write_version<'a>(f: &'a mut File, xml_contents: &'a str) -> Result<&'a str, Box> { - let package_version = xml_contents - .split("::from("Version not found"))? - .split('"') - .next() - .ok_or(Box::::from("Version not found"))?; + +fn write_version<'a>(f: &'a mut File, doc: &'a Value) -> Result<&'a str, Box> { + let package_version = doc + .get("version") + .ok_or("No version found")? + .as_str() + .unwrap(); f.write_all( format!( "pub const PACKAGE_VERSION: &'static str = \"{}\";\n", @@ -23,27 +23,6 @@ fn write_version<'a>(f: &'a mut File, xml_contents: &'a str) -> Result<&'a str, Ok(package_version) } -fn write_dtd(f: &mut File, xml_contents: &str) -> Result<(), Box> { - let mut dtd = xml_contents - .split("?>") - .nth(1) - .ok_or(Box::::from("DTD not found"))? - .split("]>") - .next() - .ok_or(Box::::from("DTD not found"))? - .to_string(); - dtd.push_str("]>"); - - f.write_all( - format!( - "pub const DTD: &'static str = \"{}\n\";\n", - dtd.replace('"', "\\\"") - ) - .as_bytes(), - ) - .map_err(|e| e.into()) -} - fn set_cargo_version(package_version: &str, file: &str) -> Result<(), Box> { let cargo_toml = File::open(std::path::Path::new(file)).expect("Cargo.toml not found"); let reader = BufReader::new(cargo_toml); @@ -147,7 +126,7 @@ fn set_readme_version(package_version: &str, file: &str) -> Result<(), Box { if let Err(err) = set_cargo_version(package_version, "Cargo.toml") { eprintln!("cargo:warning={}", err); @@ -192,9 +171,11 @@ fn main() { eprintln!("cargo:warning={}", err); } } - if let Err(err) = write_dtd(&mut f, cargo_toml) { - eprintln!("cargo:warning={}", err); - } + + // let xml = include_str!("resources/rootasrole.xml"); + // if let Err(err) = write_dtd(&mut f, xml) { + // eprintln!("cargo:warning={}", err); + // } f.flush().unwrap(); } diff --git a/capable-ebpf/Cargo.toml b/capable-ebpf/Cargo.toml index a7c76057..d90e4f5a 100644 --- a/capable-ebpf/Cargo.toml +++ b/capable-ebpf/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "capable-ebpf" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" edition = "2021" [dependencies] -aya-bpf = { git = "https://github.com/aya-rs/aya" } +aya-ebpf = { git = "https://github.com/aya-rs/aya" } aya-log-ebpf = { git = "https://github.com/aya-rs/aya" } capable-common = { path = "../capable-common" } diff --git a/capable/Cargo.toml b/capable/Cargo.toml index a2d2a128..b47e653f 100644 --- a/capable/Cargo.toml +++ b/capable/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "capable" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" edition = "2021" publish = false diff --git a/configure.sh b/configure.sh old mode 100755 new mode 100644 index f8a93c62..44570a3e --- a/configure.sh +++ b/configure.sh @@ -1,83 +1,6 @@ #!/bin/bash -# Check that script is executed under sudo -if [ -z "${SUDO_USER}" ]; then - echo "Please execute this script with sudo" >&2 - exit 1 -fi; - -DOCKER=0 - -while getopts "yd" opt; do - case ${opt} in - y ) YES="-y" - ;; - d ) DOCKER=1 - ;; - esac -done - -echo "Install Rust" -if [ $(which cargo &>/dev/null ; echo $?) -eq 0 ]; then - echo "Cargo is installed" -elif [ "${YES}" == "-y" ]; then - curl https://sh.rustup.rs -sSf | sh -s -- -y -else - curl https://sh.rustup.rs -sSf | sh -fi - -if [ ! -f "/usr/bin/cargo" ]; then - cp ~/.cargo/bin/cargo /usr/bin -fi - -echo "Capabilities & PAM packages installation" -if [ $(which apt-get >/dev/null 2>&1 ; echo $?) -eq 0 ];then - apt-get install "${YES}" gcc llvm clang libcap2 libcap2-bin libcap-dev libcap-ng-dev libelf-dev libpam0g-dev libxml2 libxml2-dev make linux-headers-$(uname -r) - if [ -n "${DEBUG}" ]; then - apt-get install "${YES}" gdb - fi; - if [ -n "${COV}" ]; then - apt-get install "${YES}" gcovr - fi; -elif [ $(which yum >/dev/null 2>&1 ; echo $?) -eq 0 ];then - yum install "${YES}" gcc llvm clang libcap libcap-ng libelf libxml2 make kernel-headers - if [ -n "${DEBUG}" ]; then - yum install "${YES}" gdb - fi; - if [ -n "${COV}" ]; then - yum install "${YES}" gcovr - fi; -elif [ $(which pacman >/dev/null 2>&1 ; echo $?) -eq 0 ];then - pacman -S "${YES}" cargo-make gcc llvm clang libcap libcap-ng libelf libxml2 linux-headers linux-api-headers make - if [ -n "${DEBUG}" ]; then - pacman -S "${YES}" gdb - fi; - if [ -n "${COV}" ]; then - pacman -S "${YES}" gcovr - fi; -else - echo "Unable to find a supported package manager, exiting..." - exit 2 -fi - -echo "Install cargo bpf-linker" -cargo install --force bpf-linker - -export $(grep -h '^ID' /etc/*-release) - -echo "Configuration files installation" -echo "id : ${ID}" -if [ "${ID}" == "arch" ]; then - cp resources/arch_sr_pam.conf /etc/pam.d/sr || exit; -elif [ "${ID}" == "ubuntu" ] || [ "${ID}" == "debian" ]; then - cp resources/deb_sr_pam.conf /etc/pam.d/sr || exit; -elif [ "${ID}" == "centos" ] || [ "${ID}" == "fedora" ]; then - cp resources/rh_sr_pam.conf /etc/pam.d/sr || exit; -else - echo "Unable to find a supported distribution, exiting..." - exit 3 -fi -if [ -e "/etc/security/rootasrole.xml" ];then +if [ -e "/etc/security/rootasrole.kdl" ];then read -r -p "Reconfigure policy? [y/N] " response case "$response" in [yY][eE][sS]|[yY]) @@ -92,7 +15,4 @@ sed -i "s/ROOTADMINISTRATOR/${SUDO_USER}/g" /etc/security/rootasrole.xml chmod 0640 /etc/security/rootasrole.xml || exit if [ $DOCKER -eq 0 ]; then chattr +i /etc/security/rootasrole.xml || exit -fi - - -echo "configuration done. Ready to compile." +fi \ No newline at end of file diff --git a/dependencies.sh b/dependencies.sh new file mode 100755 index 00000000..c78faa06 --- /dev/null +++ b/dependencies.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +DOCKER=0 + +while getopts "yd" opt; do + case ${opt} in + y ) YES="-y" + ;; + d ) DOCKER=1 + ;; + esac +done + +echo "Install Rust Cargo compiler" +if [ $(which cargo &>/dev/null ; echo $?) -eq 0 ]; then + echo "Cargo is installed" +elif [ "${YES}" == "-y" ]; then + curl https://sh.rustup.rs -sSf | sh -s -- -y +else + curl https://sh.rustup.rs -sSf | sh +fi + +if [ ! -f "/usr/bin/cargo" ]; then + cp ~/.cargo/bin/cargo /usr/bin + echo "as $HOME/.cargo/bin/cargo cargo program is copied to /usr/bin" +fi + +echo "Capabilities & PAM packages installation" +if [ $(which apt-get >/dev/null 2>&1 ; echo $?) -eq 0 ];then + apt-get install "${YES}" gcc llvm clang libcap2 libcap2-bin libcap-dev libcap-ng-dev libelf-dev libpam0g-dev libxml2 libxml2-dev make linux-headers-$(uname -r) + if [ -n "${DEBUG}" ]; then + apt-get install "${YES}" gdb + fi; + if [ -n "${COV}" ]; then + apt-get install "${YES}" gcovr + fi; +elif [ $(which yum >/dev/null 2>&1 ; echo $?) -eq 0 ];then + yum install "${YES}" gcc llvm clang libcap libcap-ng libelf libxml2 make kernel-headers + if [ -n "${DEBUG}" ]; then + yum install "${YES}" gdb + fi; + if [ -n "${COV}" ]; then + yum install "${YES}" gcovr + fi; +elif [ $(which pacman >/dev/null 2>&1 ; echo $?) -eq 0 ];then + pacman -S "${YES}" cargo-make gcc llvm clang libcap libcap-ng libelf libxml2 linux-headers linux-api-headers make + if [ -n "${DEBUG}" ]; then + pacman -S "${YES}" gdb + fi; + if [ -n "${COV}" ]; then + pacman -S "${YES}" gcovr + fi; +else + echo "Unable to find a supported package manager, exiting..." + exit 2 +fi + +# ask for user to install bpf-linker +if [ "${YES}" == "-y" ]; then + echo "cargo install bpf-linker into /usr/bin" + cargo install --force bpf-linker + mv -f ~/.cargo/bin/bpf-linker /usr/bin +else + read -r -p "Install bpf-linker in /usr/local/bin? (mandatory for build) [y/N] " response + case "$response" in + [yY][eE][sS]|[yY]|[oO]) + echo "cargo install bpf-linker into /usr/bin" + cargo install --force bpf-linker + mv -f ~/.cargo/bin/bpf-linker /usr/bin + ;; + esac +fi + + + +export $(grep -h '^ID' /etc/*-release) + +echo "Configuration files installation" +echo "id : ${ID}" +if [ "${ID}" == "arch" ]; then + cp resources/arch_sr_pam.conf /etc/pam.d/sr || exit; +elif [ "${ID}" == "ubuntu" ] || [ "${ID}" == "debian" ]; then + cp resources/deb_sr_pam.conf /etc/pam.d/sr || exit; +elif [ "${ID}" == "centos" ] || [ "${ID}" == "fedora" ]; then + cp resources/rh_sr_pam.conf /etc/pam.d/sr || exit; +else + echo "Unable to find a supported distribution, exiting..." + exit 3 +fi + + + +echo "configuration done. Ready to compile." diff --git a/resources/rootasrole.json b/resources/rootasrole.json new file mode 100644 index 00000000..5f8e20a2 --- /dev/null +++ b/resources/rootasrole.json @@ -0,0 +1,118 @@ +{ + "version": "3.0.0-alpha.4", + "timeout": { + "type": "ppid", + "duration": "00:05:00" + }, + "options": { + "path": { + "default": "delete", + "add": [ + "/usr/local/sbin", + "/usr/local/bin", + "/usr/sbin", + "/usr/bin", + "/sbin", + "/bin", + "/snap/bin" + ] + }, + "env": { + "default": "delete", + "keep": [ + "HOME", + "USER", + "LOGNAME", + "COLORS", + "DISPLAY", + "HOSTNAME", + "KRB5CCNAME", + "LS_COLORS", + "PS1", + "PS2", + "XAUTHORY", + "XAUTHORIZATION", + "XDG_CURRENT_DESKTOP" + ], + "check": [ + "COLORTERM", + "LANG", + "LANGUAGE", + "LC_*", + "LINGUAS", + "TERM", + "TZ" + ] + }, + "allow-root": false, + "allow-bounding": false, + "wildcard-denied": ";&|" + }, + "roles": [ + { + "name": "t_root", + "actors": [ + { + "type": "user", + "name": "root" + } + ], + "tasks": [ + { + "name": "t_root", + "purpose": "access to every commands", + "cred": { + "setuid": "root", + "setgid": "root", + "capabilities": { + "default": "all" + } + }, + "commands": { + "default": "all", + "sub": [ + "cap_sys_admin" + ] + } + } + ] + }, + { + "name": "functionnal", + "tasks": [ + { + "name": "facl", + "purpose": "File Access Control Managament", + "cred": { + "capabilities": { + "default": "none", + "add": [ + "cap_dac_override" + ] + } + }, + "commands": { + "default": "none", + "add": [ + "/usr/bin/chmod ([ugoa]*([-+=]([rwxXt]+|[ugo]))+|[-+=][0-7]{0,4})(,(?1))* /home/[^. ]+" + ] + } + }, + { + "name": "softs", + "purpose": "Install and update Softwares", + "cred": { + "setuid": "root", + "setgid": "root" + }, + "commands": { + "default": "none", + "add": [ + "/usr/bin/apt install .*" + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/resources/rootasrole_storage.json b/resources/rootasrole_storage.json new file mode 100644 index 00000000..1055c5bb --- /dev/null +++ b/resources/rootasrole_storage.json @@ -0,0 +1,6 @@ +{ + "storage_method": "json", + "storage_settings": { + "path": "/etc/security/rootasrole.json" + } +} \ No newline at end of file diff --git a/src/api.rs b/src/api.rs new file mode 100644 index 00000000..d22fa3e3 --- /dev/null +++ b/src/api.rs @@ -0,0 +1,269 @@ +use std::sync::Mutex; + +use capctl::CapSet; +use serde_json::Value; +use strum::EnumIs; + +use crate::finder::{Cred, ExecSettings, TaskMatch, UserMin}; + +use super::database::structs::{SActor, SConfig, SRole, STask}; +use once_cell::sync::Lazy; +static API: Lazy> = Lazy::new(|| Mutex::new(PluginManager::new())); + +// Define a trait for the plugin +pub trait Plugin { + fn initialize(&self); + fn cleanup(&self); +} + +#[derive(Debug, PartialEq, Eq, EnumIs)] +pub enum PluginPosition { + Beginning, // The plugin is inserted at the beginning of the plugin list + Ending, // The plugin is pushed at the end of the plugin list +} + +#[derive(Debug, PartialEq, Eq, EnumIs)] +pub enum PluginResultAction { + Override, // The result of this plugin ends the algorithm to return the plugin result + Edit, // The result of this plugin modify the result, algorithm continues + Ignore, // The result of this plugin is ignored, algorithm continues +} + +#[derive(Debug, PartialEq, Eq, EnumIs)] +pub enum PluginResult { + Deny, // The plugin denies the action + Neutral, // The plugin has no opinion on the action +} + +pub type ConfigLoaded = fn(config: &SConfig); + +pub type RoleMatcher = fn(role: &SRole, user: &Cred, command: &[String], matcher: &mut TaskMatch) -> PluginResultAction; +pub type TaskMatcher = fn(task: &STask, user: &Cred, command: &[String], matcher: &mut TaskMatch) -> PluginResultAction; + +pub type UserMatcher = fn(role: &SRole, user: &Cred, user_struct: &Value) -> UserMin; + +pub type RoleInformation = fn(role: &SRole) -> Option; +pub type ActorInformation = fn(actor: &SActor) -> Option; +pub type TaskInformation = fn(task: &STask) -> Option; + +pub type DutySeparation = fn(role: &SRole, actor: &Cred) -> PluginResult; +pub type TaskSeparation = fn(task: &STask, actor: &Cred) -> PluginResult; + +pub type CapsFilter = fn(task: &STask, capabilities: &mut CapSet) -> PluginResultAction; +pub type ExecutionChecker = fn(user: &Cred, exec: &mut ExecSettings) -> PluginResult; + +pub type ComplexCommandParser = fn(command: &serde_json::Value) -> Result, Box>; + +macro_rules! plugin_subscribe { + ($plugin:ident, $position:ident, $plugin_type:ident, $plugin_function:ident) => { + let mut api = API.lock().unwrap(); + match $position { + PluginPosition::Beginning => { + api.$plugin.insert(0, $plugin_function); + }, + PluginPosition::Ending => { + api.$plugin.push($plugin_function); + }, + } + }; +} + +// Define a struct to hold the plugins +pub struct PluginManager { + role_matcher_plugins: Vec, + task_matcher_plugins: Vec, + user_matcher_plugins: Vec, + role_information_plugins: Vec, + actor_information_plugins: Vec, + task_information_plugins: Vec, + duty_separation_plugins: Vec, + task_separation_plugins: Vec, + caps_filter_plugins: Vec, + execution_checker_plugins: Vec, + complex_command_parsers: Vec, +} + +impl PluginManager { + pub fn new() -> Self { + PluginManager { + role_matcher_plugins: Vec::new(), + task_matcher_plugins: Vec::new(), + user_matcher_plugins: Vec::new(), + role_information_plugins: Vec::new(), + actor_information_plugins: Vec::new(), + task_information_plugins: Vec::new(), + duty_separation_plugins: Vec::new(), + task_separation_plugins: Vec::new(), + caps_filter_plugins: Vec::new(), + execution_checker_plugins: Vec::new(), + complex_command_parsers: Vec::new(), + } + } + + pub fn subscribe_role_matcher(plugin: RoleMatcher, position: PluginPosition) { + plugin_subscribe!(role_matcher_plugins, position, RoleMatcher, plugin); + } + + pub fn subscribe_task_matcher(plugin: TaskMatcher, position: PluginPosition) { + plugin_subscribe!(task_matcher_plugins, position, TaskMatcher, plugin); + } + + pub fn subscribe_user_matcher(plugin: UserMatcher, position: PluginPosition) { + plugin_subscribe!(user_matcher_plugins, position, UserMatcher, plugin); + } + + pub fn subscribe_role_information(plugin: RoleInformation, position: PluginPosition) { + plugin_subscribe!(role_information_plugins, position, RoleInformation, plugin); + } + + pub fn subscribe_actor_information(plugin: ActorInformation, position: PluginPosition) { + plugin_subscribe!(actor_information_plugins, position, ActorInformation, plugin); + } + + pub fn subscribe_task_information(plugin: TaskInformation, position: PluginPosition) { + plugin_subscribe!(task_information_plugins, position, TaskInformation, plugin); + } + + pub fn subscribe_duty_separation(plugin: DutySeparation, position: PluginPosition) { + plugin_subscribe!(duty_separation_plugins, position, DutySeparation, plugin); + } + + pub fn subscribe_task_separation(plugin: TaskSeparation, position: PluginPosition) { + plugin_subscribe!(task_separation_plugins, position, TaskSeparation, plugin); + } + + pub fn subscribe_caps_filter(plugin: CapsFilter, position: PluginPosition) { + plugin_subscribe!(caps_filter_plugins, position, CapsFilter, plugin); + } + + pub fn subscribe_privilege_checker(plugin: ExecutionChecker, position: PluginPosition) { + plugin_subscribe!(execution_checker_plugins, position, ExecutionChecker, plugin); + } + + pub fn subscribe_complex_command_parser(plugin: ComplexCommandParser, position: PluginPosition) { + plugin_subscribe!(complex_command_parsers, position, ComplexCommandParser, plugin); + } + + pub fn notify_role_matcher(role: &SRole, user: &Cred, command: &[String], matcher: &mut TaskMatch) -> PluginResultAction { + let api = API.lock().unwrap(); + for plugin in api.role_matcher_plugins.iter() { + match plugin(role, user, command, matcher) { + PluginResultAction::Override => return PluginResultAction::Override, + PluginResultAction::Edit => continue, + PluginResultAction::Ignore => continue, + } + } + PluginResultAction::Ignore + } + + pub fn notify_task_matcher(task: &STask, user: &Cred, command: &[String], matcher: &mut TaskMatch) -> PluginResultAction { + let api = API.lock().unwrap(); + for plugin in api.task_matcher_plugins.iter() { + match plugin(task, user, command, matcher) { + PluginResultAction::Override => return PluginResultAction::Override, + PluginResultAction::Edit => continue, + PluginResultAction::Ignore => continue, + } + } + PluginResultAction::Ignore + } + + pub fn notify_user_matcher(role: &SRole, user: &Cred, user_struct: &Value) -> UserMin { + let api = API.lock().unwrap(); + for plugin in api.user_matcher_plugins.iter() { + let res = plugin(role, user, user_struct); + if ! res.is_no_match() { + return res; + } + } + UserMin::NoMatch + } + + pub fn notify_role_information(role: &SRole) -> Option { + let api = API.lock().unwrap(); + for plugin in api.role_information_plugins.iter() { + if let Some(info) = plugin(role) { + return Some(info); + } + } + None + } + + pub fn notify_actor_information(actor: &SActor) -> Option { + let api = API.lock().unwrap(); + for plugin in api.actor_information_plugins.iter() { + if let Some(info) = plugin(actor) { + return Some(info); + } + } + None + } + + pub fn notify_task_information(task: &STask) -> Option { + let api = API.lock().unwrap(); + for plugin in api.task_information_plugins.iter() { + if let Some(info) = plugin(task) { + return Some(info); + } + } + None + } + + pub fn notify_duty_separation(role: &SRole, actor: &Cred) -> PluginResult { + let api = API.lock().unwrap(); + for plugin in api.duty_separation_plugins.iter() { + match plugin(role, actor) { + PluginResult::Deny => return PluginResult::Deny, + PluginResult::Neutral => continue, + } + } + PluginResult::Neutral + } + + pub fn notify_task_separation(task: &STask, actor: &Cred) -> PluginResult { + let api = API.lock().unwrap(); + for plugin in api.task_separation_plugins.iter() { + match plugin(task, actor) { + PluginResult::Deny => return PluginResult::Deny, + PluginResult::Neutral => continue, + } + } + PluginResult::Neutral + } + + pub fn notify_caps_filter(task: &STask, capabilities: &mut CapSet) -> PluginResultAction { + let api = API.lock().unwrap(); + for plugin in api.caps_filter_plugins.iter() { + match plugin(task, capabilities) { + PluginResultAction::Override => return PluginResultAction::Override, + PluginResultAction::Edit => continue, + PluginResultAction::Ignore => continue, + } + } + PluginResultAction::Ignore + } + + pub fn notify_privilege_checker(user: &Cred, exec: &mut ExecSettings) -> PluginResult { + let api = API.lock().unwrap(); + for plugin in api.execution_checker_plugins.iter() { + match plugin(user, exec) { + PluginResult::Deny => return PluginResult::Deny, + PluginResult::Neutral => continue, + } + } + PluginResult::Neutral + } + + pub fn notify_complex_command_parser(command: &serde_json::Value) -> Result, Box> { + let api = API.lock().unwrap(); + for plugin in api.complex_command_parsers.iter() { + match plugin(command) { + Ok(result) => return Ok(result), + Err(_) => continue, + } + } + Err("No complex command parser found".into()) + } + +} + diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 00000000..8bbcd127 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,158 @@ +// Let's define a serde configuration struct to define the database type and connection string +// example in json: +// { +// "storage_method": "sqlite", // storage method is where roles and permissions are stored +// "storage_settings": { +// "path": "/path/to/sqlite.db" +// "host": "localhost", +// "port": 5432, +// "auth": { +// "user": "user", +// "password": "password", +// "client_ssl": { +// "ca_cert": "/path/to/ca_cert", +// "client_cert": "/path/to/client_cert", +// "client_key": "/path/to/client_key" +// } +// }, +// // when using rdbms as storage method +// "database": "database", +// "schema": "schema", +// "table_prefix": "rar_", +// "properties": { +// "use_unicode": true, +// "character_encoding": "utf8" +// }, +// // when using ldap as storage method +// "role_dn": "ou=roles", +// }, +// "ldap": { // when using ldap for user and groups definition storage +// "enabled": false, +// "host": "localhost", +// "port": 389, +// "auth": { +// "user": "user", +// "password": "password" +// "client_ssl": { +// "ca_cert": "/path/to/ca_cert", +// "client_cert": "/path/to/client_cert", +// "client_key": "/path/to/client_key" +// } +// }, +// "base_dn": "dc=example,dc=com", +// "user_dn": "ou=users", +// "group_dn": "ou=groups", +// "user_filter": "(&(objectClass=person)(sAMAccountName=%s))", +// "group_filter": "(&(objectClass=group)(member=%s))" +// } +// } + +const FILEPATH : &str = "/etc/security/rootasrole_storage.json"; +pub const ROOTASROLE : &str = "/etc/security/rootasrole.json"; + + +use std::path::PathBuf; + +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +pub enum StorageMethod { + JSON, +// SQLite, +// PostgreSQL, +// MySQL, +// LDAP, + #[serde(other)] + Unknown, +} + +#[derive(Deserialize, Debug)] +pub struct Settings { + pub storage_method: StorageMethod, + #[serde(skip_serializing_if = "Option::is_none")] + pub remote_storage_settings: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub ldap: Option, +} + +#[derive(Deserialize, Debug)] +pub struct RemoteStorageSettings { + pub path: Option, + pub host: Option, + pub port: Option, + pub auth: Option, + + pub database: Option, + pub schema: Option, + pub table_prefix: Option, + pub properties: Option, +} + +#[derive(Deserialize, Debug)] +pub struct ConnectionAuth { + pub user: String, + pub password: Option, + pub client_ssl: Option, +} + +#[derive(Deserialize, Debug)] +pub struct ClientSsl { + pub enabled: bool, + pub ca_cert: Option, + pub client_cert: Option, + pub client_key: Option, +} + +#[derive(Deserialize, Debug)] +pub struct Properties { + pub use_unicode: bool, + pub character_encoding: String, +} + +#[derive(Deserialize, Debug)] +pub struct LdapSettings { + pub enabled: bool, + pub host: String, + pub port: Option, + pub auth: Option, + pub base_dn: String, + pub user_dn: String, + pub group_dn: String, + pub user_filter: String, + pub group_filter: String, +} + +// Default implementation for Settings +impl Default for Settings { + fn default() -> Self { + Self { + storage_method: StorageMethod::JSON, + remote_storage_settings: Some(RemoteStorageSettings::default()), + ldap: None, + } + } +} + +impl Default for RemoteStorageSettings { + fn default() -> Self { + Self { + path: Some(ROOTASROLE.into()), + host: None, + port: None, + auth: None, + database: None, + schema: None, + table_prefix: None, + properties: None, + } + } +} + +pub fn get_settings() -> Settings { + // if file does not exist, return default settings + if !std::path::Path::new(FILEPATH).exists() { + return Settings::default(); + } + let file = std::fs::File::open(FILEPATH).expect("Failed to open file"); + serde_json::from_reader(file).unwrap_or_default() +} \ No newline at end of file diff --git a/src/config/libxml2.rs b/src/config/libxml2.rs deleted file mode 100644 index cc97491f..00000000 --- a/src/config/libxml2.rs +++ /dev/null @@ -1,274 +0,0 @@ -use std::{ - ffi::{c_char, c_int, c_long, c_uint, c_ulong, c_ushort, c_void, CString}, - fmt::Display, - path::Path, - ptr, -}; - -enum XmlDtd {} -enum XmlNode {} -enum XmlNs {} -enum XmlValidState {} -enum XmlAutomata {} -enum XmlAutomataState {} -enum XmlSAXHandler {} -enum XmlParserInput {} -enum XmlParserNodeInfo {} -enum XmlParserNodeInfoSeq {} -enum XmlParserInputState {} -enum XmlDict {} -enum XmlStartTag {} -enum XmlHashTable {} -enum XmlAttr {} -enum XmlError {} -enum XmlParserMode {} - -#[repr(C)] -struct XmlParserCtxt { - sax: *mut XmlSAXHandler, - user_data: *mut c_void, - my_doc: *mut XmlDoc, - well_formed: c_int, - replace_entities: c_int, - version: *const c_char, - encoding: *const c_char, - standalone: c_int, - html: c_int, - input: *mut XmlParserInput, - input_nr: c_int, - input_max: c_int, - input_tab: *mut *mut XmlParserInput, - node: *mut XmlNode, - node_nr: c_int, - node_max: c_int, - node_tab: *mut *mut XmlNode, - record_info: c_int, - node_seq: XmlParserNodeInfoSeq, - err_no: c_int, - has_external_subset: c_int, - has_pe_refs: c_int, - external: c_int, - valid: c_int, - validate: c_int, - vctxt: XmlValidCtxt, - instate: XmlParserInputState, - token: c_int, - directory: *mut c_char, - name: *const c_char, - name_nr: c_int, - name_max: c_int, - name_tab: *const *mut c_char, - nb_chars: c_long, - check_index: c_long, - keep_blanks: c_int, - disable_sax: c_int, - in_subset: c_int, - int_sub_name: *const c_char, - ext_sub_uri: *mut c_char, - ext_sub_system: *mut c_char, - space: *mut c_int, - space_nr: c_int, - space_max: c_int, - space_tab: *mut c_int, - depth: c_int, - entity: *mut XmlParserInput, - charset: c_int, - nodelen: c_int, - nodemem: c_int, - pedantic: c_int, - _private: *mut c_void, - loadsubset: c_int, - linenumbers: c_int, - catalogs: *mut c_void, - recovery: c_int, - progressive: c_int, - dict: *mut XmlDict, - atts: *const *mut c_char, - maxatts: c_int, - docdict: c_int, - str_xml: *const c_char, - str_xmlns: *const c_char, - str_xml_ns: *const c_char, - sax2: c_int, - ns_nr: c_int, - ns_max: c_int, - ns_tab: *const *mut c_char, - attallocs: *mut c_int, - push_tab: *mut XmlStartTag, - atts_default: *mut XmlHashTable, - atts_special: *mut XmlHashTable, - ns_well_formed: c_int, - options: c_int, - dict_names: c_int, - free_elems_nr: c_int, - free_elems: *mut XmlNode, - free_attrs_nr: c_int, - free_attrs: *mut XmlAttr, - last_error: XmlError, - parse_mode: XmlParserMode, - nbentities: c_ulong, - sizeentities: c_ulong, - node_info: *mut XmlParserNodeInfo, - node_info_nr: c_int, - node_info_max: c_int, - node_info_tab: *mut XmlParserNodeInfo, - input_id: c_int, - sizeentcopy: c_ulong, - end_check_state: c_int, - nb_errors: c_ushort, - nb_warnings: c_ushort, -} - -enum XmlElementType {} - -enum _XmlDict {} - -#[repr(C)] -struct XmlValidCtxt { - user_data: *mut c_void, - error: *mut extern "C" fn(*mut c_void, *const c_char, ...), - warning: *mut extern "C" fn(*mut c_void, *const c_char, ...), - node: *mut XmlNode, - node_nr: c_int, - node_max: c_int, - node_tab: *mut *mut XmlNode, - flags: c_uint, - doc: *mut XmlDoc, - valid: c_int, - vstate: *mut XmlValidState, - vstate_nr: c_int, - vstate_max: c_int, - vstate_tab: *mut XmlValidState, - am: *mut XmlAutomata, - state: *mut XmlAutomataState, -} - -#[repr(C)] -struct XmlDoc { - _private: *mut c_void, - type_: XmlElementType, - name: *const c_char, - children: *mut XmlNode, - last: *mut XmlNode, - parent: *mut XmlNode, - next: *mut XmlNode, - prev: *mut XmlNode, - doc: *mut XmlDoc, - compression: c_int, - standalone: c_int, - int_subset: *mut XmlDtd, - ext_subset: *mut XmlDtd, - oldns: *mut XmlNs, - version: *const c_char, - encoding: *const c_char, - ids: *mut c_void, - refs: *mut c_void, - url: *const c_char, - charset: c_int, - dict: *mut _XmlDict, - psvi: *mut c_void, - parse_flags: c_int, - properties: c_int, -} - -#[derive(Clone, Copy)] -struct XmlValidCtxtPtr(pub *mut XmlValidCtxt); - -unsafe impl Send for XmlValidCtxtPtr {} -unsafe impl Sync for XmlValidCtxtPtr {} - -static XML_PARSE_DTDVALID: c_int = 16; -static XML_PARSE_NOERROR: c_int = 32; -static XML_PARSE_NOWARNING: c_int = 64; -static XML_PARSE_PEDANTIC: c_int = 128; -static XML_PARSE_NOBLANKS: c_int = 256; -static XML_PARSE_NONET: c_int = 2048; - -#[link(name = "xml2")] -extern "C" { - - fn xmlParseFile(filename: *const ::std::os::raw::c_char) -> *mut XmlDoc; - fn xmlFreeDoc(cur: *mut XmlDoc); - fn xmlNewValidCtxt() -> *mut XmlValidCtxt; - fn xmlFreeValidCtxt(ctxt: *mut XmlValidCtxt); - fn xmlValidateDocument(ctxt: *mut XmlValidCtxt, doc: *mut XmlDoc) -> ::std::os::raw::c_int; - fn xmlGetIntSubset(doc: *mut XmlDoc) -> *mut XmlDtd; - fn xmlValidateDtd( - ctxt: *mut XmlValidCtxt, - doc: *mut XmlDoc, - dtd: *mut XmlDtd, - ) -> ::std::os::raw::c_int; - fn xmlValidityErrorFunc(ctx: *mut c_void, msg: *const c_char, ...); - fn xmlNewParserCtxt() -> *mut XmlParserCtxt; - fn xmlCtxtReadFile( - ctxt: *mut XmlParserCtxt, - filename: *const c_char, - encoding: *const c_char, - options: c_int, - ) -> *mut XmlDoc; - -} - -/* -pub(crate) fn validate_Xml_file(filename: &str) -> bool { - let filename = CString::new(filename).unwrap(); - let doc = unsafe { - XmlParseFile( - filename.as_ptr() as *const ::std::os::raw::c_char, - ) - }; - if doc.is_null() { - return false; - } - let ctxt = unsafe { XmlValidCtxtPtr(XmlNewValidCtxt()) }; - - if ctxt.0.is_null() { - unsafe { XmlFreeDoc(doc) }; - return false; - } - let ret = unsafe { XmlValidateDocument(ctxt.0, doc) }; - - if ret != 1 { - unsafe { - XmlFreeDoc(doc); - XmlFreeValidCtxt(ctxt.0); - } - return false; - } - let dtd = unsafe { XmlGetIntSubset(doc) }; - let ret = unsafe { XmlValidateDtd(ctxt.0, doc, dtd) }; - unsafe { - XmlFreeDoc(doc); - XmlFreeValidCtxt(ctxt.0); - } - ret == 1 - -} -*/ - -pub(crate) unsafe fn validate_xml_file

(filename: &P, silent: bool) -> bool -where - P: AsRef + Display, -{ - let ctxt = xmlNewParserCtxt(); - let filename = CString::new(filename.to_string()).unwrap(); - let options: c_int = if silent { - XML_PARSE_DTDVALID - | XML_PARSE_NOBLANKS - | XML_PARSE_NONET - | XML_PARSE_NOERROR - | XML_PARSE_NOWARNING - } else { - XML_PARSE_DTDVALID | XML_PARSE_NOBLANKS | XML_PARSE_NONET | XML_PARSE_PEDANTIC - }; - let doc = xmlCtxtReadFile(ctxt, filename.as_ptr(), ptr::null(), options); - if doc.is_null() { - return false; - } - if (!ctxt.is_null()) && (*ctxt).valid != 0 { - xmlFreeDoc(doc); - return false; - } - - true -} diff --git a/src/config/load.rs b/src/config/load.rs deleted file mode 100644 index 4fdedcda..00000000 --- a/src/config/load.rs +++ /dev/null @@ -1,422 +0,0 @@ -use std::{borrow::BorrowMut, cell::RefCell, error::Error, fmt::Display, path::Path, rc::Rc}; - -use chrono::Duration; -use sxd_document::{ - dom::{Document, Element}, - Package, -}; -use tracing::warn; - -use super::{ - do_in_main_child, get_groups, libxml2, - options::{Level, Opt}, - parse_capset, read_xml_file, - structs::{Config, IdTask, Role, Task}, - version::migrate, -}; - -use crate::xml_version::PACKAGE_VERSION; - -trait Load { - fn load(&self, node: Element) -> Result<(), Box>; -} - -/// Checks if an element is enforced. -/// It checks the enforce attribute of the element. -/// If the enforce attribute is true, then the element is enforced. -pub fn is_enforced(node: Element) -> bool { - let enforce = node.attribute("enforce"); - (enforce.is_some() - && enforce - .expect("Unable to retrieve enforce attribute") - .value() - == "true") - || enforce.is_none() -} - -/// Retrieve string from an option element. -/// It returns the text of the first child of the element. -fn option_element_string(elem: Element<'_>) -> String { - elem.children() - .first() - .unwrap() - .text() - .expect("Cannot read option") - .text() - .to_string() -} - -/// Construct an option from the document structure level and the pointed element -/// It returns an option with the level and the element. -fn get_options(level: Level, node: Element) -> Opt { - let mut rc_options = Opt::new(level); - - for child in node.children() { - let mut options = rc_options.borrow_mut(); - if let Some(elem) = child.element() { - match elem.name().local_part() { - "path" => options.path = Some(option_element_string(elem)), - "env-keep" => options.env_whitelist = Some(option_element_string(elem)), - "env-check" => options.env_checklist = Some(option_element_string(elem)), - "allow-root" => options.allow_root = Some(is_enforced(elem)), - "allow-bounding" => options.disable_bounding = Some(is_enforced(elem)), - "wildcard-denied" => options.wildcard_denied = Some(option_element_string(elem)), - _ => warn!("Unknown option: {}", elem.name().local_part()), - } - } - } - rc_options -} - -/// Load a task from an element. -/// It loads the id, the commands, the options and the purpose of the task. -/// It also loads the capabilities, the setuid and the setgid if they are present. -/// It returns an error if the id is not present. The id is required by the DTD. -impl Load for Rc>> { - fn load(&self, node: Element) -> Result<(), Box> { - if let Some(id) = node.attribute_value("id") { - self.as_ref().borrow_mut().id = IdTask::Name(id.to_string()); - } - if let Some(capabilities) = node.attribute_value("capabilities") { - self.as_ref().borrow_mut().capabilities = Some(parse_capset(capabilities)?); - } - self.as_ref().borrow_mut().setuid = - node.attribute_value("setuser").map(|setuid| setuid.into()); - self.as_ref().borrow_mut().setgid = node - .attribute_value("setgroups") - .map(|setgid| setgid.split(',').map(|e| e.to_string()).collect()); - for child in node.children() { - if let Some(elem) = child.element() { - match elem.name().local_part() { - "command" => self.as_ref().borrow_mut().commands.push( - elem.children() - .first() - .ok_or("Unable to get text from command")? - .text() - .map(|f| f.text().to_string()) - .ok_or("Unable to get text from command")?, - ), - "options" => { - self.as_ref().borrow_mut().options = - Some(Rc::new(get_options(Level::Task, elem).into())); - } - "purpose" => { - self.as_ref().borrow_mut().purpose = Some( - elem.children() - .first() - .ok_or("Unable to get text from purpose")? - .text() - .map(|f| f.text().to_string()) - .ok_or("Unable to get text from purpose")?, - ); - } - _ => warn!("Unknown element: {}", elem.name().local_part()), - } - } - } - Ok(()) - } -} - -/// Obtain every role actors from the actors element. -fn add_actors(role: &mut Role, node: Element) -> Result<(), Box> { - for child in node.children() { - if let Some(elem) = child.element() { - match elem.name().local_part() { - "user" => role.users.push( - elem.attribute_value("name") - .ok_or("Unable to retrieve user name")? - .to_string(), - ), - "group" => role.groups.push(get_groups(elem)), - _ => warn!("Unknown element: {}", elem.name().local_part()), - } - } - } - Ok(()) -} - -/// Load a role from an element. -/// It loads the name, the actors, the tasks and the options. -impl Load for Rc>> { - fn load(&self, element: Element) -> Result<(), Box> { - let mut i: usize = 0; - for child in element.children() { - if let Some(element) = child.element() { - match element.name().local_part() { - "actors" => add_actors(&mut self.as_ref().borrow_mut(), element)?, - "task" => { - i += 1; - let task = Task::new(IdTask::Number(i), Rc::downgrade(self)); - task.load(element)?; - self.as_ref().borrow_mut().tasks.push(task); - } - "options" => { - self.as_ref().borrow_mut().options = - Some(Rc::new(get_options(Level::Role, element).into())) - } - _ => warn!( - "Unknown element: {}", - child - .element() - .expect("Unable to convert unknown to element") - .name() - .local_part() - ), - } - } - } - // load parents - if let Some(parents) = element.attribute_value("parents") { - let parents: Vec<&str> = parents.split(',').collect(); - let confparents = parents - .iter() - .map(|e| e.to_string()) - .collect::>(); - let mut parents = Vec::new(); - if let Some(config) = self.as_ref().borrow().get_config() { - let mut roles = config.as_ref().borrow_mut().roles.clone(); - roles.retain(|e| { - confparents.contains(&e.as_ref().borrow().name) - && e.as_ref().borrow().name != self.as_ref().borrow().name - }); - if roles.len() != confparents.len() { - warn!( - "Role {} : Some parents are not found: {:?}", - self.as_ref().borrow().name, - confparents - ); - } - if !roles.is_empty() { - for role in roles { - parents.push(Rc::downgrade(&role)); - } - } - } - if !parents.is_empty() { - self.as_ref().borrow_mut().parents = Some(parents); - } - } - Ok(()) - } -} - -/// Load the rootasrole element. -/// It load the timestamp-type, the timestamp-timeout and the password-usage-max attributes. -/// It also load the roles and the options. -impl Load for Rc>> { - fn load(&self, element: Element) -> Result<(), Box> { - if element.name().local_part() != "rootasrole" { - return Err("Wrong Element".into()); - } - - if let Some(timestamp_type) = element.attribute_value("timestamp-type") { - self.as_ref().borrow_mut().timestamp.timestamptype = timestamp_type.to_string(); - } - - if let Some(timestamp) = element.attribute_value("timestamp-timeout") { - self.as_ref().borrow_mut().timestamp.offset = - Duration::seconds(timestamp.parse::()?); - } - - if let Some(usage_max) = element.attribute_value("password-usage-max") { - self.as_ref().borrow_mut().timestamp.max_usage = Some(usage_max.parse::()?); - } - - for role in element.children() { - if let Some(element) = role.element() { - if element.name().local_part() == "roles" { - let mut ziprole = Vec::new(); - for role in element.children() { - if let Some(element) = role.element() { - if element.name().local_part() == "role" { - let name = element.attribute_value("name").unwrap(); - let role = Role::new(name.to_string(), Some(Rc::downgrade(self))); - ziprole.push((role, element)); - } - } - } - // Load role after all roles are created, this is because of the hierarchy feature - for (role, element) in ziprole { - role.load(element)?; - self.as_ref().borrow_mut().roles.push(role); - } - } - if element.name().local_part() == "options" { - self.as_ref().borrow_mut().options = - Some(Rc::new(get_options(Level::Global, element).into())); - } - } - } - Ok(()) - } -} - -/// Load a document with the filename, and check for his DTD validity if validate is set to true. -/// It returns an error if the document is not valid. -pub fn load_document<'a, P>(filename: &P, validate: bool) -> Result> -where - P: AsRef + Display, -{ - if validate && !unsafe { libxml2::validate_xml_file(filename, true) } { - return Err("Invalid XML file".into()); - } - read_xml_file(filename) -} - -/// Load a config from the filename, and check for his DTD validity. -/// It returns an error if the document is not valid -pub(crate) fn load_config<'a, P>(filename: &P) -> Result>>, Box> -where - P: AsRef + Display, -{ - load_document(filename, true).and_then(|pkg| load_config_from_doc(&pkg.as_document(), true)) -} - -/// Load a config from the filename, and check for his DTD validity. -/// It also perform a migration if the version of the config is not the same as the package version. -/// It returns an error if the document is not valid -pub fn load_config_from_doc<'a>( - doc: &Document, - do_migration: bool, -) -> Result>>, Box> { - let mut version = PACKAGE_VERSION.to_string(); - do_in_main_child(doc, "rootasrole", |element| { - if let Some(element) = element.element() { - version = element - .attribute_value("version") - .expect("No version") - .to_string(); - } - Ok(()) - })?; - let rc_roles = Config::new(version.as_str()); - do_in_main_child(doc, "rootasrole", |element| { - if let Some(element) = element.element() { - if do_migration { - migrate(&version, doc)?; - rc_roles.as_ref().borrow_mut().version = PACKAGE_VERSION.to_string(); - rc_roles.as_ref().borrow_mut().migrated = true; - } - rc_roles.load(element)?; - } - Ok(()) - })?; - Ok(rc_roles) -} - -#[cfg(test)] -mod tests { - - use crate::util; - - use super::*; - #[test] - fn test_load_roles() { - let roles = load_config(&util::test::test_resources_file( - "test_xml_manager_case1.xml", - )); - if let Err(e) = roles { - panic!("Unable to load roles: {}", e); - } - let binding = roles.unwrap(); - let roles = binding.as_ref().borrow(); - assert_eq!(roles.roles.len(), 2); - let role = roles.roles.first().unwrap(); - let role = role.as_ref().borrow(); - assert_eq!(role.name, "test1"); - assert_eq!(role.users.len(), 1); - assert_eq!(role.users.first().unwrap(), "test1"); - assert_eq!(role.groups.len(), 0); - assert_eq!(role.tasks.len(), 2); - let task = role.tasks.first().unwrap(); - let task = task.as_ref().borrow(); - assert_eq!(task.id, IdTask::Name("t1_test1".to_string())); - assert_eq!(task.commands.len(), 1); - assert_eq!(task.commands.first().unwrap(), "/bin/ls"); - let option = task.options.as_ref(); - assert!(option.is_some()); - let path = task - .options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .to_owned() - .path; - assert!(path.is_some()); - assert_eq!(path.unwrap(), "t1_test1"); - assert!(task.capabilities.is_some()); - let capabilities = task.capabilities.to_owned().unwrap(); - assert_eq!( - capabilities, - super::parse_capset("cap_dac_override").unwrap() - ); - let task = role.tasks.last().unwrap(); - let task = task.as_ref().borrow(); - assert_eq!(task.id, IdTask::Name("t1_test2".to_string())); - assert_eq!(task.commands.len(), 1); - assert_eq!(task.commands.first().unwrap(), "/bin/ls"); - let option = task.options.as_ref(); - assert!(option.is_some()); - let path = task - .options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .to_owned() - .path; - assert!(path.is_some()); - assert_eq!(path.unwrap(), "t1_test2"); - assert!(task.capabilities.is_none()); - let role = roles.roles.last().unwrap(); - let role = role.as_ref().borrow(); - assert_eq!(role.name, "test2"); - assert_eq!(role.users.len(), 1); - assert_eq!(role.users.first().unwrap(), "test1"); - assert_eq!(role.groups.len(), 0); - assert_eq!(role.tasks.len(), 1); - let task = role.tasks.first().unwrap(); - let task = task.as_ref().borrow(); - assert_eq!(task.id, IdTask::Name("t2_test1".to_string())); - assert_eq!(task.commands.len(), 1); - assert_eq!(task.commands.first().unwrap(), "/bin/ls"); - let option = task.options.as_ref(); - assert!(option.is_some()); - let path = task - .options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .to_owned() - .path; - assert!(path.is_some()); - assert_eq!(path.unwrap(), "t2_test1"); - let allowroot = task - .options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .to_owned() - .allow_root; - assert!(allowroot.is_some()); - assert_eq!(allowroot.unwrap(), true); - assert!(task.capabilities.is_none()); - } - - #[test] - fn test_load_roles_with_hierarchy() { - let roles = load_config(&util::test::test_resources_file( - "test_xml_manager_hierarchy.xml", - )); - if let Err(e) = roles { - panic!("Unable to load roles: {}", e); - } - let binding = roles.unwrap(); - let roles = binding.as_ref().borrow(); - assert_eq!(roles.roles.len(), 6); - } -} diff --git a/src/config/mod.rs b/src/config/mod.rs deleted file mode 100644 index 17a19752..00000000 --- a/src/config/mod.rs +++ /dev/null @@ -1,245 +0,0 @@ -pub mod load; -pub mod options; -pub mod save; -pub mod structs; - -#[allow(dead_code)] -mod libxml2; -mod version; - -use capctl::{Cap, CapSet, ParseCapError}; - -use std::{error::Error, fs::File, io::Read, path::Path}; - -use sxd_document::{ - dom::{ChildOfElement, ChildOfRoot, Document, Element}, - parser, Package, -}; - -use self::structs::Groups; - -pub(crate) const FILENAME: &str = "/etc/security/rootasrole.xml"; - -pub(crate) fn read_file

(file_path: P, contents: &mut String) -> Result<(), Box> -where - P: AsRef, -{ - let mut file = File::open(file_path)?; - file.read_to_string(contents)?; - Ok(()) -} - -pub(crate) fn read_xml_file

(file_path: &P) -> Result> -where - P: AsRef, -{ - let mut contents = String::new(); - read_file(file_path, &mut contents)?; - Ok(parser::parse(&contents)?) -} - -pub(crate) fn foreach_child(element: &Element, mut f: F) -> Result<(), Box> -where - F: FnMut(ChildOfElement) -> Result<(), Box>, -{ - if !element.children().is_empty() { - for child in element.children() { - f(child)?; - } - } - Ok(()) -} - -pub(crate) fn foreach_element_name( - element: &Element, - element_name: &str, - mut f: F, -) -> Result<(), Box> -where - F: FnMut(Element) -> Result<(), Box>, -{ - if !element.children().is_empty() { - for child in element.children() { - if let Some(element) = child.element() { - if element.name().local_part() == element_name { - f(element)?; - } - } - } - } - Ok(()) -} - -pub(crate) fn foreach_inner_elements_names( - element: &Element, - elements_structure: &mut Vec<&str>, - mut f: F, -) -> Result<(), Box> -where - F: FnMut(Element) -> Result<(), Box>, -{ - if elements_structure.is_empty() { - return Ok(()); - } else if elements_structure.len() == 1 { - return foreach_element_name(element, elements_structure.first().unwrap(), f); - } else if elements_structure.len() > 128 { - return Err("elements_structure is too big".into()); - } - for child in element.children() { - if let Some(element) = child.element() { - if element.name().local_part() == *elements_structure.first().unwrap() { - elements_structure.remove(0); - if elements_structure.is_empty() { - return f(element); - } else { - return foreach_inner_elements_names(&element, elements_structure, f); - } - } - } - } - Ok(()) -} - -pub(crate) fn do_in_main_child( - doc: &Document, - name: &str, - mut f: F, -) -> Result<(), Box> -where - F: FnMut(ChildOfRoot) -> Result<(), Box>, -{ - for child in doc.root().children() { - if let Some(element) = child.element() { - if element.name().local_part() == name { - f(child)?; - } - } - } - Ok(()) -} - -pub(crate) fn do_in_main_element( - doc: &Document, - name: &str, - mut f: F, -) -> Result<(), Box> -where - F: FnMut(Element) -> Result<(), Box>, -{ - do_in_main_child(doc, name, |child| { - if let Some(element) = child.element() { - f(element.into())?; - } - Ok(()) - }) -} - -pub(crate) fn get_groups(node: Element) -> Groups { - node.attribute("names") - .expect("Unable to retrieve group names") - .value() - .split(',') - .map(|s| s.to_string()) - .collect() -} - -pub fn capset_to_string(set: &CapSet) -> String { - set.iter() - .fold(String::new(), |mut acc, cap| { - acc.push_str(&format!("CAP_{:?} ", cap)); - acc - }) - .trim_end() - .to_string() -} - -pub fn parse_capset(s: &str) -> Result { - if s.is_empty() || s.eq_ignore_ascii_case("all") { - return Ok(!CapSet::empty()); - } - - let mut res = CapSet::empty(); - - for part in s.split(',') { - match part.parse() { - Ok(cap) => res.add(cap), - Err(error) => { - return Err(error); - } - } - } - - Ok(res) -} - -/// Reference every capabilities that lead to almost a direct privilege escalation -pub fn capabilities_are_exploitable(caps: &CapSet) -> bool { - caps.has(Cap::SYS_ADMIN) - || caps.has(Cap::SYS_PTRACE) - || caps.has(Cap::SYS_MODULE) - || caps.has(Cap::DAC_READ_SEARCH) - || caps.has(Cap::DAC_OVERRIDE) - || caps.has(Cap::FOWNER) - || caps.has(Cap::CHOWN) - || caps.has(Cap::SETUID) - || caps.has(Cap::SETGID) - || caps.has(Cap::SETFCAP) - || caps.has(Cap::SYS_RAWIO) - || caps.has(Cap::LINUX_IMMUTABLE) - || caps.has(Cap::SYS_CHROOT) - || caps.has(Cap::SYS_BOOT) - || caps.has(Cap::MKNOD) -} - -#[cfg(test)] -mod tests { - use super::*; - use capctl::Cap; - - #[test] - fn capset_to_string_test() { - let mut set = CapSet::empty(); - set.add(Cap::CHOWN); - set.add(Cap::DAC_OVERRIDE); - set.add(Cap::DAC_READ_SEARCH); - set.add(Cap::FOWNER); - set.add(Cap::FSETID); - set.add(Cap::KILL); - set.add(Cap::SETGID); - set.add(Cap::SETUID); - set.add(Cap::SETPCAP); - set.add(Cap::LINUX_IMMUTABLE); - set.add(Cap::NET_BIND_SERVICE); - set.add(Cap::NET_BROADCAST); - set.add(Cap::NET_ADMIN); - set.add(Cap::NET_RAW); - set.add(Cap::IPC_LOCK); - set.add(Cap::IPC_OWNER); - set.add(Cap::SYS_MODULE); - set.add(Cap::SYS_RAWIO); - set.add(Cap::SYS_CHROOT); - set.add(Cap::SYS_PTRACE); - set.add(Cap::SYS_PACCT); - set.add(Cap::SYS_ADMIN); - set.add(Cap::SYS_BOOT); - set.add(Cap::SYS_NICE); - set.add(Cap::SYS_RESOURCE); - set.add(Cap::SYS_TIME); - set.add(Cap::SYS_TTY_CONFIG); - set.add(Cap::MKNOD); - set.add(Cap::LEASE); - set.add(Cap::AUDIT_WRITE); - set.add(Cap::AUDIT_CONTROL); - set.add(Cap::SETFCAP); - set.add(Cap::MAC_OVERRIDE); - set.add(Cap::MAC_ADMIN); - set.add(Cap::SYSLOG); - set.add(Cap::WAKE_ALARM); - set.add(Cap::BLOCK_SUSPEND); - set.add(Cap::AUDIT_READ); - - assert_eq!( - capset_to_string(&set), - "CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_FSETID CAP_KILL CAP_SETGID CAP_SETUID CAP_SETPCAP CAP_LINUX_IMMUTABLE CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_ADMIN CAP_NET_RAW CAP_IPC_LOCK CAP_IPC_OWNER CAP_SYS_MODULE CAP_SYS_RAWIO CAP_SYS_CHROOT CAP_SYS_PTRACE CAP_SYS_PACCT CAP_SYS_ADMIN CAP_SYS_BOOT CAP_SYS_NICE CAP_SYS_RESOURCE CAP_SYS_TIME CAP_SYS_TTY_CONFIG CAP_MKNOD CAP_LEASE CAP_AUDIT_WRITE CAP_AUDIT_CONTROL CAP_SETFCAP CAP_MAC_OVERRIDE CAP_MAC_ADMIN CAP_SYSLOG CAP_WAKE_ALARM CAP_BLOCK_SUSPEND CAP_AUDIT_READ"); - } -} diff --git a/src/config/options.rs b/src/config/options.rs deleted file mode 100644 index d17235a4..00000000 --- a/src/config/options.rs +++ /dev/null @@ -1,633 +0,0 @@ -use std::{borrow::Borrow, cell::RefCell, rc::Rc}; - -use tracing::debug; - -use super::structs::{Config, Role, Task}; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum Level { - None, - Default, - Global, - Role, - Task, -} - -#[derive(Debug, Clone, Copy)] -pub enum OptType { - Path, - EnvWhitelist, - EnvChecklist, - NoRoot, - Bounding, - Wildcard, -} - -impl OptType { - pub fn from_index(index: usize) -> OptType { - match index { - 0 => OptType::Path, - 1 => OptType::EnvWhitelist, - 2 => OptType::EnvChecklist, - 3 => OptType::NoRoot, - 4 => OptType::Bounding, - _ => panic!("Invalid index for OptType"), - } - } - pub fn as_index(&self) -> usize { - match self { - OptType::Path => 0, - OptType::EnvWhitelist => 1, - OptType::EnvChecklist => 2, - OptType::NoRoot => 3, - OptType::Bounding => 4, - OptType::Wildcard => 5, - } - } -} - -#[derive(Debug)] -pub enum OptValue { - String(String), - Bool(bool), -} - -impl ToString for OptValue { - fn to_string(&self) -> String { - match self { - OptValue::String(s) => s.to_string(), - OptValue::Bool(b) => b.to_string(), - } - } -} - -impl OptValue { - pub fn as_bool(&self) -> bool { - match self { - OptValue::Bool(b) => *b, - _ => panic!("OptValue is not a bool"), - } - } -} - -impl OptValue { - pub fn get_description(&self, opttype: OptType) -> String { - match opttype { - OptType::Path => self - .to_string() - .split(':') - .collect::>() - .join("\n"), - OptType::EnvWhitelist => self - .to_string() - .split(',') - .collect::>() - .join("\n"), - OptType::EnvChecklist => self - .to_string() - .split(',') - .collect::>() - .join("\n"), - OptType::NoRoot => { - if self.as_bool() { - String::from("Enforce NoRoot") - } else { - String::from("Do not enforce NoRoot") - } - } - OptType::Bounding => { - if self.as_bool() { - String::from("Restrict with Bounding") - } else { - String::from("Do not restrict with Bounding") - } - } - OptType::Wildcard => self.to_string(), - } - } -} - -impl OptType { - pub fn item_list_str() -> Vec<(OptType, String)> { - vec![ - (OptType::Path, String::from("Path")), - (OptType::EnvWhitelist, String::from("Environment Whitelist")), - (OptType::EnvChecklist, String::from("Environment Checklist")), - (OptType::NoRoot, String::from("Enforce NoRoot")), - (OptType::Bounding, String::from("Restrict with Bounding")), - ] - } -} - -#[derive(Debug, Clone)] -pub struct Opt { - level: Level, - pub path: Option, - pub env_whitelist: Option, - pub env_checklist: Option, - pub wildcard_denied: Option, - pub allow_root: Option, - pub disable_bounding: Option, -} - -impl AsRef for Opt { - fn as_ref(&self) -> &Opt { - self - } -} - -impl ToString for Opt { - fn to_string(&self) -> String { - let mut str = String::new(); - if let Some(path) = &self.path { - str.push_str(format!("path={}\n", path).as_str()); - } - if let Some(env_whitelist) = &self.env_whitelist { - str.push_str(format!("env_whitelist={}\n", env_whitelist).as_str()); - } - if let Some(env_checklist) = &self.env_checklist { - str.push_str(format!("env_checklist={}\n", env_checklist).as_str()); - } - if let Some(wildcard_denied) = &self.wildcard_denied { - str.push_str(format!("wildcard_denied={}\n", wildcard_denied).as_str()); - } - if let Some(no_root) = &self.allow_root { - str.push_str(format!("no_root={}\n", no_root).as_str()); - } - if let Some(bounding) = &self.disable_bounding { - str.push_str(format!("bounding={}\n", bounding).as_str()); - } - str - } -} - -impl Default for Opt { - fn default() -> Opt { - Opt { - level: Level::Default, - path: Some("/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin".to_string()), - env_whitelist: Some("HOME,USER,LOGNAME,COLORS,DISPLAY,HOSTNAME,KRB5CCNAME,LS_COLORS,PS1,PS2,XAUTHORY,XAUTHORIZATION,XDG_CURRENT_DESKTOP".to_string()), - env_checklist: Some("COLORTERM,LANG,LANGUAGE,LC_*,LINGUAS,TERM,TZ".to_string()), - allow_root: Some(true), - disable_bounding: Some(true), - wildcard_denied: Some(";&|".to_string()) - } - } -} - -impl Opt { - pub fn new(level: Level) -> Opt { - Opt { - level, - path: None, - env_whitelist: None, - env_checklist: None, - allow_root: None, - disable_bounding: None, - wildcard_denied: None, - } - } - - pub fn get_description(&self) -> String { - let mut description = String::new(); - if let Some(path) = self.path.borrow().as_ref() { - description.push_str(format!("Path: {}\n", path).as_str()); - } - if let Some(env_whitelist) = self.env_whitelist.borrow().as_ref() { - description.push_str(format!("Env whitelist: {}\n", env_whitelist).as_str()); - } - if let Some(env_checklist) = self.env_checklist.borrow().as_ref() { - description.push_str(format!("Env checklist: {}\n", env_checklist).as_str()); - } - if let Some(no_root) = self.allow_root.borrow().as_ref() { - description.push_str(format!("No root: {}\n", no_root).as_str()); - } - if let Some(bounding) = self.disable_bounding.borrow().as_ref() { - description.push_str(format!("Bounding: {}\n", bounding).as_str()); - } - if let Some(wildcard_denied) = self.wildcard_denied.borrow().as_ref() { - description.push_str(format!("Wildcard denied: {}\n", wildcard_denied).as_str()); - } - description - } -} - -#[derive(Debug, Clone)] -pub struct OptStack<'a> { - pub(crate) stack: [Option>>; 5], - roles: Rc>>, - role: Option>>>, - task: Option>>>, -} - -impl<'a> OptStack<'a> { - pub fn from_task(task: Rc>>) -> Self { - let mut stack = OptStack::from_role(task.as_ref().borrow().get_role().unwrap()); - stack.task = Some(task.to_owned()); - stack.set_opt(Level::Task, task.as_ref().borrow().options.to_owned()); - stack - } - pub fn from_role(role: Rc>>) -> Self { - let mut stack = OptStack::from_roles(role.as_ref().borrow().get_config().unwrap()); - stack.role = Some(role.to_owned()); - stack.set_opt(Level::Role, role.as_ref().borrow().options.to_owned()); - stack - } - pub fn from_roles(roles: Rc>>) -> Self { - let mut stack = OptStack::new(roles); - stack.set_opt( - Level::Global, - stack.get_roles().as_ref().borrow().options.to_owned(), - ); - stack - } - - fn new(roles: Rc>>) -> OptStack<'a> { - OptStack { - stack: [None, Some(Rc::new(Opt::default().into())), None, None, None], - roles, - role: None, - task: None, - } - } - - fn get_roles(&self) -> Rc>> { - self.roles.to_owned() - } - - fn save(&mut self) { - let level = self.get_level(); - let opt = self.get_opt(level); - match level { - Level::Global => { - self.get_roles().as_ref().borrow_mut().options = opt; - } - Level::Role => { - self.role.to_owned().unwrap().as_ref().borrow_mut().options = opt; - } - Level::Task => { - self.task.to_owned().unwrap().as_ref().borrow_mut().options = opt; - } - Level::None | Level::Default => { - panic!("Cannot save None/default options"); - } - } - } - - pub fn get_level(&self) -> Level { - self.stack - .iter() - .rev() - .find(|opt| opt.is_some()) - .unwrap() - .as_ref() - .unwrap() - .as_ref() - .borrow() - .level - } - fn set_opt(&mut self, level: Level, opt: Option>>) { - if let Some(opt) = opt { - self.stack[level as usize] = Some(opt); - } else { - self.stack[level as usize] = Some(Rc::new(Opt::new(level).into())); - } - } - - fn get_opt(&self, level: Level) -> Option>> { - self.stack[level as usize].to_owned() - } - - fn find_in_options Option<(Level, T)>, T>(&self, f: F) -> Option<(Level, T)> { - for opt in self.stack.iter().rev() { - if let Some(opt) = opt.to_owned() { - let res = f(opt.as_ref().borrow().as_ref()); - if res.is_some() { - debug!("res: {:?}", res.as_ref().unwrap().0); - return res; - } - } - } - None - } - - pub fn get_from_type(&self, opttype: OptType) -> (Level, OptValue) { - match opttype { - OptType::Path => { - let res = self.get_path(); - (res.0, OptValue::String(res.1)) - } - OptType::EnvWhitelist => { - let res = self.get_env_whitelist(); - (res.0, OptValue::String(res.1)) - } - OptType::EnvChecklist => { - let res = self.get_env_checklist(); - (res.0, OptValue::String(res.1)) - } - OptType::NoRoot => { - let res = self.get_no_root(); - (res.0, OptValue::Bool(res.1)) - } - OptType::Bounding => { - let res = self.get_bounding(); - (res.0, OptValue::Bool(res.1)) - } - OptType::Wildcard => { - let res = self.get_wildcard(); - (res.0, OptValue::String(res.1)) - } - } - } - - pub fn get_from_level(&self, level: Level, opttype: OptType) -> Option { - self.stack[level as usize] - .as_ref() - .map(|opt| { - let opt = opt.as_ref().borrow(); - match opttype { - OptType::Path => { - if let Some(value) = opt.path.borrow().as_ref() { - return Some(OptValue::String(value.to_owned())); - } - } - OptType::EnvWhitelist => { - if let Some(value) = opt.env_whitelist.borrow().as_ref() { - return Some(OptValue::String(value.to_owned())); - } - } - OptType::EnvChecklist => { - if let Some(value) = opt.env_checklist.borrow().as_ref() { - return Some(OptValue::String(value.to_owned())); - } - } - OptType::NoRoot => { - if let Some(value) = opt.allow_root.borrow().as_ref() { - return Some(OptValue::Bool(value.to_owned())); - } - } - OptType::Bounding => { - if let Some(value) = opt.disable_bounding.borrow().as_ref() { - return Some(OptValue::Bool(value.to_owned())); - } - } - OptType::Wildcard => { - if let Some(value) = opt.wildcard_denied.borrow().as_ref() { - return Some(OptValue::String(value.to_owned())); - } - } - } - None - }) - .unwrap_or(None) - } - - pub fn get_path(&self) -> (Level, String) { - self.find_in_options(|opt| { - if let Some(p) = opt.borrow().path.borrow().as_ref() { - return Some((opt.borrow().level, p.to_owned())); - } - None - }) - .unwrap_or((Level::None, "".to_string())) - } - pub fn get_env_whitelist(&self) -> (Level, String) { - self.find_in_options(|opt| { - if let Some(p) = opt.borrow().env_whitelist.borrow().as_ref() { - return Some((opt.borrow().level, p.to_owned())); - } - None - }) - .unwrap_or((Level::None, "".to_string())) - } - pub fn get_env_checklist(&self) -> (Level, String) { - self.find_in_options(|opt| { - if let Some(p) = opt.borrow().env_checklist.borrow().as_ref() { - return Some((opt.borrow().level, p.to_owned())); - } - None - }) - .unwrap_or((Level::None, "".to_string())) - } - pub fn get_no_root(&self) -> (Level, bool) { - self.find_in_options(|opt| { - if let Some(p) = opt.borrow().allow_root.borrow().as_ref() { - return Some((opt.borrow().level, p.to_owned())); - } - None - }) - .unwrap_or((Level::None, true)) - } - pub fn get_bounding(&self) -> (Level, bool) { - self.find_in_options(|opt| { - if let Some(p) = opt.borrow().disable_bounding.borrow().as_ref() { - return Some((opt.borrow().level, p.to_owned())); - } - None - }) - .unwrap_or((Level::None, true)) - } - pub fn get_wildcard(&self) -> (Level, String) { - self.find_in_options(|opt| { - if let Some(p) = opt.borrow().wildcard_denied.borrow().as_ref() { - return Some((opt.borrow().level, p.to_owned())); - } - None - }) - .unwrap_or((Level::None, "".to_string())) - } - - fn set_at_level(&mut self, opttype: OptType, value: Option, level: Level) { - let ulevel = level as usize; - if self.stack[ulevel].is_none() { - self.stack[ulevel] = Some(Rc::new(Opt::new(level).into())); - return; - } - println!("stack : {:?}", self.stack); - let binding = self.stack[ulevel].as_ref().unwrap(); - let mut opt = binding.as_ref().borrow_mut(); - match opttype { - OptType::Path => { - if let Some(OptValue::String(value)) = value.borrow() { - opt.path.replace(value.to_string()); - } - } - OptType::EnvWhitelist => { - if let Some(OptValue::String(value)) = value.borrow() { - opt.env_whitelist.replace(value.to_string()); - } - } - OptType::EnvChecklist => { - if let Some(OptValue::String(value)) = value.borrow() { - opt.env_checklist.replace(value.to_string()); - } - } - OptType::NoRoot => { - if let Some(OptValue::Bool(value)) = value.borrow() { - opt.allow_root.replace(*value); - } - } - OptType::Bounding => { - if let Some(OptValue::Bool(value)) = value.borrow() { - opt.disable_bounding.replace(*value); - } - } - OptType::Wildcard => { - if let Some(OptValue::String(value)) = value.borrow() { - opt.wildcard_denied.replace(value.to_string()); - } - } - } - } - - /** - * Set an option at the highest level - */ - pub fn set_value(&mut self, opttype: OptType, value: Option) { - self.set_at_level(opttype, value, self.get_level()); - self.save(); - } - - pub fn get_description(&self, current_level: Level, opttype: OptType) -> String { - let (level, value) = self.get_from_type(opttype.to_owned()); - let leveldesc = if level != current_level { - match level { - Level::Default => " (Inherited from Default)", - Level::Global => " (Inherited from Global)", - Level::Role => " (Inherited from Role)", - Level::Task => " (Inherited from Commands)", - Level::None => " (Inherited from None)", - } - } else { - " (setted at this level)" - }; - format!("{}\n{}", leveldesc, value.get_description(opttype)) - } -} - -#[cfg(test)] -mod tests { - use crate::xml_version::PACKAGE_VERSION; - - use super::super::options::*; - use super::super::structs::*; - - #[test] - fn test_find_in_options() { - let roles = Config::new(PACKAGE_VERSION); - let role = Role::new("test".to_string(), Some(Rc::downgrade(&roles))); - roles.as_ref().borrow_mut().roles.push(role); - let mut options = OptStack::from_role(roles.as_ref().borrow().roles[0].to_owned()); - options.set_at_level( - OptType::Path, - Some(OptValue::String("path1".to_string())), - Level::Global, - ); - options.set_at_level( - OptType::Path, - Some(OptValue::String("path2".to_string())), - Level::Role, - ); - - let res = options.find_in_options(|opt| { - if let Some(value) = opt.path.borrow().as_ref() { - Some((opt.level, value.to_owned())) - } else { - None - } - }); - assert_eq!(res, Some((Level::Role, "path2".to_string()))); - } - - #[test] - fn test_get_description() { - let mut options = OptStack::from_roles(Config::new(PACKAGE_VERSION)); - println!("{:?}", options); - options.set_at_level( - OptType::Path, - Some(OptValue::String("path1".to_string())), - Level::Global, - ); - println!("{:?}", options); - options.set_at_level( - OptType::EnvWhitelist, - Some(OptValue::String("tets".to_string())), - Level::Role, - ); - println!("{:?}", options); - let res = options.get_description(Level::Role, OptType::Path); - assert_eq!(res, " (Inherited from Global)\npath1"); - } - - #[test] - fn test_get_description_inherited() { - let mut options = OptStack::from_roles(Config::new(PACKAGE_VERSION)); - options.set_at_level( - OptType::Path, - Some(OptValue::String("path1".to_string())), - Level::Global, - ); - options.set_at_level( - OptType::EnvWhitelist, - Some(OptValue::String("tets".to_string())), - Level::Global, - ); - - let res = options.get_description(Level::Global, OptType::Path); - assert_eq!(res, " (setted at this level)\npath1"); - } - - #[test] - fn test_task_level() { - let roles = Config::new(PACKAGE_VERSION); - let role = Role::new("test".to_string(), Some(Rc::downgrade(&roles))); - let task = Task::new(IdTask::Number(1), Rc::downgrade(&role)); - let mut options = OptStack::from_task(task); - options.set_at_level( - OptType::EnvChecklist, - Some(OptValue::String("checklist1".to_string())), - Level::Global, - ); - options.set_at_level( - OptType::EnvChecklist, - Some(OptValue::String("checklist2".to_string())), - Level::Task, - ); - - let res = options.get_description(Level::Task, OptType::EnvChecklist); - assert_eq!(res, " (setted at this level)\nchecklist2"); - } - - #[test] - fn test_get_from_level() { - let roles = Config::new(PACKAGE_VERSION); - let role = Role::new("test".to_string(), Some(Rc::downgrade(&roles))); - let task = Task::new(IdTask::Number(1), Rc::downgrade(&role)); - let mut options = OptStack::from_task(task); - options.set_at_level( - OptType::EnvChecklist, - Some(OptValue::String("checklist1".to_string())), - Level::Global, - ); - options.set_at_level( - OptType::EnvChecklist, - Some(OptValue::String("checklist2".to_string())), - Level::Task, - ); - - let res = options.get_from_level(Level::Task, OptType::EnvChecklist); - assert_eq!(res.unwrap().to_string(), "checklist2"); - } - - #[test] - fn test_set_value() { - let roles = Config::new(PACKAGE_VERSION); - let role = Role::new("test".to_string(), Some(Rc::downgrade(&roles))); - let task = Task::new(IdTask::Number(1), Rc::downgrade(&role)); - let mut options = OptStack::from_task(task); - options.set_value(OptType::NoRoot, Some(OptValue::Bool(true))); - - let res = options.get_from_level(Level::Task, OptType::NoRoot); - assert_eq!(res.unwrap().to_string(), "true"); - } -} diff --git a/src/config/save.rs b/src/config/save.rs deleted file mode 100644 index 8de97208..00000000 --- a/src/config/save.rs +++ /dev/null @@ -1,874 +0,0 @@ -use std::{ - borrow::Borrow, collections::HashSet, error::Error, fs::File, io::Write, os::fd::AsRawFd, - path::Path, str::from_utf8, -}; - -use sxd_document::{ - dom::{Document, Element}, - writer::Writer, -}; -use tracing::debug; - -use crate::xml_version::DTD; - -use super::{capset_to_string, do_in_main_child, options::Opt}; - -use super::{ - foreach_child, read_xml_file, - structs::{Config, Groups, IdTask, Role, Save, Task}, -}; - -const FS_IMMUTABLE_FL: u32 = 0x00000010; -const FS_IOC_GETFLAGS: u64 = 0x80086601; -const FS_IOC_SETFLAGS: u64 = 0x40086602; - -fn toggle_lock_config(file: &str, lock: bool) -> Result<(), String> { - let file = match File::open(file) { - Err(e) => return Err(e.to_string()), - Ok(f) => f, - }; - let mut val = 0; - let fd = file.as_raw_fd(); - if unsafe { nix::libc::ioctl(fd, FS_IOC_GETFLAGS, &mut val) } < 0 { - return Err(std::io::Error::last_os_error().to_string()); - } - if lock { - val &= !(FS_IMMUTABLE_FL); - } else { - val |= FS_IMMUTABLE_FL; - } - if unsafe { nix::libc::ioctl(fd, FS_IOC_SETFLAGS, &mut val) } < 0 { - return Err(std::io::Error::last_os_error().to_string()); - } - Ok(()) -} - -pub fn sxd_sanitize(element: &mut str) -> String { - element - .replace('&', "&") - .replace('<', "<") - .replace('>', ">") - .replace('\"', """) - .replace('\'', "'") -} - -fn write_xml_config(file: &str, content: Option<&[u8]>) -> Result<(), Box> { - debug!("Writing config file {}", file); - let mut file = File::create(file)?; - if let Some(content) = content { - let mut content = from_utf8(content).unwrap().to_string(); - content = content.replace("?>", format!("?>\n{}", DTD).as_str()); - file.write_all(content.as_bytes())?; - } else { - file.write_fmt(format_args!( - "\n{}\n\n", - DTD, - ))?; - } - - Ok(()) -} - -pub fn save_config(filename: &str, config: &Config, lock: bool) -> Result<(), Box> { - if !Path::new(filename).exists() { - write_xml_config(filename, None)?; - } - let package = read_xml_file(&filename)?; - let doc = package.as_document(); - config.save(Some(&doc), None)?; - let mut output = Vec::new(); - Writer::new() - .set_single_quotes(false) - .format_document(&doc, &mut output)?; - if lock { - toggle_lock_config(filename, false)?; - } - write_xml_config(filename, Some(&output))?; - if lock { - toggle_lock_config(filename, true)?; - } - - Ok(()) -} - -impl<'a> Save for Config<'a> { - fn save( - &self, - doc: Option<&Document>, - _element: Option<&Element>, // is None - ) -> Result> { - let doc = doc.ok_or::>("Unable to retrieve Document".into())?; - let mut edited = false; - let mut hasroles = false; - do_in_main_child(doc, "rootasrole", |element| { - let element = element.element().unwrap(); - element.set_attribute_value("version", self.version.as_str()); - foreach_child(&element, |child| { - if let Some(child) = child.element() { - match child.name().local_part() { - "roles" => { - hasroles = true; - let mut rolesnames = self.get_roles_names(); - foreach_child(&child, |role_element| { - if let Some(role_element) = role_element.element() { - let rolename = role_element.attribute_value("name").unwrap(); - if let Some(role) = self.get_role(rolename) { - if role - .as_ref() - .borrow() - .save(doc.into(), Some(&role_element))? - { - edited = true; - } - } else { - role_element.remove_from_parent(); - } - rolesnames.remove(&rolename.to_string()); - } - Ok(()) - })?; - if !rolesnames.is_empty() { - edited = true; - } - for rolename in rolesnames { - let role = self.get_role(&rolename).unwrap(); - let role_element = doc.create_element("role"); - role_element.set_attribute_value("name", &rolename); - - role.as_ref() - .borrow() - .save(doc.into(), Some(&role_element))?; - child.append_child(role_element); - } - } - "options" => { - if self - .options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .save(doc.into(), Some(&child))? - { - edited = true; - } - } - _ => (), - } - } - Ok(()) - })?; - if !hasroles { - if let Some(options) = &self.options { - let options = options.as_ref(); - let options_element = doc.create_element("options"); - options.borrow().save(doc.into(), Some(&options_element))?; - element.append_child(options_element); - } - let roles_element = doc.create_element("roles"); - let rolesnames = self.get_roles_names(); - for rolename in rolesnames { - let role = self.get_role(&rolename).unwrap(); - let role_element = doc.create_element("role"); - role_element.set_attribute_value("name", &rolename); - - role.as_ref() - .borrow() - .save(doc.into(), Some(&role_element))?; - roles_element.append_child(role_element); - } - element.append_child(roles_element); - edited = true; - } - Ok(()) - })?; - Ok(edited) - } -} - -fn add_actors_to_child_element( - doc: &Document, - child: &Element, - users: &HashSet, - groups: &HashSet, -) -> bool { - if !users.is_empty() || !groups.is_empty() { - for user in users { - let actor_element = doc.create_element("user"); - actor_element.set_attribute_value("name", user); - child.append_child(actor_element); - } - for group in groups { - let actor_element = doc.create_element("group"); - actor_element.set_attribute_value("names", &group.join(",")); - child.append_child(actor_element); - } - true - } else { - false - } -} - -impl<'a> Save for Role<'a> { - fn save( - &self, - doc: Option<&Document>, - element: Option<&Element>, - ) -> Result> { - let doc = doc.ok_or::>("Unable to retrieve Document".into())?; - let element = element.ok_or::>("Unable to retrieve Element".into())?; - if element.name().local_part() != "role" { - return Err("Unable to save role".into()); - } - let mut edited = false; - if !element.children().is_empty() { - let mut hasactors = false; - let mut hasoptions = false; - let mut hastasks = false; - let mut taskid = 0; - - foreach_child(element, |child| { - if let Some(child) = child.element() { - match child.name().local_part() { - "actors" => { - hasactors = true; - let mut users = HashSet::new(); - users.extend(self.users.clone()); - let mut groups = HashSet::new(); - groups.extend(self.groups.clone()); - foreach_child(&child, |actor_element| { - if let Some(actor_element) = actor_element.element() { - match actor_element.name().local_part() { - "user" => { - let username = actor_element - .attribute_value("name") - .unwrap() - .to_string(); - if !users.contains(&username) { - actor_element.remove_from_parent(); - edited = true; - } else { - users.remove(&username); - } - } - "group" => { - let groupnames = actor_element - .attribute_value("names") - .unwrap() - .split(',') - .map(|s| s.to_string()) - .collect::(); - if !groups.contains(&groupnames) { - actor_element.remove_from_parent(); - edited = true; - } else { - groups.remove(&groupnames); - } - } - _ => {} - } - } - Ok(()) - })?; - edited = add_actors_to_child_element(doc, &child, &users, &groups); - } - "task" => { - hastasks = true; - if let Some(task) = self.tasks.iter().find(|t| { - if let Some(id) = child.attribute("id") { - t.as_ref().borrow().id == IdTask::Name(id.value().to_string()) - } else { - let ret = t.as_ref().borrow().id == IdTask::Number(taskid); - taskid += 1; - ret - } - }) { - if task.as_ref().borrow().save(doc.into(), Some(&child))? { - edited = true; - } - } else { - child.remove_from_parent(); - edited = true; - } - } - "options" => { - hasoptions = true; - if self - .options - .clone() - .unwrap() - .as_ref() - .borrow() - .save(doc.into(), Some(&child))? - { - edited = true; - } - } - _ => (), - } - } - Ok(()) - })?; - if !hasactors && (!self.users.is_empty() || !self.groups.is_empty()) { - let mut users = HashSet::new(); - users.extend(self.users.clone()); - let mut groups = HashSet::new(); - groups.extend(self.groups.clone()); - let actors_element = doc.create_element("actors"); - add_actors_to_child_element(doc, &actors_element, &users, &groups); - element.append_child(actors_element); - edited = true; - } - if !hastasks && !self.tasks.is_empty() { - for task in self.tasks.clone() { - let element = doc.create_element("task"); - task.as_ref().borrow().save(doc.into(), Some(&element))?; - } - edited = true; - } - if !hasoptions && self.options.is_some() { - let element = doc.create_element("options"); - self.options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .save(doc.into(), Some(&element))?; - edited = true; - } - } else { - let actors_element = doc.create_element("actors"); - let mut users = HashSet::new(); - users.extend(self.users.clone()); - let mut groups = HashSet::new(); - groups.extend(self.groups.clone()); - add_actors_to_child_element(doc, &actors_element, &users, &groups); - for task in self.tasks.clone() { - let child = doc.create_element("task"); - task.as_ref().borrow().save(doc.into(), Some(&child))?; - element.append_child(child); - } - if let Some(options) = &self.options { - let options_element = doc.create_element("options"); - options - .as_ref() - .borrow() - .save(doc.into(), Some(&options_element))?; - element.append_child(options_element); - } - edited = true; - } - Ok(edited) - } -} - -impl<'a> Save for Task<'a> { - fn save( - &self, - doc: Option<&Document>, - element: Option<&Element>, - ) -> Result> { - let doc = doc.ok_or::>("Unable to retrieve Document".into())?; - let element = element.ok_or::>("Unable to retrieve Element".into())?; - if element.name().local_part() != "task" { - return Err("Unable to save task".into()); - } - let mut edited = false; - if let IdTask::Name(id) = &self.id { - if let Some(att) = element.attribute_value("id") { - if att != id.as_str() { - element.set_attribute_value("id", id.as_str()); - edited = true; - } - } else { - element.set_attribute_value("id", id.as_str()); - edited = true; - } - } - if let Some(capabilities) = &self.capabilities { - if !capabilities.is_empty() { - element.set_attribute_value("capabilities", &capset_to_string(capabilities)); - } else if element.attribute_value("capabilities").is_some() { - element.remove_attribute("capabilities"); - } - } - if let Some(setuid) = &self.setuid { - element.set_attribute_value("setuser", setuid.as_str()); - } else if element.attribute_value("setuser").is_some() { - element.remove_attribute("setuser"); - } - if let Some(setgid) = &self.setgid { - element.set_attribute_value("setgroups", setgid.join(",").as_str()); - } else if element.attribute_value("setgroups").is_some() { - element.remove_attribute("setgroups"); - } - - let mut commands = HashSet::new(); - commands.extend(self.commands.clone()); - let mut hasoptions = false; - let mut haspurpose = false; - foreach_child(element, |child| { - if let Some(child_element) = child.element() { - match child_element.name().local_part() { - "command" => { - let command = child - .text() - .ok_or::>("Unable to retrieve command Text".into())? - .text() - .to_string(); - if !commands.contains(&command) { - child_element.remove_from_parent(); - edited = true; - } else { - commands.remove(&command); - } - } - "purpose" => { - haspurpose = true; - if let Some(purpose) = &self.purpose { - if child - .text() - .ok_or::>("Unable to retrieve command Text".into())? - .text() - != purpose - { - child_element.set_text(purpose); - edited = true; - } - } else { - child_element.remove_from_parent(); - edited = true; - } - } - "options" => { - hasoptions = true; - if self - .options - .as_ref() - .map(|o| o.as_ref().borrow().save(doc.into(), Some(&child_element))) - .unwrap()? - { - edited = true; - } - } - _ => {} - } - } - Ok(()) - })?; - - if !haspurpose && self.purpose.is_some() { - let purpose_element = doc.create_element("purpose"); - purpose_element.set_text(self.purpose.as_ref().unwrap().as_str()); - element.append_child(purpose_element); - edited = true; - } - - if !commands.is_empty() { - for command in commands { - let command_element = doc.create_element("command"); - command_element.set_text(&command); - element.append_child(command_element); - } - edited = true; - } - - if !hasoptions && self.options.is_some() { - let options_element = doc.create_element("options"); - self.options - .as_ref() - .unwrap() - .as_ref() - .borrow() - .save(doc.into(), Some(&options_element))?; - element.append_child(options_element); - edited = true; - } - Ok(edited) - } -} - -impl Save for Opt { - fn save( - &self, - _doc: Option<&Document>, - element: Option<&Element>, - ) -> Result> { - let element = element.ok_or::>("Unable to retrieve Element".into())?; - if element.name().local_part() != "options" { - return Err("Unable to save options".into()); - } - let mut edited = false; - let mut haspath = false; - let mut hasenv_whitelist = false; - let mut hasenv_checklist = false; - let mut hasallow_root = false; - let mut hasdisable_bounding = false; - let mut haswildcard_denied = false; - foreach_child(element, |child| { - if let Some(child_element) = child.element() { - match child_element.name().local_part() { - "path" => { - haspath = true; - if self.path.is_none() { - child_element.remove_from_parent(); - edited = true; - } else if child_element - .children() - .iter() - .fold(String::new(), |acc, c| { - acc + match c.text() { - Some(t) => t.text(), - None => "", - } - }) - != *self.path.as_ref().unwrap() - { - child_element.set_text(self.path.as_ref().unwrap()); - edited = true; - } - } - "env_whitelist" => { - hasenv_whitelist = true; - if self.env_whitelist.is_none() { - child_element.remove_from_parent(); - edited = true; - } else if *child - .text() - .ok_or::>( - "Unable to retrieve env_whitelist Text".into(), - )? - .text() - != self.env_whitelist.as_ref().unwrap().to_string() - { - child_element.set_text(self.env_whitelist.as_ref().unwrap().as_str()); - edited = true; - } - } - "env_checklist" => { - hasenv_checklist = true; - if self.env_checklist.is_none() { - child_element.remove_from_parent(); - edited = true; - } else if *child - .text() - .ok_or::>( - "Unable to retrieve env_checklist Text".into(), - )? - .text() - != self.env_checklist.as_ref().unwrap().to_string() - { - child_element.set_text(self.env_checklist.as_ref().unwrap().as_str()); - edited = true; - } - } - "allow-root" => { - hasallow_root = true; - let noroot = child_element - .attribute("allow-root") - .ok_or::>("Unable to retrieve allow-root".into())?; - if self.allow_root.is_none() { - child_element.remove_from_parent(); - edited = true; - } else if (noroot.value() == "true") != self.allow_root.unwrap() { - child_element.set_attribute_value( - "enforce", - match self.allow_root.unwrap() { - true => "true", - false => "false", - }, - ); - edited = true; - } - } - "allow-bounding" => { - hasdisable_bounding = true; - let noroot = child_element - .attribute("allow-bounding") - .ok_or::>("Unable to retrieve allow_bounding".into())?; - if self.allow_root.is_none() { - child_element.remove_from_parent(); - edited = true; - } else if (noroot.value() == "true") != self.allow_root.unwrap() { - child_element.set_attribute_value( - "enforce", - match self.allow_root.unwrap() { - true => "true", - false => "false", - }, - ); - edited = true; - } - } - "wildcard_denied" => { - haswildcard_denied = true; - if self.wildcard_denied.is_none() { - child_element.remove_from_parent(); - edited = true; - } else if *child.text().unwrap().text() - != self.wildcard_denied.as_ref().unwrap().to_string() - { - child_element.set_text(self.wildcard_denied.as_ref().unwrap().as_str()); - edited = true; - } - } - _ => {} - } - } - Ok(()) - })?; - if !haspath && self.path.is_some() { - let path_element = _doc.unwrap().create_element("path"); - path_element.set_text(self.path.as_ref().unwrap()); - element.append_child(path_element); - edited = true; - } - if !hasenv_whitelist && self.env_whitelist.is_some() { - let env_whitelist_element = _doc.unwrap().create_element("env_whitelist"); - env_whitelist_element.set_text(self.env_whitelist.as_ref().unwrap().as_str()); - element.append_child(env_whitelist_element); - edited = true; - } - if !hasenv_checklist && self.env_checklist.is_some() { - let env_checklist_element = _doc.unwrap().create_element("env_checklist"); - env_checklist_element.set_text(self.env_checklist.as_ref().unwrap().as_str()); - element.append_child(env_checklist_element); - edited = true; - } - if !hasallow_root && self.allow_root.is_some() { - let allow_root_element = _doc.unwrap().create_element("allow-root"); - allow_root_element.set_attribute_value( - "enforce", - match self.allow_root.unwrap() { - true => "true", - false => "false", - }, - ); - element.append_child(allow_root_element); - edited = true; - } - if !hasdisable_bounding && self.disable_bounding.is_some() { - let disable_bounding_element = _doc.unwrap().create_element("disable-bounding"); - disable_bounding_element.set_attribute_value( - "enforce", - match self.disable_bounding.unwrap() { - true => "true", - false => "false", - }, - ); - element.append_child(disable_bounding_element); - edited = true; - } - if self.wildcard_denied.is_some() { - let wildcard_denied_element = _doc.unwrap().create_element("wildcard_denied"); - wildcard_denied_element.set_text(self.wildcard_denied.as_ref().unwrap().as_str()); - element.append_child(wildcard_denied_element); - edited = true; - } - - Ok(edited) - } -} - -#[cfg(test)] -mod tests { - use std::rc::Rc; - use test_log::test; - - use crate::xml_version::PACKAGE_VERSION; - - use super::super::options::*; - use super::super::structs::*; - use super::*; - use capctl::{Cap, CapSet}; - - #[test] - fn test_save() { - let roles = Config::new(PACKAGE_VERSION); - let binding = "role_test".to_string(); - let role = Role::new(binding, Some(Rc::downgrade(&roles))); - let task = Task::new(IdTask::Name("task_test".to_string()), Rc::downgrade(&role)); - { - let mut task_mut = task.as_ref().borrow_mut(); - task_mut.commands.push("test_command1".to_string()); - task_mut.commands.push("test_command2".to_string()); - task_mut.purpose = Some("test_purpose".to_string()); - let mut capset = CapSet::empty(); - capset.add(Cap::BPF); - task_mut.capabilities = Some(capset); - task_mut.setuid = Some("test_setuid".to_string()); - task_mut.setgid = - Some(vec!["test_setgidA1".to_string(), "test_setgidB1".to_string()].into()); - let mut options = Opt::new(Level::Task); - options.path = Some("task_test_path".to_string().into()); - options.env_whitelist = Some("task_test_env_whitelist".to_string().into()); - options.env_checklist = Some("task_test_env_checklist".to_string().into()); - options.allow_root = Some(false.into()); - options.disable_bounding = Some(false.into()); - options.wildcard_denied = Some("task_test_wildcard_denied".into()); - task_mut.options = Some(Rc::new(options.into())); - } - { - let mut role_mut = role.as_ref().borrow_mut(); - role_mut.users.push("test_user1".to_string()); - role_mut.users.push("test_user2".to_string()); - role_mut - .groups - .push(vec!["test_groupA1".to_string()].into()); - role_mut - .groups - .push(vec!["test_groupB1".to_string(), "test_groupB2".to_string()].into()); - role_mut.tasks.push(task); - let mut options = Opt::new(Level::Role); - options.path = Some("role_test_path".to_string().into()); - options.env_whitelist = Some("role_test_env_whitelist".to_string().into()); - options.env_checklist = Some("role_test_env_checklist".to_string().into()); - options.allow_root = Some(false.into()); - options.disable_bounding = Some(false.into()); - options.wildcard_denied = Some("role_test_wildcard_denied".into()); - role_mut.options = Some(Rc::new(options.into())); - } - let mut roles_mut = roles.as_ref().borrow_mut(); - let mut options = Opt::new(Level::Global); - options.path = Some("global_test_path".to_string().into()); - options.env_whitelist = Some("global_test_env_whitelist".to_string().into()); - options.env_checklist = Some("global_test_env_checklist".to_string().into()); - options.allow_root = Some(false.into()); - options.disable_bounding = Some(false.into()); - options.wildcard_denied = Some("global_test_wildcard_denied".into()); - roles_mut.options = Some(Rc::new(options.into())); - roles_mut.roles.push(role); - let package = sxd_document::Package::new(); - let doc = package.as_document(); - let root = doc.create_element("rootasrole"); - root.set_attribute_value("version", "vtest"); - doc.root().append_child(root); - roles_mut.save(Some(&doc), None).unwrap(); - - let childs = root.children(); - assert_eq!(childs.len(), 2); - let roles_options = childs[0].element().unwrap(); - assert_eq!(roles_options.name().local_part(), "options"); - assert_eq!(roles_options.children().len(), 6); - for option_element in roles_options.children() { - let option_element = option_element.element().unwrap(); - match option_element.name().local_part() { - "path" => { - assert_eq!( - option_element.children()[0].text().unwrap().text(), - "global_test_path" - ); - } - "env_whitelist" => { - assert_eq!( - option_element.children()[0].text().unwrap().text(), - "global_test_env_whitelist" - ); - } - "env_checklist" => { - assert_eq!( - option_element.children()[0].text().unwrap().text(), - "global_test_env_checklist" - ); - } - "allow-root" => { - assert_eq!( - option_element.attribute("enforce").unwrap().value(), - "false" - ); - } - "allow-bounding" => { - assert_eq!( - option_element.attribute("enforce").unwrap().value(), - "false" - ); - } - "wildcard_denied" => { - assert_eq!( - option_element.children()[0].text().unwrap().text(), - "global_test_wildcard_denied" - ); - } - _ => {} - } - } - let role_list = childs[1].element().unwrap(); - assert_eq!(role_list.name().local_part(), "roles"); - assert_eq!(role_list.children().len(), 1); - let role = role_list.children()[0].element().unwrap(); - assert_eq!(role.name().local_part(), "role"); - assert_eq!(role.children().len(), 2); - let task = role.children()[0].element().unwrap(); - assert_eq!(task.name().local_part(), "task"); - assert_eq!(task.children().len(), 4); - let task_purpose = task.children()[0].element().unwrap(); - assert_eq!(task_purpose.name().local_part(), "purpose"); - assert_eq!(task_purpose.children().len(), 1); - assert_eq!( - task_purpose.children()[0].text().unwrap().text(), - "test_purpose" - ); - let task_command1 = task.children()[1].element().unwrap(); - assert_eq!(task_command1.name().local_part(), "command"); - assert_eq!(task_command1.children().len(), 1); - assert!(task_command1.children()[0] - .text() - .unwrap() - .text() - .starts_with("test_command")); - let task_command2 = task.children()[2].element().unwrap(); - assert_eq!(task_command2.name().local_part(), "command"); - assert_eq!(task_command2.children().len(), 1); - assert!(task_command2.children()[0] - .text() - .unwrap() - .text() - .starts_with("test_command")); - let package = read_xml_file(&crate::util::test::test_resources_file( - "test_xml_manager_case1.xml", - )) - .unwrap(); - let doc = package.as_document(); - let element = doc.root().children(); - assert_eq!(element.len(), 3); - let element = element[1].element().unwrap(); - roles_mut.save(Some(&doc), Some(&element)).unwrap(); - let childs = root.children(); - assert_eq!(childs.len(), 2); - let roles_options = childs[0].element().unwrap(); - assert_eq!(roles_options.name().local_part(), "options"); - assert_eq!(roles_options.children().len(), 6); - let role_list = childs[1].element().unwrap(); - assert_eq!(role_list.name().local_part(), "roles"); - assert_eq!(role_list.children().len(), 1); - let role = role_list.children()[0].element().unwrap(); - assert_eq!(role.name().local_part(), "role"); - assert_eq!(role.children().len(), 2); - let task = role.children()[0].element().unwrap(); - assert_eq!(task.name().local_part(), "task"); - assert_eq!(task.children().len(), 4); - let task_purpose = task.children()[0].element().unwrap(); - assert_eq!(task_purpose.name().local_part(), "purpose"); - assert_eq!(task_purpose.children().len(), 1); - assert_eq!( - task_purpose.children()[0].text().unwrap().text(), - "test_purpose" - ); - let task_command1 = task.children()[1].element().unwrap(); - assert_eq!(task_command1.name().local_part(), "command"); - assert_eq!(task_command1.children().len(), 1); - assert!(task_command1.children()[0] - .text() - .unwrap() - .text() - .starts_with("test_command")); - let task_command2 = task.children()[2].element().unwrap(); - assert_eq!(task_command2.name().local_part(), "command"); - assert_eq!(task_command2.children().len(), 1); - assert!(task_command2.children()[0] - .text() - .unwrap() - .text() - .starts_with("test_command")); - } -} diff --git a/src/config/structs.rs b/src/config/structs.rs deleted file mode 100644 index ef8d8163..00000000 --- a/src/config/structs.rs +++ /dev/null @@ -1,575 +0,0 @@ -use std::cell::RefCell; -use std::collections::HashSet; -use std::error::Error; -use std::ffi::CString; -use std::hash::{Hash, Hasher}; - -use std::rc::{Rc, Weak}; -use std::str::Split; - -use capctl::CapSet; -use chrono::Duration; -use nix::unistd::{getgrouplist, Group}; -use sxd_document::dom::{Document, Element}; - -use crate::util::capset_to_string; - -use super::options::Opt; - -#[derive(Debug, Clone, PartialEq, Eq, Default)] -pub struct Groups { - pub groups: Vec, -} - -impl Hash for Groups { - fn hash(&self, state: &mut H) { - for group in self.groups.iter() { - group.hash(state); - } - } -} - -impl FromIterator for Groups { - fn from_iter>(iter: T) -> Groups { - let mut groups = Vec::new(); - for group in iter { - groups.push(group); - } - Groups { groups } - } -} - -impl From> for Groups { - fn from(groups: Vec) -> Self { - let mut set = Vec::new(); - for group in groups { - set.push(group); - } - Groups { groups: set } - } -} - -impl From> for Groups { - fn from(groups: Split) -> Self { - let mut set = Vec::new(); - for group in groups { - set.push(group.to_string()); - } - Groups { groups: set } - } -} - -impl Groups { - pub fn join(&self, sep: &str) -> String { - self.groups.iter().fold(String::new(), |acc, s| { - if acc.is_empty() { - s.to_string() - } else { - format!("{}{}{}", acc, sep, s) - } - }) - } - fn to_hashset(&self) -> HashSet { - self.groups.clone().into_iter().collect() - } - pub fn is_subset(&self, other: &Groups) -> bool { - self.to_hashset().is_subset(&other.to_hashset()) - } - pub fn is_unix_subset(&self, other: &Vec) -> bool { - let mut remaining = self.groups.clone(); - for group in other { - if remaining.is_empty() { - return true; - } - if let Some(index) = remaining - .iter() - .position(|x| x == &group.name || x == &group.gid.to_string()) - { - remaining.remove(index); - } - } - remaining.is_empty() - } - pub fn len(&self) -> usize { - self.groups.len() - } - pub fn is_empty(&self) -> bool { - self.groups.is_empty() - } -} - -impl From for Vec { - fn from(val: Groups) -> Self { - val.groups.into_iter().collect() - } -} - -#[derive(Clone, Debug)] -pub enum IdTask { - Name(String), - Number(usize), -} - -impl IdTask { - pub fn is_name(&self) -> bool { - match self { - IdTask::Name(_) => true, - IdTask::Number(_) => false, - } - } - - pub fn as_ref(&self) -> &IdTask { - self - } - - pub fn unwrap(&self) -> String { - match self { - IdTask::Name(s) => s.to_string(), - IdTask::Number(s) => s.to_string(), - } - } -} - -impl ToString for IdTask { - fn to_string(&self) -> String { - match self { - IdTask::Name(s) => s.to_string(), - IdTask::Number(n) => format!("Task #{}", n), - } - } -} - -impl From for IdTask { - fn from(s: String) -> Self { - IdTask::Name(s) - } -} - -impl From for String { - fn from(val: IdTask) -> Self { - match val { - IdTask::Name(s) => s, - IdTask::Number(n) => n.to_string(), - } - } -} - -impl PartialEq for IdTask { - fn eq(&self, other: &Self) -> bool { - match (self, other) { - (IdTask::Name(a), IdTask::Name(b)) => a == b, - (IdTask::Number(a), IdTask::Number(b)) => a == b, - _ => false, - } - } -} - -#[derive(Clone, Debug)] -pub struct Task<'a> { - role: Weak>>, - pub id: IdTask, - pub options: Option>>, - pub commands: Vec, - pub capabilities: Option, - pub setuid: Option, - pub setgid: Option, - pub setgroups: Option, - pub purpose: Option, -} - -#[derive(Debug, Clone)] -pub struct Role<'a> { - roles: Option>>>, - ssd: Option>>>, - denied_caps: Option, - pub parents: Option>>>>, - pub name: String, - pub users: Vec, - pub groups: Vec, - pub tasks: Vec>>>, - pub options: Option>>, -} - -#[derive(Debug, Clone)] -pub struct CookieConstraint { - pub offset: Duration, - pub timestamptype: String, - pub max_usage: Option, -} - -#[derive(Debug, Clone)] -pub struct Config<'a> { - pub config: Option>>>, - pub roles: Vec>>>, - pub options: Option>>, - pub version: String, - pub timestamp: CookieConstraint, - pub migrated: bool, -} - -impl Default for CookieConstraint { - fn default() -> Self { - CookieConstraint { - offset: Duration::seconds(0), - timestamptype: "tty".to_string(), - max_usage: None, - } - } -} - -impl<'a> Config<'a> { - pub fn new(version: &str) -> Rc>> { - Rc::new( - Config { - config: None, - roles: Vec::new(), - options: None, - version: version.to_string(), - timestamp: CookieConstraint::default(), - migrated: false, - } - .into(), - ) - } - - pub fn get_role(&self, name: &str) -> Option>>> { - for r in self.roles.iter() { - if r.as_ref().borrow().name == name { - return Some(r.clone()); - } - } - None - } - - pub fn get_roles_names(&self) -> HashSet { - let mut set = HashSet::new(); - for r in self.roles.iter() { - set.insert(r.as_ref().borrow().name.to_string()); - } - set - } -} - -impl<'a> Role<'a> { - pub fn new(name: String, roles: Option>>>) -> Rc>> { - Rc::new( - Role { - roles, - name, - users: Vec::new(), - groups: Vec::new(), - tasks: Vec::new(), - options: None, - parents: None, - ssd: None, - denied_caps: None, - } - .into(), - ) - } - pub fn in_config(&self) -> bool { - self.roles.is_some() - } - pub fn get_config(&self) -> Option>>> { - if let Some(roles) = &self.roles { - return roles.upgrade(); - } - None - } - pub fn get_task_from_index(&self, index: &usize) -> Option>>> { - if self.tasks.len() > *index { - return Some(self.tasks[*index].clone()); - } - None - } - pub fn get_users_info(&self) -> String { - let mut users_info = String::new(); - users_info.push_str(&format!("Users:\n({})\n", self.users.to_vec().join(", "))); - users_info - } - pub fn get_groups_info(&self) -> String { - let mut groups_info = String::new(); - groups_info.push_str(&format!( - "Groups:\n({})\n", - self.groups - .iter() - .cloned() - .map(|x| x.join(" & ")) - .collect::>() - .join(")\n(") - )); - groups_info - } - pub fn get_tasks_info(&self) -> String { - let mut tasks_info = String::new(); - tasks_info.push_str(&format!( - "Tasks:\n{}\n", - self.tasks - .iter() - .cloned() - .map(|x| x.as_ref().borrow().id.to_string()) - .collect::>() - .join("\n") - )); - tasks_info - } - pub fn get_options_info(&self) -> String { - let mut options_info = String::new(); - if let Some(o) = &self.options { - options_info.push_str(&format!( - "Options:\n{}", - o.as_ref().borrow().get_description() - )); - } - options_info - } - - pub fn get_description(&self) -> String { - let mut description = String::new(); - description.push_str(&self.get_users_info()); - description.push_str(&self.get_groups_info()); - description.push_str(&self.get_tasks_info()); - description.push_str(&self.get_options_info()); - description - } - - pub fn remove_task(&mut self, id: IdTask) { - self.tasks.retain(|x| x.as_ref().borrow().id != id); - } - - pub fn groups_are_forbidden(&self, groups: &Vec) -> bool { - return match self.ssd.as_ref() { - Some(roles) => { - let mut vgroups = Vec::new(); - for group in groups { - match nix::unistd::Group::from_name(group) { - Ok(Some(nixgroup)) => { - vgroups.push(nixgroup); - } - _ => (), - }; - } - for role in roles.iter() { - if let Some(role) = role.upgrade() { - if role - .groups - .iter() - .any(|group| group.is_unix_subset(&vgroups)) - { - return true; - } - } - } - false - } - None => false, - }; - } - - pub fn user_is_forbidden(&self, user: &str) -> bool { - return match self.ssd.as_ref() { - Some(roles) => match nix::unistd::User::from_name(user) { - Ok(Some(nixuser)) => { - let mut groups_to_check = Vec::new(); - if let Ok(groups) = getgrouplist( - CString::new(nixuser.name.as_str()).unwrap().as_c_str(), - nixuser.gid, - ) { - for group in groups.iter() { - let group = nix::unistd::Group::from_gid(group.to_owned()); - if let Ok(Some(group)) = group { - groups_to_check.push(group); - } - } - } - for role in roles.iter() { - if let Some(role) = role.upgrade() { - if role.users.contains(&nixuser.name) - || role.users.contains(&nixuser.uid.to_string()) - || role - .groups - .iter() - .any(|group| group.is_unix_subset(&groups_to_check)) - { - return true; - } - } - } - false - } - Ok(None) => false, - Err(_) => false, - }, - None => false, - }; - } - - pub fn capabilities_are_denied(&self, caps: CapSet) -> bool { - !self.denied_capabilities().intersection(caps).is_empty() - } - - pub fn denied_capabilities(&self) -> CapSet { - let mut denied_caps = if self.denied_caps.is_some() { - self.denied_caps.as_ref().unwrap().clone() - } else { - CapSet::empty() - }; - if let Some(parents) = &self.parents { - for parent in parents.iter() { - if let Some(parent) = parent.upgrade() { - if let Some(denied) = &parent.as_ref().borrow().denied_caps { - denied_caps = denied_caps.union(*denied); - } - } - } - } - denied_caps - } -} - -impl<'a> Task<'a> { - pub fn new(id: IdTask, role: Weak>>) -> Rc>> { - Rc::new( - Task { - role, - id, - options: None, - commands: Vec::new(), - capabilities: None, - setuid: None, - setgid: None, - setgroups: None, - purpose: None, - } - .into(), - ) - } - pub fn get_role(&self) -> Option>>> { - self.role.upgrade() - } - - pub fn get_description(&self) -> String { - let mut description = String::new(); - - if let Some(p) = &self.purpose { - description.push_str(&format!("Purpose :\n{}\n", p)); - } - - if let Some(caps) = &self.capabilities { - description.push_str(&format!("Capabilities:\n({})\n", capset_to_string(caps))); - } - if let Some(setuid) = &self.setuid { - description.push_str(&format!("Setuid:\n({})\n", setuid)); - } - if let Some(setgid) = &self.setgid { - description.push_str(&format!("Setgid:\n({})\n", setgid.join(" & "))); - } - - if let Some(options) = &self.options { - description.push_str(&format!( - "Options:\n({})\n", - options.as_ref().borrow().get_description() - )); - } - - description.push_str(&format!( - "Commands:\n{}\n", - self.commands - .iter() - .map(|s| { - if s.len() < 64 { - s.to_string() - } else { - let mut s = s.to_string().chars().take(64).collect::(); - s.push_str("..."); - s - } - }) - .fold(String::new(), |acc, x| acc + &format!("{}\n", x)) - )); - description - } -} - -pub trait Save { - fn save( - &self, - doc: Option<&Document>, - element: Option<&Element>, - ) -> Result>; -} - -#[cfg(test)] -mod tests { - use test_log::test; - - use capctl::Cap; - - use super::super::{capset_to_string, options::Level}; - - use super::*; - - #[test] - fn test_get_empty_description() { - let binding = "test_role".to_string(); - let role = Role::new(binding, None); - assert_eq!( - role.as_ref().borrow().get_description(), - "Users:\n()\nGroups:\n()\nTasks:\n\n" - ); - let task = Task::new(IdTask::Number(0), Rc::downgrade(&role)); - assert_eq!(task.as_ref().borrow().get_description(), "Commands:\n\n"); - } - - #[test] - fn test_get_description() { - let binding = "test_role".to_string(); - let role = Role::new(binding, None); - let task = Task::new(IdTask::Number(0), Rc::downgrade(&role)); - task.as_ref().borrow_mut().commands.push("ls".to_string()); - task.as_ref() - .borrow_mut() - .commands - .push("another".to_string()); - task.as_ref().borrow_mut().purpose = Some("thepurpose".to_string()); - task.as_ref().borrow_mut().setuid = Some("thesetuid".to_string()); - task.as_ref().borrow_mut().setgid = - Some(vec!["thesetgid".to_string(), "thesecondsetgid".to_string()].into()); - let mut caps = CapSet::empty(); - caps.add(Cap::DAC_READ_SEARCH); - task.as_ref().borrow_mut().capabilities = Some(caps.clone()); - let mut opt = Opt::new(Level::Task); - opt.path = Some("thepath".to_string()); - opt.disable_bounding = Some(false); - opt.allow_root = Some(true); - opt.wildcard_denied = Some("thewildcard-denied".to_string()); - opt.env_checklist = Some("thechecklist".to_string()); - opt.env_whitelist = Some("thewhitelist".to_string()); - task.as_ref().borrow_mut().options = Some(Rc::new(RefCell::new(opt))); - let desc = task.as_ref().borrow().get_description(); - println!("{}", desc); - assert!(desc.contains("ls\nanother\n")); - assert!(desc.contains("thepurpose")); - assert!(desc.contains("thesetuid")); - assert!(desc.contains("thesetgid")); - assert!(desc.contains("thesecondsetgid")); - assert!(desc.contains(&capset_to_string(&caps))); - assert!(desc.contains("Options")); - assert!(desc.contains("thepath")); - assert!(desc.contains("thewildcard-denied")); - assert!(desc.contains("thechecklist")); - assert!(desc.contains("thewhitelist")); - assert!(desc.contains("No root: true")); - assert!(desc.contains("Bounding: false")); - } - - #[test] - fn test_idtask() { - let id = IdTask::Number(0); - assert_eq!(id.to_string(), "Task #0"); - let id = IdTask::Name("test".to_string()); - assert_eq!(id.to_string(), "test"); - let id: IdTask = "test".to_string().into(); - assert_eq!(Into::::into(id), "test"); - } -} diff --git a/src/config/version.rs b/src/config/version.rs deleted file mode 100644 index 01100984..00000000 --- a/src/config/version.rs +++ /dev/null @@ -1,354 +0,0 @@ -use std::error::Error; - -use crate::xml_version::PACKAGE_VERSION; -/// This allows to upgrade or downgrade the database schema. -/// The version is stored in the database and compared to the compiled version. -use semver::Version; -use sxd_document::dom::{Document, Element}; -use tracing::debug; - -use super::{do_in_main_child, do_in_main_element, foreach_inner_elements_names}; - -struct Migration { - from: fn() -> Version, - to: fn() -> Version, - up: fn(&Self, &Document) -> Result<(), Box>, - down: fn(&Self, &Document) -> Result<(), Box>, -} - -#[derive(PartialEq, Eq, Debug)] -enum ChangeResult { - UpgradeDirect, - DowngradeDirect, - UpgradeIndirect, - DowngradeIndirect, - None, -} - -impl Migration { - fn from(&self) -> Version { - (self.from)() - } - fn to(&self) -> Version { - (self.to)() - } - fn change( - &self, - doc: &Document, - from: &Version, - to: &Version, - ) -> Result> { - debug!("Checking migration from {} to {} :", self.from(), self.to()); - debug!( - " -\tself.from() == *from -> {}\tself.from() == *to -> {} -\tself.to() == *to -> {}\tself.to() == *from -> {} -\t*from < *to -> {}\tself.to() < *to -> {}\tself.to() > *from -> {} -\t*from > *to -> {}\tself.from() < *to -> {}\tself.from() > *from -> {}", - self.from() == *from, - self.to() == *from, - self.to() == *to, - self.to() == *from, - *from < *to, - self.to() < *to, - self.to() > *from, - *from > *to, - self.from() < *to, - self.from() > *from - ); - if self.from() == *from && self.to() == *to { - debug!("Direct Upgrading from {} to {}", self.from(), self.to()); - (self.up)(self, doc)?; - Ok(ChangeResult::UpgradeDirect) - } else if self.to() == *from && self.from() == *to { - debug!("Direct Downgrading from {} to {}", self.to(), self.from()); - (self.down)(self, doc)?; - Ok(ChangeResult::DowngradeDirect) - } else if *from < *to && self.from() == *from && self.to() < *to && self.to() > *from { - debug!("Step Upgrading from {} to {}", self.from(), self.to()); - // 1.0.0 -> 2.0.0 -> 3.0.0 - (self.up)(self, doc)?; - Ok(ChangeResult::UpgradeIndirect) - } else if *from > *to && self.to() == *from && self.from() > *to && self.from() < *from { - debug!("Step Downgrading from {} to {}", self.to(), self.from()); - // 3.0.0 -> 2.0.0 -> 1.0.0 - (self.down)(self, doc)?; - Ok(ChangeResult::DowngradeIndirect) - } else { - Ok(ChangeResult::None) - } - } -} - -fn _migrate(from: &Version, to: &Version, doc: &Document) -> Result> { - let mut from = from.clone(); - let to = to.clone(); - debug!("===== Migrating from {} to {} =====", from, to); - if from != to { - let mut migrated = ChangeResult::UpgradeIndirect; - while migrated == ChangeResult::UpgradeIndirect - || migrated == ChangeResult::DowngradeIndirect - { - for migration in MIGRATIONS { - match migration.change(doc, &from, &to)? { - ChangeResult::UpgradeDirect | ChangeResult::DowngradeDirect => { - return Ok(true); - } - ChangeResult::UpgradeIndirect => { - from = migration.to(); - migrated = ChangeResult::UpgradeIndirect; - break; - } - ChangeResult::DowngradeIndirect => { - from = migration.from(); - migrated = ChangeResult::DowngradeIndirect; - break; - } - ChangeResult::None => { - migrated = ChangeResult::None; - } - } - } - if migrated == ChangeResult::None { - return Err(format!("No migration from {} to {} found", from, to).into()); - } - } - } - Ok(false) -} - -/// Migrate the database schema to the current version. -/// If the version is already the current version, nothing is done. -/// If the version is older, the database is upgraded. -/// If the version is newer, the database is downgraded. -pub(crate) fn migrate(version: &str, doc: &Document) -> Result> { - _migrate( - &Version::parse(version).unwrap(), - &Version::parse(PACKAGE_VERSION).unwrap(), - doc, - ) -} - -fn set_to_version(element: &Element, to: &Version) { - element.set_attribute_value("version", to.to_string().as_str()); -} - -fn set_to_version_from_doc(doc: &Document, to: &Version) -> Result<(), Box> { - do_in_main_child(doc, "rootasrole", |main| { - if let Some(mainelement) = main.element() { - set_to_version(&mainelement, to); - } - Ok(()) - }) -} - -const MIGRATIONS: &[Migration] = &[ - Migration { - from: || "3.0.0-alpha.2".parse().unwrap(), - to: || "3.0.0-alpha.3".parse().unwrap(), - /// Upgrade from 3.0.0-alpha.2 to 3.0.0-alpha.3 - /// The version attribute is set to 3.0.0-alpha.3 - up: |m, doc| { - do_in_main_element(doc, "rootasrole", |main| { - set_to_version(&main, &m.to()); - foreach_inner_elements_names( - &main, - &mut vec!["roles", "role", "task", "command"], - |cmdelement| { - cmdelement.remove_attribute("regex"); - Ok(()) - }, - )?; - Ok(()) - })?; - Ok(()) - }, - /// Downgrade from 3.0.0-alpha.3 to 3.0.0-alpha.2 - /// The timestamp-timeout attribute is removed from the root element. - /// The version attribute is set to 3.0.0-alpha.2 - /// The parents, denied-capabilities and incompatible-with attributes are removed from the role element. - down: |s: &Migration, doc| { - do_in_main_element(doc, "rootasrole", |main| { - set_to_version(&main, &s.from()); - if let Some(a) = main.attribute("timestamp-timeout") { - a.remove_from_parent(); - } - return foreach_inner_elements_names(&main, &mut vec!["roles", "role"], |role| { - if let Some(a) = role.attribute("parents") { - a.remove_from_parent(); - } - if let Some(a) = role.attribute("denied-capabilities") { - a.remove_from_parent(); - } - if let Some(a) = role.attribute("incompatible-with") { - a.remove_from_parent(); - } - Ok(()) - }); - })?; - Ok(()) - }, - }, - Migration { - from: || "3.0.0-alpha.1".parse().unwrap(), - to: || "3.0.0-alpha.2".parse().unwrap(), - up: |m, doc| set_to_version_from_doc(doc, &m.to()), - down: |s, doc| set_to_version_from_doc(doc, &s.from()), - }, -]; - -#[cfg(test)] -mod tests { - - use super::*; - use crate::{ - config::{ - self, - load::{load_config, load_config_from_doc}, - save::save_config, - }, - util, - }; - use test_log::test; - - #[test] - fn test_migrate() { - let pkg = config::load::load_document( - &util::test::test_resources_file("test_migrate-3.0.0-alpha.1.xml"), - true, - ) - .expect("Failed to load config"); - let doc = pkg.as_document(); - let v1 = &Version::parse("3.0.0-alpha.1").unwrap(); - let v2 = &Version::parse("3.0.0-alpha.2").unwrap(); - let v3 = &Version::parse("3.0.0-alpha.3").unwrap(); - - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v1.to_string().as_str() - ); - Ok(()) - }) - .expect("Failed to get rootasrole element"); - - //this migration should remove regex attribute on command element - assert_eq!( - _migrate(v1, v2, &doc).expect(format!("Failed to migrate to {}", v3).as_str()), - true - ); - - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v2.to_string().as_str() - ); - Ok(()) - }) - .expect("Failed to get rootasrole element"); - - //this migration should remove regex attribute on command element - assert_eq!( - _migrate(v2, v3, &doc).expect(format!("Failed to migrate to {}", v3).as_str()), - true - ); - - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v3.to_string().as_str() - ); - foreach_inner_elements_names( - &main, - &mut vec!["roles", "role", "task", "command"], - |cmdelement| { - assert_eq!(cmdelement.attribute("regex"), None); - Ok(()) - }, - )?; - Ok(()) - }) - .expect("Failed to get rootasrole element"); - - //this migration should do nothing - assert_eq!( - _migrate(v3, v2, &doc).expect(format!("Failed to migrate to {}", v3).as_str()), - true - ); - - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v2.to_string().as_str() - ); - Ok(()) - }) - .expect("Failed to get rootasrole element"); - - //this migration should do nothing - assert_eq!( - _migrate(v2, v3, &doc).expect(format!("Failed to migrate to {}", v3).as_str()), - true - ); - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v3.to_string().as_str() - ); - Ok(()) - }) - .expect("Failed to get rootasrole element"); - - //we add v3 features on document - do_in_main_child(&doc, "rootasrole", |element| { - let element = element.element().unwrap(); - element.set_attribute_value("timestamp-timeout", "10"); - return foreach_inner_elements_names(&element, &mut vec!["roles", "role"], |role| { - role.set_attribute_value("parents", "role1"); - role.set_attribute_value("denied-capabilities", "CAP_CHOWN"); - role.set_attribute_value("incompatible-with", "role2"); - Ok(()) - }); - }) - .expect("Failed to add v3 features on document"); - assert_eq!( - _migrate(v3, v1, &doc).expect(format!("Failed to migrate to {}", v2).as_str()), - true - ); - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v1.to_string().as_str() - ); - assert_eq!(main.attribute("timestamp-timeout"), None); - foreach_inner_elements_names(&main, &mut vec!["roles", "role"], |role| { - assert_eq!(role.attribute("parents"), None); - assert_eq!(role.attribute("denied-capabilities"), None); - assert_eq!(role.attribute("incompatible-with"), None); - Ok(()) - })?; - Ok(()) - }) - .expect("Failed to get rootasrole element"); - assert_eq!( - _migrate(v1, v3, &doc).expect(format!("Failed to migrate to {}", v3).as_str()), - true - ); - do_in_main_element(&doc, "rootasrole", |main| { - assert_eq!( - main.attribute("version").unwrap().value(), - v3.to_string().as_str() - ); - Ok(()) - }) - .expect("Failed to get rootasrole element"); - let config = load_config_from_doc(&doc, false).expect("Failed to load config"); - save_config("/tmp/migrate_config.xml", &config.as_ref().borrow(), false) - .expect("Failed to save config"); - let config = load_config(&"/tmp/migrate_config.xml").expect("Failed to load config"); - assert_eq!( - config.as_ref().borrow().version.parse::().unwrap(), - *v3 - ); - } -} diff --git a/src/database/migration.rs b/src/database/migration.rs new file mode 100644 index 00000000..d14d3989 --- /dev/null +++ b/src/database/migration.rs @@ -0,0 +1,130 @@ +use std::error::Error; + +use semver::Version; +use tracing::debug; + +use crate::common::version::PACKAGE_VERSION; + + +pub struct Migration { + pub from: fn() -> Version, + pub to: fn() -> Version, + pub up: fn(&Self, &mut T) -> Result<(), Box>, + pub down: fn(&Self, &mut T) -> Result<(), Box>, +} + +#[derive(PartialEq, Eq, Debug)] +pub enum ChangeResult { + UpgradeDirect, + DowngradeDirect, + UpgradeIndirect, + DowngradeIndirect, + None, +} + +impl Migration { + pub fn from(&self) -> Version { + (self.from)() + } + pub fn to(&self) -> Version { + (self.to)() + } + pub fn change( + &self, + doc: &mut T, + from: &Version, + to: &Version, + ) -> Result> { + debug!("Checking migration from {} to {} :", self.from(), self.to()); + debug!( + " +\tself.from() == *from -> {}\tself.from() == *to -> {} +\tself.to() == *to -> {}\tself.to() == *from -> {} +\t*from < *to -> {}\tself.to() < *to -> {}\tself.to() > *from -> {} +\t*from > *to -> {}\tself.from() < *to -> {}\tself.from() > *from -> {}", + self.from() == *from, + self.to() == *from, + self.to() == *to, + self.to() == *from, + *from < *to, + self.to() < *to, + self.to() > *from, + *from > *to, + self.from() < *to, + self.from() > *from + ); + if self.from() == *from && self.to() == *to { + debug!("Direct Upgrading from {} to {}", self.from(), self.to()); + (self.up)(self, doc)?; + Ok(ChangeResult::UpgradeDirect) + } else if self.to() == *from && self.from() == *to { + debug!("Direct Downgrading from {} to {}", self.to(), self.from()); + (self.down)(self, doc)?; + Ok(ChangeResult::DowngradeDirect) + } else if *from < *to && self.from() == *from && self.to() < *to && self.to() > *from { + debug!("Step Upgrading from {} to {}", self.from(), self.to()); + // 1.0.0 -> 2.0.0 -> 3.0.0 + (self.up)(self, doc)?; + Ok(ChangeResult::UpgradeIndirect) + } else if *from > *to && self.to() == *from && self.from() > *to && self.from() < *from { + debug!("Step Downgrading from {} to {}", self.to(), self.from()); + // 3.0.0 -> 2.0.0 -> 1.0.0 + (self.down)(self, doc)?; + Ok(ChangeResult::DowngradeIndirect) + } else { + Ok(ChangeResult::None) + } + } + + pub fn migrate_from(from: &Version, to: &Version, doc: &mut T, migrations : &[Self]) -> Result> { + let mut from = from.clone(); + let to = to.clone(); + debug!("===== Migrating from {} to {} =====", from, to); + if from != to { + let mut migrated = ChangeResult::UpgradeIndirect; + while migrated == ChangeResult::UpgradeIndirect + || migrated == ChangeResult::DowngradeIndirect + { + for migration in migrations { + match migration.change(doc, &from, &to)? { + ChangeResult::UpgradeDirect | ChangeResult::DowngradeDirect => { + return Ok(true); + } + ChangeResult::UpgradeIndirect => { + from = migration.to(); + migrated = ChangeResult::UpgradeIndirect; + break; + } + ChangeResult::DowngradeIndirect => { + from = migration.from(); + migrated = ChangeResult::DowngradeIndirect; + break; + } + ChangeResult::None => { + migrated = ChangeResult::None; + } + } + } + if migrated == ChangeResult::None { + return Err(format!("No migration from {} to {} found", from, to).into()); + } + } + } + Ok(false) + } + + /// Migrate the database schema to the current version. + /// If the version is already the current version, nothing is done. + /// If the version is older, the database is upgraded. + /// If the version is newer, the database is downgraded. + pub fn migrate(version: &Version, doc: &mut T, migrations : &[Self]) -> Result> + where + { + Self::migrate_from( + &version, + &Version::parse(PACKAGE_VERSION).unwrap(), + doc, + migrations, + ) + } +} \ No newline at end of file diff --git a/src/database/mod.rs b/src/database/mod.rs new file mode 100644 index 00000000..d432e84c --- /dev/null +++ b/src/database/mod.rs @@ -0,0 +1,77 @@ + + +use chrono::Duration; +use linked_hash_set::LinkedHashSet; +use serde::{de, Deserialize, Serialize}; +use self::options::EnvKey; + +mod migration; +pub mod structs; +mod version; +pub mod options; +pub mod wrapper; + +// deserialize the linked hash set +fn lhs_deserialize_envkey<'de, D>(deserializer: D) -> Result, D::Error> +where + D: de::Deserializer<'de>, +{ + let v: Vec = Vec::deserialize(deserializer)?; + Ok(v.into_iter().collect()) +} + +// serialize the linked hash set +fn lhs_serialize_envkey(value: &LinkedHashSet, serializer: S) -> Result +where + S: serde::Serializer, +{ + let v: Vec = value.iter().cloned().collect(); + v.serialize(serializer) +} + +// deserialize the linked hash set +fn lhs_deserialize<'de, D>(deserializer: D) -> Result, D::Error> +where + D: de::Deserializer<'de>, +{ + let v: Vec = Vec::deserialize(deserializer)?; + Ok(v.into_iter().collect()) +} + +// serialize the linked hash set +fn lhs_serialize(value: &LinkedHashSet, serializer: S) -> Result +where + S: serde::Serializer, +{ + let v: Vec = value.iter().cloned().collect(); + v.serialize(serializer) +} + +fn is_default(t: &T) -> bool { + t == &T::default() +} + +fn serialize_duration(value: &Duration, serializer: S) -> Result +where + S: serde::Serializer, +{ + // hh:mm:ss format + serializer.serialize_str(&format!("{}:{}:{}", value.num_hours(), value.num_minutes() % 60, value.num_seconds() % 60)) + +} + +fn deserialize_duration<'de, D>(deserializer: D) -> Result +where + D: de::Deserializer<'de>, +{ + let s = String::deserialize(deserializer)?; + let mut parts = s.split(':'); + //unwrap or error + if let (Some(hours), Some(minutes), Some(seconds)) = (parts.next(), parts.next(), parts.next()) { + let hours: i64 = hours.parse().map_err(de::Error::custom)?; + let minutes: i64 = minutes.parse().map_err(de::Error::custom)?; + let seconds: i64 = seconds.parse().map_err(de::Error::custom)?; + return Ok(Duration::hours(hours) + Duration::minutes(minutes) + Duration::seconds(seconds)) + } + Err(de::Error::custom("Invalid duration format")) +} \ No newline at end of file diff --git a/src/database/options.rs b/src/database/options.rs new file mode 100644 index 00000000..b94aa2a8 --- /dev/null +++ b/src/database/options.rs @@ -0,0 +1,922 @@ +use std::{ + borrow::Borrow, cell::RefCell, path::PathBuf, rc::Rc +}; + +use linked_hash_set::LinkedHashSet; +use pcre2::bytes::Regex; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::{Map, Value}; +use strum::{Display, EnumIs, FromRepr}; +use tracing::debug; + +use crate::rc_refcell; + +use super::is_default; + +use super::{ + lhs_deserialize, lhs_deserialize_envkey, lhs_serialize, lhs_serialize_envkey, + structs::{SConfig, SRole, STask}, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Level { + None, + Default, + Global, + Role, + Task, +} + + +#[derive(Debug, Clone, Copy, FromRepr)] +pub enum OptType { + Path, + Env, + Root, + Bounding, + Wildcard, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs, Display, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum PathBehavior { + Delete, + KeepSafe, + KeepUnsafe, + Inherit, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)] +pub struct SPathOptions { + #[serde(rename = "default", default, skip_serializing_if = "is_default")] + pub default_behavior: PathBehavior, + #[serde( + default, + skip_serializing_if = "LinkedHashSet::is_empty", + deserialize_with = "lhs_deserialize", + serialize_with = "lhs_serialize" + )] + pub add: LinkedHashSet, + #[serde( + default, + skip_serializing_if = "LinkedHashSet::is_empty", + deserialize_with = "lhs_deserialize", + serialize_with = "lhs_serialize" + )] + pub sub: LinkedHashSet, + #[serde(default)] + #[serde(flatten)] + pub _extra_fields: Map, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs, Display, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum EnvBehavior { + Delete, + Keep, + Inherit, +} + +#[derive(Serialize, Hash, Deserialize, PartialEq, Eq, Debug, EnumIs, Clone)] +enum EnvKeyType { + Wildcarded, + Normal, +} + +#[derive(Eq, Hash, PartialEq, Serialize, Debug, Clone)] +pub struct EnvKey { + env_type: EnvKeyType, + value: String, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +pub struct SEnvOptions { + #[serde(rename = "default", default, skip_serializing_if = "is_default")] + pub default_behavior: EnvBehavior, + #[serde( + default, + skip_serializing_if = "LinkedHashSet::is_empty", + deserialize_with = "lhs_deserialize_envkey", + serialize_with = "lhs_serialize_envkey" + )] + pub keep: LinkedHashSet, + #[serde( + default, + skip_serializing_if = "LinkedHashSet::is_empty", + deserialize_with = "lhs_deserialize_envkey", + serialize_with = "lhs_serialize_envkey" + )] + pub check: LinkedHashSet, + #[serde( + default, + skip_serializing_if = "LinkedHashSet::is_empty", + deserialize_with = "lhs_deserialize_envkey", + serialize_with = "lhs_serialize_envkey" + )] + pub delete: LinkedHashSet, + #[serde(default, flatten)] + pub _extra_fields: Map, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs, Display, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum SBounding { + Strict, + Ignore, + Inherit, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs, Display, Clone, Copy)] +#[serde(rename_all = "kebab-case")] +pub enum SPrivileged { + Privileged, + User, + Inherit, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[serde(rename_all = "kebab-case")] +pub struct Opt { + #[serde(skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub env: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub root: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub bounding: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub wildcard_denied: Option, + #[serde(default)] + #[serde(flatten)] + pub _extra_fields: Map, + #[serde(skip)] + pub level: Level, +} + + +impl Default for Level { + fn default() -> Self { + Level::Default + } +} + +impl Default for EnvBehavior { + fn default() -> Self { + EnvBehavior::Inherit + } +} + +impl Default for SBounding { + fn default() -> Self { + SBounding::Inherit + } +} + +impl Default for SPrivileged { + fn default() -> Self { + SPrivileged::User + } +} + +impl Default for PathBehavior { + fn default() -> Self { + PathBehavior::Inherit + } +} + +impl Opt { + pub fn new(level: Level) -> Self { + let mut opt = Self::default(); + opt.level = level; + opt + } +} + + + +impl Default for Opt { + fn default() -> Self { + Opt { + path: Some(SPathOptions::default()), + env: Some(SEnvOptions::default()), + root: Some(SPrivileged::default()), + bounding: Some(SBounding::default()), + wildcard_denied: Some(";&|".to_string()), + _extra_fields: Map::default(), + level: Level::Default, + } + } +} + +impl Default for SPathOptions { + fn default() -> Self { + SPathOptions { + default_behavior: PathBehavior::Inherit, + add: LinkedHashSet::new(), + sub: LinkedHashSet::new(), + _extra_fields: Map::default(), + } + } +} + +impl EnvKey { + pub fn new(s: String) -> Result { + if Regex::new("^[a-zA-Z_]+[a-zA-Z0-9_]*$") // check if it is a valid env name + .unwrap() + .is_match(s.as_bytes()) + .is_ok_and(|m| m) + { + Ok(EnvKey { + env_type: EnvKeyType::Normal, + value: s, + }) + } else if Regex::new("^[a-zA-Z_*?]+[a-zA-Z0-9_*?]*$") // check if it is a valid env name + .unwrap() + .is_match(s.as_bytes()) + .is_ok_and(|m| m) + { + Ok(EnvKey { + env_type: EnvKeyType::Wildcarded, + value: s, + }) + } else { + Err(format!("Invalid env key {}, must start with letter or underscore following by letters, numbers or underscores. Wildcard accepts only '?' and '*'", s)) + } + } +} + +impl PartialEq for EnvKey { + fn eq(&self, other: &str) -> bool { + self.value == *other + } +} + +impl Into for EnvKey { + fn into(self) -> String { + self.value + } +} + +impl From for EnvKey { + fn from(s: String) -> Self { + EnvKey::new(s).expect("Invalid env key") + } +} + +impl From<&str> for EnvKey { + fn from(s: &str) -> Self { + EnvKey::new(s.into()).expect("Invalid env key") + } +} + +impl<'de> Deserialize<'de> for EnvKey { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + EnvKey::new(s).map_err(serde::de::Error::custom) + } +} + +impl SPathOptions { + fn new(behavior : PathBehavior ) -> Self { + let mut res = SPathOptions::default(); + res.default_behavior = behavior; + res + } + pub fn get_description(&self) -> String { + let mut description = String::new(); + description.push_str(format!("Default behavior: {}\n", self.default_behavior).as_str()); + if !self.add.is_empty() { + description.push_str("Add:\n"); + for s in self.add.iter() { + description.push_str(format!("{}\n", s).as_str()); + } + } + if !self.sub.is_empty() { + description.push_str("Sub:\n"); + for s in self.sub.iter() { + description.push_str(format!("{}\n", s).as_str()); + } + } + description + } + +} + +impl Default for SEnvOptions { + fn default() -> Self { + SEnvOptions { + default_behavior: EnvBehavior::default(), + keep: LinkedHashSet::new(), + check: LinkedHashSet::new(), + delete: LinkedHashSet::new(), + _extra_fields: Map::default(), + } + } +} + +impl SEnvOptions { + pub fn new(behavior: EnvBehavior) -> Self { + let mut res = SEnvOptions::default(); + res.default_behavior = behavior; + res + } + pub fn get_description(&self) -> String { + let mut description = String::new(); + description.push_str(format!("Default behavior: {}\n", self.default_behavior).as_str()); + if !self.keep.is_empty() { + description.push_str("Keep:\n"); + for s in self.keep.iter() { + description.push_str(format!("{}\n", s.value).as_str()); + } + } + if !self.check.is_empty() { + description.push_str("Check:\n"); + for s in self.check.iter() { + description.push_str(format!("{}\n", s.value).as_str()); + } + } + if !self.delete.is_empty() { + description.push_str("Delete:\n"); + for s in self.delete.iter() { + description.push_str(format!("{}\n", s.value).as_str()); + } + } + description + } +} + +impl Opt { + pub fn get_description(&self) -> String { + let mut description = String::new(); + if let Some(path) = &self.path { + description.push_str(format!("{}\n", path.get_description()).as_str()); + } + if let Some(env) = &self.env { + description.push_str(format!("{}\n", env.get_description()).as_str()); + } + if let Some(no_root) = &self.root { + description.push_str(format!("Root type: {}\n", no_root).as_str()); + } + if let Some(bounding) = &self.bounding { + description.push_str(format!("Bounding enforcement: {}\n", bounding).as_str()); + } + description + } +} + +trait EnvSet { + fn env_matches(&self, wildcarded: &EnvKey) -> bool; +} + +impl EnvSet for LinkedHashSet { + fn env_matches(&self, wildcarded: &EnvKey) -> bool { + match wildcarded.env_type { + EnvKeyType::Normal => self.contains(wildcarded), + EnvKeyType::Wildcarded => { + self.iter().any(|s| { + Regex::new(&format!( + "^{}$", + wildcarded.value.replace("*", ".*").replace("?", ".") + )) // convert to regex + .unwrap() + .is_match(s.value.as_bytes()) + .is_ok_and(|m| m) + }) + } + } + } +} + +#[derive(Debug, Clone)] +pub struct OptStack { + pub(crate) stack: [Option>>; 5], + roles: Rc>, + role: Option>>, + task: Option>>, +} + +impl OptStack { + pub fn from_task(task: Rc>) -> Self { + let mut stack = + OptStack::from_role(task.as_ref().borrow()._role.as_ref().unwrap().upgrade().unwrap()); + stack.task = Some(task.to_owned()); + stack.set_opt(Level::Task, task.as_ref().borrow().options.to_owned()); + stack + } + pub fn from_role(role: Rc>) -> Self { + let mut stack = + OptStack::from_roles(role.as_ref().borrow()._config.as_ref().unwrap().upgrade().unwrap()); + stack.role = Some(role.to_owned()); + stack.set_opt(Level::Role, role.as_ref().borrow().options.to_owned()); + stack + } + pub fn from_roles(roles: Rc>) -> Self { + let mut stack = OptStack::new(roles); + stack.set_opt( + Level::Global, + stack.get_roles().as_ref().borrow().options.to_owned(), + ); + stack + } + + fn new(roles: Rc>) -> OptStack { + let mut opt = Opt::default(); + opt.level = Level::Global; + opt.root = Some(SPrivileged::User); + opt.bounding = Some(SBounding::Strict); + let mut env = SEnvOptions::new(EnvBehavior::Delete); + env.check = + vec!["TZ".into(), "LOGNAME".into(), "LOGIN".into(), "USER".into()] + .iter() + .cloned() + .collect(); + opt.env = Some(env); + opt.path.as_mut().unwrap().default_behavior = PathBehavior::Delete; + OptStack { + stack: [ + None, + Some(Rc::new(opt.into()) + , + ), + None, + None, + None, + ], + roles, + role: None, + task: None, + } + } + + fn get_roles(&self) -> Rc> { + self.roles.to_owned() + } + + fn save(&mut self) { + let level = self.get_level(); + let opt = self.get_opt(level); + match level { + Level::Global => { + self.get_roles().as_ref().borrow_mut().options = opt; + } + Level::Role => { + self.role.to_owned().unwrap().as_ref().borrow_mut().options = opt; + } + Level::Task => { + self.task.to_owned().unwrap().as_ref().borrow_mut().options = opt; + } + Level::None | Level::Default => { + panic!("Cannot save None/default options"); + } + } + } + + pub fn get_level(&self) -> Level { + self.stack + .iter() + .rev() + .find(|opt| opt.is_some()) + .unwrap() + .as_ref() + .unwrap() + .as_ref() + .borrow() + .level + } + fn set_opt(&mut self, level: Level, opt: Option>>) { + if let Some(opt) = opt { + self.stack[level as usize] = Some(opt); + } else { + self.stack[level as usize] = Some(Rc::new(Opt::new(level).into())); + } + } + + fn get_opt(&self, level: Level) -> Option>> { + self.stack[level as usize].to_owned() + } + + fn find_in_options Option<(Level, V)>, V>(&self, f: F) -> Option<(Level, V)> { + for opt in self.stack.iter().rev() { + if let Some(opt) = opt.to_owned() { + let res = f(&opt.as_ref().borrow()); + if res.is_some() { + debug!("res: {:?}", res.as_ref().unwrap().0); + return res; + } + } + } + None + } + + fn iter_in_options(&self, mut f: F) { + for opt in self.stack.iter() { + if let Some(opt) = opt.to_owned() { + f(&opt.as_ref().borrow()); + } + } + } + + fn calculate_path(&self) -> String { + let mut final_behavior = PathBehavior::Delete; + let final_add = rc_refcell!(LinkedHashSet::new()); // Cannot use HashSet as we need to keep order + let final_sub = rc_refcell!(LinkedHashSet::new()); + self.iter_in_options(|opt| { + let final_add_clone = Rc::clone(&final_add); + let final_sub_clone = Rc::clone(&final_sub); + if let Some(p) = opt.path.borrow().as_ref() { + match p.default_behavior { + PathBehavior::Delete => { + + // policy is to delete, so we add whitelist and remove blacklist + final_add_clone.as_ref().replace(final_add_clone.as_ref().borrow() + .union(&p.add) + .filter(|e| !p.sub.contains(*e)) + .cloned() + .collect()); + } + PathBehavior::KeepSafe | PathBehavior::KeepUnsafe => { + //policy is to keep, so we remove blacklist and add whitelist + final_sub_clone.as_ref().replace(final_sub_clone.as_ref().borrow() + .union(&p.sub) + .filter(|e| !p.add.contains(*e)) + .cloned() + .collect()); + } + PathBehavior::Inherit => { + if final_behavior.is_delete() { + final_add_clone.as_ref().replace(final_add_clone.as_ref().borrow() + .union(&p.add) + .filter(|e| !p.sub.contains(*e)) + .cloned() + .collect()); + } else { + final_sub_clone.as_ref().replace(final_sub_clone.as_ref().borrow() + .union(&p.sub) + .filter(|e| !p.add.contains(*e)) + .cloned() + .collect()); + } + } + } + if !p.default_behavior.is_inherit() { + final_behavior = p.default_behavior; + } + } + }); + let final_add = final_add.clone().as_ref().borrow() + .difference(&final_sub.as_ref().borrow()) + .fold("".to_string(), |mut acc, s| { + if !acc.is_empty() { + acc.push(':'); + } + acc.push_str(s); + acc + }); + match final_behavior { + PathBehavior::Inherit | PathBehavior::Delete => final_add, + is_safe => std::env::vars() + .find_map(|(key, value)| if key == "PATH" { Some(value) } else { None }) + .unwrap_or(String::new()) + .split(":") + .filter(|s| { + !final_sub.as_ref().borrow().contains(*s) + && (!is_safe.is_keep_safe() || PathBuf::from(s).exists()) + }) + .fold(final_add, |mut acc, s| { + if !acc.is_empty() { + acc.push(':'); + } + acc.push_str(s); + acc + }), + } + } + + fn check_env(&self, value: &str) -> bool { + value.chars().any(|c| c == '/' || c == '%') + } + + pub fn calculate_filtered_env(&self) -> Result, String> { + let final_env = std::env::vars(); + let mut final_behavior = EnvBehavior::default(); + let mut final_keep = LinkedHashSet::new(); + let mut final_check = LinkedHashSet::new(); + let mut final_delete = LinkedHashSet::new(); + self.iter_in_options(|opt| { + if let Some(p) = opt.env.borrow().as_ref() { + final_behavior = match p.default_behavior { + EnvBehavior::Delete => { + // policy is to delete, so we add whitelist and remove blacklist + final_keep = final_keep + .union(&p.keep) + .filter(|e| !p.check.env_matches(&e) || !p.delete.env_matches(e)) + .cloned() + .collect(); + final_check = final_check + .union(&p.check) + .filter(|e| !p.delete.env_matches(&e)) + .cloned() + .collect(); + p.default_behavior + } + EnvBehavior::Keep => { + //policy is to keep, so we remove blacklist and add whitelist + final_delete = final_delete + .union(&p.delete) + .filter(|e| !p.keep.env_matches(&e) || !p.check.env_matches(&e)) + .cloned() + .collect(); + final_check = final_check + .union(&p.check) + .filter(|e| !p.keep.env_matches(&e)) + .cloned() + .collect(); + p.default_behavior + } + EnvBehavior::Inherit => { + if final_behavior.is_delete() { + final_keep = final_keep + .union(&p.keep) + .filter(|e| { + !p.delete.env_matches(&e) || !p.check.env_matches(&e) + }) + .cloned() + .collect(); + final_check = final_check + .union(&p.check) + .filter(|e| !p.delete.env_matches(&e)) + .cloned() + .collect(); + } else { + final_delete = final_delete + .union(&p.delete) + .filter(|e| !p.keep.env_matches(&e) || !p.check.env_matches(&e)) + .cloned() + .collect(); + final_check = final_check + .union(&p.check) + .filter(|e| !p.keep.env_matches(&e)) + .cloned() + .collect(); + } + final_behavior + } + }; + } + + }); + match final_behavior { + EnvBehavior::Inherit => { + Err("Internal Error with environment behavior".to_string()) + } + EnvBehavior::Delete => { + Ok(final_env.filter_map(|(key, value)| { + let key = EnvKey::new(key).expect("Unexpected environment variable"); + if final_keep.env_matches(&key) || (final_check.env_matches(&key) && self.check_env(&value)) { + Some((key.value, value)) + } + else { + None + } + }).collect()) + } + EnvBehavior::Keep => { + Ok(final_env.filter_map(|(key, value)| { + let key = EnvKey::new(key).expect("Unexpected environment variable"); + if key.value == "PATH" { + Some((key.value, self.calculate_path())) + } else if final_delete.env_matches(&key) || (final_check.env_matches(&key) && self.check_env(&value)) { + Some((key.value, value)) + } else { + None + } + }).collect()) + } + } + } + pub fn get_root_behavior(&self) -> (Level, SPrivileged) { + self.find_in_options(|opt| { + if let Some(p) = &opt.borrow().root { + return Some((opt.level,*p)); + } + None + }) + .unwrap_or((Level::None, SPrivileged::default())) + } + pub fn get_bounding(&self) -> (Level, SBounding) { + self.find_in_options(|opt| { + if let Some(p) = &opt.borrow().bounding { + return Some((opt.level, *p)); + } + None + }) + .unwrap_or((Level::None, SBounding::default())) + } + pub fn get_wildcard(&self) -> (Level, String) { + self.find_in_options(|opt| { + if let Some(p) = opt.borrow().wildcard_denied.borrow().as_ref() { + return Some((opt.level, p.clone())); + } + None + }) + .unwrap_or((Level::None, "".to_owned())) + } + + fn get_description_of(&self, opttype: OptType) -> (Level, String) { + self.find_in_options(|opt| { + match opttype { + OptType::Path => { + if let Some(p) = opt.path.borrow().as_ref() { + return Some((opt.level, format!("{}\n", p.get_description()).to_string())); + } + } + OptType::Env => { + if let Some(p) = opt.env.borrow().as_ref() { + return Some((opt.level, format!("{}\n", p.get_description()).to_string())); + } + } + OptType::Root => { + if let Some(p) = &opt.root { + return Some((opt.level, format!("Root type: {}\n", p).to_string())); + } + } + OptType::Bounding => { + if let Some(p) = &opt.bounding { + return Some((opt.level, format!("Bounding enforcement: {}\n", p).to_string())); + } + } + OptType::Wildcard => { + if let Some(p) = opt.wildcard_denied.borrow().as_ref() { + return Some((opt.level, format!("Wildcard denied: {}\n", p).to_string())); + } + } + } + None + }).unwrap_or((Level::None, "".to_string())) + } + + pub fn get_description(&self, current_level: Level, opttype: OptType) -> String { + let (level, description) = self.get_description_of(opttype.to_owned()); + let leveldesc = if level != current_level { + match level { + Level::Default => " (Inherited from Default)", + Level::Global => " (Inherited from Global)", + Level::Role => " (Inherited from Role)", + Level::Task => " (Inherited from Commands)", + Level::None => " (Inherited from None)", + } + } else { + " (setted at this level)" + }; + format!("{}\n{}", leveldesc, description) + } +} + +#[cfg(test)] +mod tests { + + use crate::as_borrow_mut; + use crate::common::database::wrapper::SConfigWrapper; + use crate::common::database::wrapper::SRoleWrapper; + use crate::common::database::wrapper::STaskWrapper; + use crate::rc_refcell; + + use super::super::options::*; + use super::super::structs::*; + + #[test] + fn test_find_in_options() { + let config = rc_refcell!(SConfig::default()); + let role = rc_refcell!(SRole::new( + "test".to_string(), + Rc::downgrade(&config) + )); + let mut global_path = SPathOptions::default(); + global_path.default_behavior = PathBehavior::Delete; + global_path.add.insert("path1".to_string()); + let mut role_path = SPathOptions::default(); + role_path.default_behavior = PathBehavior::Inherit; + role_path.add.insert("path2".to_string()); + let mut config_global = Opt::new(Level::Global); + config_global.path = Some(global_path); + as_borrow_mut!(config).options = Some(rc_refcell!(config_global)); + let mut config_role = Opt::new(Level::Role); + config_role.path = Some(role_path.clone()); + as_borrow_mut!(role).options = Some(rc_refcell!(config_role)); + as_borrow_mut!(config).roles.push(role); + let options = OptStack::from_role(config.as_ref().borrow().roles[0].clone()); + + let res: Option<(Level, SPathOptions)> = options.find_in_options(|opt| { + if let Some(value) = opt.path.clone() { + Some((opt.level, value)) + } else { + None + } + }); + assert_eq!(res, Some((Level::Role, role_path))); + } + + #[test] + fn test_get_path() { + let config = rc_refcell!(SConfig::default()); + let role = rc_refcell!(SRole::new( + "test".to_string(), + Rc::downgrade(&config) + )); + let mut global_path = SPathOptions::default(); + global_path.default_behavior = PathBehavior::Delete; + global_path.add.insert("path1".to_string()); + let mut role_path = SPathOptions::default(); + role_path.default_behavior = PathBehavior::Inherit; + role_path.add.insert("path2".to_string()); + let mut config_global = Opt::new(Level::Global); + config_global.path = Some(global_path); + as_borrow_mut!(config).options = Some(rc_refcell!(config_global)); + let mut config_role = Opt::new(Level::Role); + config_role.path = Some(role_path); + as_borrow_mut!(role).options = Some(rc_refcell!(config_role)); + as_borrow_mut!(config).roles.push(role); + let options = OptStack::from_role(config.as_ref().borrow().roles.get(0).unwrap().clone()); + let res = options.calculate_path(); + assert_eq!(res, "path2:path1"); + } + + #[test] + fn test_get_description_inherited() { + let role = SRoleWrapper::default(); + as_borrow_mut!(role).name = "test".to_string(); + let mut path_options = SPathOptions::new(PathBehavior::Delete); + path_options.add.insert("path2".to_string()); + let mut opt_role = Opt::new(Level::Role); + opt_role.path = Some(path_options); + as_borrow_mut!(role).options = Some(rc_refcell!(opt_role)); + let config = SConfigWrapper::default(); + as_borrow_mut!(config).roles.push(role.clone()); + let mut global_options = Opt::new(Level::Global); + global_options.path = Some(SPathOptions::new(PathBehavior::Delete)); + global_options.path.as_mut().unwrap().add.insert("path1".to_string()); + as_borrow_mut!(role)._config = Some(Rc::downgrade(&config)); + let options = OptStack::from_role(role); + let res = options.get_description(Level::Role, OptType::Path); + assert_eq!(res, " (Inherited from Global)\npath2:path1"); + } + + #[test] + fn test_get_description() { + let role = SRoleWrapper::default(); + as_borrow_mut!(role).name = "test".to_string(); + let mut path_options = SPathOptions::new(PathBehavior::Delete); + path_options.sub.insert("path1".to_string()); + let mut opt_role = Opt::new(Level::Role); + opt_role.path = Some(path_options); + as_borrow_mut!(role).options = Some(rc_refcell!(opt_role)); + let mut path_options = SPathOptions::new(PathBehavior::Delete); + path_options.add.insert("path1".to_string()); + let mut opt_global = Opt::new(Level::Global); + opt_global.path = Some(path_options); + let config = SConfigWrapper::default(); + as_borrow_mut!(config).roles.push(role.clone()); + as_borrow_mut!(config).options = Some(rc_refcell!(opt_global)); + as_borrow_mut!(role)._config = Some(Rc::downgrade(&config)); + let options = OptStack::from_role(role); + let res = options.get_description(Level::Global, OptType::Path); + assert_eq!(res, ""); + } + + #[test] + fn test_task_level() { + let mut env_options = SEnvOptions::new(EnvBehavior::Delete); + env_options.keep.insert("env1".into()); + let mut opt = Opt::new(Level::Task); + opt.env = Some(env_options); + let task = STaskWrapper::default(); + as_borrow_mut!(task).name = IdTask::Number(1); + as_borrow_mut!(task).options = Some(rc_refcell!(opt)); + let role = SRoleWrapper::default(); + as_borrow_mut!(role).name = "test".to_string(); + let mut env_options = SEnvOptions::new(EnvBehavior::Delete); + env_options.keep.insert("env2".into()); + let mut opt = Opt::new(Level::Role); + opt.env = Some(env_options); + as_borrow_mut!(role).options = Some(rc_refcell!(opt)); + as_borrow_mut!(task)._role = Some(Rc::downgrade(&role)); + + let mut env_options = SEnvOptions::new(EnvBehavior::Delete); + env_options.keep.insert("env3".into()); + + let mut opt = Opt::new(Level::Global); + opt.env = Some(env_options); + let config = SConfigWrapper::default(); + as_borrow_mut!(config).roles.push(role.clone()); + as_borrow_mut!(config).options = Some(rc_refcell!(opt)); + as_borrow_mut!(role)._config = Some(Rc::downgrade(&config)); + let options = OptStack::from_task(task); + let res = options.get_description(Level::Task, OptType::Env); + assert_eq!(res, " (setted at this level)\nenv3,env2,env1"); + } +} diff --git a/src/database/structs.rs b/src/database/structs.rs new file mode 100644 index 00000000..9abb0e6e --- /dev/null +++ b/src/database/structs.rs @@ -0,0 +1,874 @@ +use capctl::CapSet; +use chrono::Duration; +use derivative::Derivative; +use nix::{errno::Errno, unistd::{Group, User}}; +use serde::{de::{self, Visitor}, Deserialize, Deserializer, Serialize}; +use serde_json::{Map, Value}; +use strum::{Display, EnumIs}; + +use std::{cell::RefCell, cmp::Ordering, fmt, ops::{Index, Not}, rc::{Rc, Weak}}; + +use crate::common::database::is_default; + +use super::{deserialize_duration, options::Opt, serialize_duration, wrapper::{OptWrapper, STaskWrapper}}; + + + +#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)] +pub struct SConfig +{ + #[serde(default, skip_serializing_if = "is_default")] + pub timeout: STimeout, + #[serde(skip_serializing_if = "Option::is_none")] + pub options: OptWrapper, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub roles: Vec>>, + #[serde(default)] + #[serde(flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, +} + +impl SRole +{ + pub fn new(name : String, config: Weak>) -> Self { + let mut r = SRole::default(); + r.name = name; + r._config = Some(config); + r + } +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum TimestampType +{ + PPID, + TTY, + UID, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug,)] +pub struct STimeout +{ + #[serde(default, rename = "type")] + pub type_field: TimestampType, + #[serde(serialize_with = "serialize_duration", deserialize_with = "deserialize_duration")] + pub duration: Duration, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub max_usage: Option, + #[serde(default)] + #[serde(flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, +} + + + + + +#[derive(Serialize, Deserialize, Debug, Derivative)] +#[serde(rename_all = "kebab-case")] +#[derivative(PartialEq, Eq)] +pub struct SRole +{ + pub name: String, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub actors: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub tasks: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub options: OptWrapper, + #[serde(default, flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, + #[serde(skip)] + #[derivative(PartialEq="ignore")] + pub _config: Option>>, +} + +#[derive(Serialize, PartialEq, Eq, Debug, EnumIs, Display, Clone)] +#[serde(untagged, rename_all = "lowercase")] +pub enum SActorType { + Id(u32), + Name(String), +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, EnumIs)] +#[serde(rename_all = "kebab-case")] +#[serde(untagged)] +pub enum SGroups { + Single(SActorType), + Multiple(Vec), +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs)] +#[serde(tag = "type", rename_all = "lowercase")] +pub enum SActor +{ + #[serde(rename = "user")] + User { + #[serde(skip_serializing_if = "Option::is_none")] + id: Option, + #[serde(default, flatten, skip_serializing_if = "Map::is_empty")] + _extra_fields: Map, + }, + #[serde(rename = "group")] + Group { + #[serde(skip_serializing_if = "Option::is_none")] + groups: Option, + #[serde(default, flatten)] + _extra_fields: Map, + }, + #[serde(untagged)] + Unknown(Value), + + +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Display, EnumIs)] +#[serde(untagged)] +pub enum IdTask { + Name(String), + Number(usize), +} + +#[derive(Serialize, Deserialize, Debug, Derivative)] +#[derivative(PartialEq, Eq)] +pub struct STask +{ + #[serde(default, skip_serializing_if = "IdTask::is_number")] + pub name: IdTask, + #[serde(skip_serializing_if = "Option::is_none")] + pub purpose: Option, + #[serde(default, skip_serializing_if = "is_default")] + pub cred: SCredentials, + #[serde(default, skip_serializing_if = "is_default")] + pub commands: SCommands, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub options: OptWrapper, + #[serde(default, flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, + #[serde(skip)] + #[derivative(PartialEq="ignore")] + pub _role: Option>>, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[serde(rename_all = "kebab-case")] +pub struct SCredentials{ + #[serde(skip_serializing_if = "Option::is_none")] + pub setuid: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub setgid: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub capabilities: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub additional_auth: Option, + #[serde(default, flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Display, Debug, EnumIs)] +#[serde(rename_all = "lowercase")] +pub enum SetBehavior +{ + All, + None, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +pub struct SCapabilities +{ + #[serde(rename = "default", default, skip_serializing_if = "is_default")] + pub default_behavior: SetBehavior, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub add: Vec, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub sub: Vec, + #[serde(default, flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, EnumIs, Clone)] +#[serde(untagged)] +pub enum SCommand { + Simple(String), + Complex(Value) +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +pub struct SCommands +{ + #[serde(rename = "default")] + pub default_behavior: Option, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub add: Vec, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub sub: Vec, + #[serde(default, flatten, skip_serializing_if = "Map::is_empty")] + pub _extra_fields: Map, +} + +// ------------------------ +// Default implementations +// ------------------------ + +impl Default for SConfig +{ + fn default() -> Self { + SConfig { + timeout: STimeout::default(), + options: Some(Rc::new(RefCell::new(Opt::default()))), + roles: Vec::new(), + _extra_fields: Map::default(), + } + } +} + +impl Default for STimeout +{ + fn default() -> Self { + STimeout { + type_field: TimestampType::default(), + duration: Duration::minutes(5), + max_usage: None, + _extra_fields: Map::default(), + } + } +} + +impl Default for TimestampType +{ + fn default() -> Self { + TimestampType::PPID + } +} + + + + +impl Default for SRole +{ + fn default() -> Self { + SRole { + name: "".to_string(), + actors: Vec::new(), + tasks: Vec::new(), + options: None, + _extra_fields: Map::default(), + _config: None, + } + } +} + +impl Default for STask +{ + fn default() -> Self { + STask { + name: IdTask::Number(0), + purpose: None, + cred: SCredentials::default(), + commands: SCommands::default(), + options: None, + _extra_fields: Map::default(), + _role: None, + } + } +} + +impl Default for SCredentials +{ + fn default() -> Self { + SCredentials { + setuid: None, + setgid: None, + capabilities: Some(SCapabilities::default()), + additional_auth: None, + _extra_fields: Map::default(), + } + } +} + +impl Default for SCommands +{ + fn default() -> Self { + SCommands { + default_behavior: Some(SetBehavior::default()), + add: Vec::new(), + sub: Vec::new(), + _extra_fields: Map::default(), + } + } +} + +impl Default for SetBehavior +{ + fn default() -> Self { + SetBehavior::None + } +} + +impl Default for SCapabilities +{ + fn default() -> Self { + SCapabilities { + default_behavior: SetBehavior::default(), + add: Vec::new(), + sub: Vec::new(), + _extra_fields: Map::default(), + } + } +} + +impl Default for IdTask +{ + fn default() -> Self { + IdTask::Number(0) + } +} + +// ------------------------ +// From implementations +// ------------------------ + +impl From for SActorType { + fn from(id: u32) -> Self { + SActorType::Id(id) + } +} + +impl From for SActorType { + fn from(name: String) -> Self { + SActorType::Name(name) + } +} + +impl From<&str> for SActorType { + fn from(name: &str) -> Self { + SActorType::Name(name.to_string()) + } +} + +impl From<&str> for SCommand { + fn from(name: &str) -> Self { + SCommand::Simple(name.to_string()) + } +} + +impl From for SCapabilities { + fn from(capset: CapSet) -> Self { + let mut add = Vec::new(); + for cap in capset.iter() { + add.push(cap.to_string()); + } + let mut c = SCapabilities::default(); + c.add = add; + c + } +} + +// ------------------------ +// Deserialize +// ------------------------ + +// This try to deserialize a number as an ID and a string as a name +impl<'de> Deserialize<'de> for SActorType { + fn deserialize(deserializer: D) -> Result + where D: Deserializer<'de> + { + struct IdVisitor; + + impl<'de> Visitor<'de> for IdVisitor { + type Value = SActorType; + + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str("user ID as a number or string") + } + + fn visit_u32(self, id: u32) -> Result + where E: de::Error + { + Ok(SActorType::Id(id)) + } + + fn visit_str(self, id: &str) -> Result + where E: de::Error + { + let rid: Result = id.parse(); + match rid { + Ok(id) => Ok(SActorType::Id(id)), + Err(_) => Ok(SActorType::Name(id.to_string())), + } + } + } + + deserializer.deserialize_any(IdVisitor) + } +} + +// ======================== +// Implementations for Struct navigation +// ======================== + +impl SConfig +{ + pub fn role(&self, name: &str) -> Option<&Rc>> { + self.roles.iter().find(|role| role.borrow().name == name) + } +} + +impl SRole +{ + pub fn config(&self) -> Option>> { + self._config.as_ref()?.upgrade() + } +} + +impl STask +{ + pub fn role(&self) -> Option>> { + self._role.as_ref()?.upgrade() + } +} + +impl Index for SConfig +{ + type Output = Rc>; + + fn index(&self, index: usize) -> &Self::Output { + &self.roles[index] + } +} + +impl Index for SRole +{ + type Output = Rc>; + + fn index(&self, index: usize) -> &Self::Output { + &self.tasks[index] + } +} + + +// ================= +// Other implementations +// ================= + +impl SCapabilities { + pub fn to_capset(&self) -> CapSet { + let mut capset = match self.default_behavior { + SetBehavior::All => CapSet::not(CapSet::empty()), + SetBehavior::None => CapSet::empty(), + }; + for cap in &self.add { + capset.add(cap.parse().unwrap()); + } + for cap in &self.sub { + capset.drop(cap.parse().unwrap()); + } + capset + } +} + + +impl PartialEq for SActorType { + fn eq(&self, other: &str) -> bool { + match self { + SActorType::Name(name) => name == other, + SActorType::Id(id) => other.parse().and_then( | oid : u32 | Ok(oid == *id)).unwrap_or(false), + } + } +} + +impl PartialEq for SActorType { + fn eq(&self, other: &User) -> bool { + match self { + SActorType::Name(name) => name == &other.name, + SActorType::Id(id) => other.uid.as_raw() == *id, + } + } +} + +impl PartialEq for SActorType { + fn eq(&self, other: &Group) -> bool { + match self { + SActorType::Name(name) => name == &other.name, + SActorType::Id(id) => other.gid.as_raw() == *id, + } + } +} + +impl PartialEq for SGroups { + fn eq(&self, other: &str) -> bool { + match self { + SGroups::Single(actor) => actor == other, + SGroups::Multiple(actors) => actors.len() == 1 && &actors[0] == other, + } + } +} + +impl PartialEq> for SGroups { + fn eq(&self, other: &Vec) -> bool { + match self { + SGroups::Single(actor) => { + if other.len() == 1 { + return actor == &other[0]; + } + }, + SGroups::Multiple(actors) => { + if actors.len() == other.len() { + return actors.iter().all(|actor| other.iter().any(|x| actor == x)); + } + }, + } + false + } +} + + +impl FromIterator for SGroups { + fn from_iter>(iter: I) -> Self { + let mut iter = iter.into_iter(); + let first = iter.next().unwrap(); + let mut groups = vec![SActorType::Name(first)]; + for group in iter { + groups.push(SActorType::Name(group)); + } + if groups.len() == 1 { + SGroups::Single(groups[0].to_owned()) + } else { + SGroups::Multiple(groups) + } + } +} + +impl SActorType { + pub fn into_group(&self) -> Result,Errno> { + match self { + SActorType::Name(name) => Group::from_name(&name), + SActorType::Id(id) => Group::from_gid(id.to_owned().into()), + } + } + pub fn into_user(&self) -> Result,Errno> { + match self { + SActorType::Name(name) => User::from_name(&name), + SActorType::Id(id) => User::from_uid(id.to_owned().into()), + } + } +} + +impl PartialOrd for SGroups { + fn partial_cmp(&self, other: &SGroups) -> Option { + let other = Into::>::into(other.clone()); + self.partial_cmp(&other) + } +} + +impl PartialOrd> for SGroups { + fn partial_cmp(&self, other: &Vec) -> Option { + match self { + SGroups::Single(group) => { + if other.len() == 1 { + if group == &other[0] { + return Some(Ordering::Equal); + } + } else { + if other.iter().any(| x | group == x) { + return Some(Ordering::Less); + } + } + }, + SGroups::Multiple(groups) => { + if groups.len() == other.len() { + if groups.iter().all(| x | other.iter().any(| y | x == y)) { + return Some(Ordering::Equal); + } + } else if groups.len() < other.len() { + if groups.iter().all(| x | other.iter().any(| y | x == y)) { + return Some(Ordering::Less); + } + } else { + if other.iter().all(| x | groups.iter().any(| y | y == x)) { + return Some(Ordering::Greater); + } + } + }, + } + None + } +} + +impl Into> for SGroups { + fn into(self) -> Vec { + match self { + SGroups::Single(group) => vec![group.into_group().unwrap().unwrap()], + SGroups::Multiple(groups) => groups.into_iter().map(| x | x.into_group().unwrap().unwrap()).collect(), + } + } +} + +impl SActor { + pub fn from_user_string(user: &str) -> Self { + SActor::User { id: Some(user.into()), _extra_fields: Map::default() } + } + pub fn from_user_id(id: u32) -> Self { + SActor::User { id: Some(id.into()), _extra_fields: Map::default() } + } + pub fn from_group_string(group: &str) -> Self { + SActor::Group { groups: Some(SGroups::Single(group.into())), _extra_fields: Map::default() } + } + pub fn from_group_id(id: u32) -> Self { + SActor::Group { groups: Some(SGroups::Single(id.into())), _extra_fields: Map::default() } + } + pub fn from_group_vec_string(group: Vec) -> Self { + SActor::Group { groups: Some(SGroups::Multiple(group)), _extra_fields: Map::default() } + } + pub fn from_group_vec_id(groups: Vec) -> Self { + SActor::Group { groups: Some(SGroups::Multiple(groups.into_iter().map(|id| id.into()).collect::>())), _extra_fields: Map::default() } + } +} + +#[cfg(test)] +mod tests { + + use crate::{as_borrow, common::database::options::{EnvBehavior, PathBehavior}}; + + use super::*; + + + #[test] + fn test_deserialize() { + println!("START"); + let config = r#" + { + "version": "1.0.0", + "timeout": { + "type": "ppid", + "duration": "00:05:00" + }, + "options": { + "path": { + "default": "delete", + "add": ["path_add"], + "sub": ["path_sub"] + }, + "env": { + "default": "delete", + "keep": ["keep_env"], + "check": ["check_env"] + }, + "root": "privileged", + "bounding": "ignore", + "wildcard-denied": "wildcards" + }, + "roles": [ + { + "name": "role1", + "actors": [ + { + "type": "user", + "name": "user1" + }, + { + "type":"group", + "groups": ["group1",1000] + } + ], + "tasks": [ + { + "name": "task1", + "purpose": "purpose1", + "cred": { + "setuid": "setuid1", + "setgid": "setgid1", + "capabilities": { + "default": "all", + "add": ["cap1"], + "sub": ["cap2"] + } + }, + "commands": { + "default": "all", + "add": ["cmd1"], + "sub": ["cmd2"] + } + } + ] + } + ] + } + "#; + println!("STEP 1"); + let config: SConfig = serde_json::from_str(config).unwrap(); + let timeout = config.timeout; + assert_eq!(timeout.type_field, TimestampType::PPID); + assert_eq!(timeout.duration, Duration::minutes(5)); + let options = config.options.as_ref().unwrap().as_ref().borrow(); + let path = options.path.as_ref().unwrap(); + assert_eq!(path.default_behavior, PathBehavior::Delete); + assert!(path.add.front().is_some_and(| s | s == "path_add")); + let env = options.env.as_ref().unwrap(); + assert_eq!(env.default_behavior, EnvBehavior::Delete); + assert!(env.keep.front().is_some_and(| s | s == "keep_env")); + assert!(env.check.front().is_some_and(| s | s == "check_env")); + assert!(options.root.as_ref().unwrap().is_privileged()); + assert!(options.bounding.as_ref().unwrap().is_ignore()); + assert_eq!(options.wildcard_denied.as_ref().unwrap(), "wildcards"); + assert_eq!(config.roles[0].as_ref().borrow().name, "role1"); + let actor0 = &config.roles[0].as_ref().borrow().actors[0]; + match actor0 { + SActor::User { id, .. } => { + assert_eq!(id.as_ref().unwrap(), "user1"); + }, + _ => panic!("unexpected actor type"), + } + let actor1 = &config.roles[0].as_ref().borrow().actors[1]; + match actor1 { + SActor::Group { groups, .. } => { + match groups.as_ref().unwrap() { + SGroups::Multiple(groups) => { + assert_eq!(groups[0], SActorType::Name("group1".into())); + assert_eq!(groups[1], SActorType::Id(1000)); + }, + _ => panic!("unexpected actor group type"), + } + }, + _ => panic!("unexpected actor type"), + } + let role = config.roles[0].as_ref().borrow(); + assert_eq!(as_borrow!(role[0]).purpose.as_ref().unwrap(), "purpose1"); + let cred = &as_borrow!(&role[0]).cred; + assert_eq!(cred.setuid.as_ref().unwrap(), "setuid1"); + assert_eq!(cred.setgid.as_ref().unwrap(), "setgid1"); + let capabilities = cred.capabilities.as_ref().unwrap(); + assert_eq!(capabilities.default_behavior, SetBehavior::All); + assert_eq!(capabilities.add[0], "cap1"); + assert_eq!(capabilities.sub[0], "cap2"); + let commands = &as_borrow!(&role[0]).commands; + assert_eq!(*commands.default_behavior.as_ref().unwrap(), SetBehavior::All); + assert_eq!(commands.add[0], SCommand::Simple("cmd1".into())); + assert_eq!(commands.sub[0], SCommand::Simple("cmd2".into())); + } + #[test] + fn test_unknown_fields() { + let config = r#" + { + "version": "1.0.0", + "timeout": { + "type": "ppid", + "duration": "00:05:00", + "unknown": "unknown" + }, + "options": { + "path": { + "default": "delete", + "add": ["path_add"], + "sub": ["path_sub"], + "unknown": "unknown" + }, + "env": { + "default": "delete", + "keep": ["keep_env"], + "check": ["check_env"], + "unknown": "unknown" + }, + "allow-root": false, + "allow-bounding": false, + "wildcard-denied": "wildcards", + "unknown": "unknown" + }, + "roles": [ + { + "name": "role1", + "actors": [ + { + "type": "user", + "name": "user1", + "unknown": "unknown" + }, + { + "type":"bla", + "unknown": "unknown" + } + ], + "tasks": [ + { + "name": "task1", + "purpose": "purpose1", + "cred": { + "setuid": "setuid1", + "setgid": "setgid1", + "capabilities": { + "default": "all", + "add": ["cap1"], + "sub": ["cap2"], + "unknown": "unknown" + }, + "unknown": "unknown" + }, + "commands": { + "default": "all", + "add": ["cmd1"], + "sub": ["cmd2"], + "unknown": "unknown" + }, + "unknown": "unknown" + } + ], + "unknown": "unknown" + } + ], + "unknown": "unknown" + } + "#; + let config: SConfig = serde_json::from_str(config).unwrap(); + assert_eq!(config._extra_fields.get("unknown").unwrap(), "unknown"); + let timeout = config.timeout; + assert_eq!(timeout._extra_fields.get("unknown").unwrap(), "unknown"); + let binding = config.options.unwrap(); + let options = binding.as_ref().borrow(); + let path = options.path.as_ref().unwrap(); + assert_eq!(path._extra_fields.get("unknown").unwrap(), "unknown"); + let env = &options.env.as_ref().unwrap(); + assert_eq!(env._extra_fields.get("unknown").unwrap(), "unknown"); + assert_eq!(options._extra_fields.get("unknown").unwrap(), "unknown"); + assert_eq!(config._extra_fields.get("unknown").unwrap(), "unknown"); + let actor0 = &as_borrow!(config.roles[0]).actors[0]; + match actor0 { + SActor::User { id, _extra_fields } => { + assert_eq!(id.as_ref().unwrap(), "user1"); + assert_eq!(_extra_fields.get("unknown").unwrap(), "unknown"); + }, + _ => panic!("unexpected actor type"), + } + let actor1 = &as_borrow!(config.roles[0]).actors[1]; + match actor1 { + SActor::Unknown(unknown) => { + let obj = unknown.as_object().unwrap(); + assert_eq!(obj.get("type").unwrap().as_str().unwrap(), "bla"); + assert_eq!(obj.get("unknown").unwrap().as_str().unwrap(), "unknown"); + }, + _ => panic!("unexpected actor type"), + } + assert_eq!(config.roles[0].as_ref().borrow()[0].as_ref().borrow()._extra_fields.get("unknown").as_ref().unwrap().as_str().unwrap(), "unknown"); + let role = config.roles[0].as_ref().borrow(); + let cred = &role[0].as_ref().borrow().cred; + assert_eq!(cred._extra_fields.get("unknown").unwrap(), "unknown"); + let capabilities = cred.capabilities.as_ref().unwrap(); + assert_eq!(capabilities._extra_fields.get("unknown").unwrap(), "unknown"); + let commands = &as_borrow!(role[0]).commands; + assert_eq!(commands._extra_fields.get("unknown").unwrap(), "unknown"); + + } + + #[test] + fn test_sgroups_compare() { + let single = SGroups::Single(SActorType::Name("single".into())); + let multiple = SGroups::Multiple(vec![SActorType::Name("single".into()), SActorType::Id(1000)]); + assert!(single == single); + assert!(single <= multiple); + assert!(multiple >= single); + assert!(multiple == multiple); + let multiple2 = SGroups::Multiple(vec![SActorType::Name("single".into()), SActorType::Id(1001)]); + assert!(multiple != multiple2); + + } +} \ No newline at end of file diff --git a/src/database/version.rs b/src/database/version.rs new file mode 100644 index 00000000..c45af42e --- /dev/null +++ b/src/database/version.rs @@ -0,0 +1,40 @@ +use semver::Version; +use serde::{Deserialize, Deserializer, Serialize}; +use tracing::debug; + +use crate::common::version; +use super::migration::Migration; + +use super::structs::*; + +#[derive(Deserialize, Serialize)] +pub struct Versioning { + pub version: Version, + #[serde(default,flatten)] + pub data: T, +} + +impl Versioning { + fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + // Deserialize into the intermediate representation + let mut intermediate: Versioning = ::deserialize(deserializer)?; + // Check version and perform migrations if necessary + if Migration::migrate(&intermediate.version, &mut intermediate.data, JSON_MIGRATIONS).and_then(|b| { + intermediate.version = version::PACKAGE_VERSION.to_owned().parse()?; + debug!("Migrated from {}", intermediate.version); + Ok(b) + }).is_err() { + return Err(serde::de::Error::custom("Failed to migrate data")); + } + + // Return the migrated data + Ok(intermediate.data) + } +} + +const JSON_MIGRATIONS: &[Migration] = &[ + +]; \ No newline at end of file diff --git a/src/database/wrapper.rs b/src/database/wrapper.rs new file mode 100644 index 00000000..89cdb807 --- /dev/null +++ b/src/database/wrapper.rs @@ -0,0 +1,37 @@ +use std::{cell::RefCell, rc::Rc}; + +use super::{options::Opt, structs::{SConfig,SRole, STask}}; +pub type RcRefCell = Rc>; + +pub type SConfigWrapper = RcRefCell; +pub type SRoleWrapper = RcRefCell; +pub type STaskWrapper = RcRefCell; +pub type OptWrapper = Option>; + +pub trait DefaultWrapper { + fn default() -> Self; +} + +impl DefaultWrapper for SConfigWrapper { + fn default() -> Self { + Rc::new(RefCell::new(SConfig::default())) + } +} + +impl DefaultWrapper for SRoleWrapper { + fn default() -> Self { + Rc::new(RefCell::new(SRole::default())) + } +} + +impl DefaultWrapper for STaskWrapper { + fn default() -> Self { + Rc::new(RefCell::new(STask::default())) + } +} + +impl DefaultWrapper for OptWrapper { + fn default() -> Self { + None + } +} \ No newline at end of file diff --git a/src/descriptions.rs b/src/descriptions.rs index 2e7174e3..a44e71b7 100644 --- a/src/descriptions.rs +++ b/src/descriptions.rs @@ -6,69 +6,57 @@ use capctl::Cap; pub fn get_capability_description(cap : &Cap) -> &'static str { match *cap { Cap::AUDIT_CONTROL => r#"(since Linux 2.6.11) - Enable and disable kernel auditing; change auditing filter - rules; retrieve auditing status and filtering rules."#, + Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and + filtering rules."#, Cap::AUDIT_READ => r#"(since Linux 3.16) Allow reading the audit log via a multicast netlink socket."#, Cap::AUDIT_WRITE => r#"(since Linux 2.6.11) Write records to kernel auditing log."#, Cap::BLOCK_SUSPEND => r#"(since Linux 3.5) - Employ features that can block system suspend (epoll(7) - EPOLLWAKEUP, /proc/sys/wake_lock)."#, + Employ features that can block system suspend (epoll(7) EPOLLWAKEUP, /proc/sys/wake_lock)."#, Cap::BPF => r#"(since Linux 5.8) Employ privileged BPF operations; see bpf(2) and bpf-helpers(7). - This capability was added in Linux 5.8 to separate out BPF - functionality from the overloaded CAP_SYS_ADMIN capability."#, + This capability was added in Linux 5.8 to separate out BPF functionality from the overloaded + CAP_SYS_ADMIN capability."#, Cap::CHECKPOINT_RESTORE => r#"(since Linux 5.9) • Update /proc/sys/kernel/ns_last_pid (see pid_namespaces(7)); • employ the set_tid feature of clone3(2); - • read the contents of the symbolic links in - /proc/pid/map_files for other processes. + • read the contents of the symbolic links in /proc/pid/map_files for other processes. - This capability was added in Linux 5.9 to separate out - checkpoint/restore functionality from the overloaded - CAP_SYS_ADMIN capability."#, + This capability was added in Linux 5.9 to separate out checkpoint/restore functionality from + the overloaded CAP_SYS_ADMIN capability."#, Cap::CHOWN => r#"Make arbitrary changes to file UIDs and GIDs (see chown(2))."#, - Cap::DAC_OVERRIDE => r#"Bypass file read, write, and execute permission checks. (DAC is - an abbreviation of "discretionary access control".)"#, - Cap::DAC_READ_SEARCH => r#"• Bypass file read permission checks and directory read and - execute permission checks; + Cap::DAC_OVERRIDE => r#"Bypass file read, write, and execute permission checks. (DAC is an abbreviation of + "discretionary access control".)"#, + Cap::DAC_READ_SEARCH => r#"• Bypass file read permission checks and directory read and execute permission checks; • invoke open_by_handle_at(2); - • use the linkat(2) AT_EMPTY_PATH flag to create a link to a - file referred to by a file descriptor."#, - Cap::FOWNER => r#"• Bypass permission checks on operations that normally require - the filesystem UID of the process to match the UID of the - file (e.g., chmod(2), utime(2)), excluding those operations + • use the linkat(2) AT_EMPTY_PATH flag to create a link to a file referred to by a file + descriptor."#, + Cap::FOWNER => r#"• Bypass permission checks on operations that normally require the filesystem UID of the + process to match the UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by CAP_DAC_OVERRIDE and CAP_DAC_READ_SEARCH; • set inode flags (see ioctl_iflags(2)) on arbitrary files; • set Access Control Lists (ACLs) on arbitrary files; • ignore directory sticky bit on file deletion; - • modify user extended attributes on sticky directory owned by - any user; - • specify O_NOATIME for arbitrary files in open(2) and - fcntl(2)."#, - Cap::FSETID => r#"• Don't clear set-user-ID and set-group-ID mode bits when a - file is modified; - • set the set-group-ID bit for a file whose GID does not match - the filesystem or any of the supplementary GIDs of the - calling process."#, + • modify user extended attributes on sticky directory owned by any user; + • specify O_NOATIME for arbitrary files in open(2) and fcntl(2)."#, + Cap::FSETID => r#"• Don't clear set-user-ID and set-group-ID mode bits when a file is modified; + • set the set-group-ID bit for a file whose GID does not match the filesystem or any of the + supplementary GIDs of the calling process."#, Cap::IPC_LOCK => r#"• Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)); - • Allocate memory using huge pages (memfd_create(2), mmap(2), - shmctl(2))."#, + • Allocate memory using huge pages (memfd_create(2), mmap(2), shmctl(2))."#, Cap::IPC_OWNER => r#"Bypass permission checks for operations on System V IPC objects."#, - Cap::KILL => r#"Bypass permission checks for sending signals (see kill(2)). - This includes use of the ioctl(2) KDSIGACCEPT operation."#, + Cap::KILL => r#"Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) + KDSIGACCEPT operation."#, Cap::LEASE => r#"(since Linux 2.4) Establish leases on arbitrary files (see fcntl(2))."#, - Cap::LINUX_IMMUTABLE => r#"Set the FS_APPEND_FL and FS_IMMUTABLE_FL inode flags (see - ioctl_iflags(2))."#, + Cap::LINUX_IMMUTABLE => r#"Set the FS_APPEND_FL and FS_IMMUTABLE_FL inode flags (see ioctl_iflags(2))."#, Cap::MAC_ADMIN => r#"(since Linux 2.6.25) - Allow MAC configuration or state changes. Implemented for the - Smack Linux Security Module (LSM)."#, + Allow MAC configuration or state changes. Implemented for the Smack Linux Security Module + (LSM)."#, Cap::MAC_OVERRIDE => r#"(since Linux 2.6.25) - Override Mandatory Access Control (MAC). Implemented for the - Smack LSM."#, + Override Mandatory Access Control (MAC). Implemented for the Smack LSM."#, Cap::MKNOD => r#"(since Linux 2.4) Create special files using mknod(2)."#, Cap::NET_ADMIN => r#"Perform various network-related operations: @@ -80,11 +68,9 @@ pub fn get_capability_description(cap : &Cap) -> &'static str { • clear driver statistics; • set promiscuous mode; • enabling multicasting; - • use setsockopt(2) to set the following socket options: - SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside the - range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE."#, - Cap::NET_BIND_SERVICE => r#"Bind a socket to Internet domain privileged ports (port numbers - less than 1024)."#, + • use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for + a priority outside the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE."#, + Cap::NET_BIND_SERVICE => r#"Bind a socket to Internet domain privileged ports (port numbers less than 1024)."#, Cap::NET_BROADCAST => r#"(Unused) Make socket broadcasts, and listen to multicasts."#, Cap::NET_RAW => r#"• Use RAW and PACKET sockets; • bind to any address for transparent proxying."#, @@ -92,144 +78,108 @@ pub fn get_capability_description(cap : &Cap) -> &'static str { Employ various performance-monitoring mechanisms, including: • call perf_event_open(2); - • employ various BPF operations that have performance - implications. + • employ various BPF operations that have performance implications. - This capability was added in Linux 5.8 to separate out - performance monitoring functionality from the overloaded - CAP_SYS_ADMIN capability. See also the kernel source file + This capability was added in Linux 5.8 to separate out performance monitoring functionality + from the overloaded CAP_SYS_ADMIN capability. See also the kernel source file Documentation/admin-guide/perf-security.rst."#, - Cap::SETGID => r#"• Make arbitrary manipulations of process GIDs and - supplementary GID list; - • forge GID when passing socket credentials via UNIX domain - sockets; - • write a group ID mapping in a user namespace (see - user_namespaces(7))."#, + Cap::SETGID => r#"• Make arbitrary manipulations of process GIDs and supplementary GID list; + • forge GID when passing socket credentials via UNIX domain sockets; + • write a group ID mapping in a user namespace (see user_namespaces(7))."#, Cap::SETFCAP => r#"(since Linux 2.6.24) Set arbitrary capabilities on a file. - Since Linux 5.12, this capability is also needed to map user ID - 0 in a new user namespace; see user_namespaces(7) for details."#, - Cap::SETPCAP => r#"If file capabilities are supported (i.e., since Linux 2.6.24): - add any capability from the calling thread's bounding set to its - inheritable set; drop capabilities from the bounding set (via - prctl(2) PR_CAPBSET_DROP); make changes to the securebits flags. + Since Linux 5.12, this capability is also needed to map user ID 0 in a new user namespace; see + user_namespaces(7) for details."#, + Cap::SETPCAP => r#"If file capabilities are supported (i.e., since Linux 2.6.24): add any capability from the + calling thread's bounding set to its inheritable set; drop capabilities from the bounding set + (via prctl(2) PR_CAPBSET_DROP); make changes to the securebits flags. - If file capabilities are not supported (i.e., before Linux - 2.6.24): grant or remove any capability in the caller's - permitted capability set to or from any other process. (This - property of CAP_SETPCAP is not available when the kernel is - configured to support file capabilities, since CAP_SETPCAP has - entirely different semantics for such kernels.)"#, - Cap::SETUID => r#"• Make arbitrary manipulations of process UIDs (setuid(2), - setreuid(2), setresuid(2), setfsuid(2)); - • forge UID when passing socket credentials via UNIX domain - sockets; - • write a user ID mapping in a user namespace (see - user_namespaces(7))."#, - Cap::SYS_ADMIN => r#"Note: this capability is overloaded; see Notes to kernel - developers below. + If file capabilities are not supported (i.e., before Linux 2.6.24): grant or remove any + capability in the caller's permitted capability set to or from any other process. (This + property of CAP_SETPCAP is not available when the kernel is configured to support file + capabilities, since CAP_SETPCAP has entirely different semantics for such kernels.)"#, + Cap::SETUID => r#"• Make arbitrary manipulations of process UIDs (setuid(2), setreuid(2), setresuid(2), + setfsuid(2)); + • forge UID when passing socket credentials via UNIX domain sockets; + • write a user ID mapping in a user namespace (see user_namespaces(7))."#, + Cap::SYS_ADMIN => r#"Note: this capability is overloaded; see Notes to kernel developers below. - • Perform a range of system administration operations - including: quotactl(2), mount(2), umount(2), pivot_root(2), - swapon(2), swapoff(2), sethostname(2), and setdomainname(2); - • perform privileged syslog(2) operations (since Linux 2.6.37, - CAP_SYSLOG should be used to permit such operations); + • Perform a range of system administration operations including: quotactl(2), mount(2), + umount(2), pivot_root(2), swapon(2), swapoff(2), sethostname(2), and setdomainname(2); + • perform privileged syslog(2) operations (since Linux 2.6.37, CAP_SYSLOG should be used to + permit such operations); • perform VM86_REQUEST_IRQ vm86(2) command; - • access the same checkpoint/restore functionality that is - governed by CAP_CHECKPOINT_RESTORE (but the latter, weaker + • access the same checkpoint/restore functionality that is governed by CAP_CHECKPOINT_RESTORE + (but the latter, weaker capability is preferred for accessing that functionality). + • perform the same BPF operations as are governed by CAP_BPF (but the latter, weaker capability is preferred for accessing that functionality). - • perform the same BPF operations as are governed by CAP_BPF - (but the latter, weaker capability is preferred for accessing - that functionality). - • employ the same performance monitoring mechanisms as are - governed by CAP_PERFMON (but the latter, weaker capability is - preferred for accessing that functionality). - • perform IPC_SET and IPC_RMID operations on arbitrary System V - IPC objects; + • employ the same performance monitoring mechanisms as are governed by CAP_PERFMON (but the + latter, weaker capability is preferred for accessing that functionality). + • perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects; • override RLIMIT_NPROC resource limit; - • perform operations on trusted and security extended - attributes (see xattr(7)); + • perform operations on trusted and security extended attributes (see xattr(7)); • use lookup_dcookie(2); - • use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux - 2.6.25) IOPRIO_CLASS_IDLE I/O scheduling classes; - • forge PID when passing socket credentials via UNIX domain - sockets; - • exceed /proc/sys/fs/file-max, the system-wide limit on the - number of open files, in system calls that open files (e.g., - accept(2), execve(2), open(2), pipe(2)); - • employ CLONE_* flags that create new namespaces with clone(2) - and unshare(2) (but, since Linux 3.8, creating user - namespaces does not require any capability); + • use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) IOPRIO_CLASS_IDLE I/O + scheduling classes; + • forge PID when passing socket credentials via UNIX domain sockets; + • exceed /proc/sys/fs/file-max, the system-wide limit on the number of open files, in system + calls that open files (e.g., accept(2), execve(2), open(2), pipe(2)); + • employ CLONE_* flags that create new namespaces with clone(2) and unshare(2) (but, since + Linux 3.8, creating user namespaces does not require any capability); • access privileged perf event information; - • call setns(2) (requires CAP_SYS_ADMIN in the target - namespace); + • call setns(2) (requires CAP_SYS_ADMIN in the target namespace); • call fanotify_init(2); - • perform privileged KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) - operations; + • perform privileged KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations; • perform madvise(2) MADV_HWPOISON operation; - • employ the TIOCSTI ioctl(2) to insert characters into the - input queue of a terminal other than the caller's controlling - terminal; + • employ the TIOCSTI ioctl(2) to insert characters into the input queue of a terminal other + than the caller's controlling terminal; • employ the obsolete nfsservctl(2) system call; • employ the obsolete bdflush(2) system call; • perform various privileged block-device ioctl(2) operations; • perform various privileged filesystem ioctl(2) operations; - • perform privileged ioctl(2) operations on the /dev/random - device (see random(4)); - • install a seccomp(2) filter without first having to set the - no_new_privs thread attribute; + • perform privileged ioctl(2) operations on the /dev/random device (see random(4)); + • install a seccomp(2) filter without first having to set the no_new_privs thread attribute; • modify allow/deny rules for device control groups; - • employ the ptrace(2) PTRACE_SECCOMP_GET_FILTER operation to - dump tracee's seccomp filters; - • employ the ptrace(2) PTRACE_SETOPTIONS operation to suspend - the tracee's seccomp protections (i.e., the - PTRACE_O_SUSPEND_SECCOMP flag); + • employ the ptrace(2) PTRACE_SECCOMP_GET_FILTER operation to dump tracee's seccomp filters; + • employ the ptrace(2) PTRACE_SETOPTIONS operation to suspend the tracee's seccomp + protections (i.e., the PTRACE_O_SUSPEND_SECCOMP flag); • perform administrative operations on many device drivers; - • modify autogroup nice values by writing to - /proc/pid/autogroup (see sched(7))."#, + • modify autogroup nice values by writing to /proc/pid/autogroup (see sched(7))."#, Cap::SYS_BOOT => r#"Use reboot(2) and kexec_load(2)."#, Cap::SYS_CHROOT => r#"• Use chroot(2); • change mount namespaces using setns(2)."#, - Cap::SYS_MODULE => r#"• Load and unload kernel modules (see init_module(2) and - delete_module(2)); - • before Linux 2.6.25: drop capabilities from the system-wide - capability bounding set."#, - Cap::SYS_NICE => r#"• Lower the process nice value (nice(2), setpriority(2)) and - change the nice value for arbitrary processes; - • set real-time scheduling policies for calling process, and - set scheduling policies and priorities for arbitrary - processes (sched_setscheduler(2), sched_setparam(2), + Cap::SYS_MODULE => r#"• Load and unload kernel modules (see init_module(2) and delete_module(2)); + • before Linux 2.6.25: drop capabilities from the system-wide capability bounding set."#, + Cap::SYS_NICE => r#"• Lower the process nice value (nice(2), setpriority(2)) and change the nice value for + arbitrary processes; + • set real-time scheduling policies for calling process, and set scheduling policies and + priorities for arbitrary processes (sched_setscheduler(2), sched_setparam(2), sched_setattr(2)); - • set CPU affinity for arbitrary processes - (sched_setaffinity(2)); - • set I/O scheduling class and priority for arbitrary processes - (ioprio_set(2)); - • apply migrate_pages(2) to arbitrary processes and allow - processes to be migrated to arbitrary nodes; + • set CPU affinity for arbitrary processes (sched_setaffinity(2)); + • set I/O scheduling class and priority for arbitrary processes (ioprio_set(2)); + • apply migrate_pages(2) to arbitrary processes and allow processes to be migrated to + arbitrary nodes; • apply move_pages(2) to arbitrary processes; - • use the MPOL_MF_MOVE_ALL flag with mbind(2) and - move_pages(2)."#, + • use the MPOL_MF_MOVE_ALL flag with mbind(2) and move_pages(2)."#, Cap::SYS_PACCT => r#"Use acct(2)."#, Cap::SYS_PTRACE => r#"• Trace arbitrary processes using ptrace(2); • apply get_robust_list(2) to arbitrary processes; - • transfer data to or from the memory of arbitrary processes - using process_vm_readv(2) and process_vm_writev(2); + • transfer data to or from the memory of arbitrary processes using process_vm_readv(2) and + process_vm_writev(2); • inspect processes using kcmp(2)."#, Cap::SYS_RAWIO => r#"• Perform I/O port operations (iopl(2) and ioperm(2)); • access /proc/kcore; • employ the FIBMAP ioctl(2) operation; - • open devices for accessing x86 model-specific registers - (MSRs, see msr(4)); + • open devices for accessing x86 model-specific registers (MSRs, see msr(4)); • update /proc/sys/vm/mmap_min_addr; - • create memory mappings at addresses below the value specified - by /proc/sys/vm/mmap_min_addr; + • create memory mappings at addresses below the value specified by + /proc/sys/vm/mmap_min_addr; • map files in /proc/bus/pci; • open /dev/mem and /dev/kmem; • perform various SCSI device commands; • perform certain operations on hpsa(4) and cciss(4) devices; - • perform a range of device-specific operations on other - devices."#, + • perform a range of device-specific operations on other devices."#, Cap::SYS_RESOURCE => r#"• Use reserved space on ext2 filesystems; • make ioctl(2) calls controlling ext3 journaling; • override disk quota limits; @@ -238,38 +188,32 @@ pub fn get_capability_description(cap : &Cap) -> &'static str { • override maximum number of consoles on console allocation; • override maximum number of keymaps; • allow more than 64hz interrupts from the real-time clock; - • raise msg_qbytes limit for a System V message queue above the - limit in /proc/sys/kernel/msgmnb (see msgop(2) and - msgctl(2)); - • allow the RLIMIT_NOFILE resource limit on the number of "in- - flight" file descriptors to be bypassed when passing file - descriptors to another process via a UNIX domain socket (see + • raise msg_qbytes limit for a System V message queue above the limit in + /proc/sys/kernel/msgmnb (see msgop(2) and msgctl(2)); + • allow the RLIMIT_NOFILE resource limit on the number of "in-flight" file descriptors to be + bypassed when passing file descriptors to another process via a UNIX domain socket (see unix(7)); - • override the /proc/sys/fs/pipe-size-max limit when setting - the capacity of a pipe using the F_SETPIPE_SZ fcntl(2) - command; - • use F_SETPIPE_SZ to increase the capacity of a pipe above the - limit specified by /proc/sys/fs/pipe-max-size; - • override /proc/sys/fs/mqueue/queues_max, - /proc/sys/fs/mqueue/msg_max, and - /proc/sys/fs/mqueue/msgsize_max limits when creating POSIX - message queues (see mq_overview(7)); + • override the /proc/sys/fs/pipe-size-max limit when setting the capacity of a pipe using the + F_SETPIPE_SZ fcntl(2) command; + • use F_SETPIPE_SZ to increase the capacity of a pipe above the limit specified by + /proc/sys/fs/pipe-max-size; + • override /proc/sys/fs/mqueue/queues_max, /proc/sys/fs/mqueue/msg_max, and + /proc/sys/fs/mqueue/msgsize_max limits when creating POSIX message queues (see + mq_overview(7)); • employ the prctl(2) PR_SET_MM operation; - • set /proc/pid/oom_score_adj to a value lower than the value - last set by a process with CAP_SYS_RESOURCE."#, - Cap::SYS_TIME => r#"Set system clock (settimeofday(2), stime(2), adjtimex(2)); set - real-time (hardware) clock."#, - Cap::SYS_TTY_CONFIG => r#"Use vhangup(2); employ various privileged ioctl(2) operations on - virtual terminals."#, + • set /proc/pid/oom_score_adj to a value lower than the value last set by a process with + CAP_SYS_RESOURCE."#, + Cap::SYS_TIME => r#"Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock."#, + Cap::SYS_TTY_CONFIG => r#"Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals."#, Cap::SYSLOG => r#"(since Linux 2.6.37) - • Perform privileged syslog(2) operations. See syslog(2) for - information on which operations require privilege. - • View kernel addresses exposed via /proc and other interfaces - when /proc/sys/kernel/kptr_restrict has the value 1. (See - the discussion of the kptr_restrict in proc(5).)"#, + • Perform privileged syslog(2) operations. See syslog(2) for information on which operations + require privilege. + • View kernel addresses exposed via /proc and other interfaces when + /proc/sys/kernel/kptr_restrict has the value 1. (See the discussion of the kptr_restrict + in proc(5).)"#, Cap::WAKE_ALARM => r#"(since Linux 3.0) - Trigger something that will wake up the system (set - CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM timers)."#, + Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and + CLOCK_BOOTTIME_ALARM timers)."#, _ => "Unknown capability", } } \ No newline at end of file diff --git a/src/mod.rs b/src/mod.rs new file mode 100644 index 00000000..df9eb319 --- /dev/null +++ b/src/mod.rs @@ -0,0 +1,18 @@ +pub mod util; +pub mod version; +pub mod database; +pub mod config; +pub mod api; + +mod plugin; + +trait With { + fn with(&mut self, f: F) -> &mut Self + where + F: FnOnce(&mut Self) -> &mut Self, + Self: Sized, + { + f(self); + self + } +} \ No newline at end of file diff --git a/src/plugin/hashchecker.rs b/src/plugin/hashchecker.rs new file mode 100644 index 00000000..a13178cb --- /dev/null +++ b/src/plugin/hashchecker.rs @@ -0,0 +1,83 @@ +use serde::{Deserialize, Serialize}; +use sha1::Digest; + +use crate::{command::{find_executable_in_path, parse_conf_command}, common::{api::{PluginManager, PluginPosition}, database::structs::SCommand}}; + +use md5; + +#[derive(Debug, Serialize, Deserialize)] +pub enum HashType { + MD5, + SHA1, + SHA224, + SHA256, + SHA384, + SHA512, +} + +#[derive(Debug, Serialize, Deserialize)] +struct HashChecker { + hash_type: HashType, + hash: String, + command: SCommand, +} + +fn compute(hashtype : &HashType, hash: &str) -> Vec { + match hashtype { + HashType::MD5 => md5::compute(hash).0.to_vec(), + HashType::SHA1 => { + let mut hasher = sha1::Sha1::new(); + hasher.update(hash); + hasher.finalize().to_vec() + }, + HashType::SHA224 => { + let mut hasher = sha2::Sha224::new(); + hasher.update(hash); + hasher.finalize().to_vec() + }, + HashType::SHA256 => { + let mut hasher = sha2::Sha256::new(); + hasher.update(hash); + hasher.finalize().to_vec() + }, + HashType::SHA384 => { + let mut hasher = sha2::Sha384::new(); + hasher.update(hash); + hasher.finalize().to_vec() + }, + HashType::SHA512 => { + let mut hasher = sha2::Sha512::new(); + hasher.update(hash); + hasher.finalize().to_vec() + }, + } +} + +fn complex_command_parse(command: &serde_json::Value) -> Result, Box> { + let checker = serde_json::from_value::(command.clone()); + + match checker { + Ok(checker) => { + let path; + if let SCommand::Simple(command) = &checker.command { + let opath = find_executable_in_path(&command); + if opath.is_none() { + return Err("Command not found".into()); + } + path = opath.unwrap(); + } else { + return Err("Invalid command".into()); + } + return if compute(&checker.hash_type, &String::from_utf8(std::fs::read(&path)?)?) == compute(&checker.hash_type, &checker.hash) { + parse_conf_command(&checker.command) + } else { + Err("Hashes do not match".into()) + }; + }, + Err(e) => Err(Box::new(e)) + } +} + +pub fn register() { + PluginManager::subscribe_complex_command_parser(complex_command_parse, PluginPosition::Beginning) +} \ No newline at end of file diff --git a/src/plugin/hierarchy.rs b/src/plugin/hierarchy.rs new file mode 100644 index 00000000..e69de29b diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs new file mode 100644 index 00000000..cc3dec85 --- /dev/null +++ b/src/plugin/mod.rs @@ -0,0 +1,7 @@ +mod hashchecker; +mod ssd; + +pub fn register_plugins() { + hashchecker::register(); + ssd::register(); +} \ No newline at end of file diff --git a/src/plugin/ssd.rs b/src/plugin/ssd.rs new file mode 100644 index 00000000..c4da82fa --- /dev/null +++ b/src/plugin/ssd.rs @@ -0,0 +1,133 @@ +use std::ffi::CString; + +use ::serde::Deserialize; +use nix::unistd::{getgrouplist, Group, User}; + +use crate::{ + as_borrow, + common::{ + api::{PluginManager, PluginPosition, PluginResult}, + database::structs::{SActor, SConfig, SGroups, SRole}, + }, finder::Cred, +}; + +#[derive(Deserialize)] +pub struct SSD(Vec); + +fn user_contained_in(user: &User, actors: &Vec) -> bool { + for actor in actors.iter() { + if let SActor::User { id, .. } = actor { + if let Some(id) = id { + if id == user { + return true; + } + } else { + //TODO API call to verify if user is the described actor + return false; + } + } + } + false +} + +fn group_contained_in(group: &Group, actors: &Vec) -> bool { + for actor in actors.iter() { + if let SActor::Group { groups, .. } = actor { + if let Some(groups) = groups { + match groups { + SGroups::Single(group) => { + if group == group { + return true; + } + }, + SGroups::Multiple(groups) => { + if groups.iter().any(|x| x == group){ + return true; + } + }, + } + } else { + //TODO API call to verify if group is the described actor + return false; + } + } + } + false +} + +fn groups_subset_of(groups: &Vec, actors: &Vec) -> bool { + for group in groups.iter() { + if !group_contained_in(group, actors) { + return false; + } + } + true +} + +// Check if user and its related groups are forbidden to use the role +fn user_is_forbidden(user: &User, ssd_roles: &Vec, sconfig: &SConfig) -> bool { + + let mut groups_to_check = Vec::new(); + if let Ok(groups) = getgrouplist( + CString::new(user.name.as_str()).unwrap().as_c_str(), + user.gid, + ) { + for group in groups.iter() { + let group = nix::unistd::Group::from_gid(group.to_owned()); + if let Ok(Some(group)) = group { + groups_to_check.push(group); + } + } + } + for role in ssd_roles.iter() { + + if let Some(role) = sconfig.role(role) { + if user_contained_in(user, &as_borrow!(role) + .actors) + || groups_subset_of(&groups_to_check, &as_borrow!(role).actors) + { + return true; + } + } + } + false +} + +fn groups_are_forbidden(groups: &Vec, ssd_roles: &Vec, sconfig: &SConfig) -> bool { + for role in ssd_roles.iter() { + if let Some(role) = sconfig.role(role) { + if groups_subset_of(groups, &as_borrow!(role).actors) { + return true; + } + } + } + false +} + +fn check_separation_of_duty(role: &SRole, actor: &Cred) -> PluginResult { + let ssd = role._extra_fields.get("ssd"); + if ssd.is_none() { + return PluginResult::Neutral; + } + let sconfig = role + ._config + .as_ref() + .expect("role should have its config") + .upgrade() + .expect("internal error"); + let roles = serde_json::from_value::(ssd.unwrap().clone()); + if roles.is_err() { + return PluginResult::Neutral; + } + let roles = roles.unwrap().0; + if user_is_forbidden(&actor.user, &roles, &as_borrow!(sconfig)) || + groups_are_forbidden(&actor.groups, &roles, &as_borrow!(sconfig)){ + PluginResult::Deny + } else { + PluginResult::Neutral + } +} + +pub fn register() { + PluginManager::subscribe_duty_separation(check_separation_of_duty, PluginPosition::Beginning) +} diff --git a/src/sr/command.rs b/src/sr/command.rs index cf243289..2220d03f 100644 --- a/src/sr/command.rs +++ b/src/sr/command.rs @@ -1,15 +1,16 @@ use std::{ - env::var, - path::{Path, PathBuf}, + env::var, error::Error, path::{Path, PathBuf} }; use shell_words::ParseError; +use crate::common::{api::PluginManager, database::structs::SCommand}; + fn get_command_abspath_and_args(content: &str) -> Result, ParseError> { shell_words::split(content) } -fn find_executable_in_path(executable: &str) -> Option { +pub fn find_executable_in_path(executable: &str) -> Option { let path = var("PATH").unwrap_or("".to_string()); for dir in path.split(':') { let path = Path::new(dir).join(executable); @@ -20,9 +21,35 @@ fn find_executable_in_path(executable: &str) -> Option { None } -pub fn parse_conf_command(command: &str) -> Result, ParseError> { - if command == "ALL" { - return Ok(vec!["**".to_string(), ".*".to_string()]); +pub fn parse_conf_command(command: &SCommand) -> Result, Box> { + match command { + SCommand::Simple(command) => { + if command == "ALL" { + return Ok(vec!["**".to_string(), ".*".to_string()]); + } + Ok(shell_words::split(command)?) + }, + SCommand::Complex(command) => { + if let Some(array) = command.as_array() { + let mut result = Vec::new(); + if ! array.iter().all(|item| { + // if it is a string + item.is_string() && { + //add to result + result.push(item.as_str().unwrap().to_string()); + true // continue + } + + }) { // if any of the items is not a string + return Err("Invalid command".into()); + } + Ok(result) + } else { + // call PluginManager + PluginManager::notify_complex_command_parser(command) + } + + } } - shell_words::split(command) + } diff --git a/src/sr/finder.rs b/src/sr/finder.rs index 231842de..69a2ead5 100644 --- a/src/sr/finder.rs +++ b/src/sr/finder.rs @@ -14,16 +14,13 @@ use nix::{ unistd::{Group, Pid, User}, }; use pcre2::bytes::RegexBuilder; +use strum::EnumIs; use tracing::{debug, warn}; -use crate::{ - command::parse_conf_command, - config::{ - options::{Opt, OptStack}, - structs::{Config, Groups, Role, Task}, - }, - util::capabilities_are_exploitable, -}; +use crate::{as_borrow, common::{ + api::{PluginManager, PluginResultAction}, database::{options::{Opt, OptStack}, structs::{SActor, SActorType, SCommand, SCommands, SConfig, SGroups, SRole, STask, SetBehavior}}, util::capabilities_are_exploitable +}}; +use crate::command::parse_conf_command; use bitflags::bitflags; #[derive(Debug, PartialEq, Eq, Clone, Copy)] @@ -32,7 +29,7 @@ pub enum MatchError { Conflict, } -impl<'a> Display for MatchError { +impl Display for MatchError { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { MatchError::NoMatch => write!(f, "No match"), @@ -41,7 +38,7 @@ impl<'a> Display for MatchError { } } -impl<'a> Error for MatchError { +impl Error for MatchError { fn description(&self) -> &str { match self { MatchError::NoMatch => "No match", @@ -50,29 +47,22 @@ impl<'a> Error for MatchError { } } -#[derive(Debug)] -pub struct Cred { - pub user: User, - pub groups: Vec, - pub tty: Option, - pub ppid: Pid, -} #[derive(Clone, Debug)] -struct ExecSettings<'a> { - exec_path: String, - exec_args: Vec, - opt: Option>, - setuid: Option, - setgroups: Option, - caps: Option, - task: Weak>>, +pub struct ExecSettings { + pub exec_path: PathBuf, + pub exec_args: Vec, + pub opt: Option, + pub setuid: Option, + pub setgroups: Option, + pub caps: Option, + pub task: Weak>, } -impl<'a> ExecSettings<'a> { - fn new() -> ExecSettings<'a> { +impl ExecSettings { + fn new() -> ExecSettings { ExecSettings { - exec_path: String::new(), + exec_path: PathBuf::new(), exec_args: Vec::new(), opt: None, setuid: None, @@ -81,11 +71,19 @@ impl<'a> ExecSettings<'a> { task: Weak::new(), } } + + pub fn task(&self) -> Rc> { + self.task.upgrade().expect("Internal Error") + } + + pub fn role(&self) -> Rc> { + self.task().as_ref().borrow().role().expect("Internal Error") + } } -#[derive(PartialEq, PartialOrd, Eq, Ord, Clone, Copy, Debug)] +#[derive(PartialEq, PartialOrd, Eq, Ord, Clone, Copy, Debug, EnumIs)] #[repr(u32)] -enum UserMin { +pub enum UserMin { UserMatch, GroupMatch(usize), NoMatch, @@ -158,13 +156,13 @@ impl Score { } } -impl<'a> PartialOrd for Score { +impl PartialOrd for Score { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl<'a> Ord for Score { +impl Ord for Score { fn cmp(&self, other: &Self) -> Ordering { self.user_min .cmp(&other.user_min) @@ -187,14 +185,29 @@ impl<'a> Ord for Score { } } +#[derive(Debug)] +pub struct Cred { + pub user: User, + pub groups: Vec, + pub tty: Option, + pub ppid: Pid, +} + + #[derive(Clone, Debug)] -pub struct TaskMatch<'a> { +pub struct TaskMatch { score: Score, - settings: ExecSettings<'a>, + pub settings: ExecSettings, } -impl<'a> TaskMatch<'a> { - pub fn file_exec_path(&self) -> &String { +impl TaskMatch { + + pub fn is_matching(&self) -> bool { + self.score.user_min != UserMin::NoMatch + && !self.score.cmd_min.is_empty() + } + + pub fn file_exec_path(&self) -> &PathBuf { &self.settings.exec_path } @@ -202,15 +215,15 @@ impl<'a> TaskMatch<'a> { &self.settings.exec_args } - pub fn opt(&self) -> &Option> { + pub fn opt(&self) -> &Option { &self.settings.opt } - pub fn setuid(&self) -> &Option { + pub fn setuid(&self) -> &Option { &self.settings.setuid } - pub fn setgroups(&self) -> &Option { + pub fn setgroups(&self) -> &Option { &self.settings.setgroups } @@ -218,22 +231,34 @@ impl<'a> TaskMatch<'a> { &self.settings.caps } - pub fn task(&self) -> Rc>> { + pub fn task(&self) -> Rc> { self.settings.task.upgrade().expect("Internal Error") } - pub fn role(&self) -> Rc>> { - self.settings - .task - .upgrade() - .expect("Internal Error") + pub fn role(&self) -> Rc> { + self.task() .as_ref() .borrow() - .get_role() + .role() .expect("Internal Error") } } +impl Default for TaskMatch { + fn default() -> Self { + TaskMatch { + score: Score { + user_min: UserMin::NoMatch, + cmd_min: CmdMin::empty(), + caps_min: CapsMin::Undefined, + setuid_min: SetuidMin::Undefined, + security_min: SecurityMin::empty(), + }, + settings: ExecSettings::new(), + } + } +} + pub trait TaskMatcher { fn matches(&self, user: &Cred, command: &[String]) -> Result; } @@ -242,11 +267,6 @@ trait CredMatcher { fn user_matches(&self, user: &Cred) -> UserMin; } -trait RoleMatcher<'a> { - fn command_matches(&self, user: &Cred, command: &[String]) - -> Result, MatchError>; -} - fn find_from_envpath(needle: &PathBuf) -> Option { let env_path = std::env::var_os("PATH").unwrap(); for path in std::env::split_paths(&env_path) { @@ -258,38 +278,39 @@ fn find_from_envpath(needle: &PathBuf) -> Option { None } +fn final_path(path: &String) -> PathBuf { + let result; + if let Ok(cannon_path) = std::fs::canonicalize(path){ + result = cannon_path; + } else { + if let Some(env_path) = find_from_envpath(&path.parse().expect("The path is not valid")) { + result = env_path + } else { + result = path.parse().expect("The path is not valid"); + } + } + result.to_str().expect("The path is not valid").parse().expect("The path is not valid") +} + fn match_path( input_path: &String, role_path: &String, - match_status: &mut CmdMin, -) -> Result> { - let mut new_path = - std::fs::canonicalize(input_path).unwrap_or(PathBuf::from(input_path.clone())); +) -> CmdMin { if role_path == "**" { - *match_status |= CmdMin::FullWildcardPath; - } - if !new_path.is_absolute() { - if let Some(env_path) = find_from_envpath(&new_path) { - new_path = env_path; - } - } - let mut role_path = - std::fs::canonicalize(role_path).unwrap_or(PathBuf::from(role_path.clone())); - if !role_path.is_absolute() { - if let Some(env_path) = find_from_envpath(&role_path) { - role_path = env_path; - } + return CmdMin::FullWildcardPath; } + let mut match_status = CmdMin::empty(); + let new_path = final_path(input_path); + let role_path = final_path(role_path); if new_path == role_path { - *match_status |= CmdMin::Match; - return Ok(new_path); - } - if Pattern::new(role_path.to_str().unwrap())?.matches_path(&new_path) { - *match_status |= CmdMin::WildcardPath; - return Ok(new_path); + match_status |= CmdMin::Match; + } else if let Ok(pattern) = Pattern::new(role_path.to_str().unwrap()) { + if pattern.matches_path(&new_path) { + match_status |= CmdMin::WildcardPath; + } } - debug!("No match for path {:?}", new_path); - Err(Box::new(MatchError::NoMatch)) + if match_status.is_empty() { debug!("No match for path ``{:?}`` for evaluated path : ``{:?}``", new_path, role_path); } + match_status } /// Check if input args is matching with role args and return the score @@ -319,23 +340,12 @@ fn match_args(input_args: &[String], role_args: &[String]) -> Result CmdMin { let mut result = CmdMin::empty(); if !input_command.is_empty() { - match match_path(&input_command[0], &role_command[0], &mut result) { - Ok(final_path) => { - *final_binary_path = final_path; - if role_command.len() == 1 { - return result; - } - } - Err(err) => { - if err.downcast_ref::().is_none() { - warn!("Error: {}", err); - } - return CmdMin::empty(); - } + result = match_path(&input_command[0], &role_command[0]); + if role_command.len() == 1 { + return result; } match match_args(&input_command[1..], &role_command[1..]) { Ok(args_result) => result |= args_result, @@ -353,15 +363,14 @@ fn match_command_line( /// Find the minimum score for all commands that match the input command line fn get_cmd_min( input_command: &[String], - commands: &[String], - final_binary_path: &mut PathBuf, + commands: &[SCommand], ) -> CmdMin { let mut min_score: CmdMin = CmdMin::empty(); debug!("Commands : {:?}", commands); for command in commands { match parse_conf_command(command) { Ok(command) => { - let new_score = match_command_line(input_command, &command, final_binary_path); + let new_score = match_command_line(input_command, &command); debug!("Score for command {:?} is {:?}", command, new_score); if min_score.is_empty() || (new_score < min_score) { debug!("New min score for command {:?} is {:?}", command, new_score); @@ -398,13 +407,13 @@ fn get_security_min(opt: &Option>>) -> SecurityMin { Some(opt) => { let opt = opt.as_ref().borrow(); let mut result = SecurityMin::empty(); - if let Some(value) = opt.disable_bounding { - if value { + if let Some(value) = opt.bounding { + if value.is_strict() { result |= SecurityMin::DisableBounding; } } - if let Some(value) = opt.allow_root { - if value { + if let Some(value) = opt.root { + if value.is_privileged() { result |= SecurityMin::EnableRoot; } } @@ -414,134 +423,196 @@ fn get_security_min(opt: &Option>>) -> SecurityMin { } } -fn is_root(string: &String) -> bool { - string.eq_ignore_ascii_case("root") || string == "0" +fn is_root(actortype: &SActorType) -> bool { + match actortype { + SActorType::Id(id) => *id == 0, + SActorType::Name(name) => name == "root", + } } -fn list_contains_root(list: &crate::config::structs::Groups) -> bool { - list.groups.iter().any(is_root) +fn groups_contains_root(list: Option<&SGroups>) -> bool { + if let Some(list) = list { + match list { + SGroups::Single(group) => is_root(group), + SGroups::Multiple(groups) => groups.iter().any(is_root), + } + } else { + false + } +} + +fn groups_len(groups: Option<&SGroups>) -> usize { + match groups { + Some(groups) => match groups { + SGroups::Single(_) => 1, + SGroups::Multiple(groups) => groups.len(), + }, + None => 0, + } } fn get_setuid_min( - setuid: &Option, - setgid: &Option, + setuid: Option<&SActorType>, + setgid: Option<&SGroups>, security_min: &SecurityMin, ) -> SetuidMin { match (setuid, setgid) { - (Some(setuid), Some(setgid)) => { - if security_min.contains(SecurityMin::EnableRoot) && is_root(setuid) { - // user root - if list_contains_root(setgid) { - //group has root - SetuidMin::SetuidSetgidRoot(setgid.len()) + (Some(setuid), setgid) => { + if security_min.contains(SecurityMin::EnableRoot) { + // root is privileged + if is_root(setuid) { + if groups_contains_root(setgid) { + SetuidMin::SetuidSetgidRoot(groups_len(setgid)) + } else { + SetuidMin::SetuidRoot + } } else { - SetuidMin::SetuidRootSetgid(setgid.len()) + if groups_contains_root(setgid) { + SetuidMin::SetuidNotrootSetgidRoot(groups_len(setgid)) + } else { + SetuidMin::Setuid + } } } else { - // user not root - if security_min.contains(SecurityMin::EnableRoot) - && setgid - .groups - .iter() - .any(|gid| gid.eq_ignore_ascii_case("root") || gid == "0") - { - //group doesn't has root - SetuidMin::SetuidNotrootSetgidRoot(setgid.len()) - } else { - SetuidMin::SetuidSetgid(setgid.len()) - } + // root is a user + SetuidMin::SetuidSetgid(groups_len(setgid)) } - } - (Some(setuid), None) => { - if security_min.contains(SecurityMin::EnableRoot) && is_root(setuid) { - SetuidMin::SetuidRoot - } else if setuid.is_empty() { + }, + (None, setgid) => { + let len = groups_len(setgid); + if len == 0 { SetuidMin::NoSetuidNoSetgid + } else if security_min.contains(SecurityMin::EnableRoot) && groups_contains_root(setgid) { + SetuidMin::SetgidRoot(len) } else { - SetuidMin::Setuid + SetuidMin::Setgid(len) } } - (None, Some(setgid)) => { - if security_min.contains(SecurityMin::EnableRoot) && list_contains_root(setgid) { - SetuidMin::SetgidRoot(setgid.len()) - } else if setgid.is_empty() { - SetuidMin::NoSetuidNoSetgid - } else { - SetuidMin::Setgid(setgid.len()) - } - } - (None, None) => SetuidMin::NoSetuidNoSetgid, } } -impl<'a> TaskMatcher> for Rc>> { - fn matches(&self, _: &Cred, command: &[String]) -> Result, MatchError> { - let mut score = Score { - user_min: UserMin::NoMatch, - cmd_min: CmdMin::empty(), - caps_min: CapsMin::Undefined, - setuid_min: SetuidMin::Undefined, - security_min: SecurityMin::empty(), - }; - let mut final_binary_path = PathBuf::new(); - score.cmd_min = get_cmd_min( - command, - &self.as_ref().borrow().commands, - &mut final_binary_path, - ); - debug!( - "= task {} =\nScore for command {:?} is {:?}", - self.as_ref().borrow().id.to_string(), - command, - score.cmd_min +impl TaskMatcher for Rc> { + fn matches(&self, user: &Cred, command: &[String]) -> Result { + let TaskMatch { mut score, .. } = self.as_ref().borrow().commands.matches(user, command)?; + let capset = self.as_ref().borrow().cred.capabilities.as_ref().and_then(|caps| Some(caps.to_capset())); + score.caps_min = get_caps_min(&capset); + score.security_min = get_security_min(&self.as_ref().borrow().options); + let setuid = &self.as_ref().borrow().cred.setuid; + let setgid = &self.as_ref().borrow().cred.setgid; + score.setuid_min = get_setuid_min( + setuid.as_ref(), + setgid.as_ref(), + &score.security_min, ); - if score.cmd_min != CmdMin::empty() { - score.caps_min = get_caps_min(&self.as_ref().borrow().capabilities); - score.security_min = get_security_min(&self.as_ref().borrow().options); - score.setuid_min = get_setuid_min( - &self.as_ref().borrow().setuid, - &self.as_ref().borrow().setgid, - &score.security_min, - ); - let mut settings = ExecSettings::new(); - settings.exec_path = final_binary_path.to_str().unwrap().to_string(); - settings.exec_args = command[1..].to_vec(); - settings.setuid = self.as_ref().borrow().setuid.clone(); - settings.setgroups = self.as_ref().borrow().setgid.clone(); - settings.caps = self.as_ref().borrow().capabilities; - let stack = OptStack::from_task(self.clone()); - settings.opt = Some(stack); - - Ok(TaskMatch { score, settings }) + let mut settings = ExecSettings::new(); + + settings.setuid = setuid.clone(); + settings.setgroups = setgid.clone(); + settings.caps = capset; + let stack = OptStack::from_task(self.clone()); + settings.opt = Some(stack); + + Ok(TaskMatch { score, settings }) + } +} + +fn get_default_behavior(commands: &Option) -> &SetBehavior { + match commands.as_ref() { + Some(commands) => commands, + None => &SetBehavior::None, + } +} + +impl TaskMatcher for SCommands { + fn matches(&self, _: &Cred, input_command: &[String]) -> Result { + let min_score: CmdMin; + let mut settings = ExecSettings::new(); + // if the command is forbidden, we return NoMatch + let is_forbidden = get_cmd_min(&input_command, &self.sub); + if !is_forbidden.is_empty() { + return Err(MatchError::NoMatch); + } + // otherwise, we check if behavior is No command allowed by default + if get_default_behavior(&self.default_behavior).is_none() { + // if the behavior is No command by default, we check if the command is allowed explicitly. + min_score = get_cmd_min(&input_command, &self.add); + if min_score.is_empty() { + return Err(MatchError::NoMatch); + } } else { - Err(MatchError::NoMatch) + min_score = CmdMin::all(); } + + settings.exec_path = final_path(&input_command[0]); + settings.exec_args = input_command[1..].to_vec(); + + Ok(TaskMatch { + score: Score { + user_min: UserMin::NoMatch, + cmd_min: min_score, + caps_min: CapsMin::Undefined, + setuid_min: SetuidMin::Undefined, + security_min: SecurityMin::empty(), + }, + settings, + }) } } /// Check if user's groups is matching with any of the role's groups -fn match_groups(groups: &[Group], role_groups: &Vec) -> bool { - let str_groups: Groups = groups.iter().map(|g| g.name.to_string()).collect(); +fn match_groups(groups: &[Group], role_groups: &Vec) -> bool { + let str_groups: SGroups = groups.iter().map(|g| g.name.to_string()).collect(); for role_group in role_groups { - if role_group.is_subset(&str_groups) { + if *role_group <= str_groups { return true; } } false } -impl CredMatcher for Rc>> { +fn user_matches(user : &Cred) -> UserMin { + if user.user.name == "root" { + UserMin::UserMatch + } else { + UserMin::NoMatch + } +} + +impl CredMatcher for Rc> { fn user_matches(&self, user: &Cred) -> UserMin { let borrow = self.as_ref().borrow(); - if borrow.user_is_forbidden(user.user.name.as_str()) - || borrow - .groups_are_forbidden(&user.groups.iter().map(|g| g.name.to_string()).collect()) - { - warn!("You are forbidden to use a role by a conflict of interest, please contact your administrator"); - UserMin::NoMatch - } else if borrow.users.contains(&user.user.name) { + if PluginManager::notify_duty_separation(&self.as_ref().borrow(),user).is_deny() { + warn!("You are forbidden to use a role due to a conflict of interest, please contact your administrator"); + return UserMin::NoMatch; + } + let mut matches = borrow.actors.iter().filter_map(|actor| { + match actor { + SActor::User { id , .. } => { + if let Some(id) = id { + if *id == user.user { + return Some(UserMin::UserMatch); + } + } + }, + SActor::Group { groups, .. } => { + if let Some(groups) = groups.as_ref() { + if match_groups(&user.groups, &vec![groups.clone()]) { + return Some(UserMin::GroupMatch(user.groups.len())); + } + } + }, + SActor::Unknown(element) => { + let min = PluginManager::notify_user_matcher(&as_borrow!(self), user, element); + if ! min.is_no_match() { + return Some(min); + } + } + } + None + }); + if matches.any(|m| m.is_user_match()) { UserMin::UserMatch - } else if match_groups(&user.groups, &borrow.groups) { + } else if matches.any(|m| m.is_group_match()) { UserMin::GroupMatch(user.groups.len()) } else { debug!( @@ -555,43 +626,90 @@ impl CredMatcher for Rc>> { } } -impl<'a> RoleMatcher<'a> for Rc>> { - fn command_matches( - &self, - user: &Cred, - command: &[String], - ) -> Result, MatchError> { - let mut min_task = TaskMatch { - score: Score { - user_min: self.user_matches(user), - cmd_min: CmdMin::empty(), - caps_min: CapsMin::Undefined, - setuid_min: SetuidMin::Undefined, - security_min: SecurityMin::empty(), - }, - settings: ExecSettings::new(), - }; +// impl TaskMatcher for Rc> { +// fn matches( +// &self, +// user: &Cred, +// command: &[String], +// ) -> Result { +// let mut min_task = TaskMatch { +// score: Score { +// user_min: self.user_matches(user), +// cmd_min: CmdMin::empty(), +// caps_min: CapsMin::Undefined, +// setuid_min: SetuidMin::Undefined, +// security_min: SecurityMin::empty(), +// }, +// settings: ExecSettings::new(), +// }; +// let mut nmatch = 0; +// let borrow = self.as_ref().borrow(); +// for task in borrow.tasks.iter() { +// match task.matches(user, command) { +// Ok(task_match) => { +// debug!( +// "if min_task.score.cmd_min.is_empty() : {}", +// min_task.score.cmd_min.is_empty() +// ); +// debug!( +// "task_match.score < min_task.score : {:?} < {:?} -> {}", +// task_match.score.prettyprint(), +// min_task.score.prettyprint(), +// task_match.score < min_task.score +// ); +// if min_task.score.cmd_min.is_empty() || task_match.score < min_task.score { +// debug!( +// "Role {} : Match for task {}", +// self.as_ref().borrow().name, +// task.as_ref().borrow().id.to_string() +// ); +// let mut task_match = task_match; +// task_match.score.user_min = min_task.score.user_min; +// task_match.settings.task = Rc::downgrade(task); +// min_task = task_match; +// nmatch = 1; +// } else if task_match.score == min_task.score { +// nmatch += 1; +// } +// } +// Err(err) => match err { +// MatchError::NoMatch => { +// debug!( +// "Role {} : No match for task {}", +// self.as_ref().borrow().name, +// task.as_ref().borrow().id.to_string() +// ); +// continue; +// } +// MatchError::Conflict => { +// debug!( +// "Role {} : Conflict in task {}", +// self.as_ref().borrow().name, +// task.as_ref().borrow().id.to_string() +// ); +// return Err(err); +// } +// }, +// }; +// } +// if nmatch == 1 { +// Ok(min_task) +// } else if nmatch > 1 { +// Err(MatchError::Conflict) +// } else { +// Err(MatchError::NoMatch) +// } +// } +// } + +impl TaskMatcher for Vec>> { + fn matches(&self, user: &Cred, command: &[String]) -> Result { + let mut min_task = TaskMatch::default(); let mut nmatch = 0; - let borrow = self.as_ref().borrow(); - for task in borrow.tasks.iter() { + for task in self.iter() { match task.matches(user, command) { Ok(task_match) => { - debug!( - "if min_task.score.cmd_min.is_empty() : {}", - min_task.score.cmd_min.is_empty() - ); - debug!( - "task_match.score < min_task.score : {:?} < {:?} -> {}", - task_match.score.prettyprint(), - min_task.score.prettyprint(), - task_match.score < min_task.score - ); - if min_task.score.cmd_min.is_empty() || task_match.score < min_task.score { - debug!( - "Role {} : Match for task {}", - self.as_ref().borrow().name, - task.as_ref().borrow().id.to_string() - ); + if !min_task.is_matching() || task_match.score < min_task.score { let mut task_match = task_match; task_match.score.user_min = min_task.score.user_min; task_match.settings.task = Rc::downgrade(task); @@ -603,47 +721,69 @@ impl<'a> RoleMatcher<'a> for Rc>> { } Err(err) => match err { MatchError::NoMatch => { - debug!( - "Role {} : No match for task {}", - self.as_ref().borrow().name, - task.as_ref().borrow().id.to_string() - ); continue; } MatchError::Conflict => { - debug!( - "Role {} : Conflict in task {}", - self.as_ref().borrow().name, - task.as_ref().borrow().id.to_string() - ); return Err(err); } }, - }; + } } - if nmatch == 1 { + if nmatch == 0 { + Err(MatchError::NoMatch) + } else if nmatch == 1 { Ok(min_task) - } else if nmatch > 1 { - Err(MatchError::Conflict) } else { + Err(MatchError::Conflict) + } + } +} + +impl TaskMatcher for Vec>> { + fn matches(&self, user: &Cred, command: &[String]) -> Result { + let mut min_role = TaskMatch::default(); + let mut nmatch = 0; + for role in self.iter() { + match role.matches(user, command) { + Ok(mut role_match) => { + role_match.score.user_min = min_role.score.user_min; + if min_role.score.cmd_min.is_empty() || role_match.score < min_role.score { + min_role = role_match; + nmatch = 1; + } else if role_match.score == min_role.score + && !Rc::ptr_eq( + &role_match.settings.task.upgrade().unwrap(), + &min_role.settings.task.upgrade().unwrap(), + ) + { + nmatch += 1; + } + } + Err(err) => { + if err == MatchError::NoMatch { + continue; + } else { + return Err(err); + } + } + } + } + if nmatch == 0 { Err(MatchError::NoMatch) + } else if nmatch == 1 { + Ok(min_role) + } else { + Err(MatchError::Conflict) } } + } -impl<'a> TaskMatcher> for Rc>> { - fn matches(&self, user: &Cred, command: &[String]) -> Result, MatchError> { +impl TaskMatcher for Rc> { + fn matches(&self, user: &Cred, command: &[String]) -> Result { let borrow = self.as_ref().borrow(); - let mut min_role = TaskMatch { - score: Score { - user_min: self.user_matches(user), - cmd_min: CmdMin::empty(), - caps_min: CapsMin::Undefined, - setuid_min: SetuidMin::Undefined, - security_min: SecurityMin::empty(), - }, - settings: ExecSettings::new(), - }; + let mut min_role = TaskMatch::default(); + min_role.score.user_min = self.user_matches(user); debug!( "==== Role {} ====\n score: {}", self.as_ref().borrow().name, @@ -653,77 +793,37 @@ impl<'a> TaskMatcher> for Rc { - command_match.score.user_min = min_role.score.user_min; - min_role = command_match; + let task_match = borrow.tasks.matches(user, command)?; + if !min_role.is_matching() || (task_match.is_matching() && task_match.score < min_role.score) { + min_role = task_match; + nmatch = 1; + } + let mut matcher = TaskMatch::default(); + // notify plugins + match PluginManager::notify_role_matcher(&borrow, user, command, &mut matcher) { + PluginResultAction::Override => { + min_role = matcher; nmatch = 1; } - Err(err) => { - if err == MatchError::Conflict { - return Err(err); + PluginResultAction::Edit => { + if !min_role.is_matching() || (matcher.is_matching() && matcher.score < min_role.score) { + min_role = matcher; + nmatch = 1; + } else if matcher.score == min_role.score { + nmatch += 1; } } - }; - debug!("search a better role in parents"); - if let Some(ref parent) = borrow.parents { - for parent in parent.iter() { - let parent = parent.upgrade().expect("Internal Error"); - debug!("Search in parent {}", parent.as_ref().borrow().name); - match parent.command_matches(user, command) { - Ok(mut command_match) => { - command_match.score.user_min = min_role.score.user_min; - if min_role.score.cmd_min.is_empty() || command_match.score < min_role.score - { - min_role = command_match; - nmatch = 1; - } else if command_match.score == min_role.score - && !Rc::ptr_eq( - &command_match.settings.task.upgrade().unwrap(), - &min_role.settings.task.upgrade().unwrap(), - ) - { - debug!("Conflict in parent {}", parent.as_ref().borrow().name); - debug!( - "{:?} == {:?}", - command_match - .settings - .task - .upgrade() - .unwrap() - .as_ref() - .borrow() - .id, - min_role - .settings - .task - .upgrade() - .unwrap() - .as_ref() - .borrow() - .id - ); - nmatch += 1; - } - } - Err(err) => { - if err == MatchError::NoMatch { - continue; - } else { - return Err(err); - } - } - } + PluginResultAction::Ignore => { + } } - debug!("END search a better role in parents"); if nmatch == 0 { Err(MatchError::NoMatch) } else if nmatch == 1 { debug!( "=== Role {} === : Match for task {}\nScore : {}", self.as_ref().borrow().name, - min_role.task().as_ref().borrow().id.to_string(), + min_role.task().as_ref().borrow().name.to_string(), min_role.score.prettyprint() ); Ok(min_role) @@ -733,13 +833,13 @@ impl<'a> TaskMatcher> for Rc TaskMatcher> for Rc>> { - fn matches(&self, user: &Cred, command: &[String]) -> Result, MatchError> { +impl TaskMatcher for Rc> { + fn matches(&self, user: &Cred, command: &[String]) -> Result { debug!( "Config : Matching user {} with command {:?}", user.user.name, command ); - let mut tasks: Vec> = Vec::new(); + let mut tasks: Vec = Vec::new(); for role in self.as_ref().borrow().roles.iter() { if let Ok(matched) = role.matches(user, command) { if tasks.is_empty() || matched.score < tasks[0].score { @@ -764,7 +864,7 @@ impl<'a> TaskMatcher> for Rc>> { "Config : Matched user {}\n - command {:?}\n - with task {}\n - with role {}\n - with score {:?}", user.user.name, command, - tasks[0].task().as_ref().borrow().id.to_string(), + tasks[0].task().as_ref().borrow().name.to_string(), tasks[0].role().as_ref().borrow().name, tasks[0].score.prettyprint() ); @@ -778,14 +878,14 @@ mod tests { use capctl::Cap; use test_log::test; - use crate::{config::structs::IdTask, xml_version::PACKAGE_VERSION}; + + use crate::{common::database::{options::{SBounding, SPrivileged}, structs::IdTask}, rc_refcell}; use super::*; #[test] fn test_match_path() { - let mut result = CmdMin::empty(); - assert!(match_path(&"/bin/ls".to_string(), &"/bin/ls".to_string(), &mut result).is_ok()); + let result = match_path(&"/bin/ls".to_string(), &"/bin/ls".to_string()); assert_eq!(result, CmdMin::Match); } @@ -801,30 +901,24 @@ mod tests { #[test] fn test_match_command_line() { - let mut final_binary_path = PathBuf::new(); let result = match_command_line( &vec!["/bin/ls".to_string(), "-l".to_string(), "-a".to_string()], &vec!["/bin/ls".to_string(), "-l".to_string(), "-a".to_string()], - &mut final_binary_path, ); assert_eq!(result, CmdMin::Match); - assert_eq!(final_binary_path, PathBuf::from("/usr/bin/ls")); } #[test] fn test_get_cmd_min() { - let mut final_binary_path = PathBuf::new(); let result = get_cmd_min( &vec!["/bin/ls".to_string(), "-l".to_string(), "-a".to_string()], &vec![ - "/bin/l*".to_string(), - "/bin/ls .*".to_string(), - "/bin/ls -l -a".to_string(), + "/bin/l*".into(), + "/bin/ls .*".into(), + "/bin/ls -l -a".into(), ], - &mut final_binary_path, ); assert_eq!(result, CmdMin::Match); - assert_eq!(final_binary_path, PathBuf::from("/usr/bin/ls")); } #[test] @@ -854,9 +948,9 @@ mod tests { #[test] fn test_get_security_min() { - let mut opt = Opt::new(crate::config::options::Level::Default); - opt.disable_bounding = Some(true); - opt.allow_root = Some(true); + let mut opt = Opt::default(); + opt.bounding = Some(SBounding::Ignore); + opt.root = Some(SPrivileged::Privileged); assert_eq!( get_security_min(&Some(Rc::new(RefCell::new(opt)))), SecurityMin::DisableBounding | SecurityMin::EnableRoot @@ -865,57 +959,50 @@ mod tests { #[test] fn test_is_root() { - assert!(is_root(&"root".to_string())); - assert!(is_root(&"0".to_string())); - assert!(!is_root(&"1".to_string())); + assert!(is_root(&"root".into())); + assert!(is_root(&0.into())); + assert!(!is_root(&1.into())); } #[test] fn test_list_contains_root() { - let mut list = Groups { groups: Vec::new() }; - list.groups.push("root".to_string()); - assert!(list_contains_root(&list)); - list.groups.clear(); - list.groups.push("0".to_string()); - assert!(list_contains_root(&list)); - list.groups.clear(); - list.groups.push("1".to_string()); - assert!(!list_contains_root(&list)); + let mut list = SGroups::Single("root".into()); + assert!(groups_contains_root(Some(&list))); + list = SGroups::Multiple(vec!["root".into(), 1.into()]); + assert!(groups_contains_root(Some(&list))); + list = SGroups::Multiple(vec![1.into(), 2.into()]); + assert!(!groups_contains_root(Some(&list))); } #[test] fn test_get_setuid_min() { - let mut setuid = Some("root".to_string()); - let mut setgid = Some(Groups { - groups: vec!["root".to_string()], - }); + let mut setuid: Option = Some("root".into()); + let mut setgid = Some(SGroups::Single("root".into())); let security_min = SecurityMin::EnableRoot; assert_eq!( - get_setuid_min(&setuid, &setgid, &security_min), + get_setuid_min(setuid.as_ref(), setgid.as_ref(), &security_min), SetuidMin::SetuidSetgidRoot(1) ); - setuid = Some("1".to_string()); + setuid = Some("1".into()); assert_eq!( - get_setuid_min(&setuid, &setgid, &security_min), + get_setuid_min(setuid.as_ref(), setgid.as_ref(), &security_min), SetuidMin::SetuidNotrootSetgidRoot(1) ); - setgid = Some(Groups { - groups: vec!["1".to_string(), "2".to_string()], - }); + setgid = Some(SGroups::Multiple(vec![1.into(), 2.into()])); assert_eq!( - get_setuid_min(&setuid, &setgid, &security_min), + get_setuid_min(setuid.as_ref(), setgid.as_ref(), &security_min), SetuidMin::SetuidSetgid(2) ); assert_eq!( - get_setuid_min(&None, &setgid, &security_min), + get_setuid_min(None, setgid.as_ref(), &security_min), SetuidMin::Setgid(2) ); assert_eq!( - get_setuid_min(&None, &None, &security_min), + get_setuid_min(None, None, &security_min), SetuidMin::NoSetuidNoSetgid ); assert_eq!( - get_setuid_min(&setuid, &None, &security_min), + get_setuid_min(setuid.as_ref(), None, &security_min), SetuidMin::Setuid ) } @@ -979,30 +1066,33 @@ mod tests { assert_eq!(score1.cmp(&score2), Ordering::Equal); } - fn setup_test_config(num_roles: usize) -> Rc>> { - let config = Config::new(PACKAGE_VERSION); + fn setup_test_config(num_roles: usize) -> Rc> { + let config = Rc::new(SConfig::default().into()); for i in 0..num_roles { - let role = Role::new(format!("role{}", i), Some(Rc::downgrade(&config))); - config.as_ref().borrow_mut().roles.push(role); + let mut role = SRole::default(); + role.name = format!("role{}", i); + role._config = Some(Rc::downgrade(&config)); + config.as_ref().borrow_mut().roles.push(rc_refcell!(role)); } config } fn setup_test_role( num_tasks: usize, - role: Option>>>, - with_config: Option>>>, - ) -> Rc>> { - let role = role.unwrap_or(Role::new( - "test".to_string(), - with_config.and_then(|c| Some(Rc::downgrade(&c))), - )); + role: Option>>, + with_config: Option>>, + ) -> Rc> { + let role = role.unwrap_or_else( || { + let mut role = SRole::default(); + role.name = "test".to_string(); + role._config = with_config.map(|config| Rc::downgrade(&config)); + Rc::new(RefCell::new(role)) + }); for i in 0..num_tasks { - let task = Task::new( - IdTask::Name(format!("{}_task_{}", role.as_ref().borrow().name, i)), - Rc::downgrade(&role), - ); - role.as_ref().borrow_mut().tasks.push(task); + let mut task = STask::default(); + task.name = IdTask::Name(format!("{}_task_{}", role.as_ref().borrow().name, i)); + task._role = Some(Rc::downgrade(&role)); + role.as_ref().borrow_mut().tasks.push(Rc::new(task.into())); } role } @@ -1018,38 +1108,39 @@ mod tests { let r2_task2 = role2.as_ref().borrow().tasks[1].clone(); // every tasks matches but not at the same score, so the least one is matched - role1.as_ref().borrow_mut().users.push("root".to_string()); - role2.as_ref().borrow_mut().users.push("root".to_string()); - - //resolve conflict if two roles returns same tasks because of parents - role2.as_ref().borrow_mut().parents = Some(vec![Rc::downgrade(&role1)]); + role1.as_ref().borrow_mut().actors.push(SActor::from_user_string("root".into())); + role2.as_ref().borrow_mut().actors.push(SActor::from_user_string("root".into())); r1_task1 .as_ref() .borrow_mut() .commands - .push("/bin/ls -l -a".to_string()); // candidate + .add + .push("/bin/ls -l -a".into()); // candidate r1_task2 .as_ref() .borrow_mut() .commands - .push("/bin/ls .*".to_string()); // regex args > r1_task1 + .add + .push("/bin/ls .*".into()); // regex args > r1_task1 r2_task1 .as_ref() .borrow_mut() .commands - .push("/bin/ls -l -a".to_string()); //AllCaps > r1_task1 + .add + .push("/bin/ls -l -a".into()); //AllCaps > r1_task1 r2_task2 .as_ref() .borrow_mut() .commands - .push("/bin/ls -l -a".to_string()); //One Capability > r1_task1 + .add + .push("/bin/ls -l -a".into()); //One Capability > r1_task1 - r2_task1.as_ref().borrow_mut().capabilities = Some(!CapSet::empty()); + r2_task1.as_ref().borrow_mut().cred.capabilities = Some((!CapSet::empty()).into()); let mut capset = CapSet::empty(); capset.add(Cap::SYS_ADMIN); - r2_task2.as_ref().borrow_mut().capabilities = Some(capset); + r2_task2.as_ref().borrow_mut().cred.capabilities = Some(capset.into()); let cred = Cred { user: User::from_name("root").unwrap().unwrap(), @@ -1065,7 +1156,7 @@ mod tests { assert!(result.is_ok()); let result = result.unwrap(); assert_eq!( - result.task().as_ref().borrow().id, + result.task().as_ref().borrow().name, IdTask::Name("role0_task_0".to_string()) ); assert_eq!(result.role().as_ref().borrow().name, "role0"); diff --git a/src/sr/main.rs b/src/sr/main.rs index 7790380a..680eed69 100644 --- a/src/sr/main.rs +++ b/src/sr/main.rs @@ -1,30 +1,34 @@ mod command; -#[path = "../config/mod.rs"] -mod config; +#[path = "../mod.rs"] +mod common; mod finder; mod timeout; -#[path = "../util.rs"] -mod util; -#[path = "../xml_version.rs"] -mod xml_version; - -use std::{collections::HashMap, env::Vars, io::stdout, ops::Not, os::fd::AsRawFd}; use capctl::{prctl, Cap, CapState}; use clap::Parser; -use config::{load::load_config, FILENAME}; -use finder::{Cred, TaskMatcher}; +use common::{ + config::{Settings, ROOTASROLE}, + database::structs::SConfig, +}; +use finder::{Cred, ExecSettings, TaskMatcher}; use nix::{ libc::{dev_t, PATH_MAX}, sys::stat, - unistd::{getgroups, getuid, isatty, setegid, seteuid, setgroups, Group, User}, + unistd::{getgroups, getuid, isatty, Group, User}, }; use pam_client::{conv_cli::Conversation, Context, Flag}; +use pty_process::blocking::{Command, Pty}; #[cfg(not(debug_assertions))] use std::panic::set_hook; +use std::{ + cell::RefCell, collections::HashMap, env::Vars, error::Error, io::stdout, os::fd::AsRawFd, + rc::Rc, +}; use tracing::{debug, error, Level}; use tracing_subscriber::util::SubscriberInitExt; +use crate::common::{config, database::structs::SGroups}; + #[derive(Parser, Debug)] #[command( about = "Execute privileged commands with a role-based access control system", @@ -44,6 +48,10 @@ struct Cli { command: Vec, } +enum Storage { + JSON(Rc>), +} + fn cap_effective(cap: Cap, enable: bool) -> Result<(), capctl::Error> { let mut current = CapState::get_current()?; current.effective.set_state(cap, enable); @@ -133,10 +141,13 @@ fn check_var(key: &str, value: &str) -> bool { } } -fn filter_env_vars(env: Vars, checklist: &[&str], whitelist: &[&str]) -> HashMap { +fn filter_env_vars( + env: Vars, + checklist: &[String], + whitelist: &[String], +) -> HashMap { env.filter(|(key, value)| { - checklist.contains(&key.as_str()) && check_var(key, value) - || whitelist.contains(&key.as_str()) + checklist.contains(key) && check_var(key, value) || whitelist.contains(key) }) .collect() } @@ -201,14 +212,48 @@ fn add_dashes() -> Vec { args } +fn read_json_config(settings: Settings) -> Result>, Box> { + let file = std::fs::File::open( + settings + .remote_storage_settings + .unwrap_or_default() + .path + .unwrap_or(ROOTASROLE.into()), + )?; + let config = serde_json::from_reader(file)?; + Ok(config) +} + +fn from_json_execution_settings( + args: &Cli, + config: &Rc>, + user: &Cred, +) -> Result> { + match &args.role { + None => match config.matches(&user, &args.command) { + Err(_) => { + error!("Permission Denied"); + std::process::exit(1); + } + Ok(matching) => Ok(matching.settings), + }, + Some(role) => Ok(as_borrow!(config) + .role(&role) + .expect("Permission Denied") + .matches(&user, &args.command) + .expect("Permission Denied") + .settings), + } +} + fn main() { subsribe(); let args = add_dashes(); let args = Cli::parse_from(args.iter()); read_effective(true).expect("Failed to read_effective"); - let config = load_config(&FILENAME).expect("Failed to load config file"); + let settings = config::get_settings(); read_effective(false).expect("Failed to read_effective"); - debug!("loaded config : {:#?}", config); + debug!("loaded config : {:#?}", settings); let user = User::from_uid(getuid()) .expect("Failed to get user") .expect("Failed to get user"); @@ -247,7 +292,18 @@ fn main() { }; dac_override_effective(true).expect("Failed to dac_override_effective"); - let is_valid = timeout::is_valid(&user, &user, &config.as_ref().borrow().timestamp); + let config = match settings.storage_method { + config::StorageMethod::JSON => { + Storage::JSON(read_json_config(settings).expect("Failed to read config")) + } + _ => { + error!("Unsupported storage method"); + std::process::exit(1); + } + }; + let is_valid = match config { + Storage::JSON(ref config) => timeout::is_valid(&user, &user, &config.as_ref().borrow().timeout), + }; debug!("need to re-authenticate : {}", !is_valid); if !is_valid { let mut context = Context::new("sr", Some(&user.user.name), Conversation::new()) @@ -255,41 +311,38 @@ fn main() { context.authenticate(Flag::NONE).expect("Permission Denied"); context.acct_mgmt(Flag::NONE).expect("Permission Denied"); } - timeout::update_cookie(&user, &user, &config.as_ref().borrow().timestamp) - .expect("Failed to add cookie"); + match config { + Storage::JSON(ref config) => { + timeout::update_cookie(&user, &user, &config.as_ref().borrow().timeout) + .expect("Failed to add cookie"); + } + } dac_override_effective(false).expect("Failed to dac_override_effective"); - let matching = match args.role { - None => match config.matches(&user, &args.command) { - Err(err) => { - error!("Permission Denied"); - std::process::exit(1); - } - Ok(matching) => matching, - }, - Some(role) => config - .as_ref() - .borrow() - .roles - .iter() - .find(|r| r.as_ref().borrow().name == role) - .expect("Permission Denied") - .matches(&user, &args.command) - .expect("Permission Denied"), + let matching: ExecSettings = match config { + Storage::JSON(ref config) => { + let result = + from_json_execution_settings(&args, config, &user).expect("Failed to get settings"); + + result + } }; debug!( "Config : Matched user {}\n - with task {}\n - with role {}", user.user.name, - matching.task().as_ref().borrow().id.to_string(), + matching.task().as_ref().borrow().name.to_string(), matching.role().as_ref().borrow().name ); if args.info { println!("Role: {}", matching.role().as_ref().borrow().name); - println!("Task: {}", matching.task().as_ref().borrow().id.to_string()); + println!( + "Task: {}", + matching.task().as_ref().borrow().name.to_string() + ); println!( "With capabilities: {}", matching - .caps() + .caps .unwrap_or_default() .into_iter() .fold(String::new(), |acc, cap| acc + &cap.to_string() + " ") @@ -297,58 +350,82 @@ fn main() { std::process::exit(0); } - let optstack = matching.opt().as_ref().unwrap(); + let optstack = matching.opt.as_ref().unwrap(); // disable root - if optstack.get_no_root().1 { + if !optstack.get_root_behavior().1.is_privileged() { activates_no_new_privs().expect("Failed to activate no new privs"); } - debug!("setuid : {:?}", matching.setuid()); + debug!("setuid : {:?}", matching.setuid); - let uid = matching.setuid().as_ref().map(|u| { - User::from_name(&u) - .expect("Failed to get user") - .expect("Failed to get user") - .uid - .as_raw() + let uid = matching.setuid.and_then(|u| { + let res = u.into_user().unwrap_or(None); + if let Some(user) = res { + Some(user.uid.as_raw()) + } else { + None + } }); - let gid = matching.setgroups().as_ref().map(|g| { - Group::from_name(&g.groups[0]) - .expect("Failed to get group") - .expect("Failed to get group") - .gid - .as_raw() + let gid = matching.setgroups.as_ref().and_then(|g| match g { + SGroups::Single(g) => { + let res = g.into_group().unwrap_or(None); + if let Some(group) = res { + Some(group.gid.as_raw()) + } else { + None + } + } + SGroups::Multiple(g) => { + let res = g.get(0).unwrap().into_group().unwrap_or(None); + if let Some(group) = res { + Some(group.gid.as_raw()) + } else { + None + } + } }); - let groups = matching.setgroups().as_ref().map(|g| { - g.groups - .iter() - .map(|g| { - Group::from_name(g) - .expect("Failed to get group") - .expect("Failed to get group") - .gid - .as_raw() - }) - .collect::>() + let groups = matching.setgroups.as_ref().and_then(|g| { + match g { + SGroups::Single(g) => { + let res = g.into_group().unwrap_or(None); + if let Some(group) = res { + Some(vec![group.gid.as_raw()]) + } else { + None + } + } + SGroups::Multiple(g) => { + let res = g.iter().map(|g| g.into_group().unwrap_or(None)); + let mut groups = Vec::new(); + for group in res { + if let Some(group) = group { + groups.push(group.gid.as_raw()); + } + } + Some(groups) + } + } }); + setgid_effective(true).expect("Failed to setgid_effective"); setuid_effective(true).expect("Failed to setuid_effective"); capctl::cap_set_ids(uid, gid, groups.as_ref().map(|g| g.as_slice())) .expect("Failed to set ids"); + setgid_effective(false).expect("Failed to setgid_effective"); setuid_effective(false).expect("Failed to setuid_effective"); //set capabilities - if let Some(caps) = matching.caps() { + if let Some(caps) = matching.caps { setpcap_effective(true).expect("Failed to setpcap_effective"); let mut capstate = CapState::empty(); - if optstack.get_bounding().1 { - for cap in caps.not().iter() { + if !optstack.get_bounding().1.is_ignore() { + for cap in (!caps).iter() { capctl::bounding::drop(cap).expect("Failed to set bounding cap"); } } - capstate.permitted = *caps; - capstate.inheritable = *caps; + capstate.permitted = caps; + capstate.inheritable = caps; capstate.set_current().expect("Failed to set current cap"); for cap in caps.iter() { capctl::ambient::raise(cap).expect("Failed to set ambiant cap"); @@ -356,7 +433,7 @@ fn main() { setpcap_effective(false).expect("Failed to setpcap_effective"); } else { setpcap_effective(true).expect("Failed to setpcap_effective"); - if optstack.get_bounding().1 { + if !optstack.get_bounding().1.is_ignore() { capctl::bounding::clear().expect("Failed to clear bounding cap"); } let capstate = CapState::empty(); @@ -365,26 +442,30 @@ fn main() { } //execute command - let checklist = optstack.get_env_checklist().1; - let whitelist = optstack.get_env_whitelist().1; - let veccheck: Vec<&str> = checklist.split(',').collect(); - let vecwhitelist: Vec<&str> = whitelist.split(',').collect(); - let mut command = std::process::Command::new(matching.file_exec_path()) - .args(matching.exec_args()) - .envs(filter_env_vars(std::env::vars(), &veccheck, &vecwhitelist)) + let envset = optstack.calculate_filtered_env().expect("Failed to calculate env"); + let pty = Pty::new().expect("Failed to create pty"); + + let command = Command::new(&matching.exec_path) + .args(matching.exec_args) + .envs(envset) .stdin(std::process::Stdio::inherit()) .stdout(std::process::Stdio::inherit()) .stderr(std::process::Stdio::inherit()) - .spawn(); + .spawn(&pty.pts().expect("Failed to get pts")); let mut command = match command { Ok(command) => command, Err(_) => { - error!("{} : command not found", matching.file_exec_path()); - eprintln!("sr: {} : command not found", matching.file_exec_path()); + error!( + "{} : command not found", + matching.exec_path.display() + ); + eprintln!( + "sr: {} : command not found", + matching.exec_path.display() + ); std::process::exit(1); } }; - //wait for command to finish let status = command.wait().expect("Failed to wait for command"); std::process::exit(status.code().unwrap_or(1)); } diff --git a/src/sr/timeout.rs b/src/sr/timeout.rs index a6086fb5..d4a28a42 100644 --- a/src/sr/timeout.rs +++ b/src/sr/timeout.rs @@ -7,42 +7,18 @@ use std::{ time, }; -use chrono::{TimeZone, Utc}; +use chrono::Utc; use nix::{ libc::dev_t, libc::{pid_t, uid_t}, sys::signal::kill, }; use serde::{Deserialize, Serialize}; -use std::str::FromStr; use tracing::debug; -use crate::{config::structs::CookieConstraint, finder::Cred}; +use crate::{common::database::structs::{STimeout, TimestampType}, finder::Cred}; -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -#[repr(u8)] -#[derive(Default)] -pub enum TimestampType { - Global, - TTY, - #[default] - PPID, -} -impl FromStr for TimestampType { - type Err = (); - fn from_str(s: &str) -> Result { - match s { - "global" => Ok(TimestampType::Global), - "tty" => Ok(TimestampType::TTY), - "ppid" => Ok(TimestampType::PPID), - _ => { - debug!("Invalid timestamp type: {}", s); - Err(()) - } - } - } -} /// This module checks the validity of a user's credentials /// This module allow to users to not have to re-enter their password in a short period of time @@ -64,7 +40,7 @@ impl Default for ParentRecord { match TimestampType::default() { TimestampType::TTY => Self::TTY(0), TimestampType::PPID => Self::PPID(0), - TimestampType::Global => Self::None, + TimestampType::UID => Self::None, } } } @@ -80,7 +56,7 @@ impl ParentRecord { } } TimestampType::PPID => Self::PPID(user.ppid.as_raw()), - TimestampType::Global => Self::None, + TimestampType::UID => Self::None, } } } @@ -90,7 +66,7 @@ struct Cookiev1 { timestamp_type: TimestampType, start_time: i64, timestamp: i64, - usage: u32, + usage: u64, parent_record: ParentRecord, auth_uid: uid_t, } @@ -210,7 +186,7 @@ fn save_cookies(user: &Cred, cookies: &Vec) -> Result<(), Box Option { let mut cookies = read_cookies(from).unwrap_or_default(); @@ -226,15 +202,15 @@ fn find_valid_cookie( CookieVersion::V1(cookie) => { debug!("Checking cookie: {:?}", cookie); if cookie.auth_uid != cred_asked.user.uid.as_raw() - || cookie.timestamp_type != constraint.timestamptype.parse().unwrap() + || cookie.timestamp_type != constraint.type_field { continue; } let max_usage_ok = constraint.max_usage.is_none() || cookie.usage < constraint.max_usage.unwrap(); - debug!("timestamp: {}, now: {}, offset {}, now + offset : {}\ntimestamp-now+offset : {}", cookie.timestamp, Utc::now().timestamp(), constraint.offset.num_seconds(), Utc::now().timestamp() + constraint.offset.num_seconds(), cookie.timestamp - Utc::now().timestamp() + constraint.offset.num_seconds()); + debug!("timestamp: {}, now: {}, offset {}, now + offset : {}\ntimestamp-now+offset : {}", cookie.timestamp, Utc::now().timestamp(), constraint.duration.num_seconds(), Utc::now().timestamp() + constraint.duration.num_seconds(), cookie.timestamp - Utc::now().timestamp() + constraint.duration.num_seconds()); let timeofuse: bool = - cookie.timestamp - Utc::now().timestamp() + constraint.offset.num_seconds() > 0; + cookie.timestamp - Utc::now().timestamp() + constraint.duration.num_seconds() > 0; debug!("Time of use: {}, max_usage : {}", timeofuse, max_usage_ok); if timeofuse && max_usage_ok && res.is_none() { editcookie(cookiev); @@ -259,7 +235,7 @@ fn find_valid_cookie( /// @param cred_asked: the credentials of the user that is asked to execute a command /// @param max_offset: the maximum offset between the current time and the time of the credentials, including the type of the offset /// @return true if the credentials are valid, false otherwise -pub(crate) fn is_valid(from: &Cred, cred_asked: &Cred, constraint: &CookieConstraint) -> bool { +pub(crate) fn is_valid(from: &Cred, cred_asked: &Cred, constraint: &STimeout) -> bool { find_valid_cookie(from, cred_asked, constraint, |_c| { debug!("Found valid cookie "); }) @@ -270,7 +246,7 @@ pub(crate) fn is_valid(from: &Cred, cred_asked: &Cred, constraint: &CookieConstr pub(crate) fn update_cookie( from: &Cred, cred_asked: &Cred, - constraint: &CookieConstraint, + constraint: &STimeout, ) -> Result<(), Box> { let res = find_valid_cookie(from, cred_asked, constraint, |cookie| match cookie { CookieVersion::V1(cookie) => { @@ -281,11 +257,10 @@ pub(crate) fn update_cookie( }); if res.is_none() { let mut cookies = read_cookies(from).unwrap_or_default(); - let timestamp_type: TimestampType = constraint.timestamptype.parse().unwrap_or_default(); - let parent_record = ParentRecord::new(×tamp_type, from); + let parent_record = ParentRecord::new(&constraint.type_field, from); let cookie = CookieVersion::V1(Cookiev1 { auth_uid: cred_asked.user.uid.as_raw(), - timestamp_type, + timestamp_type: constraint.type_field, start_time: Utc::now().timestamp(), timestamp: Utc::now().timestamp(), usage: 0, diff --git a/src/util.rs b/src/util.rs index d9c34245..d486d4b4 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,5 +1,33 @@ use capctl::{Cap, CapSet, ParseCapError}; +#[macro_export] +macro_rules! upweak { + ($e:expr) => { + $e.upgrade().unwrap() + }; +} + +#[macro_export] +macro_rules! as_borrow { + ($e:expr) => { + $e.as_ref().borrow() + }; +} + +#[macro_export] +macro_rules! as_borrow_mut { + ($e:expr) => { + $e.as_ref().borrow_mut() + }; +} + +#[macro_export] +macro_rules! rc_refcell { + ($e:expr) => { + std::rc::Rc::new(std::cell::RefCell::new($e)) + }; +} + pub fn capset_to_string(set: &CapSet) -> String { set.iter() .fold(String::new(), |mut acc, cap| { @@ -33,12 +61,15 @@ where Ok(res) } -pub fn parse_capset(s: &str) -> Result { - if s.is_empty() || s.eq_ignore_ascii_case("all") { - return Ok(!CapSet::empty()); +pub fn parse_capset(s: &String) -> Result { + let mut init = CapSet::empty(); + if s.to_lowercase().replace(" ", "").starts_with("all-") { + parse_capset_iter(s.replace('-', "").split_at(3).1.split(' ')).and(Ok(!init)) + } else { + parse_capset_iter(s.split(' ')) } - parse_capset_iter(s.split(' ')) + } /// Reference every capabilities that lead to almost a direct privilege escalation @@ -60,6 +91,7 @@ pub fn capabilities_are_exploitable(caps: &CapSet) -> bool { || caps.has(Cap::MKNOD) } + #[cfg(test)] pub(super) mod test { pub fn test_resources_folder() -> std::path::PathBuf { diff --git a/src/version.rs b/src/version.rs new file mode 100644 index 00000000..aeb27d5e --- /dev/null +++ b/src/version.rs @@ -0,0 +1,4 @@ +// This file is generated by build.rs +// Do not edit this file directly +// Instead edit build.rs and run cargo build +pub const PACKAGE_VERSION: &'static str = "3.0.0-alpha.4"; diff --git a/src/xml_version.rs b/src/xml_version.rs deleted file mode 100644 index d865e34f..00000000 --- a/src/xml_version.rs +++ /dev/null @@ -1,40 +0,0 @@ -// This file is generated by build.rs -// Do not edit this file directly -// Instead edit build.rs and run cargo build -pub const PACKAGE_VERSION: &'static str = "3.0.0-alpha.3"; -pub const DTD: &'static str = " - - - - - - - - - - - - - - - - - - - - - - - -]> -"; diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index 281b4ca1..58ecba82 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "xtask" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" edition = "2021" [dependencies] From 30ef90310d25e00f8ec9476b77ea602fbf60bb83 Mon Sep 17 00:00:00 2001 From: LeChatP Date: Fri, 29 Mar 2024 10:00:16 +0100 Subject: [PATCH 02/42] first iteration for chsr (not working) --- src/chsr/cli.rs | 625 +++++++++++++++----------------------- src/chsr/main.rs | 9 +- src/chsr/rolemanager.rs | 172 +++++++++-- src/chsr/state/command.rs | 26 +- src/chsr/state/role.rs | 18 +- src/chsr/state/task.rs | 58 +++- 6 files changed, 476 insertions(+), 432 deletions(-) diff --git a/src/chsr/cli.rs b/src/chsr/cli.rs index e085d3a2..990301fe 100644 --- a/src/chsr/cli.rs +++ b/src/chsr/cli.rs @@ -1,16 +1,7 @@ -use std::{collections::HashSet, error::Error}; +use std::error::Error; +use clap::{Parser, Subcommand, ValueEnum}; -use clap::{Parser, Subcommand}; -use nix::unistd::Group; - -use crate::{ - config::{ - options::{OptType, OptValue}, - structs::{Groups, IdTask, Save}, - }, - rolemanager::RoleContext, - util, -}; +use crate::rolemanager::RoleContext; //chsr newrole "role1" --user "user1" --group "group1" "group2" //chsr addtask "role1" --cmds "command1" --caps "cap_dac_override,cap_dac_read_search" @@ -41,65 +32,140 @@ struct Cli { command: Option, } +#[derive(ValueEnum, Debug, Clone, PartialEq, Eq)] // ArgEnum here +#[clap(rename_all = "kebab_case")] +enum Action { + Add, + Del, + Purge, + Set, + List, +} + +#[derive(ValueEnum, Debug, Clone, PartialEq, Eq)] // ArgEnum here +#[clap(rename_all = "kebab_case")] +enum Manage { + Grant, + Revoke, + Purge, + Set, + List, +} + #[derive(Subcommand, Debug, PartialEq, Eq)] enum CCommand { - /// List all roles - #[command(name = "list")] - List { - #[arg(short, long)] - /// Describe role - role: Option, - #[arg(short, long)] - /// Describe task within role - task: Option, - }, - /// Create a new role, you can add users, groups, tasks. You can assign tasks through the command "addtask" - #[command(name = "newrole")] - NewRole { + /// Manipulate role, you can add users, groups, tasks. You can assign tasks through the command "addtask" + #[command(name = "role")] + Role { + /// WARNING! Purge == remove all roles on the config + #[arg(value_enum)] + action: Action, + /// Always Confirm dangerous action if set + #[arg(short)] + yes: bool, + + /// Role name role: String, + /// Add users to role, multiple users can be added by multiple -u #[arg(short, long)] user: Option>, + /// Add groups to role, multiple groups can be added by multiple -g, + /// Group combinaison can be done by separating groups with a comma, + /// Example: -g group1 -g group2,group3 #[arg(short, long)] group: Option>, }, - /// You can grant users/groups to role - #[command(name = "grant")] - Grant { + + /// Manipulate users assigned to roles + #[command(name = "actors")] + Actors { + /// Purge == remove all users and groups from role + #[arg(value_enum)] + action: Manage, + /// Always Confirm dangerous action if set + #[arg(short)] + yes: bool, + + /// Role name role: String, + /// Add users to role, multiple users can be added by multiple -u #[arg(short, long)] user: Option>, + /// Add groups to role, multiple groups can be added by multiple -g, + /// Group combinaison can be done by separating groups with a comma, + /// Example: -g group1 -g group2,group3 #[arg(short, long)] group: Option>, }, - /// You can revoke users/groups from role - #[command(name = "revoke")] - Revoke { + + /// Add a task to a role, you can add commands and capabilities + #[command(name = "task")] + Task { + /// WARNING! Purge == remove all tasks from role + #[arg(value_enum)] + action: Action, + /// Always Confirm dangerous action if set + #[arg(short)] + yes: bool, + role: String, + #[arg(short = 't', long)] + id: Option, + }, + /// Perform action on command entries to a task + #[command(name = "cmd")] + Cmd { + /// WARNING! Purge == remove all commands from task, and set all_cmd to false + #[arg(value_enum)] + action: Action, + /// Always Confirm dangerous action if set + #[arg(short)] + yes: bool, + + role: String, + task_id: String, + /// If set, all commands are allowed. This option is exclusive with whitelist #[arg(short, long)] - user: Option>, + all_cmd: bool, + /// append whitelisted commands #[arg(short, long)] - group: Option>, + whitelist: Option>, + /// append blacklisted commands + #[arg(short, long)] + blacklist: Option>, }, - /// Add a task to a role, you can add commands and capabilities - #[command(name = "addtask")] - AddTask { + + #[command(name = "cred")] + Cred { + /// Purge == remove all credentials from task, the task will be executable as executor user without privileges. + #[arg(value_enum)] + action: Action, + /// Always Confirm dangerous action if set + #[arg(short)] + yes: bool, + role: String, + task_id: String, + /// Set capabilities to task + /// Format: cap1 cap2 cap3 + /// Or : all- cap1 cap2 #[arg(short, long)] - withid: Option, - #[arg(short, long)] - cmds: Option>, - #[arg(short = 'p', long)] caps: Option, + /// Setuid applied to task + #[arg(short, long)] + setuid: Option, + /// Setgid applied to task + #[arg(short, long)] + setgid: Option, }, - /// Delete a task from a role - #[command(name = "deltask")] - DelTask { role: String, id: String }, - /// Delete a role, this is not reversible - #[command(name = "delrole")] - DelRole { role: String }, - /// You could configure options for all roles, specific role, or specific task #[command(name = "config")] Config { + /// WARNING! Purge == purges global, role or task config considering the options you set + #[arg(value_enum)] + action: Action, + /// Always Confirm dangerous action if set + #[arg(short)] + yes: bool, #[arg(short, long)] /// Role name role: Option, @@ -118,6 +184,9 @@ enum CCommand { /// When false, capabilties are permanently dropped, when true, process can regain them (with sudo as example) #[arg(long)] allow_bounding: Option, + /// When false, root is disabled, when true, root is enabled + #[arg(long)] + allow_root: Option, /// When you configure command with wildcard, you can except chars of wildcard match #[arg(long)] wildcard_denied: Option, @@ -129,191 +198,132 @@ enum CCommand { }, } -/** - * Parse the command line arguments - */ -pub fn parse_args(manager: &mut RoleContext) -> Result> { - let args = Cli::parse(); - match args.command.as_ref() { - Some(CCommand::NewRole { role, user, group }) => { - manager.create_new_role(role.to_owned()); - let role = manager.get_role().unwrap(); - if let Some(user) = &user { - let user = user - .iter() - .collect::>() - .into_iter() - .map(|x| x.to_owned()) - .collect::>(); - role.as_ref().borrow_mut().users = user; - } - if let Some(group) = &group { - let group = group - .iter() - .collect::>() - .into_iter() - .collect::>(); - role.as_ref().borrow_mut().groups = group - .iter() - .map(|x| Into::::into(x.split(','))) - .collect::>(); +fn perform_option_command( + manager: &mut RoleContext, + action: Action, + opttype: OptType, + value: OptValue, +) { + match action { + Action::Add => { + let mut optvalue = manager.get_options().get_from_type(opttype); + match value { + OptValue::String(s) => { + optvalue.1.as_string().push_str(&s); + } + OptValue::VecString(v) => { + optvalue.1.as_vec_string().extend(v.0); + } + OptValue::Bool(b) => { + optvalue.1 = OptValue::Bool(value.as_bool()); + } } - manager.save_new_role(); - manager.save(None, None)?; - Ok(true) + manager.get_options().set_value(opttype, Some(optvalue.1)); } - Some(CCommand::Grant { role, user, group }) => { - let mut res = false; - if let Some(role) = manager.find_role(role.as_str()) { - if let Some(user) = &user { - let mut forbidden = Vec::new(); - for u in user { - if role.as_ref().borrow().user_is_forbidden(u) { - forbidden.push(u.to_owned()); - continue; - } - if !role.as_ref().borrow().users.contains(u) { - role.as_ref().borrow_mut().users.push(u.to_owned()); - } - } - if forbidden.is_empty() { - res = true; - } else { - println!("Forbidden users: {:?}", forbidden); - println!("By the static separation of duty, you can't grant these users to this role"); - } + Action::Del => { + let mut optvalue = manager.get_options().get_from_type(opttype); + match value { + OptValue::String(s) => { + optvalue.1 = OptValue::String(optvalue.1.as_string().replace(&s, "")); } - if let Some(group) = &group { - let mut already = Vec::new(); - let mut forbidden = Vec::new(); - let mut to_add = group - .iter() - .filter(|x| { - let xgroups = x - .split('&') - .filter_map(|x| match Group::from_name(x) { - Ok(Some(g)) => Some(g), - _ => None, - }) - .collect::>(); - for group in role.as_ref().borrow_mut().groups.iter() { - if group.is_unix_subset(&xgroups) { - already.push(group.to_owned()); - return false; - } - } - true - }) - .filter(|x| { - let xgroups = - x.split('&').map(|x| x.to_string()).collect::>(); - if role.as_ref().borrow().groups_are_forbidden(&xgroups) { - forbidden.push(xgroups); - false - } else { - true - } - }) - .map(|x| Into::::into(x.split('&'))) - .collect::>(); - role.as_ref().borrow_mut().groups.append(&mut to_add); - let groups = &role.as_ref().borrow_mut().groups; - role.as_ref().borrow_mut().groups = groups - .iter() - .collect::>() - .into_iter() - .map(|x| x.to_owned()) - .collect::>(); - - if !forbidden.is_empty() { - println!("Forbidden groups: {:?}", forbidden); - println!("By the static separation of duty, you can't grant these groups to this role"); - } - if !already.is_empty() { - println!("Groups already granted by their numberical id or name combinaison: {:?}", already); - } - if forbidden.is_empty() && already.is_empty() { - res = true; - } else { - println!("Others groups are successfully granted"); - } + OptValue::VecString(v) => { + optvalue.1.as_vec_string().retain(|x| !v.0.contains(x)); } - if res { - manager.save(None, None)?; + OptValue::Bool(b) => { + manager.get_options().set_value(opttype, None); + return; } } - Ok(res) + manager.get_options().set_value(opttype, Some(optvalue.1)); + } + Action::Purge => { + manager.get_options().unset_value(opttype); + } + Action::Set => { + manager.get_options().set_value(opttype, Some(value)); } - Some(CCommand::Revoke { role, user, group }) => { - let mut res = false; - if let Some(role) = manager.find_role(role.as_str()) { - if let Some(user) = &user { - for u in user { - if !role.as_ref().borrow().users.contains(u) { - role.as_ref().borrow_mut().users.retain(|x| x != u); - } - } - res = true; + Action::List => { + let paths = manager.get_options().get_from_type(opttype); + match paths.1 { + OptValue::String(s) => { + println!("{} = {}", opttype, s); } - if let Some(group) = &group { - role.as_ref().borrow_mut().groups = group - .iter() - .map(|x| Into::::into(x.split('&'))) - .collect::>(); - res = true; + OptValue::VecString(v) => { + println!("{} = {}", opttype, v.0.join(&v.1)); } - if res { - manager.save(None, None)?; + OptValue::Bool(b) => { + println!("{} = {}", opttype, b); } } - Ok(res) } - Some(CCommand::AddTask { + } +} + +/** + * Parse the command line arguments + */ +pub fn parse_args(manager: &mut RoleContext) -> Result> { + let args = Cli::parse(); + match args.command.as_ref() { + Some(CCommand::Role { + action, + yes, role, - withid, - cmds, - caps, + user, + group, + }) => { + Ok(true) + } + Some(CCommand::Actors { + action, + yes, + role, + user, + group, + }) => { + Ok(true) + } + Some(CCommand::Task { + action, + yes, + role, + id, }) => { - manager.select_role_by_name(role.as_str())?; - manager.create_new_task(withid.as_ref())?; - let task = manager.get_task().unwrap(); - if let Some(cmds) = &cmds { - task.as_ref().borrow_mut().commands = cmds.to_owned(); - } - if let Some(caps) = &caps { - let role = manager.get_role().unwrap(); - let caps = util::parse_capset(caps)?; - if role.as_ref().borrow().capabilities_are_denied(caps) { - println!( - "Capabilities {:?} are denied by role definition (or in hierarchy definition)", - role.as_ref().borrow().denied_capabilities().intersection(caps)); - return Ok(false); - } - task.as_ref().borrow_mut().capabilities = Some(caps); - } - manager.save(None, None)?; Ok(true) } - Some(CCommand::DelTask { role, id }) => { - manager.select_role_by_name(role.as_str())?; - manager.select_task_by_id(&IdTask::Name(id.to_string()))?; - manager.delete_task()?; - manager.save(None, None)?; + Some(CCommand::Cmd { + action, + yes, + role, + task_id, + all_cmd, + whitelist, + blacklist, + }) => { Ok(true) } - Some(CCommand::DelRole { role }) => { - manager.select_role_by_name(role.as_str())?; - manager.delete_role()?; - manager.save(None, None)?; + Some(CCommand::Cred { + action, + yes, + role, + task_id, + caps, + setuid, + setgid, + }) => { Ok(true) } + Some(CCommand::Config { + action, + yes, role, task, path, env_keep, env_check, allow_bounding, + allow_root, wildcard_denied, }) => { if let Some(role) = role.as_ref() { @@ -327,58 +337,54 @@ pub fn parse_args(manager: &mut RoleContext) -> Result> { manager.select_task_by_id(&tid)?; } if let Some(path) = path { - manager - .get_options() - .set_value(OptType::Path, Some(OptValue::String(path.to_string()))); + perform_option_command( + manager, + action.to_owned(), + OptType::Path, + OptValue::from_str_vec(OptType::Path, path.to_string()), + ); } if let Some(env_keep) = env_keep { - manager.get_options().set_value( + perform_option_command( + manager, + action.to_owned(), OptType::EnvWhitelist, - Some(OptValue::String(env_keep.to_string())), + OptValue::from_str_vec(OptType::EnvWhitelist, env_keep.to_string()), ); } if let Some(env_check) = env_check { - manager.get_options().set_value( + perform_option_command( + manager, + action.to_owned(), OptType::EnvChecklist, - Some(OptValue::String(env_check.to_string())), + OptValue::from_str_vec(OptType::EnvChecklist, env_check.to_string()), ); } if let Some(allow_bounding) = allow_bounding { - manager - .get_options() - .set_value(OptType::Bounding, Some(OptValue::Bool(*allow_bounding))); + perform_option_command( + manager, + action.to_owned(), + OptType::Bounding, + OptValue::Bool(allow_bounding.to_owned()), + ); + } + if let Some(allow_root) = allow_root { + perform_option_command( + manager, + action.to_owned(), + OptType::NoRoot, + OptValue::Bool(allow_root.to_owned()), + ); } if let Some(wildcard_denied) = wildcard_denied { - manager.get_options().set_value( + perform_option_command( + manager, + action.to_owned(), OptType::Wildcard, - Some(OptValue::String(wildcard_denied.to_string())), + OptValue::String(wildcard_denied.to_owned()), ); } - manager.save(None, None)?; - Ok(true) - } - Some(CCommand::List { role, task }) => { - if let Some(role) = role.as_ref() { - manager.select_role_by_name(role)?; - if let Some(task) = task { - let tid = match task.parse::() { - Ok(id) => IdTask::Number(id), - Err(_) => IdTask::Name(task.to_string()), - }; - manager.select_task_by_id(&tid)?; - let task = manager.get_task().unwrap(); - println!("{}", task.as_ref().borrow().get_description()); - } else { - let role = manager.get_role().unwrap(); - println!("{}", role.as_ref().borrow().get_description()); - } - } else { - let roles = manager.roles.as_ref().borrow(); - for role in roles.roles.iter() { - println!("=============\nRole {}", role.as_ref().borrow().name); - println!("{}", role.as_ref().borrow().get_description()); - } - } + save_config(&manager.get_config().as_ref().borrow())?; Ok(true) } Some(CCommand::Import { file: _ }) => Err("not implemented".into()), @@ -389,138 +395,5 @@ pub fn parse_args(manager: &mut RoleContext) -> Result> { #[cfg(test)] mod tests { use super::*; - #[test] - fn test_parse_args_new_role() { - let args = Cli::parse_from(&[ - "chsr", "newrole", "admin", "--user", "user1", "--group", "group1", - ]) - .command; - let expected_command = Some(CCommand::NewRole { - role: "admin".to_string(), - user: Some(["user1".to_string()].to_vec()), - group: Some(["group1".to_string()].to_vec()), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_grant() { - let args = Cli::parse_from(&[ - "chsr", "grant", "admin", "--user", "user1", "--group", "group1", - ]) - .command; - let expected_command = Some(CCommand::Grant { - role: "admin".to_string(), - user: Some(["user1".to_string()].to_vec()), - group: Some(["group1".to_string()].to_vec()), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_revoke() { - let args = Cli::parse_from(&[ - "chsr", "revoke", "admin", "--user", "user1", "--group", "group1", - ]) - .command; - let expected_command = Some(CCommand::Revoke { - role: "admin".to_string(), - user: Some(["user1".to_string()].to_vec()), - group: Some(["group1".to_string()].to_vec()), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_add_task() { - let args = Cli::parse_from(&[ - "chsr", "addtask", "admin", "--withid", "task1", "--cmds", "cmd1", "--caps", "cap1", - ]) - .command; - let expected_command = Some(CCommand::AddTask { - role: "admin".to_string(), - withid: Some("task1".to_string()), - cmds: Some(["cmd1".to_string()].to_vec()), - caps: Some("cap1".to_string()), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_del_task() { - let args = Cli::parse_from(&["chsr", "deltask", "admin", "task1"]).command; - let expected_command = Some(CCommand::DelTask { - role: "admin".to_string(), - id: "task1".to_string(), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_del_role() { - let args = Cli::parse_from(&["chsr", "delrole", "admin"]).command; - let expected_command = Some(CCommand::DelRole { - role: "admin".to_string(), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_config() { - let args = Cli::parse_from(&[ - "chsr", - "config", - "--role", - "admin", - "--task", - "task1", - "--path", - "/path/to/file", - "--env-keep", - "env1", - "--env-check", - "env2", - "--allow-bounding", - "true", - "--wildcard-denied", - ";;", - ]) - .command; - let expected_command = Some(CCommand::Config { - role: Some("admin".to_string()), - task: Some("task1".to_string()), - path: Some("/path/to/file".to_string()), - env_keep: Some("env1".to_string()), - env_check: Some("env2".to_string()), - allow_bounding: Some(true), - wildcard_denied: Some(";;".to_string()), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_list() { - let args = Cli::parse_from(&["chsr", "list", "--role", "admin", "--task", "task1"]).command; - let expected_command = Some(CCommand::List { - role: Some("admin".to_string()), - task: Some("task1".to_string()), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_import() { - let args = Cli::parse_from(&["chsr", "import", "/path/to/file"]).command; - let expected_command = Some(CCommand::Import { - file: "/path/to/file".to_string(), - }); - assert_eq!(args, expected_command); - } - - #[test] - fn test_parse_args_no_command() { - let args = Cli::parse_from(&["chsr"]).command; - let expected_command = None; - assert_eq!(args, expected_command); - } + } diff --git a/src/chsr/main.rs b/src/chsr/main.rs index 4dd9dc3d..8118a2c2 100644 --- a/src/chsr/main.rs +++ b/src/chsr/main.rs @@ -2,17 +2,16 @@ mod checklist; mod cli; -#[path = "../config/mod.rs"] +#[path = "../config.rs"] mod config; mod rolemanager; mod state; #[path = "../util.rs"] mod util; -#[path = "../xml_version.rs"] -mod xml_version; +#[path = "../version.rs"] +mod version; use cli::parse_args; -use config::FILENAME; use cursive::Cursive; use rolemanager::RoleContext; use state::{role::SelectRoleState, InitState}; @@ -29,7 +28,7 @@ pub struct RoleManagerApp { } fn main() { - let roles = config::load::load_config(&FILENAME); + let roles = config::load_config(); if let Err(err) = roles { eprintln!("{}", err); std::process::exit(1); diff --git a/src/chsr/rolemanager.rs b/src/chsr/rolemanager.rs index 4bcaf519..2f4392ff 100644 --- a/src/chsr/rolemanager.rs +++ b/src/chsr/rolemanager.rs @@ -6,9 +6,8 @@ use sxd_document::dom::{Document, Element}; use crate::config::{ options::{Opt, OptStack}, - save::save_config, + save_config, structs::{Config, Groups, IdTask, Role, Save, Task}, - FILENAME, }; pub trait ContextMemento { fn restore(&self) -> T; @@ -43,6 +42,7 @@ pub struct RoleContext { new_role: Option>>>, selected_task: Option, new_task: Option>>>, + selected_command_type: Option, selected_command: Option, new_command: Option, new_groups: Option, @@ -66,6 +66,7 @@ impl Clone for RoleContext { new_task: Some(Rc::new(RefCell::new( self.new_task.clone().unwrap().as_ref().borrow().clone(), ))), + selected_command_type: self.selected_command_type, selected_command: self.selected_command, new_command: self.new_command.clone(), new_groups: self.new_groups.clone(), @@ -85,6 +86,7 @@ impl RoleContext { roles, selected_role: None, selected_task: None, + selected_command_type: None, selected_command: None, selected_actors: None, new_role: None, @@ -173,21 +175,36 @@ impl RoleContext { self.new_role = None; } - pub fn create_new_task(&mut self, pid: Option<&String>) -> Result<(), Box> { + pub fn create_new_task(&mut self, pid: Option<&String>) -> Result> { let parent; - let mut id; + let id; self.unselect_task(); if let Some(role) = self.get_role() { - id = IdTask::Number(role.as_ref().borrow().tasks.len() + 1); + if let Some(pid) = pid { + id = if let Some(value) = pid.parse::().ok() { + IdTask::Number(value) + } else { + IdTask::Name(pid.to_string()) + }; + } else { + id = IdTask::Number(role.as_ref().borrow().tasks.iter().fold(0, |acc, f| { + if let IdTask::Number(n) = f.as_ref().borrow().id { + if n > acc { + n + } else { + acc + } + } else { + acc + } + }) + 1); + } parent = Rc::downgrade(&role); } else { return Err("role not selected".into()); } - if let Some(pid) = pid { - id = IdTask::Name(pid.to_owned()); - } - self.new_task = Some(Task::new(id, parent)); - Ok(()) + self.new_task = Some(Task::new(id.clone(), parent)); + Ok(id.clone()) } pub fn delete_new_task(&mut self) { @@ -230,6 +247,15 @@ impl RoleContext { } } + pub fn select_task_by_id_str(&mut self, task_id: &str) -> Result<(), Box> { + let id = if let Some(value) = task_id.parse::().ok() { + IdTask::Number(value) + } else { + IdTask::Name(task_id.to_string()) + }; + self.select_task_by_id(&id) + } + pub fn select_task_by_id(&mut self, task_id: &IdTask) -> Result<(), Box> { let mut index = None; for (i, t) in self @@ -256,10 +282,61 @@ impl RoleContext { pub fn unselect_task(&mut self) { self.selected_task = None; + self.unselect_command_set(); + } + + pub fn unselect_command(&mut self) { + self.selected_command = None; + } + + pub fn unselect_command_set(&mut self) { + self.selected_command_type = None; + self.unselect_command(); + } + + pub fn select_command_set(&mut self, is_add: bool) { + self.selected_command_type = Some(is_add); + self.unselect_command(); + } + + pub fn get_command_set(&self) -> Result, Box> { + match self.selected_command_type { + Some(true) => Ok(self + .get_task() + .unwrap() + .as_ref() + .borrow() + .commands + .added().to_owned()), + Some(false) => Ok(self + .get_task() + .unwrap() + .as_ref() + .borrow() + .commands + .removed().to_owned()), + None => Err("no command set selected".into()), + } + } + + pub fn is_blacklist(&self) -> bool { + self.selected_command_type.is_some_and(|b| !b) + } + + pub fn is_command_set_all(&self) -> bool { + self.get_task() + .unwrap() + .as_ref() + .borrow() + .commands.is_all() } pub fn select_command(&mut self, command_index: usize) -> Result<(), Box> { - let len = self.get_task().unwrap().as_ref().borrow().commands.len(); + let len = if self.selected_command_type.is_some_and(|b| b) { + self.get_task().unwrap().as_ref().borrow().commands.added().len() + } else { + self.get_task().unwrap().as_ref().borrow().commands.removed().len() + }; if command_index > len - 1 { Err("command not exist".into()) } else { @@ -330,22 +407,65 @@ impl RoleContext { } pub fn get_command(&self) -> Option { - match self.selected_command { - Some(i) => { - return Some(self.get_task().unwrap().as_ref().borrow().commands[i].to_string()); + match self.selected_command_type { + Some(true) => { + if let Some(i) = self.selected_command { + return Some( + self.get_task() + .unwrap() + .as_ref() + .borrow() + .commands + .added()[i] + .to_owned(), + ); + } } - None => None, + Some(false) => { + if let Some(i) = self.selected_command { + return Some( + self.get_task() + .unwrap() + .as_ref() + .borrow() + .commands + .removed()[i] + .to_owned(), + ); + } + } + None => {} } + None } pub fn set_command(&mut self, command: String) -> Result<(), Box> { - match self.selected_command { - Some(i) => { - self.get_task().unwrap().borrow_mut().commands[i] = command; - Ok(()) + match self.selected_command_type { + Some(true) => { + if let Some(i) = self.selected_command { + self.get_task() + .unwrap() + .as_ref() + .borrow_mut() + .commands + .added_mut()[i] = command; + return Ok(()); + } + } + Some(false) => { + if let Some(i) = self.selected_command { + self.get_task() + .unwrap() + .as_ref() + .borrow_mut() + .commands + .removed_mut()[i] = command; + return Ok(()); + } } - None => Err("no command selected".into()), + None => {} } + Err("no command selected".into()) } /** @@ -368,14 +488,18 @@ impl RoleContext { pub fn take_error(&mut self) -> Option> { self.error.take() } + + pub(crate) fn get_config(&self) -> Rc>> { + self.roles.clone() + } } -impl Save for RoleContext { +impl Save for RoleContext { fn save( &self, - _doc: Option<&Document>, - _element: Option<&Element>, + _doc: Option<&mut T>, + _element: Option<&mut V>, ) -> Result> { - save_config(FILENAME, &self.roles.as_ref().borrow(), true).map(|_| true) + save_config(&self.roles.as_ref().borrow()).map(|_| true) } } diff --git a/src/chsr/state/command.rs b/src/chsr/state/command.rs index 99cb51c2..0f03b2ae 100644 --- a/src/chsr/state/command.rs +++ b/src/chsr/state/command.rs @@ -16,7 +16,9 @@ use capctl::{Cap, CapSet}; pub struct EditCapabilitiesState; -pub struct EditCommandState; +pub struct EditCommandState { + pub remove: bool, +} impl State for EditCapabilitiesState { fn create(self: Box, _manager: &mut RoleContext) -> Box { @@ -135,12 +137,22 @@ impl State for EditCommandState { return self; } } else { - manager - .get_task() - .unwrap() - .borrow_mut() - .commands - .push(input.as_string()); + if self.remove { + manager + .get_task() + .unwrap() + .borrow_mut() + .commands + .remove_command(&input.as_string()); + } else { + manager + .get_task() + .unwrap() + .borrow_mut() + .commands + .add_command(&input.as_string()); + } + } Box::new(EditTaskState) } diff --git a/src/chsr/state/role.rs b/src/chsr/state/role.rs index e4d82d71..3a1e6708 100644 --- a/src/chsr/state/role.rs +++ b/src/chsr/state/role.rs @@ -14,7 +14,8 @@ use cursive::view::{Nameable, Scrollable}; use cursive::views::{Dialog, LinearLayout, SelectView, TextView}; use cursive::Cursive; -use crate::config::structs::{Groups, Role, Save}; +use crate::config::save_config; +use crate::config::structs::{Groups, Role, ActorSetTrait}; use crate::{RoleContext, RoleManagerApp}; #[derive(Clone)] @@ -70,7 +71,9 @@ impl State for SelectRoleState { } fn confirm(self: Box, manager: &mut RoleContext) -> Box { - if let Err(err) = manager.save(None, None) { + let binding = manager.get_config(); + let borrow = save_config(&binding.as_ref().borrow_mut()); + if let Err(err) = borrow{ manager.set_error(err); } self @@ -196,7 +199,8 @@ impl State for EditRoleState { .unwrap() .as_ref() .borrow() - .users + .actors + .users() .to_vec() .into(), ), @@ -209,7 +213,8 @@ impl State for EditRoleState { .unwrap() .as_ref() .borrow() - .groups + .actors + .groups() .to_vec(), )), 2 => Box::new(SelectTaskState), @@ -340,13 +345,12 @@ impl PushableItemState for EditRoleState { impl PushableItemState for EditRoleState { fn push(&mut self, manager: &mut RoleContext, item: Users) { - manager.get_role().unwrap().as_ref().borrow_mut().users = - item.name.as_ref().borrow().to_vec(); + manager.get_role().unwrap().as_ref().borrow_mut().actors.extend(item.name.as_ref().borrow().to_vec().iter().map(|x| crate::config::structs::Actor::User(x.to_string()))); } } impl PushableItemState> for EditRoleState { fn push(&mut self, manager: &mut RoleContext, item: Vec) { - manager.get_role().unwrap().as_ref().borrow_mut().groups = item; + manager.get_role().unwrap().as_ref().borrow_mut().actors.extend(item.iter().map(|x| crate::config::structs::Actor::Group(x.clone()))); } } diff --git a/src/chsr/state/task.rs b/src/chsr/state/task.rs index 31fe9432..6f14cf3d 100644 --- a/src/chsr/state/task.rs +++ b/src/chsr/state/task.rs @@ -2,7 +2,7 @@ use cursive::{ align::{HAlign, VAlign}, event::Key, view::{Nameable, Scrollable}, - views::{Dialog, LinearLayout, SelectView, TextView}, + views::{Dialog, LinearLayout, SelectView, TextView, Button}, Cursive, }; @@ -182,8 +182,8 @@ impl DeletableItemState for SelectTaskState { * And used to set options on the command block (with Dialog) */ impl State for EditTaskState { - fn create(self: Box, _manager: &mut RoleContext) -> Box { - Box::new(EditCommandState) + fn create(self: Box, manager: &mut RoleContext) -> Box { + Box::new(EditCommandState { remove : manager.is_blacklist() }) } fn delete(self: Box, manager: &mut RoleContext, index: usize) -> Box { if let Err(err) = manager.select_command(index) { @@ -195,7 +195,7 @@ impl State for EditTaskState { &format!( "Are you sure to delete Command #{}?\n\"{}\"", index, - manager.get_task().unwrap().borrow().commands[index] + manager.get_command_set().unwrap()[index] ), index, )) @@ -205,7 +205,7 @@ impl State for EditTaskState { manager.set_error(err); return self; } - Box::new(EditCommandState) + Box::new(EditCommandState { remove : manager.is_blacklist() }) } fn cancel(self: Box, manager: &mut RoleContext) -> Box { if manager.get_new_task().is_some() { @@ -254,6 +254,12 @@ impl State for EditTaskState { "Set task id", Some(manager.get_task().unwrap().as_ref().borrow().id.to_owned()), )), + "d" => { + let binding = manager.get_task().unwrap(); + let mut task = binding.as_ref().borrow_mut(); + task.commands.all = !task.commands.is_all(); + self + } _ => panic!("Unknown input {}", input.as_string()), } } @@ -263,20 +269,32 @@ impl State for EditTaskState { title = format!("Edit {}", o.as_ref().borrow().id.to_string()); o }); - let mut select = SelectView::new().on_submit(|s, item| { + let mut select_whitelist = SelectView::new().on_submit(|s, item| { + let RoleManagerApp { mut manager, state } = s.take_user_data().unwrap(); + manager.select_command_set(true); + s.set_user_data(RoleManagerApp { manager, state }); + execute(s, ExecuteType::Submit(*item)); + }); + let mut select_blacklist = SelectView::new().on_submit(|s, item| { + let RoleManagerApp { mut manager, state } = s.take_user_data().unwrap(); + manager.select_command_set(false); + s.set_user_data(RoleManagerApp { manager, state }); execute(s, ExecuteType::Submit(*item)); }); let mut purpose = String::new(); + let mut default_cmd = "No command matching by default"; if let Some(task) = task { - task.as_ref() - .borrow() - .commands - .iter() + task.as_ref().borrow().commands.added().iter() + .enumerate() + .for_each(|(index, e)| { + select_whitelist.add_item(e.to_string(), index); + }); + task.as_ref().borrow().commands.removed().iter() .enumerate() .for_each(|(index, e)| { - select.add_item(e.to_string(), index); + select_blacklist.add_item(e.to_string(), index); }); cursive.set_global_callback(Key::Del, move |s| { let sel = s @@ -301,12 +319,26 @@ impl State for EditTaskState { format!("Capabilities : {}\n", util::capset_to_string(caps)).as_str(), ); } + task.as_ref().borrow().commands.is_all().then(|| { + default_cmd = "All commands matching by default"; + }); } else { purpose = "".to_string(); } + // Create a button to switch between ALL and NONE command set + + let button = Button::new(default_cmd, |s| { + execute(s, ExecuteType::Input(Input::String("d".to_string()))); + }); + + let horizontal = LinearLayout::horizontal() + .child(select_whitelist.with_name("whitelist").scrollable()) + .child(select_blacklist.with_name("blacklist").scrollable()); + let layout = LinearLayout::vertical() - .child(select.with_name("select").scrollable()) + .child(button) + .child(horizontal) .child(TextView::new(purpose).align(cursive::align::Align { h: HAlign::Center, v: VAlign::Bottom, @@ -358,7 +390,7 @@ impl DeletableItemState for EditTaskState { }) .borrow_mut() .commands - .remove(index); + .remove_added_entry_index(&index); } } impl PushableItemState for EditTaskState { From 4d939dd4f44819d4877ecb80da7220349a9c082a Mon Sep 17 00:00:00 2001 From: LeChatP Date: Tue, 9 Apr 2024 08:16:25 +0200 Subject: [PATCH 03/42] remove legacy --- legacy/.clang-format | 493 ----- legacy/Makefile | 76 - legacy/capable/Makefile | 116 - legacy/capable/README.md | 270 --- legacy/capable/src/bpf.c | 188 -- legacy/capable/src/bpf.h | 50 - legacy/capable/src/bpf_load.c | 568 ----- legacy/capable/src/bpf_load.h | 39 - legacy/capable/src/capable.c | 574 ----- .../capable/src/kernel/asm_goto_workaround.h | 20 - legacy/capable/src/kernel/bpf_helpers.h | 169 -- legacy/capable/src/kernel/capable_kern.c | 116 - legacy/capable/src/kernel/nscapable_kern.c | 105 - legacy/capable/src/libbpf.h | 170 -- legacy/capable/src/perf-sys.h | 142 -- legacy/capable/src/sorting.c | 38 - legacy/capable/src/sorting.h | 23 - legacy/capable/src/sr_constants.h | 56 - legacy/doc/SrWorkflow.png | Bin 681162 -> 0 bytes legacy/doc/Sr_auxWorkflow.png | Bin 275848 -> 0 bytes legacy/doc/algorithm3.jpg | Bin 246402 -> 0 bytes legacy/doc/assumerole1.png | Bin 17832 -> 0 bytes legacy/doc/assumerole11.png | Bin 37551 -> 0 bytes legacy/doc/assumerole111.png | Bin 18607 -> 0 bytes legacy/doc/assumerole1111.png | Bin 17537 -> 0 bytes legacy/doc/assumerole11111.png | Bin 19540 -> 0 bytes legacy/doc/assumerootrole.png | Bin 90295 -> 0 bytes legacy/doc/calculations.jpg | Bin 197131 -> 0 bytes legacy/doc/checkbitsping.png | Bin 10245 -> 0 bytes legacy/doc/passwdprivi.png | Bin 47940 -> 0 bytes legacy/doc/preloadWithRole1.png | Bin 24647 -> 0 bytes legacy/doc/preloadWithoutWithSetcap.png | Bin 25372 -> 0 bytes legacy/doc/preloadWithoutWithSetcap1.png | Bin 25372 -> 0 bytes legacy/doc/removebitsping.png | Bin 9902 -> 0 bytes legacy/doc/rootfindcommand1.png | Bin 7793 -> 0 bytes legacy/doc/scenarioNoRoot/norootnoption.png | Bin 60432 -> 0 bytes legacy/doc/scenarioNoRoot/privilegeshell.png | Bin 22409 -> 0 bytes legacy/doc/scenarioNoRoot/setuidping.png | Bin 41399 -> 0 bytes legacy/doc/scenarioPython/WithPamCap.png | Bin 13778 -> 0 bytes legacy/doc/scenarioPython/bashPamCap.png | Bin 4126 -> 0 bytes legacy/doc/scenarioPython/capConf.png | Bin 8078 -> 0 bytes .../doc/scenarioPython/connectionFailed.png | Bin 30942 -> 0 bytes .../doc/scenarioPython/connectionWithRole.png | Bin 21625 -> 0 bytes legacy/doc/scenarioPython/proofNoCaps.png | Bin 24379 -> 0 bytes .../scenarioPython/pythonpermissiondenied.png | Bin 86114 -> 0 bytes .../doc/scenarioPython/pythonserverwork.png | Bin 39809 -> 0 bytes .../doc/scenarioPython/runscriptwithp80.png | Bin 40598 -> 0 bytes .../doc/scenarioPython/runscriptwithp90.png | Bin 39545 -> 0 bytes .../doc/scenarioPython/solutionWithSetcap.png | Bin 10968 -> 0 bytes legacy/doc/socketWithoutWithSetcap1.png | Bin 60313 -> 0 bytes legacy/doc/tcpdump1.png | Bin 132749 -> 0 bytes legacy/doc/tcpdumparg1.png | Bin 54287 -> 0 bytes legacy/doc/tcpdumparg2.png | Bin 37930 -> 0 bytes legacy/doc/wihtoutbitsping.png | Bin 11248 -> 0 bytes legacy/doc/workping.png | Bin 29469 -> 0 bytes legacy/src/capabilities.c | 241 --- legacy/src/capabilities.h | 93 - legacy/src/command.c | 251 --- legacy/src/command.h | 50 - legacy/src/env.c | 205 -- legacy/src/env.h | 52 - legacy/src/params.c | 294 --- legacy/src/params.h | 110 - legacy/src/sr.c | 428 ---- legacy/src/timestamp.c | 1151 ---------- legacy/src/timestamp.h | 67 - legacy/src/user.c | 427 ---- legacy/src/user.h | 133 -- legacy/src/xml_manager.c | 1880 ----------------- legacy/src/xml_manager.h | 128 -- .../resources/test_xml_manager_case1.xml | 93 - .../resources/test_xml_manager_hierarchy.xml | 56 - legacy/tests/unit/test_capabilities.c | 3 - legacy/tests/unit/test_command.c | 149 -- legacy/tests/unit/test_env.c | 50 - legacy/tests/unit/test_params.c | 54 - legacy/tests/unit/test_xml_manager.c | 1147 ---------- 77 files changed, 10275 deletions(-) delete mode 100644 legacy/.clang-format delete mode 100644 legacy/Makefile delete mode 100644 legacy/capable/Makefile delete mode 100644 legacy/capable/README.md delete mode 100644 legacy/capable/src/bpf.c delete mode 100644 legacy/capable/src/bpf.h delete mode 100644 legacy/capable/src/bpf_load.c delete mode 100644 legacy/capable/src/bpf_load.h delete mode 100644 legacy/capable/src/capable.c delete mode 100644 legacy/capable/src/kernel/asm_goto_workaround.h delete mode 100644 legacy/capable/src/kernel/bpf_helpers.h delete mode 100644 legacy/capable/src/kernel/capable_kern.c delete mode 100644 legacy/capable/src/kernel/nscapable_kern.c delete mode 100644 legacy/capable/src/libbpf.h delete mode 100644 legacy/capable/src/perf-sys.h delete mode 100644 legacy/capable/src/sorting.c delete mode 100644 legacy/capable/src/sorting.h delete mode 100644 legacy/capable/src/sr_constants.h delete mode 100644 legacy/doc/SrWorkflow.png delete mode 100644 legacy/doc/Sr_auxWorkflow.png delete mode 100644 legacy/doc/algorithm3.jpg delete mode 100644 legacy/doc/assumerole1.png delete mode 100644 legacy/doc/assumerole11.png delete mode 100644 legacy/doc/assumerole111.png delete mode 100644 legacy/doc/assumerole1111.png delete mode 100644 legacy/doc/assumerole11111.png delete mode 100644 legacy/doc/assumerootrole.png delete mode 100644 legacy/doc/calculations.jpg delete mode 100644 legacy/doc/checkbitsping.png delete mode 100644 legacy/doc/passwdprivi.png delete mode 100644 legacy/doc/preloadWithRole1.png delete mode 100644 legacy/doc/preloadWithoutWithSetcap.png delete mode 100644 legacy/doc/preloadWithoutWithSetcap1.png delete mode 100644 legacy/doc/removebitsping.png delete mode 100644 legacy/doc/rootfindcommand1.png delete mode 100644 legacy/doc/scenarioNoRoot/norootnoption.png delete mode 100644 legacy/doc/scenarioNoRoot/privilegeshell.png delete mode 100644 legacy/doc/scenarioNoRoot/setuidping.png delete mode 100644 legacy/doc/scenarioPython/WithPamCap.png delete mode 100644 legacy/doc/scenarioPython/bashPamCap.png delete mode 100644 legacy/doc/scenarioPython/capConf.png delete mode 100644 legacy/doc/scenarioPython/connectionFailed.png delete mode 100644 legacy/doc/scenarioPython/connectionWithRole.png delete mode 100644 legacy/doc/scenarioPython/proofNoCaps.png delete mode 100644 legacy/doc/scenarioPython/pythonpermissiondenied.png delete mode 100644 legacy/doc/scenarioPython/pythonserverwork.png delete mode 100644 legacy/doc/scenarioPython/runscriptwithp80.png delete mode 100644 legacy/doc/scenarioPython/runscriptwithp90.png delete mode 100644 legacy/doc/scenarioPython/solutionWithSetcap.png delete mode 100644 legacy/doc/socketWithoutWithSetcap1.png delete mode 100644 legacy/doc/tcpdump1.png delete mode 100644 legacy/doc/tcpdumparg1.png delete mode 100644 legacy/doc/tcpdumparg2.png delete mode 100644 legacy/doc/wihtoutbitsping.png delete mode 100644 legacy/doc/workping.png delete mode 100644 legacy/src/capabilities.c delete mode 100644 legacy/src/capabilities.h delete mode 100644 legacy/src/command.c delete mode 100644 legacy/src/command.h delete mode 100644 legacy/src/env.c delete mode 100644 legacy/src/env.h delete mode 100644 legacy/src/params.c delete mode 100644 legacy/src/params.h delete mode 100644 legacy/src/sr.c delete mode 100644 legacy/src/timestamp.c delete mode 100644 legacy/src/timestamp.h delete mode 100644 legacy/src/user.c delete mode 100644 legacy/src/user.h delete mode 100644 legacy/src/xml_manager.c delete mode 100644 legacy/src/xml_manager.h delete mode 100644 legacy/tests/resources/test_xml_manager_case1.xml delete mode 100644 legacy/tests/resources/test_xml_manager_hierarchy.xml delete mode 100644 legacy/tests/unit/test_capabilities.c delete mode 100644 legacy/tests/unit/test_command.c delete mode 100644 legacy/tests/unit/test_env.c delete mode 100644 legacy/tests/unit/test_params.c delete mode 100644 legacy/tests/unit/test_xml_manager.c diff --git a/legacy/.clang-format b/legacy/.clang-format deleted file mode 100644 index 2ffd69af..00000000 --- a/legacy/.clang-format +++ /dev/null @@ -1,493 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# clang-format configuration file. Intended for clang-format >= 4. -# -# For more information, see: -# -# Documentation/process/clang-format.rst -# https://clang.llvm.org/docs/ClangFormat.html -# https://clang.llvm.org/docs/ClangFormatStyleOptions.html -# ---- -AccessModifierOffset: -4 -AlignAfterOpenBracket: Align -AlignConsecutiveAssignments: false -AlignConsecutiveDeclarations: false -#AlignEscapedNewlines: Left # Unknown to clang-format-4.0 -AlignOperands: true -AlignTrailingComments: false -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortBlocksOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: None -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: false -BinPackArguments: true -BinPackParameters: true -BraceWrapping: - AfterClass: false - AfterControlStatement: false - AfterEnum: false - AfterFunction: true - AfterNamespace: true - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - #AfterExternBlock: false # Unknown to clang-format-5.0 - BeforeCatch: false - BeforeElse: false - IndentBraces: false - #SplitEmptyFunction: true # Unknown to clang-format-4.0 - #SplitEmptyRecord: true # Unknown to clang-format-4.0 - #SplitEmptyNamespace: true # Unknown to clang-format-4.0 -BreakBeforeBinaryOperators: None -BreakBeforeBraces: Custom -#BreakBeforeInheritanceComma: false # Unknown to clang-format-4.0 -BreakBeforeTernaryOperators: false -BreakConstructorInitializersBeforeComma: false -#BreakConstructorInitializers: BeforeComma # Unknown to clang-format-4.0 -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: false -ColumnLimit: 80 -CommentPragmas: '^ IWYU pragma:' -#CompactNamespaces: false # Unknown to clang-format-4.0 -ConstructorInitializerAllOnOneLineOrOnePerLine: false -ConstructorInitializerIndentWidth: 8 -ContinuationIndentWidth: 8 -Cpp11BracedListStyle: false -DerivePointerAlignment: false -DisableFormat: false -ExperimentalAutoDetectBinPacking: false -#FixNamespaceComments: false # Unknown to clang-format-4.0 - -# Taken from: -# git grep -h '^#define [^[:space:]]*for_each[^[:space:]]*(' include/ \ -# | sed "s,^#define \([^[:space:]]*for_each[^[:space:]]*\)(.*$, - '\1'," \ -# | sort | uniq -ForEachMacros: - - 'apei_estatus_for_each_section' - - 'ata_for_each_dev' - - 'ata_for_each_link' - - '__ata_qc_for_each' - - 'ata_qc_for_each' - - 'ata_qc_for_each_raw' - - 'ata_qc_for_each_with_internal' - - 'ax25_for_each' - - 'ax25_uid_for_each' - - '__bio_for_each_bvec' - - 'bio_for_each_bvec' - - 'bio_for_each_integrity_vec' - - '__bio_for_each_segment' - - 'bio_for_each_segment' - - 'bio_for_each_segment_all' - - 'bio_list_for_each' - - 'bip_for_each_vec' - - 'blkg_for_each_descendant_post' - - 'blkg_for_each_descendant_pre' - - 'blk_queue_for_each_rl' - - 'bond_for_each_slave' - - 'bond_for_each_slave_rcu' - - 'bpf_for_each_spilled_reg' - - 'btree_for_each_safe128' - - 'btree_for_each_safe32' - - 'btree_for_each_safe64' - - 'btree_for_each_safel' - - 'card_for_each_dev' - - 'cgroup_taskset_for_each' - - 'cgroup_taskset_for_each_leader' - - 'cpufreq_for_each_entry' - - 'cpufreq_for_each_entry_idx' - - 'cpufreq_for_each_valid_entry' - - 'cpufreq_for_each_valid_entry_idx' - - 'css_for_each_child' - - 'css_for_each_descendant_post' - - 'css_for_each_descendant_pre' - - 'device_for_each_child_node' - - 'drm_atomic_crtc_for_each_plane' - - 'drm_atomic_crtc_state_for_each_plane' - - 'drm_atomic_crtc_state_for_each_plane_state' - - 'drm_atomic_for_each_plane_damage' - - 'drm_connector_for_each_possible_encoder' - - 'drm_for_each_connector_iter' - - 'drm_for_each_crtc' - - 'drm_for_each_encoder' - - 'drm_for_each_encoder_mask' - - 'drm_for_each_fb' - - 'drm_for_each_legacy_plane' - - 'drm_for_each_plane' - - 'drm_for_each_plane_mask' - - 'drm_for_each_privobj' - - 'drm_mm_for_each_hole' - - 'drm_mm_for_each_node' - - 'drm_mm_for_each_node_in_range' - - 'drm_mm_for_each_node_safe' - - 'flow_action_for_each' - - 'for_each_active_drhd_unit' - - 'for_each_active_iommu' - - 'for_each_available_child_of_node' - - 'for_each_bio' - - 'for_each_board_func_rsrc' - - 'for_each_bvec' - - 'for_each_card_components' - - 'for_each_card_links' - - 'for_each_card_links_safe' - - 'for_each_card_prelinks' - - 'for_each_card_rtds' - - 'for_each_card_rtds_safe' - - 'for_each_cgroup_storage_type' - - 'for_each_child_of_node' - - 'for_each_clear_bit' - - 'for_each_clear_bit_from' - - 'for_each_cmsghdr' - - 'for_each_compatible_node' - - 'for_each_component_dais' - - 'for_each_component_dais_safe' - - 'for_each_comp_order' - - 'for_each_console' - - 'for_each_cpu' - - 'for_each_cpu_and' - - 'for_each_cpu_not' - - 'for_each_cpu_wrap' - - 'for_each_dev_addr' - - 'for_each_dma_cap_mask' - - 'for_each_dpcm_be' - - 'for_each_dpcm_be_rollback' - - 'for_each_dpcm_be_safe' - - 'for_each_dpcm_fe' - - 'for_each_drhd_unit' - - 'for_each_dss_dev' - - 'for_each_efi_memory_desc' - - 'for_each_efi_memory_desc_in_map' - - 'for_each_element' - - 'for_each_element_extid' - - 'for_each_element_id' - - 'for_each_endpoint_of_node' - - 'for_each_evictable_lru' - - 'for_each_fib6_node_rt_rcu' - - 'for_each_fib6_walker_rt' - - 'for_each_free_mem_range' - - 'for_each_free_mem_range_reverse' - - 'for_each_func_rsrc' - - 'for_each_hstate' - - 'for_each_if' - - 'for_each_iommu' - - 'for_each_ip_tunnel_rcu' - - 'for_each_irq_nr' - - 'for_each_link_codecs' - - 'for_each_lru' - - 'for_each_matching_node' - - 'for_each_matching_node_and_match' - - 'for_each_memblock' - - 'for_each_memblock_type' - - 'for_each_memcg_cache_index' - - 'for_each_mem_pfn_range' - - 'for_each_mem_range' - - 'for_each_mem_range_rev' - - 'for_each_migratetype_order' - - 'for_each_msi_entry' - - 'for_each_msi_entry_safe' - - 'for_each_net' - - 'for_each_netdev' - - 'for_each_netdev_continue' - - 'for_each_netdev_continue_rcu' - - 'for_each_netdev_feature' - - 'for_each_netdev_in_bond_rcu' - - 'for_each_netdev_rcu' - - 'for_each_netdev_reverse' - - 'for_each_netdev_safe' - - 'for_each_net_rcu' - - 'for_each_new_connector_in_state' - - 'for_each_new_crtc_in_state' - - 'for_each_new_mst_mgr_in_state' - - 'for_each_new_plane_in_state' - - 'for_each_new_private_obj_in_state' - - 'for_each_node' - - 'for_each_node_by_name' - - 'for_each_node_by_type' - - 'for_each_node_mask' - - 'for_each_node_state' - - 'for_each_node_with_cpus' - - 'for_each_node_with_property' - - 'for_each_of_allnodes' - - 'for_each_of_allnodes_from' - - 'for_each_of_cpu_node' - - 'for_each_of_pci_range' - - 'for_each_old_connector_in_state' - - 'for_each_old_crtc_in_state' - - 'for_each_old_mst_mgr_in_state' - - 'for_each_oldnew_connector_in_state' - - 'for_each_oldnew_crtc_in_state' - - 'for_each_oldnew_mst_mgr_in_state' - - 'for_each_oldnew_plane_in_state' - - 'for_each_oldnew_plane_in_state_reverse' - - 'for_each_oldnew_private_obj_in_state' - - 'for_each_old_plane_in_state' - - 'for_each_old_private_obj_in_state' - - 'for_each_online_cpu' - - 'for_each_online_node' - - 'for_each_online_pgdat' - - 'for_each_pci_bridge' - - 'for_each_pci_dev' - - 'for_each_pci_msi_entry' - - 'for_each_populated_zone' - - 'for_each_possible_cpu' - - 'for_each_present_cpu' - - 'for_each_prime_number' - - 'for_each_prime_number_from' - - 'for_each_process' - - 'for_each_process_thread' - - 'for_each_property_of_node' - - 'for_each_registered_fb' - - 'for_each_reserved_mem_region' - - 'for_each_rtd_codec_dai' - - 'for_each_rtd_codec_dai_rollback' - - 'for_each_rtdcom' - - 'for_each_rtdcom_safe' - - 'for_each_set_bit' - - 'for_each_set_bit_from' - - 'for_each_sg' - - 'for_each_sg_dma_page' - - 'for_each_sg_page' - - 'for_each_sibling_event' - - 'for_each_subelement' - - 'for_each_subelement_extid' - - 'for_each_subelement_id' - - '__for_each_thread' - - 'for_each_thread' - - 'for_each_zone' - - 'for_each_zone_zonelist' - - 'for_each_zone_zonelist_nodemask' - - 'fwnode_for_each_available_child_node' - - 'fwnode_for_each_child_node' - - 'fwnode_graph_for_each_endpoint' - - 'gadget_for_each_ep' - - 'genradix_for_each' - - 'genradix_for_each_from' - - 'hash_for_each' - - 'hash_for_each_possible' - - 'hash_for_each_possible_rcu' - - 'hash_for_each_possible_rcu_notrace' - - 'hash_for_each_possible_safe' - - 'hash_for_each_rcu' - - 'hash_for_each_safe' - - 'hctx_for_each_ctx' - - 'hlist_bl_for_each_entry' - - 'hlist_bl_for_each_entry_rcu' - - 'hlist_bl_for_each_entry_safe' - - 'hlist_for_each' - - 'hlist_for_each_entry' - - 'hlist_for_each_entry_continue' - - 'hlist_for_each_entry_continue_rcu' - - 'hlist_for_each_entry_continue_rcu_bh' - - 'hlist_for_each_entry_from' - - 'hlist_for_each_entry_from_rcu' - - 'hlist_for_each_entry_rcu' - - 'hlist_for_each_entry_rcu_bh' - - 'hlist_for_each_entry_rcu_notrace' - - 'hlist_for_each_entry_safe' - - '__hlist_for_each_rcu' - - 'hlist_for_each_safe' - - 'hlist_nulls_for_each_entry' - - 'hlist_nulls_for_each_entry_from' - - 'hlist_nulls_for_each_entry_rcu' - - 'hlist_nulls_for_each_entry_safe' - - 'i3c_bus_for_each_i2cdev' - - 'i3c_bus_for_each_i3cdev' - - 'ide_host_for_each_port' - - 'ide_port_for_each_dev' - - 'ide_port_for_each_present_dev' - - 'idr_for_each_entry' - - 'idr_for_each_entry_continue' - - 'idr_for_each_entry_ul' - - 'inet_bind_bucket_for_each' - - 'inet_lhash2_for_each_icsk_rcu' - - 'key_for_each' - - 'key_for_each_safe' - - 'klp_for_each_func' - - 'klp_for_each_func_safe' - - 'klp_for_each_func_static' - - 'klp_for_each_object' - - 'klp_for_each_object_safe' - - 'klp_for_each_object_static' - - 'kvm_for_each_memslot' - - 'kvm_for_each_vcpu' - - 'list_for_each' - - 'list_for_each_codec' - - 'list_for_each_codec_safe' - - 'list_for_each_entry' - - 'list_for_each_entry_continue' - - 'list_for_each_entry_continue_rcu' - - 'list_for_each_entry_continue_reverse' - - 'list_for_each_entry_from' - - 'list_for_each_entry_from_rcu' - - 'list_for_each_entry_from_reverse' - - 'list_for_each_entry_lockless' - - 'list_for_each_entry_rcu' - - 'list_for_each_entry_reverse' - - 'list_for_each_entry_safe' - - 'list_for_each_entry_safe_continue' - - 'list_for_each_entry_safe_from' - - 'list_for_each_entry_safe_reverse' - - 'list_for_each_prev' - - 'list_for_each_prev_safe' - - 'list_for_each_safe' - - 'llist_for_each' - - 'llist_for_each_entry' - - 'llist_for_each_entry_safe' - - 'llist_for_each_safe' - - 'media_device_for_each_entity' - - 'media_device_for_each_intf' - - 'media_device_for_each_link' - - 'media_device_for_each_pad' - - 'mp_bvec_for_each_page' - - 'mp_bvec_for_each_segment' - - 'nanddev_io_for_each_page' - - 'netdev_for_each_lower_dev' - - 'netdev_for_each_lower_private' - - 'netdev_for_each_lower_private_rcu' - - 'netdev_for_each_mc_addr' - - 'netdev_for_each_uc_addr' - - 'netdev_for_each_upper_dev_rcu' - - 'netdev_hw_addr_list_for_each' - - 'nft_rule_for_each_expr' - - 'nla_for_each_attr' - - 'nla_for_each_nested' - - 'nlmsg_for_each_attr' - - 'nlmsg_for_each_msg' - - 'nr_neigh_for_each' - - 'nr_neigh_for_each_safe' - - 'nr_node_for_each' - - 'nr_node_for_each_safe' - - 'of_for_each_phandle' - - 'of_property_for_each_string' - - 'of_property_for_each_u32' - - 'pci_bus_for_each_resource' - - 'ping_portaddr_for_each_entry' - - 'plist_for_each' - - 'plist_for_each_continue' - - 'plist_for_each_entry' - - 'plist_for_each_entry_continue' - - 'plist_for_each_entry_safe' - - 'plist_for_each_safe' - - 'pnp_for_each_card' - - 'pnp_for_each_dev' - - 'protocol_for_each_card' - - 'protocol_for_each_dev' - - 'queue_for_each_hw_ctx' - - 'radix_tree_for_each_slot' - - 'radix_tree_for_each_tagged' - - 'rbtree_postorder_for_each_entry_safe' - - 'rdma_for_each_port' - - 'resource_list_for_each_entry' - - 'resource_list_for_each_entry_safe' - - 'rhl_for_each_entry_rcu' - - 'rhl_for_each_rcu' - - 'rht_for_each' - - 'rht_for_each_from' - - 'rht_for_each_entry' - - 'rht_for_each_entry_from' - - 'rht_for_each_entry_rcu' - - 'rht_for_each_entry_rcu_from' - - 'rht_for_each_entry_safe' - - 'rht_for_each_rcu' - - 'rht_for_each_rcu_from' - - '__rq_for_each_bio' - - 'rq_for_each_bvec' - - 'rq_for_each_segment' - - 'scsi_for_each_prot_sg' - - 'scsi_for_each_sg' - - 'sctp_for_each_hentry' - - 'sctp_skb_for_each' - - 'shdma_for_each_chan' - - '__shost_for_each_device' - - 'shost_for_each_device' - - 'sk_for_each' - - 'sk_for_each_bound' - - 'sk_for_each_entry_offset_rcu' - - 'sk_for_each_from' - - 'sk_for_each_rcu' - - 'sk_for_each_safe' - - 'sk_nulls_for_each' - - 'sk_nulls_for_each_from' - - 'sk_nulls_for_each_rcu' - - 'snd_array_for_each' - - 'snd_pcm_group_for_each_entry' - - 'snd_soc_dapm_widget_for_each_path' - - 'snd_soc_dapm_widget_for_each_path_safe' - - 'snd_soc_dapm_widget_for_each_sink_path' - - 'snd_soc_dapm_widget_for_each_source_path' - - 'tb_property_for_each' - - 'tcf_exts_for_each_action' - - 'udp_portaddr_for_each_entry' - - 'udp_portaddr_for_each_entry_rcu' - - 'usb_hub_for_each_child' - - 'v4l2_device_for_each_subdev' - - 'v4l2_m2m_for_each_dst_buf' - - 'v4l2_m2m_for_each_dst_buf_safe' - - 'v4l2_m2m_for_each_src_buf' - - 'v4l2_m2m_for_each_src_buf_safe' - - 'virtio_device_for_each_vq' - - 'xa_for_each' - - 'xa_for_each_marked' - - 'xa_for_each_start' - - 'xas_for_each' - - 'xas_for_each_conflict' - - 'xas_for_each_marked' - - 'zorro_for_each_dev' - -#IncludeBlocks: Preserve # Unknown to clang-format-5.0 -IncludeCategories: - - Regex: '.*' - Priority: 1 -IncludeIsMainRegex: '(Test)?$' -IndentCaseLabels: false -#IndentPPDirectives: None # Unknown to clang-format-5.0 -IndentWidth: 8 -IndentWrappedFunctionNames: false -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: false -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: Inner -#ObjCBinPackProtocolList: Auto # Unknown to clang-format-5.0 -ObjCBlockIndentWidth: 8 -ObjCSpaceAfterProperty: true -ObjCSpaceBeforeProtocolList: true - -# Taken from git's rules -#PenaltyBreakAssignment: 10 # Unknown to clang-format-4.0 -PenaltyBreakBeforeFirstCallParameter: 30 -PenaltyBreakComment: 10 -PenaltyBreakFirstLessLess: 0 -PenaltyBreakString: 10 -PenaltyExcessCharacter: 100 -PenaltyReturnTypeOnItsOwnLine: 60 - -PointerAlignment: Right -ReflowComments: false -SortIncludes: false -#SortUsingDeclarations: false # Unknown to clang-format-4.0 -SpaceAfterCStyleCast: false -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -#SpaceBeforeCtorInitializerColon: true # Unknown to clang-format-5.0 -#SpaceBeforeInheritanceColon: true # Unknown to clang-format-5.0 -SpaceBeforeParens: ControlStatements -#SpaceBeforeRangeBasedForLoopColon: true # Unknown to clang-format-5.0 -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 -SpacesInAngles: false -SpacesInContainerLiterals: false -SpacesInCStyleCastParentheses: false -SpacesInParentheses: false -SpacesInSquareBrackets: false -Standard: Cpp03 -TabWidth: 8 -UseTab: Always -... diff --git a/legacy/Makefile b/legacy/Makefile deleted file mode 100644 index 2b6d88d5..00000000 --- a/legacy/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -#Makefile for sr -#Author: Rémi Venant, Eddie BILLOIR -COMP = gcc - -SR_VERSION = $(shell xmllint --xpath "string(/rootasrole/@version)" resources/rootasrole.xml) -SRC_DIR := src -MANAGER_DIR := new_role_manager -OBJ_DIR := obj -BIN_DIR := bin -TEST_DIR := tests/unit -WARNINGS := -Wall -Wextra -LIBCAP := -lcap -lcap-ng -LIBPAM := -lpam -lpam_misc -STDOPT = -std=c11 -GDB_D = $(if $(GDB_DEBUG), -DGDB_DEBUG,) -OASAN = $(if $(ASAN),-fsanitize=address,) -ODEBUG = $(if $(DEBUG),-g $(GDB_D),-pedantic -Werror) -COVOPT := $(if $(COV),--coverage -fprofile-abs-path,) - -ALLOPT := $(ODEBUG) $(OASAN) $(STDOPT) $(WARNINGS) $(COVOPT) -DSR_VERSION=\"$(SR_VERSION)\" - -COMPOPTIONS = $(shell xml2-config --cflags) $(ALLOPT) -SR_LDOPTIONS := $(LIBCAP) $(LIBPAM) $(shell xml2-config --libs) $(ALLOPT) -LDUNIT := -lcriterion $(LIBCAP) -I$(SRC_DIR) $(shell xml2-config --libs) $(ALLOPT) -COMPUNIT := -lcriterion $(LIBCAP) -I$(SRC_DIR) $(shell xml2-config --cflags) $(ALLOPT) -EXECUTABLES := sr - -OBJS := $(addprefix $(SRC_DIR)/,capabilities.o user.o xml_manager.o env.o sr.o params.o command.o) -BINS := $(addprefix $(BIN_DIR)/,sr) - -all: $(BINS) - -.PHONY: clean - -$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c | $(OBJ_DIR) - $(COMP) -o $@ -c $< $(COMPOPTIONS) - -$(OBJ_DIR)/%.o : $(TEST_DIR)/%.c | $(OBJ_DIR) - $(COMP) -o $@ -c $< $(COMPUNIT) - -$(OBJS): | $(OBJ_DIR) - -$(OBJ_DIR): - mkdir $(OBJ_DIR) - -$(BIN_DIR)/sr: $(addprefix $(OBJ_DIR)/,capabilities.o xml_manager.o user.o env.o sr.o params.o command.o) | $(BIN_DIR) - $(COMP) -o $@ $^ $(SR_LDOPTIONS) - -$(BIN_DIR)/unit_test: $(addprefix $(OBJ_DIR)/test_,xml_manager.o command.o params.o capabilities.o env.o) | $(BIN_DIR) - $(COMP) -o $@ $^ $(LDUNIT) - -$(BINS): | $(BIN_DIR) - -$(BIN_DIR): - mkdir $(BIN_DIR) - -#run as root -install: $(BINS) - cp $(BINS) /usr/bin - setcap "=p" /usr/bin/sr - -build_unit_test: clean $(BIN_DIR)/unit_test - -unit_test: build_unit_test - $(BIN_DIR)/unit_test --verbose=1 - -uninstall: - rm -f /usr/bin/sr - rm -f /usr/bin/capable - chattr -i /etc/security/rootasrole.xml - rm -f /etc/security/rootasrole.xml - -clean: - @rm -rf $(BIN_DIR) $(OBJ_DIR) ebpf/$(BIN_DIR) ebpf/$(OBJ_DIR) - - diff --git a/legacy/capable/Makefile b/legacy/capable/Makefile deleted file mode 100644 index 7e32e6e3..00000000 --- a/legacy/capable/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -#Makefile for capable -#Author: Eddie BILLOIR -UNAME=$(shell uname -r) - -ifeq ($(shell uname -a | grep -q debian && echo 1),1) -KERNEL ?= /usr/src/linux-headers-${UNAME} -COMMON_KERNEL ?= /usr/src/linux-headers-$(shell uname -r | sed -e 's:\(.*\)-[^-]*:\1:g')-common - -LINUXINCLUDE += -I$(COMMON_KERNEL)/arch/$(INCLUDE_ARCH)/include/generated/uapi -LINUXINCLUDE += -I$(COMMON_KERNEL)/arch/$(INCLUDE_ARCH)/include/generated -LINUXINCLUDE += -I$(COMMON_KERNEL)/arch/$(INCLUDE_ARCH)/include -LINUXINCLUDE += -I$(COMMON_KERNEL)/arch/$(INCLUDE_ARCH)/include/uapi -LINUXINCLUDE += -I$(COMMON_KERNEL)/include -LINUXINCLUDE += -I$(COMMON_KERNEL)/include/uapi -LINUXINCLUDE += -I$(COMMON_KERNEL)/include/generated/uapi -LINUXINCLUDE += -include $(COMMON_KERNEL)/include/linux/kconfig.h -else -KERNEL ?= /lib/modules/${UNAME}/build -LINUXINCLUDE += -include $(KERNEL)/include/linux/kconfig.h -endif -NOSTDINC_FLAGS ?= -nostdinc -isystem $(shell $(CC) -print-file-name=include) -ARCH=$(shell uname -m | sed 's/x86_64/x86/' | sed 's/i386/x86/') -ifeq (${ARCH},$(filter ${ARCH},arm64 aarch64)) -INCLUDE_ARCH = $(shell echo '${ARCH}' | sed 's/aarch64/arm64/') -EXTRA_CFLAGS = -D__TARGET_ARCH_${ARCH} -else -INCLUDE_ARCH = ${ARCH} -EXTRA_CFLAGS = -D__ASM_SYSREG_H -fcf-protection -endif - -test_kernel: -ifeq ($(wildcard ${KERNEL}),) - @echo "$(echo -e "\033[0;31m")ERROR: Unable to find kernel headers. Please install the kernel headers for your kernel." - @echo " For example, on Ubuntu, run : sudo apt install linux-headers-\`shell uname -r\`" - @echo " If you've just updated your kernel, you may need to reboot your system." - @echo " If you have already installed the kernel headers, make sure you have the correct kernel headers for your kernel." - @echo " For example, if you are running a custom kernel, make sure you have the kernel headers for that kernel." - @echo " If you are running a custom kernel, you can specify the kernel headers directory by setting the KERNEL variable." - @echo " For example, if your kernel headers are in /usr/src/linux-headers-5.4.0-42-generic, run make KERNEL=/usr/src/linux-headers-5.4.0-42-generic$(echo -e "\033[0m")" - @exit 1 -endif - -LINUXINCLUDE += -I$(KERNEL)/arch/$(INCLUDE_ARCH)/include/generated/uapi -LINUXINCLUDE += -I$(KERNEL)/arch/$(INCLUDE_ARCH)/include/generated -LINUXINCLUDE += -I$(KERNEL)/arch/$(INCLUDE_ARCH)/include -LINUXINCLUDE += -I$(KERNEL)/arch/$(INCLUDE_ARCH)/include/uapi -LINUXINCLUDE += -I$(KERNEL)/include -LINUXINCLUDE += -I$(KERNEL)/include/uapi -LINUXINCLUDE += -I$(KERNEL)/include/generated/uapi -LINUXINCLUDE += -I$(KER_DIR) -LINUXINCLUDE += -D KBUILD_MODNAME=\"capable\" -D __BPF_TRACING__ # you must precisely include the file - -ifeq ($(uname -r | cut -c1-5),$(5.0.0)) -EXTRA_CFLAGS+=-DK50 -endif -LDFLAGS= -lelf - -LLC ?= llc -CLANG ?= clang -CC = gcc - -SRC_DIR := src -OBJ_DIR := obj -BIN_DIR := bin -KER_DIR := src/kernel - -COMPOPTIONS = -O2 -Wall -pedantic -I ./ -g -LDOPTIONS := -O2 -Wall -pedantic -lcap -lcap-ng -I ./ -lelf -g -EXECUTABLE := capable - -OBJS := $(addprefix $(OBJ_DIR)/,bpf.o bpf_load.o capable.o sorting.o) -BINS := $(BIN_DIR)/$(EXECUTABLE) $(addprefix $(BIN_DIR)/,capable_kern.o nscapable_kern.o) - -all: test_kernel $(BINS) - -.PHONY: clean - -$(OBJ_DIR)/%_kern.ll: $(KER_DIR)/%_kern.c - $(CLANG) -S $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \ - -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \ - -Wno-compare-distinct-pointer-types \ - -Wno-gnu-variable-sized-type-not-at-end \ - -Wno-tautological-compare \ - -O2 -emit-llvm -fno-stack-protector -c $< -o $@ - -$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) - $(CC) $(COMPOPTIONS) -o $@ -c $< - -$(BIN_DIR)/%_kern.o: $(OBJ_DIR)/%_kern.ll - $(LLC) -march=bpf -filetype=obj -o $@ $< - -$(OBJS): | $(OBJ_DIR) - -$(OBJ_DIR): - mkdir $(OBJ_DIR) - -$(BIN_DIR)/$(EXECUTABLE): $(SR_OBJS) $(OBJS) | $(SR_BIN_DIR) $(BIN_DIR) - $(CC) $^ -o $@ $(LDOPTIONS) - -$(BINS): | $(BIN_DIR) - -$(BIN_DIR): - mkdir $(BIN_DIR) - -build: test_kernel $(BINS) - -install: test_kernel $(BINS) - mkdir -p /usr/lib/RootAsRole - cat /proc/self/status - bash -c 'cat /proc/self/status' - cp $(BIN_DIR)/$(EXECUTABLE) /usr/bin - cp $(BIN_DIR)/*_kern.o /usr/lib/RootAsRole - setcap cap_dac_override,cap_sys_admin,cap_sys_ptrace+ep /usr/bin/capable - -clean: - @rm -rf $(BIN_DIR) $(OBJ_DIR) $(SR_OBJS) diff --git a/legacy/capable/README.md b/legacy/capable/README.md deleted file mode 100644 index 4e81a0a4..00000000 --- a/legacy/capable/README.md +++ /dev/null @@ -1,270 +0,0 @@ -# RootAsRole C eBPF Capable Tool - -## Introduction - -In many cases, it is very difficult for a user or administrator to know what kind of capabilities are requested by a program. So we created the capable tool in order to help Linux users know discover the capabilities requested by a program. - -Our tool uses eBPF in order to intercept the cap_capable() calls in the kernel. This filter uses JIT compilation and is injected to the kernel and will give back information to user-space. More details [here](https://github.com/pratyushanand/learn-bpf) -However, the kernel retruns the list of capabilities to all programs that are running on the OS. We have added a filtering mecanism in order to let the user see only the capabilites requested by his program. - -## Tested Plateforms - -This program has been tested with kernel version 5.0.0-13-generic with x86_64 arch but compiled with 4.10.0-generic code. - -## Installation - -### How to Build - -1. cd RootAsRole/ebpf -2. sr make install - -### Usage - -By default capable without any argument will run as daemon and will print every capabilities when program ends. - -```Text -Usage : capable [-c command] [-s seconds] [-r | -d] [-h] [-v] -Get every capabilities used by running programs. -If you run this command for daemon you can use -s to kill automatically process -Options: - -c, --command=command launch the command to be more precise. - -s, --sleep=number specify number of seconds before kill program - -d, --daemon collecting data until killing program printing result at end - -v, --version show the actual version of RootAsRole - -h, --help print this help and quit. -Note: this tool is mainly useful for administrators, and is almost not user-friendly -``` - -When a command is specified, the program will run the command and wait for the end of its execution. The result will be filtered by his pid and his child processes. -If your program is a daemon you can specify -s X or -d to give some time to daemon to start. -When -d option is specified, the program will wait for SIGINT (Ctrl+C) to kill the specified program (or not) and print result. - -## Example - -To retrieve capabilities requested by tcpdump we just need to do : - -```Txt -$ capable -c "tcpdump" -tcpdump: wlp108s0: You don't have permission to capture on that device -(socket: Operation not permitted) - -Here's all capabilities intercepted for this program : -cap_net_raw -WARNING: These capabilities aren't mandatory, but can change the behavior of tested program. -WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant -``` - -In this example we can see that we haven't the permission to execute the tcpdump command but capable tool retruns CAP_NET_RAW and CAP_SYS_ADMIN capabilities. Please pay attention to CAP_SYS_ADMIN, this capability is not probably important for programs but the kernel shows it because it is needed for every fork() call. In this case, tcpdump just wants to get raw traffic, which corresponds to CAP_NET_RAW. So if you create a role with CAP_NET_RAW and tcpdump command : - -```XML - - - CAP_NET_RAW - - - - - tcpdump - - - - -``` - -So we will try : - -```Txt -$ sr -c 'tcpdump' -Authentication of lechatp... -Password: -Privileged bash launched with the role net and the following capabilities : cap_dac_override, cap_dac_read_search, cap_net_admin, cap_net_raw. -tcpdump: verbose output suppressed, use -v or -vv for full protocol decode -listening on wlp108s0, link-type EN10MB (Ethernet), capture size 262144 bytes -15:40:03.315266 IP ############ -15:40:03.317476 IP ############ -15:40:03.419401 IP ############ -15:40:03.421165 IP ############ -15:40:03.423753 IP ############ -15:40:03.575237 IP ############ -^C -6 packets captured -6 packets received by filter -0 packets dropped by kernel -End of role net session. -``` - -Now tcpdump is run with only cap_net_raw capability. - -## Example 2 - -Now we want to get capabilities used to get addresses in kallsyms file : - -```Txt -$ capable -c 'cat /proc/kallsyms' -... -0000000000000000 T acpi_video_get_backlight_type [video] -0000000000000000 T acpi_video_set_dmi_backlight_type [video] -0000000000000000 t acpi_video_detect_exit [video] -0000000000000000 T acpi_video_register [video] -0000000000000000 T nfnetlink_init [nfnetlink] -Here's all capabilities intercepted : -cap_sys_admin, cap_syslog -WARNING: These capabilities aren't mandatory, but can change the behavior of tested program. -WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant -``` - -This is an interesting example because the command has not been terminated by the kernel because it doesn't have the necessary capabilities. However, the kernel doesn't deliver the content asked by the command cat because it doesn't have the necessary capabilities. We can see that the command output successfuly without permission denied. But adresses are all in 0. So we shall try to understand what kind of capablities we need. By using capable tool, we figure out that we need cap_sys_admin and cap_sys_log. As we told before, we will not use cap_sys_admin because it is not probably needed, so we will try only with cap_syslog. - -```Xml - - - CAP_SYSLOG - - - - - cat /proc/kallsyms - - - - -``` - -Let's try this new role : - -```Txt -$ cat /proc/kallsyms -Authentication of lechatp... -Password: -Privileged bash launched with the role stacktrace and the following capabilities : cap_syslog. -... -ffffffff******** T acpi_video_unregister [video] -ffffffff******** T acpi_video_get_backlight_type [video] -ffffffff******** T acpi_video_set_dmi_backlight_type [video] -ffffffff******** t acpi_video_detect_exit [video] -ffffffff******** T acpi_video_register [video] -ffffffff******** T nfnetlink_init [nfnetlink] -End of role stacktrace session. -``` - -Perfect! We can see real adresses. - -## Example 3 - -This example will show how our tool is powerful. In this example we will try to find capabilities used by a daemon, let's try with sshd : - -```Txt -$ capable -c /usr/sbin/sshd -Here's all capabilities intercepted : -cap_net_bind_service, cap_sys_admin -WARNING: These capabilities aren't mandatory, but can change the behavior of tested program. -WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant -``` - -We can see that sshd needs CAP_NET_BIND_SERVICE, so let's try to create configuration with sshd : - -```Xml - - - CAP_NET_BIND_SERVICE - - - - - /usr/sbin/sshd - - - - -``` - -```Txt -$ sr -c '/usr/sbin/sshd' -Authentication of lechatp... -Password: -Privileged bash launched with the role sshd and the following capabilities : cap_net_bind_service. -End of role sshd session. -$ ps -aux | grep sshd -$ -``` - -As you can see, the daemon wasn't launched. This is maybe due that the daemon stop when he knows tht he doesn't have the right capability. So to try to solve that, we will give cap_net_bind_service to file with setcap and then retry : - -```Txt -$ sr -r root -c "setcap cap_net_bind_service+ep /usr/sbin/sshd" -$ capable -c /usr/sbin/sshd -Could not load host key: /etc/ssh/ssh_host_rsa_key -Could not load host key: /etc/ssh/ssh_host_ecdsa_key -Could not load host key: /etc/ssh/ssh_host_ed25519_key - -Here's all capabilities intercepted for this program : -cap_dac_override, cap_sys_admin -WARNING: These capabilities aren't mandatory, but can change the behavior of tested program. -WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant -``` - -Now we see that sshd needs cap_dac_override, it is mainly because the files that the program want to access are owned by root. So we got two choices : chown all the files needed for sshd, or grant cap_dac_override to sshd. We can just add CAP_DAC_OVERRIDE to our config. - -```Xml - - - CAP_NET_BIND_SERVICE - CAP_DAC_OVERRIDE - - - - - /usr/sbin/sshd - - - - -``` - -```Txt -$ sr -c '/usr/sbin/sshd' -Authentication of lechatp... -Password: -Privileged bash launched with the role sshd and the following capabilities : cap_dac_override, cap_net_bind_service. -End of role sshd session. -$ ps -aux | grep sshd -lechatp 10003 0.0 0.0 11868 2856 ? Ss 07:51 0:00 /usr/sbin/sshd -``` - -As you can see, the daemon has been launched with lechatp user. All of these steps was necessary to respect the principle of least privilege. - -## TO-DO - -1. Get and read stack trace in kernelside to filter capable() calls by fork() which are non-pertinent for user. This enhancement will ignore CAP_SYS_ADMIN and CAP_SYS_RESOURCES capable() calls for each process. But program must still write entry to map, useful to retrieve the process tree. Note : it seems impossible, see and see but needs confirm. I've read in a commit (I dont resolve him) that bpf_get_stack permits to read stack. Once this found, we will filter capabilities by a "checking" ebpf map. containing list of kallsym ignorable. the ebpf map will lookup in this map for each function trace forwarding 10 iteration max. -2. In addition to read stack in TODO#1, We need to sort capabilities to 2 list : - * mandatory, which corresponds to capabilities who returns -EPERM to program in a specific kernel call - * optionnal, which corresponds to capabilities who change the behavior of kernel in a specific kernel call - - This separation will permits a more convinient selection for automation of sr configuration. -3. Make this tool testable. Tests are created but not functionning. - -## References - -[1] - -[2] - -[3] - -[4] - -[5] - -[6] - -[7] - -[8] - -[9] - -[10] - -[11] - -[12] diff --git a/legacy/capable/src/bpf.c b/legacy/capable/src/bpf.c deleted file mode 100644 index 1fe097f8..00000000 --- a/legacy/capable/src/bpf.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * common eBPF ELF operations. - * - * Copyright (C) 2013-2015 Alexei Starovoitov - * Copyright (C) 2015 Wang Nan - * Copyright (C) 2015 Huawei Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License (not later!) - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see - */ - -#include "bpf.h" - - -/* - * When building perf, unistd.h is overrided. __NR_bpf is - * required to be defined explicitly. - */ -#ifndef __NR_bpf -#if defined(__i386__) -#define __NR_bpf 357 -#elif defined(__x86_64__) -#define __NR_bpf 321 -#elif defined(__aarch64__) -#define __NR_bpf 280 -#else -#error __NR_bpf not defined. libbpf does not support your arch. -#endif -#endif - -static __u64 ptr_to_u64(void *ptr) -{ - return (__u64)(unsigned long)ptr; -} - -static int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, unsigned int size) -{ - return syscall(__NR_bpf, cmd, attr, size); -} - -int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size, - int max_entries, __u32 map_flags) -{ - union bpf_attr attr; - - memset(&attr, '\0', sizeof(attr)); - - attr.map_type = map_type; - attr.key_size = key_size; - attr.value_size = value_size; - attr.max_entries = max_entries; - attr.map_flags = map_flags; - - return sys_bpf(BPF_MAP_CREATE, &attr, sizeof(attr)); -} - -int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns, - size_t insns_cnt, char *license, __u32 kern_version, - char *log_buf, size_t log_buf_sz) -{ - int fd; - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.prog_type = type; - attr.insn_cnt = (__u32)insns_cnt; - attr.insns = ptr_to_u64(insns); - attr.license = ptr_to_u64(license); - attr.log_buf = ptr_to_u64(NULL); - attr.log_size = 0; - attr.log_level = 0; - attr.kern_version = kern_version; - - fd = sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); - if (fd >= 0 || !log_buf || !log_buf_sz) - return fd; - - /* Try again with log */ - attr.log_buf = ptr_to_u64(log_buf); - attr.log_size = log_buf_sz; - attr.log_level = 1; - log_buf[0] = 0; - return sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); -} - -int bpf_map_update_elem(int fd, void *key, void *value, __u64 flags) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.map_fd = fd; - attr.key = ptr_to_u64(key); - attr.value = ptr_to_u64(value); - attr.flags = flags; - - return sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr)); -} - -int bpf_map_lookup_elem(int fd, void *key, void *value) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.map_fd = fd; - attr.key = ptr_to_u64(key); - attr.value = ptr_to_u64(value); - - return sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr)); -} - -int bpf_map_delete_elem(int fd, void *key) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.map_fd = fd; - attr.key = ptr_to_u64(key); - - return sys_bpf(BPF_MAP_DELETE_ELEM, &attr, sizeof(attr)); -} - -int bpf_map_get_next_key(int fd, void *key, void *next_key) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.map_fd = fd; - attr.key = ptr_to_u64(key); - attr.next_key = ptr_to_u64(next_key); - - return sys_bpf(BPF_MAP_GET_NEXT_KEY, &attr, sizeof(attr)); -} - -int bpf_obj_pin(int fd, const char *pathname) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.pathname = ptr_to_u64((void *)pathname); - attr.bpf_fd = fd; - - return sys_bpf(BPF_OBJ_PIN, &attr, sizeof(attr)); -} - -int bpf_obj_get(const char *pathname) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.pathname = ptr_to_u64((void *)pathname); - - return sys_bpf(BPF_OBJ_GET, &attr, sizeof(attr)); -} - -int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type, - unsigned int flags) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.target_fd = target_fd; - attr.attach_bpf_fd = prog_fd; - attr.attach_type = type; - attr.attach_flags = flags; - - return sys_bpf(BPF_PROG_ATTACH, &attr, sizeof(attr)); -} - -int bpf_prog_detach(int target_fd, enum bpf_attach_type type) -{ - union bpf_attr attr; - - bzero(&attr, sizeof(attr)); - attr.target_fd = target_fd; - attr.attach_type = type; - - return sys_bpf(BPF_PROG_DETACH, &attr, sizeof(attr)); -} diff --git a/legacy/capable/src/bpf.h b/legacy/capable/src/bpf.h deleted file mode 100644 index c04eb323..00000000 --- a/legacy/capable/src/bpf.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * common eBPF ELF operations. - * - * Copyright (C) 2013-2015 Alexei Starovoitov - * Copyright (C) 2015 Wang Nan - * Copyright (C) 2015 Huawei Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License (not later!) - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see - */ -#ifndef __BPF_BPF_H -#define __BPF_BPF_H - -#include -#include -#include -#include -#include - -int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size, - int max_entries, __u32 map_flags); - -/* Recommend log buffer size */ -#define BPF_LOG_BUF_SIZE 65536 -int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns, - size_t insns_cnt, char *license, __u32 kern_version, - char *log_buf, size_t log_buf_sz); - -int bpf_map_update_elem(int fd, void *key, void *value, __u64 flags); - -int bpf_map_lookup_elem(int fd, void *key, void *value); -int bpf_map_delete_elem(int fd, void *key); -int bpf_map_get_next_key(int fd, void *key, void *next_key); -int bpf_obj_pin(int fd, const char *pathname); -int bpf_obj_get(const char *pathname); -int bpf_prog_attach(int prog_fd, int attachable_fd, enum bpf_attach_type type, - unsigned int flags); -int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); - -#endif \ No newline at end of file diff --git a/legacy/capable/src/bpf_load.c b/legacy/capable/src/bpf_load.c deleted file mode 100644 index 27b76a1e..00000000 --- a/legacy/capable/src/bpf_load.c +++ /dev/null @@ -1,568 +0,0 @@ -#include "bpf_load.h" -#include "libbpf.h" -#include "perf-sys.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DEBUGFS "/sys/kernel/debug/tracing/" - -static char license[128]; -static int kern_version; -static bool processed_sec[128]; -char bpf_log_buf[BPF_LOG_BUF_SIZE]; -int map_fd[MAX_MAPS]; -int prog_fd[MAX_PROGS]; -int event_fd[MAX_PROGS]; -int prog_cnt; -int prog_array_fd = -1; - -struct bpf_map_def { - unsigned int type; - unsigned int key_size; - unsigned int value_size; - unsigned int max_entries; - unsigned int map_flags; -}; - -static int populate_prog_array(const char *event, int prog_fd) -{ - int ind = atoi(event), err; - - err = bpf_map_update_elem(prog_array_fd, &ind, &prog_fd, BPF_ANY); - if (err < 0) { - printf("failed to store prog_fd in prog_array\n"); - return -1; - } - return 0; -} - -static int load_and_attach(const char *event, struct bpf_insn *prog, int size) -{ - bool is_socket = strncmp(event, "socket", 6) == 0; - bool is_kprobe = strncmp(event, "kprobe/", 7) == 0; - bool is_kretprobe = strncmp(event, "kretprobe/", 10) == 0; - bool is_tracepoint = strncmp(event, "tracepoint/", 11) == 0; - bool is_xdp = strncmp(event, "xdp", 3) == 0; - bool is_perf_event = strncmp(event, "perf_event", 10) == 0; - bool is_cgroup_skb = strncmp(event, "cgroup/skb", 10) == 0; - bool is_cgroup_sk = strncmp(event, "cgroup/sock", 11) == 0; - size_t insns_cnt = size / sizeof(struct bpf_insn); - enum bpf_prog_type prog_type; - char buf[256]; - int fd, efd, err, id; - struct perf_event_attr attr = {0}; - - attr.type = PERF_TYPE_TRACEPOINT; - attr.sample_type = PERF_SAMPLE_RAW; - attr.sample_period = 1; - attr.wakeup_events = 1; - - if (is_socket) { - prog_type = BPF_PROG_TYPE_SOCKET_FILTER; - } else if (is_kprobe || is_kretprobe) { - prog_type = BPF_PROG_TYPE_KPROBE; - } else if (is_tracepoint) { - prog_type = BPF_PROG_TYPE_TRACEPOINT; - } else if (is_xdp) { - prog_type = BPF_PROG_TYPE_XDP; - } else if (is_perf_event) { - prog_type = BPF_PROG_TYPE_PERF_EVENT; - } else if (is_cgroup_skb) { - prog_type = BPF_PROG_TYPE_CGROUP_SKB; - } else if (is_cgroup_sk) { - prog_type = BPF_PROG_TYPE_CGROUP_SOCK; - } else { - printf("Unknown event '%s'\n", event); - return -1; - } - - fd = bpf_load_program(prog_type, prog, insns_cnt, license, kern_version, - bpf_log_buf, BPF_LOG_BUF_SIZE); - if (fd < 0) { - printf("bpf_load_program() err=%d\n%s", errno, bpf_log_buf); - return -1; - } - - prog_fd[prog_cnt++] = fd; - - if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk) - return 0; - - if (is_socket) { - event += 6; - if (*event != '/') - return 0; - event++; - if (!isdigit(*event)) { - printf("invalid prog number\n"); - return -1; - } - return populate_prog_array(event, fd); - } - - if (is_kprobe || is_kretprobe) { - if (is_kprobe) - event += 7; - else - event += 10; - - if (*event == 0) { - printf("event name cannot be empty\n"); - return -1; - } - - if (isdigit(*event)) - return populate_prog_array(event, fd); - - FILE *kprobe_events = fopen(KPROBE_EVENTS,"wa"); - if ( kprobe_events == NULL ) { - perror("Error occurs"); - fprintf( stderr, "failed to create kprobe %s\n", KPROBE_EVENTS); - return -1; - } - fprintf( - kprobe_events,"%c:%s %s",is_kprobe ? 'p' : 'r', - event, event); - fclose(kprobe_events); - strcpy(buf, DEBUGFS); - strcat(buf, "events/kprobes/"); - strcat(buf, event); - strcat(buf, "/id"); - } else if (is_tracepoint) { - event += 11; - - if (*event == 0) { - printf("event name cannot be empty\n"); - return -1; - } - strcpy(buf, DEBUGFS); - strcat(buf, "events/"); - strcat(buf, event); - strcat(buf, "/id"); - } - - efd = open(buf, O_RDONLY, 0); - if (efd < 0) { - printf("failed to open event %s\n", event); - return -1; - } - - err = read(efd, buf, sizeof(buf)); - if (err < 0 || err >= sizeof(buf)) { - printf("read from '%s' failed '%s'\n", event, strerror(errno)); - return -1; - } - - close(efd); - - buf[err] = 0; - id = atoi(buf); - attr.config = id; - - efd = sys_perf_event_open(&attr, -1 /*pid*/, 0 /*cpu*/, -1 /*group_fd*/, - 0); - if (efd < 0) { - printf("event %d fd %d err %s\n", id, efd, strerror(errno)); - return -1; - } - event_fd[prog_cnt - 1] = efd; - ioctl(efd, PERF_EVENT_IOC_ENABLE, 0); - ioctl(efd, PERF_EVENT_IOC_SET_BPF, fd); - - return 0; -} - -static int load_maps(struct bpf_map_def *maps, int len) -{ - int i; - - for (i = 0; i < len / sizeof(struct bpf_map_def); i++) { - map_fd[i] = - bpf_create_map(maps[i].type, maps[i].key_size, - maps[i].value_size, maps[i].max_entries, - maps[i].map_flags); - if (map_fd[i] < 0) { - printf("failed to create a map: %d %s\n", errno, - strerror(errno)); - return 1; - } - - if (maps[i].type == BPF_MAP_TYPE_PROG_ARRAY) - prog_array_fd = map_fd[i]; - } - return 0; -} - -static int get_sec(Elf *elf, int i, GElf_Ehdr *ehdr, char **shname, - GElf_Shdr *shdr, Elf_Data **data) -{ - Elf_Scn *scn; - - scn = elf_getscn(elf, i); - if (!scn) - return 1; - - if (gelf_getshdr(scn, shdr) != shdr) - return 2; - - *shname = elf_strptr(elf, ehdr->e_shstrndx, shdr->sh_name); - if (!*shname || !shdr->sh_size) - return 3; - - *data = elf_getdata(scn, 0); - if (!*data || elf_getdata(scn, *data) != NULL) - return 4; - - return 0; -} - -static int parse_relo_and_apply(Elf_Data *data, Elf_Data *symbols, - GElf_Shdr *shdr, struct bpf_insn *insn) -{ - int i, nrels; - - nrels = shdr->sh_size / shdr->sh_entsize; - - for (i = 0; i < nrels; i++) { - GElf_Sym sym; - GElf_Rel rel; - unsigned int insn_idx; - - gelf_getrel(data, i, &rel); - - insn_idx = rel.r_offset / sizeof(struct bpf_insn); - - gelf_getsym(symbols, GELF_R_SYM(rel.r_info), &sym); - - if (insn[insn_idx].code != (BPF_LD | BPF_IMM | BPF_DW)) { - printf("invalid relo for insn[%d].code 0x%x\n", - insn_idx, insn[insn_idx].code); - return 1; - } - insn[insn_idx].src_reg = BPF_PSEUDO_MAP_FD; - insn[insn_idx].imm = - map_fd[sym.st_value / sizeof(struct bpf_map_def)]; - } - - return 0; -} - -int load_bpf_file(char *path) -{ - int fd, i; - Elf *elf; - GElf_Ehdr ehdr; - GElf_Shdr shdr, shdr_prog; - Elf_Data *data, *data_prog, *symbols = NULL; - char *shname, *shname_prog; - int return_value = 1; - - if (elf_version(EV_CURRENT) == EV_NONE) - return return_value; - - fd = open(path, O_RDONLY, 0); - if (fd < 0) - return return_value; - - elf = elf_begin(fd, ELF_C_READ, NULL); - - if (!elf){ - close(fd); - return return_value; - } - - - if (gelf_getehdr(elf, &ehdr) != &ehdr) - goto free_on_error; - - /* clear all kprobes */ - FILE *kprobe_events = fopen(KPROBE_EVENTS,"w"); - if(kprobe_events == NULL){ - fprintf(stderr,"cannot access to %s\n",KPROBE_EVENTS); - goto free_on_error; - } - fclose(kprobe_events); - - /* scan over all elf sections to get license and map info */ - for (i = 1; i < ehdr.e_shnum; i++) { - if (get_sec(elf, i, &ehdr, &shname, &shdr, &data)) - continue; - - if (0) /* helpful for llvm debugging */ - printf("section %d:%s data %p size %zd link %d flags %d\n", - i, shname, data->d_buf, data->d_size, - shdr.sh_link, (int)shdr.sh_flags); - - if (strcmp(shname, "license") == 0) { - processed_sec[i] = true; - memcpy(license, data->d_buf, data->d_size); - } else if (strcmp(shname, "version") == 0) { - processed_sec[i] = true; - if (data->d_size != sizeof(int)) { - printf("invalid size of version section %zd\n", - data->d_size); - goto free_on_error; - } - memcpy(&kern_version, data->d_buf, sizeof(int)); - } else if (strcmp(shname, "maps") == 0) { - processed_sec[i] = true; - if (load_maps(data->d_buf, data->d_size)) - goto free_on_error; - } else if (shdr.sh_type == SHT_SYMTAB) { - symbols = data; - } - } - - /* load programs that need map fixup (relocations) */ - for (i = 1; i < ehdr.e_shnum; i++) { - if (get_sec(elf, i, &ehdr, &shname, &shdr, &data)) - continue; - if (shdr.sh_type == SHT_REL) { - struct bpf_insn *insns; - - if (get_sec(elf, shdr.sh_info, &ehdr, &shname_prog, - &shdr_prog, &data_prog)) - continue; - - if (shdr_prog.sh_type != SHT_PROGBITS || - !(shdr_prog.sh_flags & SHF_EXECINSTR)) - continue; - - insns = (struct bpf_insn *)data_prog->d_buf; - - processed_sec[shdr.sh_info] = true; - processed_sec[i] = true; - - if (parse_relo_and_apply(data, symbols, &shdr, insns)) - continue; - - if (memcmp(shname_prog, "kprobe/", 7) == 0 || - memcmp(shname_prog, "kretprobe/", 10) == 0 || - memcmp(shname_prog, "tracepoint/", 11) == 0 || - memcmp(shname_prog, "xdp", 3) == 0 || - memcmp(shname_prog, "perf_event", 10) == 0 || - memcmp(shname_prog, "socket", 6) == 0 || - memcmp(shname_prog, "cgroup/", 7) == 0) - load_and_attach(shname_prog, insns, - data_prog->d_size); - } - } - - /* load programs that don't use maps */ - for (i = 1; i < ehdr.e_shnum; i++) { - if (processed_sec[i]) - continue; - - if (get_sec(elf, i, &ehdr, &shname, &shdr, &data)) - continue; - - if (memcmp(shname, "kprobe/", 7) == 0 || - memcmp(shname, "kretprobe/", 10) == 0 || - memcmp(shname, "tracepoint/", 11) == 0 || - memcmp(shname, "xdp", 3) == 0 || - memcmp(shname, "perf_event", 10) == 0 || - memcmp(shname, "socket", 6) == 0 || - memcmp(shname, "cgroup/", 7) == 0) - load_and_attach(shname, data->d_buf, data->d_size); - } - return_value = 0; - free_on_error: - elf_end(elf); - close(fd); - return return_value; -} - -void read_trace_pipe(void) -{ - int trace_fd; - - trace_fd = open(DEBUGFS "trace_pipe", O_RDONLY, 0); - if (trace_fd < 0) - return; - - while (1) { - static char buf[4096]; - ssize_t sz; - - sz = read(trace_fd, buf, sizeof(buf)); - if (sz > 0) { - buf[sz] = 0; - puts(buf); - } - struct timespec time; - time.tv_sec = 0; - time.tv_nsec = 200000000L; - nanosleep(&time,NULL); - } -} - -#define MAX_SYMS 300000 -static struct ksym syms[MAX_SYMS]; -static int sym_cnt; - -static int ksym_cmp(const void *p1, const void *p2) -{ - return ((struct ksym *)p1)->addr - ((struct ksym *)p2)->addr; -} - -int load_kallsyms(void) -{ - FILE *f = fopen("/proc/kallsyms", "r"); - char func[256], buf[256]; - char symbol; - void *addr; - int i = 0; - - if (!f) - return -ENOENT; - - while (!feof(f)) { - if (!fgets(buf, sizeof(buf), f)) - break; - if (sscanf(buf, "%p %c %s", &addr, &symbol, func) != 3) - break; - if (!addr) - continue; - syms[i].addr = (long)addr; - syms[i].name = strdup(func); - i++; - } - sym_cnt = i; - qsort(syms, sym_cnt, sizeof(struct ksym), ksym_cmp); - return 0; -} - -struct ksym *ksym_search(long key) -{ - int start = 0, end = sym_cnt; - int result; - - while (start < end) { - size_t mid = start + (end - start) / 2; - - result = key - syms[mid].addr; - if (result < 0) - end = mid; - else if (result > 0) - start = mid + 1; - else - return &syms[mid]; - } - - if (start >= 1 && syms[start - 1].addr < key && key < syms[start].addr) - /* valid ksym */ - return &syms[start - 1]; - - /* out of range. return _stext */ - return &syms[0]; -} - -int set_link_xdp_fd(int ifindex, int fd) -{ - struct sockaddr_nl sa; - int sock, seq = 0, len, ret = -1; - char buf[4096]; - struct nlattr *nla, *nla_xdp; - struct { - struct nlmsghdr nh; - struct ifinfomsg ifinfo; - char attrbuf[64]; - } req; - struct nlmsghdr *nh; - struct nlmsgerr *err; - - memset(&sa, 0, sizeof(sa)); - sa.nl_family = AF_NETLINK; - - sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); - if (sock < 0) { - printf("open netlink socket: %s\n", strerror(errno)); - return -1; - } - - if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) { - printf("bind to netlink: %s\n", strerror(errno)); - goto cleanup; - } - - memset(&req, 0, sizeof(req)); - req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); - req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; - req.nh.nlmsg_type = RTM_SETLINK; - req.nh.nlmsg_pid = 0; - req.nh.nlmsg_seq = ++seq; - req.ifinfo.ifi_family = AF_UNSPEC; - req.ifinfo.ifi_index = ifindex; - nla = (struct nlattr *)(((char *)&req) + NLMSG_ALIGN(req.nh.nlmsg_len)); - nla->nla_type = NLA_F_NESTED | 43 /*IFLA_XDP*/; - - nla_xdp = (struct nlattr *)((char *)nla + NLA_HDRLEN); - nla_xdp->nla_type = 1 /*IFLA_XDP_FD*/; - nla_xdp->nla_len = NLA_HDRLEN + sizeof(int); - memcpy((char *)nla_xdp + NLA_HDRLEN, &fd, sizeof(fd)); - nla->nla_len = NLA_HDRLEN + nla_xdp->nla_len; - - req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len); - - if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) { - printf("send to netlink: %s\n", strerror(errno)); - goto cleanup; - } - - len = recv(sock, buf, sizeof(buf), 0); - if (len < 0) { - printf("recv from netlink: %s\n", strerror(errno)); - goto cleanup; - } - - for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len); - nh = NLMSG_NEXT(nh, len)) { - if (nh->nlmsg_pid != getpid()) { - printf("Wrong pid %d, expected %d\n", nh->nlmsg_pid, - getpid()); - goto cleanup; - } - if (nh->nlmsg_seq != seq) { - printf("Wrong seq %d, expected %d\n", nh->nlmsg_seq, - seq); - goto cleanup; - } - switch (nh->nlmsg_type) { - case NLMSG_ERROR: - err = (struct nlmsgerr *)NLMSG_DATA(nh); - if (!err->error) - continue; - printf("nlmsg error %s\n", strerror(-err->error)); - goto cleanup; - case NLMSG_DONE: - break; - } - } - - ret = 0; - -cleanup: - close(sock); - return ret; -} \ No newline at end of file diff --git a/legacy/capable/src/bpf_load.h b/legacy/capable/src/bpf_load.h deleted file mode 100644 index 70afe2b9..00000000 --- a/legacy/capable/src/bpf_load.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __BPF_LOAD_H -#define __BPF_LOAD_H - -#include "libbpf.h" - -#define MAX_MAPS 32 -#define MAX_PROGS 32 -#define KPROBE_EVENTS "/sys/kernel/debug/tracing/kprobe_events" - -extern int map_fd[MAX_MAPS]; -extern int prog_fd[MAX_PROGS]; -extern int event_fd[MAX_PROGS]; -extern char bpf_log_buf[BPF_LOG_BUF_SIZE]; -extern int prog_cnt; - -/* parses elf file compiled by llvm .c->.o - * . parses 'maps' section and creates maps via BPF syscall - * . parses 'license' section and passes it to syscall - * . parses elf relocations for BPF maps and adjusts BPF_LD_IMM64 insns by - * storing map_fd into insn->imm and marking such insns as BPF_PSEUDO_MAP_FD - * . loads eBPF programs via BPF syscall - * - * One ELF file can contain multiple BPF programs which will be loaded - * and their FDs stored stored in prog_fd array - * - * returns zero on success - */ -int load_bpf_file(char *path); - -void read_trace_pipe(void); -struct ksym { - long addr; - char *name; -}; - -int load_kallsyms(void); -struct ksym *ksym_search(long key); -int set_link_xdp_fd(int ifindex, int fd); -#endif \ No newline at end of file diff --git a/legacy/capable/src/capable.c b/legacy/capable/src/capable.c deleted file mode 100644 index 76a920e5..00000000 --- a/legacy/capable/src/capable.c +++ /dev/null @@ -1,574 +0,0 @@ -#define _GNU_SOURCE -#include "bpf_load.h" -#include "libbpf.h" -#include "sr_constants.h" -#include "sorting.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define READ 0 -#define WRITE 1 -#define MAX_CHECK 3 -#define BUFFER_KALLSYM 128 -#define HEX 16 -#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */ -//#define DEBUG 1 - -extern char *optarg; -extern int optind, opterr, optopt; - -// Internal structure of input parameters -typedef struct _arguments_t { - char *command; - int sleep; - int daemon; - int version; - int help; -} arguments_t; - -// keeps process pid, needed for signals and filtering -volatile pid_t p_popen = -1; -uid_t u_popen = -1; -volatile unsigned int nsinode = -1; - -/* -Parse input arguments and check arguments validity (in length) -return 0 on success, -1 on unknown arguments, -2 on invalid argument -*/ -static int parse_arg(int argc, char **argv, arguments_t *args); - -/* -Print Help message -*/ -static void print_help(int long_help); - -static int do_clone(void *ptr); - -/* -Inject %s_kern.o to kernel as bpf -return 1 on success, 0 on error occurs (cannot be known) -*/ -static int load_bpf(char *); - -/** - * print line with capabilities - * Note: this method is optimized - */ -static void print_ns_caps(unsigned int ns,unsigned int pns, u_int64_t caps); - - -/** - * print line with capabilities - * Note: this method is optimized - */ -static void print_caps(int pid, int ppid,unsigned int uid,unsigned int gid,unsigned int ns,unsigned int pns, u_int64_t caps); - -static char* get_caplist(u_int64_t caps); - -/** - * appends s2 to str with realloc, return new char* - */ -static char *concat(char *str, char *s2); - -/** - * Looking for command name - * return command or path if process does not exist anymore - */ -static char *get_process_name_by_pid(const int pid); - -/** - * signal handler to kill command if executed - */ -static void killProc(int signum); - -static int printResult(); - -static int printDaemonResult(); - -static int printNSDaemonResult(); - -static int ignoreKallsyms(); - -int main(int argc, char **argv) -{ - int return_code = EXIT_FAILURE; - arguments_t args; // The input args - - if (parse_arg(argc, argv, &args)) { - fprintf(stderr, "Bad parameter.\n"); - print_help(0); - goto free_rscs; - } - if (args.version) { - printf("RootAsRole V%s\n", RAR_VERSION); - return_code = EXIT_SUCCESS; - goto free_rscs; - } - if (args.help) { - print_help(1); - return_code = EXIT_SUCCESS; - goto free_rscs; - } - if(!access(KPROBE_EVENTS,W_OK)){ - cap_t cap = cap_get_proc(); - cap_flag_value_t cap_sys_admin = 0, cap_dac_override = 0; - cap_get_flag(cap, CAP_SYS_ADMIN, CAP_EFFECTIVE, &cap_sys_admin); - cap_get_flag(cap, CAP_DAC_OVERRIDE, CAP_EFFECTIVE, &cap_dac_override); - if(!cap_sys_admin && !cap_dac_override){ - printf("Please run this command with CAP_DAC_OVERRIDE and CAP_SYS_ADMIN capability\n"); - goto free_rscs; - } - cap_free(cap); - } - #ifndef DEBUG - if(load_bpf("capable"))goto free_rscs; - #endif - ignoreKallsyms(); // we remove blacklisted - if (args.command != NULL) { - char *stack; /* Start of stack buffer */ - char *stackTop; /* End of stack buffer */ - stack = malloc(STACK_SIZE); - stackTop = stack + STACK_SIZE; /* Assume stack grows downward */ - signal(SIGINT,killProc); - signal(SIGTERM,killProc); - p_popen = clone(do_clone,stackTop,CLONE_NEWPID | SIGCHLD | CLONE_NEWUTS | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWCGROUP,(void*)&args); - if (p_popen == -1) - perror("clone"); - char *namespaceFile = "/proc/%d/ns/pid"; - char *namespace = malloc(strlen(namespaceFile)*sizeof(char)+sizeof(pid_t)); - snprintf(namespace,strlen(namespaceFile)*sizeof(char)+sizeof(pid_t),namespaceFile,p_popen); - struct stat file_stat; - int ret; - ret = fstatat(0,namespace, &file_stat,0); - free(namespace); - free(stack); - if (ret < 0) { - perror("Unable to access to namespace"); - goto free_rscs; - } - nsinode = file_stat.st_ino; - return_code=0; - while(wait(0) >= 0) sleep(1); - } else if (!args.daemon && - args.sleep < 0) { // if there's no command, no daemon and no sleep - // specified the run as daemon by default - args.daemon = 1; - } - if(args.daemon){ // if command run as daemon then read and print logs from - // eBPF - sigset_t set; - int sig; - sigemptyset(&set); - sigaddset(&set, SIGINT); - sigprocmask(SIG_BLOCK, &set, NULL); - printf("Collecting capabilities asked to system...\nUse Ctrl+C to print result\n"); - int ret_val = sigwait(&set,&sig); - if(ret_val == -1) - perror("sigwait failed"); - if(args.command == NULL)printDaemonResult(); - else printNSDaemonResult(); - } else return_code = printResult(); -free_rscs: - return return_code; -} - -static int do_clone(void *ptr){ - arguments_t* args = (arguments_t*) ptr; - int return_code = -1; - execl("/bin/sh", "sh", "-c", args->command, NULL); - return return_code; -} - -/* -Parse input arguments and check arguments validity (in length) -return 0 on success, -1 on unknown arguments, -2 on invalid argument -*/ -static int parse_arg(int argc, char **argv, arguments_t *args) -{ - *args = (arguments_t){ NULL, -1, 0, 0, 0 }; - - while (1) { - int option_index = 0; - int c; - static struct option long_options[] = { - { "command", optional_argument, 0, 'c' }, - { "sleep", optional_argument, 0, 's' }, - { "daemon", no_argument, 0, 'd' }, - { "version", no_argument, 0, 'v' }, - { "help", no_argument, 0, 'h' }, - { 0, 0, 0, 0 } - }; - - c = getopt_long(argc, argv, "c:s:drnvh", long_options, - &option_index); - if (c == -1) - break; - char *endptr; - switch (c) { - case 'c': - args->command = optarg; - break; - case 'h': - args->help = 1; - break; - case 'v': - args->version = 1; - break; - case 'd': - args->daemon = 1; - break; - case 's': - args->sleep = strtol(optarg, &endptr, 10); - if (*endptr != '\0') - return -2; - break; - default: - return -1; - } - } - // If other unknown args - if (optind < argc) { - return -1; - } - if (args->command != NULL) { - if (strlen(args->command) > 256) - return -2; - } - return 0; -} - -/* -Print Help message -*/ -static void print_help(int long_help) -{ - printf("Usage : capable [-c command] [-s seconds] [-d] [-h] [-v]\n"); - if (long_help) { - printf("Get every capabilities used by running programs.\n"); - printf("If you run this command for daemon you can use -s to kill " - "automatically process\n"); - printf("Options:\n"); - printf(" -c, --command=command launch the command and filter result by his pid and childs.\n"); - printf(" -s, --sleep=number specify number of seconds before kill " - "program \n"); - printf(" -d, --daemon collecting data until killing program printing result at end\n"); - printf(" -v, --version show the actual version of RootAsRole\n"); - printf(" -h, --help print this help and quit.\n"); - printf("Note: .\n"); - } -} - -/** - * signal handler to kill command if executed - */ -static void killProc(int signum) -{ - if (p_popen != -1) { - kill(p_popen, SIGINT); - int i = 0; - while (waitpid(p_popen, NULL, 0) > 0 && i < MAX_CHECK) { - sleep(1); - i++; - } - if(i >= MAX_CHECK){ - printf("SIGINT wait is timed-out\n"); - if(!kill(p_popen, SIGKILL)); - i = 0; - while (waitpid(p_popen, NULL, 0) > 0 && i < MAX_CHECK) { - sleep(1); - i++; - } - if(i >= MAX_CHECK) { - perror("Cannot kill process... exit"); - exit(-1); - } - } - }else { - printDaemonResult(); - exit(0); - } -} - -static int printDaemonResult(){ - int return_value = EXIT_SUCCESS, res; - u_int64_t value, uid_gid,pnsid_nsid; - pid_t key = 0, prev_key = -1; - int ppid = -1; - printf("\nHere are all the capabilities intercepted for this program:\n"); - printf("| PID\t| PPID\t| UID\t| GID\t| NS\t\t| PNS\t\t| NAME\t\t\t| CAPABILITIES\t|\n"); - while (bpf_map_get_next_key(map_fd[1], &prev_key, &key) == 0) { // key are composed by pid and ppid - res = bpf_map_lookup_elem(map_fd[1], &key, - &value); // get capabilities - if (res < 0) { - printf("No capabilities value for %d ??\n", key); - prev_key = key; - return_value = EXIT_FAILURE; - continue; - } - res = bpf_map_lookup_elem(map_fd[2], &key, &uid_gid); // get uid/gid - if (res < 0) { - printf("No uid/gid for %d ??\n", key); - prev_key = key; - return_value = EXIT_FAILURE; - continue; - } - res = bpf_map_lookup_elem(map_fd[3], &key, &ppid); // get ppid - if (res < 0) { - printf("No ppid for %d ??\n", key); - prev_key = key; - return_value = EXIT_FAILURE; - continue; - } - res = bpf_map_lookup_elem(map_fd[4], &key, &pnsid_nsid); // get ppid - if (res < 0) { - printf("No ns for %d ??\n", key); - prev_key = key; - return_value = EXIT_FAILURE; - continue; - } - print_caps(key, ppid, (unsigned int)uid_gid,(unsigned int)(uid_gid >> 32), (unsigned int)pnsid_nsid, (unsigned int)(pnsid_nsid >> 32), - value); // else print everything - prev_key = key; - } - printf("WARNING: These capabilities aren't mandatory, but they can change the behavior of tested program.\n"); - printf("WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant\n"); - return return_value; -} -static int printNSDaemonResult(){ - int return_value = EXIT_SUCCESS, res; - u_int64_t value, parent = 0; - unsigned int key, prev_key = -1; - printf("\nHere are all the capabilities intercepted for this program :\n"); - printf("| NS\t\t| PNS\t\t| CAPABILITIES\t|\n"); - while (bpf_map_get_next_key(map_fd[1], &prev_key, &key) == 0) { // key are composed by pid and ppid - res = bpf_map_lookup_elem(map_fd[1], &key, - &value); // get capabilities - if (res < 0) { - printf("No capabilities value for %d ??\n", key); - prev_key = key; - return_value = EXIT_FAILURE; - continue; - } - res = bpf_map_lookup_elem(map_fd[2], &key, &parent); // get uid/gid - print_ns_caps(key, parent,value); // else print everything - prev_key = key; - } - printf("WARNING: These capabilities aren't mandatory, but they can change the behavior of tested program.\n"); - printf("WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant\n"); - return return_value; -} -/** - * will print the result with or without filter in function of p_popen > 0 - */ -static int printResult() -{ - int return_value = EXIT_SUCCESS; - u_int64_t value; - int res; - unsigned int key, prev_key = -1, parent; - u_int64_t caps = 0; - int nbchilds = 1; - unsigned int *childs = calloc(nbchilds,sizeof(unsigned int)); - childs[0] = nsinode; - while (bpf_map_get_next_key(map_fd[1], &prev_key, &key) == 0) { // key is inode of namespace - res = bpf_map_lookup_elem(map_fd[2], &key, &parent); // get ppid - if (res < 0) { - prev_key = key; - continue; - } - for(int i = 0;i< nbchilds || childs[i] == key;i++){ - if(childs[i] == parent){ //if parent of actual key is in child list then add key to childs - nbchilds++; - childs=(unsigned int *)realloc(childs,nbchilds*sizeof(unsigned int)); - if(childs == NULL){ - perror("realloc"); - exit(-1); - } - childs[nbchilds-1] = key; - } - } - prev_key = key; - } - for(int i = 0 ; i < nbchilds; i++){ - bpf_map_lookup_elem(map_fd[1], &(childs[i]), &value); - caps |= value; - } - free(childs); - if(caps){ - char *capslist = get_caplist(caps); - printf("\nHere are all the capabilities intercepted for this program :\n%s\n",capslist); - free(capslist); - printf("WARNING: These capabilities aren't mandatory, but they can change the behavior of tested program.\n"); - printf("WARNING: CAP_SYS_ADMIN is rarely needed and can be very dangerous to grant\n"); - }else{ - printf("No capabilities are needed for this program.\n"); - } - return return_value; -} - -/** - * will inject JIT ebpf to the kernel - */ -static int load_bpf(char* name) -{ - int return_code = -1; - char *filename = (char*)malloc(strlen(name)*sizeof(char)+8*sizeof(char)); - sprintf(filename,"%s_kern.o",name); - if (access(filename, F_OK)) { - char *buffer = (char*)malloc(strlen(name)*sizeof(char)+30); - sprintf(buffer,"/usr/lib/RootAsRole/%s_kern.o",name); - free(filename); - filename = buffer; - if (access(buffer, F_OK)) { //if file in library is accessible - perror("Missing injector in librairies or in current folder"); - goto free_on_error; - } - } - if (load_bpf_file(filename)) { - if (strlen(bpf_log_buf) > 1) - fprintf(stderr, "%s\n", bpf_log_buf); - goto free_on_error; - } - return_code = 0; -free_on_error: - free(filename); - return return_code; -} - -/** - * print caps logged from map - */ -static void print_caps(int pid, int ppid,unsigned int uid,unsigned int gid,unsigned int ns,unsigned int pns, u_int64_t caps) -{ - char* name = get_process_name_by_pid(pid); - if (caps <= (u_int64_t)0) { - - printf("| %d\t| %d\t| %d\t| %d\t| %u\t| %u\t| %s\t| %s\t|\n", pid, ppid,uid, - gid,ns,pns, name, - "No capabilities needed"); - return; - } - char *capslist = NULL; - capslist = get_caplist(caps); - printf("| %d\t| %d\t| %d\t| %d\t| %u\t| %u\t| %s\t| %s\t|\n",uid, - gid, pid, ppid,ns,pns, name, - capslist); - free(capslist); - free(name); -} - -static void print_ns_caps(unsigned int ns,unsigned int pns, u_int64_t caps) -{ - if (caps <= (u_int64_t)0) { - - printf("| %u\t| %u\t| %s\t|\n", ns,pns, - "No capabilities needed"); - return; - } - char *capslist = NULL; - capslist = get_caplist(caps); - printf("| %u\t| %u\t| %s\t|\n",ns,pns,capslist); - free(capslist); -} - -static char* get_caplist(u_int64_t caps){ - char *capslist = NULL; - for (int pos = 0; pos < sizeof(u_int64_t) * 8; - pos++) { // caps > ((u_int64_t)1 << pos)&& - if ((caps & ((u_int64_t)1 << pos)) != 0) { - char *cap = NULL; - if((cap= cap_to_name(pos)) == NULL){ - printf("Can't recognize %d capability",pos); - perror(""); - } - if (capslist != NULL){ - capslist = concat(capslist, ", "); - capslist = concat(capslist, cap); - }else{ - capslist = malloc(strlen(cap)*sizeof(char)+1); - strcpy(capslist,cap); - } - cap_free(cap); - } - } - return capslist; -} - -/** - * appends s2 to str with realloc, return new char* - */ -static char *concat(char *str, char *s2) -{ - int len = 0; - char *s = NULL; - if (str != NULL) - len = strlen(str); - len += strlen(s2) + 1 * sizeof(*s2); - s = realloc(str, len); - strcat(s, s2); - return s; -} - -/** - * Looking for command name - * return command or path if process does not exist anymore - */ -static char *get_process_name_by_pid(const int pid) -{ - char *name = (char *)calloc(64, sizeof(char)); - if (name) { - sprintf(name, "/proc/%d/cmdline", pid); - FILE *f = fopen(name, "r"); - if (f) { - size_t size; - size = fread(name, sizeof(char), 61, f); - if (size > 0) { - char *limit=strchr(name,' '); - if(limit != NULL){ - name[limit-name]='\0'; - }else if(name[size-1]=='\n'){ - name[size-1]='\0'; - }else{ - name[size]='.'; - name[size+1]='.'; - name[size+2]='\0'; - } - } - fclose(f); - } - } - return name; -} - -static int ignoreKallsyms(){ - char kall[HEX + 1] = "", line[BUFFER_KALLSYM] = ""; - int k = 0; - FILE *fp_kallsyms = fopen("/proc/kallsyms","r"); - while(fgets(line,BUFFER_KALLSYM,fp_kallsyms) != NULL){ - if(strstr(line,"_do_fork") != NULL){ - strncpy(line,kall,17); - } - unsigned long v = strtol(kall,NULL,HEX); - if(strcmp(kall,"") != 0) { - bpf_map_update_elem(map_fd[0],&k,&v,0); - k++; - strcpy(line,""); - } - } - return k; -} diff --git a/legacy/capable/src/kernel/asm_goto_workaround.h b/legacy/capable/src/kernel/asm_goto_workaround.h deleted file mode 100644 index d9e49e72..00000000 --- a/legacy/capable/src/kernel/asm_goto_workaround.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* Copyright (c) 2019 Facebook */ -#ifndef __ASM_GOTO_WORKAROUND_H -#define __ASM_GOTO_WORKAROUND_H - -/* this will bring in asm_volatile_goto macro definition - * if enabled by compiler and config options. - */ -#include - -#ifdef asm_volatile_goto -#undef asm_volatile_goto -#define asm_volatile_goto(x...) asm volatile("invalid use of asm_volatile_goto") -#endif - -#if __clang_major__ >= 4 -#pragma clang diagnostic ignored "-Waddress-of-packed-member" -#endif - -#endif \ No newline at end of file diff --git a/legacy/capable/src/kernel/bpf_helpers.h b/legacy/capable/src/kernel/bpf_helpers.h deleted file mode 100644 index 6f94747b..00000000 --- a/legacy/capable/src/kernel/bpf_helpers.h +++ /dev/null @@ -1,169 +0,0 @@ -#ifndef __BPF_HELPERS_H -#define __BPF_HELPERS_H - -/* helper macro to place programs, maps, license in - * different sections in elf_bpf file. Section names - * are interpreted by elf_bpf loader - */ -#define SEC(NAME) __attribute__((section(NAME), used)) - -/* adding specification fort getting current task */ -static u64 (*bpf_get_current_task)(void) = (void *)BPF_FUNC_get_current_task; -#ifdef K50 -static int (*bpf_get_stack)(void *ctx, void *buf, int size, int flags) = - (void *) BPF_FUNC_get_stack; -#endif -/* helper functions called from eBPF programs written in C */ -static void *(*bpf_map_lookup_elem)(void *map, void *key) = (void *) - BPF_FUNC_map_lookup_elem; -static int (*bpf_map_update_elem)(void *map, void *key, void *value, - unsigned long long flags) = (void *) - BPF_FUNC_map_update_elem; -static int (*bpf_map_delete_elem)(void *map, - void *key) = (void *)BPF_FUNC_map_delete_elem; -static int (*bpf_probe_read)(void *dst, int size, - void *unsafe_ptr) = (void *)BPF_FUNC_probe_read; -static unsigned long long (*bpf_ktime_get_ns)(void) = (void *) - BPF_FUNC_ktime_get_ns; -static int (*bpf_trace_printk)(const char *fmt, int fmt_size, - ...) = (void *)BPF_FUNC_trace_printk; -static void (*bpf_tail_call)(void *ctx, void *map, - int index) = (void *)BPF_FUNC_tail_call; -static unsigned long long (*bpf_get_smp_processor_id)(void) = (void *) - BPF_FUNC_get_smp_processor_id; -static unsigned long long (*bpf_get_current_pid_tgid)(void) = (void *) - BPF_FUNC_get_current_pid_tgid; -static unsigned long long (*bpf_get_current_uid_gid)(void) = (void *) - BPF_FUNC_get_current_uid_gid; -static int (*bpf_get_current_comm)(void *buf, int buf_size) = (void *) - BPF_FUNC_get_current_comm; -static int (*bpf_perf_event_read)(void *map, - int index) = (void *)BPF_FUNC_perf_event_read; -static int (*bpf_clone_redirect)(void *ctx, int ifindex, - int flags) = (void *)BPF_FUNC_clone_redirect; -static int (*bpf_redirect)(int ifindex, int flags) = (void *)BPF_FUNC_redirect; -static int (*bpf_perf_event_output)( - void *ctx, void *map, unsigned long long flags, void *data, - int size) = (void *)BPF_FUNC_perf_event_output; -static int (*bpf_get_stackid)(void *ctx, void *map, - int flags) = (void *)BPF_FUNC_get_stackid; -static int (*bpf_probe_write_user)(void *dst, void *src, int size) = (void *) - BPF_FUNC_probe_write_user; -static int (*bpf_current_task_under_cgroup)(void *map, int index) = (void *) - BPF_FUNC_current_task_under_cgroup; -static int (*bpf_skb_get_tunnel_key)(void *ctx, void *key, int size, - int flags) = (void *) - BPF_FUNC_skb_get_tunnel_key; -static int (*bpf_skb_set_tunnel_key)(void *ctx, void *key, int size, - int flags) = (void *) - BPF_FUNC_skb_set_tunnel_key; -static int (*bpf_skb_get_tunnel_opt)(void *ctx, void *md, int size) = (void *) - BPF_FUNC_skb_get_tunnel_opt; -static int (*bpf_skb_set_tunnel_opt)(void *ctx, void *md, int size) = (void *) - BPF_FUNC_skb_set_tunnel_opt; -static unsigned long long (*bpf_get_prandom_u32)(void) = (void *) - BPF_FUNC_get_prandom_u32; -static int (*bpf_xdp_adjust_head)(void *ctx, int offset) = (void *) - BPF_FUNC_xdp_adjust_head; - -/* llvm builtin functions that eBPF C program may use to - * emit BPF_LD_ABS and BPF_LD_IND instructions - */ -struct sk_buff; -unsigned long long load_byte(void *skb, - unsigned long long off) asm("llvm.bpf.load.byte"); -unsigned long long load_half(void *skb, - unsigned long long off) asm("llvm.bpf.load.half"); -unsigned long long load_word(void *skb, - unsigned long long off) asm("llvm.bpf.load.word"); - -/* a helper structure used by eBPF C program - * to describe map attributes to elf_bpf loader - */ -struct bpf_map_def { - unsigned int type; - unsigned int key_size; - unsigned int value_size; - unsigned int max_entries; - unsigned int map_flags; -}; - -static int (*bpf_skb_load_bytes)(void *ctx, int off, void *to, - int len) = (void *)BPF_FUNC_skb_load_bytes; -static int (*bpf_skb_store_bytes)(void *ctx, int off, void *from, int len, - int flags) = (void *)BPF_FUNC_skb_store_bytes; -static int (*bpf_l3_csum_replace)(void *ctx, int off, int from, int to, - int flags) = (void *)BPF_FUNC_l3_csum_replace; -static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, - int flags) = (void *)BPF_FUNC_l4_csum_replace; -static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) = (void *) - BPF_FUNC_skb_under_cgroup; -static int (*bpf_skb_change_head)(void *, int len, - int flags) = (void *)BPF_FUNC_skb_change_head; - -#if defined(__x86_64__) - -#define PT_REGS_PARM1(x) ((x)->di) -#define PT_REGS_PARM2(x) ((x)->si) -#define PT_REGS_PARM3(x) ((x)->dx) -#define PT_REGS_PARM4(x) ((x)->cx) -#define PT_REGS_PARM5(x) ((x)->r8) -#define PT_REGS_RET(x) ((x)->sp) -#define PT_REGS_FP(x) ((x)->bp) -#define PT_REGS_RC(x) ((x)->ax) -#define PT_REGS_SP(x) ((x)->sp) -#define PT_REGS_IP(x) ((x)->ip) - -#elif defined(__s390x__) - -#define PT_REGS_PARM1(x) ((x)->gprs[2]) -#define PT_REGS_PARM2(x) ((x)->gprs[3]) -#define PT_REGS_PARM3(x) ((x)->gprs[4]) -#define PT_REGS_PARM4(x) ((x)->gprs[5]) -#define PT_REGS_PARM5(x) ((x)->gprs[6]) -#define PT_REGS_RET(x) ((x)->gprs[14]) -#define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */ -#define PT_REGS_RC(x) ((x)->gprs[2]) -#define PT_REGS_SP(x) ((x)->gprs[15]) -#define PT_REGS_IP(x) ((x)->psw.addr) - -#elif defined(__aarch64__) - -#define PT_REGS_PARM1(x) ((x)->regs[0]) -#define PT_REGS_PARM2(x) ((x)->regs[1]) -#define PT_REGS_PARM3(x) ((x)->regs[2]) -#define PT_REGS_PARM4(x) ((x)->regs[3]) -#define PT_REGS_PARM5(x) ((x)->regs[4]) -#define PT_REGS_RET(x) ((x)->regs[30]) -#define PT_REGS_FP(x) ((x)->regs[29]) /* Works only with CONFIG_FRAME_POINTER */ -#define PT_REGS_RC(x) ((x)->regs[0]) -#define PT_REGS_SP(x) ((x)->sp) -#define PT_REGS_IP(x) ((x)->pc) - -#elif defined(__powerpc__) - -#define PT_REGS_PARM1(x) ((x)->gpr[3]) -#define PT_REGS_PARM2(x) ((x)->gpr[4]) -#define PT_REGS_PARM3(x) ((x)->gpr[5]) -#define PT_REGS_PARM4(x) ((x)->gpr[6]) -#define PT_REGS_PARM5(x) ((x)->gpr[7]) -#define PT_REGS_RC(x) ((x)->gpr[3]) -#define PT_REGS_SP(x) ((x)->sp) -#define PT_REGS_IP(x) ((x)->nip) - -#endif - -#ifdef __powerpc__ -#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) -#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP -#else -#define BPF_KPROBE_READ_RET_IP(ip, ctx) \ - ({ bpf_probe_read(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) -#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ - ({ \ - bpf_probe_read(&(ip), sizeof(ip), \ - (void *)(PT_REGS_FP(ctx) + sizeof(ip))); \ - }) -#endif - -#endif \ No newline at end of file diff --git a/legacy/capable/src/kernel/capable_kern.c b/legacy/capable/src/kernel/capable_kern.c deleted file mode 100644 index a9758a60..00000000 --- a/legacy/capable/src/kernel/capable_kern.c +++ /dev/null @@ -1,116 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "bpf_helpers.h" - -#define MAX_STACK_RAWTP 5 - -/** - * This eBPF still useful for daemon analysis - */ -struct bpf_map_def SEC("maps") kallsyms_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u64), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; -struct bpf_map_def SEC("maps") capabilities_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u64), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; -struct bpf_map_def SEC("maps") uid_gid_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u64), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; -struct bpf_map_def SEC("maps") ppid_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u32), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; -struct bpf_map_def SEC("maps") pnsid_nsid_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u64), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; - -struct task_struct *get_parent_task(struct task_struct *task){ - struct task_struct *parent; - bpf_probe_read(&parent, sizeof(parent), &task->real_parent); - return parent; -} - -int get_ppid(struct task_struct *task) -{ - u32 ppid; - struct task_struct *parent = get_parent_task(task); - bpf_probe_read(&ppid, sizeof(ppid), &parent->pid); - return ppid; -} - -unsigned int get_ns_inode(struct task_struct *task){ - struct nsproxy *nsp; - struct pid_namespace *pns; - struct ns_common nsc; - unsigned int inum; - bpf_probe_read(&nsp,sizeof(nsp),&task->nsproxy); - bpf_probe_read(&pns,sizeof(pns),&nsp->pid_ns_for_children); - bpf_probe_read(&nsc,sizeof(nsc),&pns->ns); - return nsc.inum; -} -/** - * return parent ns inum if same ns returned, it's because parent pid is the same - */ -unsigned int get_parent_ns_inode(struct task_struct *task){ - struct task_struct *parent = get_parent_task(task); - return get_ns_inode(parent); -} - -SEC("kprobe/cap_capable") -int bpf_cap_capable(struct pt_regs *ctx) -{ - struct task_struct *task = (struct task_struct *)bpf_get_current_task(); - u32 ppid = get_ppid(task); - int i = 0; - u32 pid = bpf_get_current_pid_tgid()>>32; - u64 cap = (u64)PT_REGS_PARM3(ctx), - uid_gid = bpf_get_current_uid_gid(), - *capval = bpf_map_lookup_elem(&capabilities_map, &pid), - pinum_inum = ((u64)get_parent_ns_inode(task)<<32) | get_ns_inode(task), - initial = ((u64)1 << cap); // if cap_sys_ressource or cap_sys_admin called first - #ifdef K50 - u64 userstack[MAX_STACK_RAWTP], //store current stack addresses - *blacklist_stack = bpf_map_lookup_elem(&kallsyms_map, &i); //getting first entry of blacklist kernel stack call - bpf_get_stack(ctx,userstack,sizeof(u64)*MAX_STACK_RAWTP,0); // retrieve MAX_STACK_RAWTP kernel stack calls - if(blacklist_stack){ // if blacklist exist, then check in stack with MAX_STACK_RAWTP depth for the call - // loops are forbidden in eBPF - if(userstack[0] == *blacklist_stack) - initial = 0; // if blacklist found then ignore capability but still write entry to map - else if(userstack[1] == *blacklist_stack) - initial = 0; - else if(userstack[2] == *blacklist_stack) - initial = 0; - else if(userstack[3] == *blacklist_stack) - initial = 0; - else if(userstack[4] == *blacklist_stack) - initial = 0; - } - #endif - if (capval) { - *capval |= initial; - } else { - bpf_map_update_elem(&uid_gid_map, &pid, &uid_gid, BPF_ANY); - bpf_map_update_elem(&pnsid_nsid_map, &pid, &pinum_inum, BPF_ANY); - bpf_map_update_elem(&ppid_map, &pid, &ppid, BPF_ANY); - bpf_map_update_elem(&capabilities_map, &pid, &initial, BPF_ANY); - } - return 0; -} - -char _license[] SEC("license") = "GPL"; -u32 _version SEC("version") = LINUX_VERSION_CODE; diff --git a/legacy/capable/src/kernel/nscapable_kern.c b/legacy/capable/src/kernel/nscapable_kern.c deleted file mode 100644 index 5a080570..00000000 --- a/legacy/capable/src/kernel/nscapable_kern.c +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "bpf_helpers.h" - -//#define randomized_struct_fields_start struct { -//#define randomized_struct_fields_end }; - -#define MAX_STACK_RAWTP 5 - -/** - * this eBPF will listen to cap_capable() kprobe - * will store capabilities asked referenced by namespace inum - * will retrieve parent namespace inum - * will blacklist capabilities if stack address is in blacklist - */ - -struct bpf_map_def SEC("maps") kallsyms_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u64), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; -struct bpf_map_def SEC("maps") capabilities_map = { .type = BPF_MAP_TYPE_HASH, - .key_size = sizeof(__u32), - .value_size = sizeof(__u64), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; -struct bpf_map_def SEC("maps") parent_map = { .type = BPF_MAP_TYPE_HASH, //current namespace inode - .key_size = sizeof(__u32), - .value_size = sizeof(__u32), - .max_entries = PID_MAX_DEFAULT, - .map_flags = 0 }; - -struct task_struct *get_parent_task(struct task_struct *task){ - struct task_struct *parent; - bpf_probe_read(&parent, sizeof(parent), &task->real_parent); - return parent; -} - -unsigned int get_ns_inode(struct task_struct *task){ - struct nsproxy *nsp; - struct pid_namespace *pns; - struct ns_common nsc; - unsigned int inum; - bpf_probe_read(&nsp,sizeof(nsp),&task->nsproxy); - bpf_probe_read(&pns,sizeof(pns),&nsp->pid_ns_for_children); - bpf_probe_read(&nsc,sizeof(nsc),&pns->ns); - return nsc.inum; -} -/** - * return parent ns inum if same ns returned, it's because parent pid is the same - */ -unsigned int get_parent_ns_inode(struct task_struct *task){ - struct task_struct *parent = get_parent_task(task); - return get_ns_inode(parent); -} - -SEC("kprobe/cap_capable") -int bpf_cap_capable_ns(struct pt_regs *ctx) -{ - int i = 0; - struct task_struct *task = (struct task_struct *)bpf_get_current_task(); //getting actual task - u32 cap = (u32)PT_REGS_PARM3(ctx), // this param is capability - inum = get_ns_inode(task), // get inode of current namespace - *pinum = bpf_map_lookup_elem(&parent_map, &inum); //getting parent inode pointer - u64 *capval = bpf_map_lookup_elem(&capabilities_map, &inum), // getting ancient capabilities value - initial = ((u64)1 << cap); //transform capability to bit position - #ifdef K50 - u64 userstack[MAX_STACK_RAWTP], //store current stack addresses - *blacklist_stack = bpf_map_lookup_elem(&kallsyms_map, &i); //getting first entry of blacklist kernel stack call - bpf_get_stack(ctx,userstack,sizeof(u64)*MAX_STACK_RAWTP,0); // retrieve MAX_STACK_RAWTP kernel stack calls - if(blacklist_stack){ // if blacklist exist, then check in stack with MAX_STACK_RAWTP depth for the call - // loops are forbidden in eBPF - if(userstack[0] == *blacklist_stack) - initial = 0; // if blacklist found then ignore capability but still write entry to map - else if(userstack[1] == *blacklist_stack) - initial = 0; - else if(userstack[2] == *blacklist_stack) - initial = 0; - else if(userstack[3] == *blacklist_stack) - initial = 0; - else if(userstack[4] == *blacklist_stack) - initial = 0; - } - #endif - if (capval) { - *capval |= initial; // update value if existing - } else { - bpf_map_update_elem(&capabilities_map, &inum, &initial, BPF_ANY); //save first capability - } - if(!pinum){ // if parent isn't existing - unsigned int parent_inum = get_parent_ns_inode(task); //getting parent - if(parent_inum !=inum) //if parent namespace getted is equal actual namespace, then we are too depth, theorically impossible - bpf_map_update_elem(&parent_map, &inum, &parent_inum, BPF_ANY); //save parent - } - return 0; -} - -char _license[] SEC("license") = "GPL"; -u32 _version SEC("version") = LINUX_VERSION_CODE; diff --git a/legacy/capable/src/libbpf.h b/legacy/capable/src/libbpf.h deleted file mode 100644 index 1520ffd2..00000000 --- a/legacy/capable/src/libbpf.h +++ /dev/null @@ -1,170 +0,0 @@ -/* eBPF mini library */ -#ifndef __LIBBPF_H -#define __LIBBPF_H - -#include "bpf.h" - -struct bpf_insn; - -/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ - -#define BPF_ALU64_REG(OP, DST, SRC) \ - ((struct bpf_insn){ .code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -#define BPF_ALU32_REG(OP, DST, SRC) \ - ((struct bpf_insn){ .code = BPF_ALU | BPF_OP(OP) | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */ - -#define BPF_ALU64_IMM(OP, DST, IMM) \ - ((struct bpf_insn){ .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_ALU32_IMM(OP, DST, IMM) \ - ((struct bpf_insn){ .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -/* Short form of mov, dst_reg = src_reg */ - -#define BPF_MOV64_REG(DST, SRC) \ - ((struct bpf_insn){ .code = BPF_ALU64 | BPF_MOV | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -#define BPF_MOV32_REG(DST, SRC) \ - ((struct bpf_insn){ .code = BPF_ALU | BPF_MOV | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -/* Short form of mov, dst_reg = imm32 */ - -#define BPF_MOV64_IMM(DST, IMM) \ - ((struct bpf_insn){ .code = BPF_ALU64 | BPF_MOV | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_MOV32_IMM(DST, IMM) \ - ((struct bpf_insn){ .code = BPF_ALU | BPF_MOV | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */ -#define BPF_LD_IMM64(DST, IMM) BPF_LD_IMM64_RAW(DST, 0, IMM) - -#define BPF_LD_IMM64_RAW(DST, SRC, IMM) \ - ((struct bpf_insn){ .code = BPF_LD | BPF_DW | BPF_IMM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = (__u32)(IMM) }), \ - ((struct bpf_insn){ .code = 0, /* zero is reserved opcode */ \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = ((__u64)(IMM)) >> 32 }) - -#ifndef BPF_PSEUDO_MAP_FD -#define BPF_PSEUDO_MAP_FD 1 -#endif - -/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */ -#define BPF_LD_MAP_FD(DST, MAP_FD) \ - BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD) - -/* Direct packet access, R0 = *(uint *) (skb->data + imm32) */ - -#define BPF_LD_ABS(SIZE, IMM) \ - ((struct bpf_insn){ .code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -/* Memory load, dst_reg = *(uint *) (src_reg + off16) */ - -#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn){ .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Memory store, *(uint *) (dst_reg + off16) = src_reg */ - -#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn){ .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Memory store, *(uint *) (dst_reg + off16) = imm32 */ - -#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ - ((struct bpf_insn){ .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -/* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + - * off16 */ - -#define BPF_JMP_REG(OP, DST, SRC, OFF) \ - ((struct bpf_insn){ .code = BPF_JMP | BPF_OP(OP) | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -/* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 - */ - -#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ - ((struct bpf_insn){ .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -/* Raw code statement block */ - -#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ - ((struct bpf_insn){ .code = CODE, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = IMM }) - -/* Program exit */ - -#define BPF_EXIT_INSN() \ - ((struct bpf_insn){ .code = BPF_JMP | BPF_EXIT, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = 0 }) - -#endif \ No newline at end of file diff --git a/legacy/capable/src/perf-sys.h b/legacy/capable/src/perf-sys.h deleted file mode 100644 index 1396f51a..00000000 --- a/legacy/capable/src/perf-sys.h +++ /dev/null @@ -1,142 +0,0 @@ -#ifndef _PERF_SYS_H -#define _PERF_SYS_H - -#include -#include -#include -#include -#include - -#if defined(__i386__) -#define cpu_relax() asm volatile("rep; nop" ::: "memory"); -#define CPUINFO_PROC \ - { \ - "model name" \ - } -#endif - -#if defined(__x86_64__) -#define cpu_relax() asm volatile("rep; nop" ::: "memory"); -#define CPUINFO_PROC \ - { \ - "model name" \ - } -#endif - -#ifdef __powerpc__ -#define CPUINFO_PROC \ - { \ - "cpu" \ - } -#endif - -#ifdef __s390__ -#define CPUINFO_PROC \ - { \ - "vendor_id" \ - } -#endif - -#ifdef __sh__ -#define CPUINFO_PROC \ - { \ - "cpu type" \ - } -#endif - -#ifdef __hppa__ -#define CPUINFO_PROC \ - { \ - "cpu" \ - } -#endif - -#ifdef __sparc__ -#define CPUINFO_PROC \ - { \ - "cpu" \ - } -#endif - -#ifdef __alpha__ -#define CPUINFO_PROC \ - { \ - "cpu model" \ - } -#endif - -#ifdef __ia64__ -#define cpu_relax() asm volatile("hint @pause" ::: "memory") -#define CPUINFO_PROC \ - { \ - "model name" \ - } -#endif - -#ifdef __arm__ -#define CPUINFO_PROC \ - { \ - "model name", "Processor" \ - } -#endif - -#ifdef __aarch64__ -#define cpu_relax() asm volatile("yield" ::: "memory") -#endif - -#ifdef __mips__ -#define CPUINFO_PROC \ - { \ - "cpu model" \ - } -#endif - -#ifdef __arc__ -#define CPUINFO_PROC \ - { \ - "Processor" \ - } -#endif - -#ifdef __metag__ -#define CPUINFO_PROC \ - { \ - "CPU" \ - } -#endif - -#ifdef __xtensa__ -#define CPUINFO_PROC \ - { \ - "core ID" \ - } -#endif - -#ifdef __tile__ -#define cpu_relax() asm volatile("mfspr zero, PASS" ::: "memory") -#define CPUINFO_PROC \ - { \ - "model name" \ - } -#endif - -#ifndef cpu_relax -#define cpu_relax() barrier() -#endif - -static inline int sys_perf_event_open(struct perf_event_attr *attr, pid_t pid, - int cpu, int group_fd, - unsigned long flags) -{ - int fd; - - fd = syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); - -#ifdef HAVE_ATTR_TEST - if (unlikely(test_attr__enabled)) - test_attr__open(attr, pid, cpu, fd, group_fd, flags); -#endif - return fd; -} - -#endif /* _PERF_SYS_H */ diff --git a/legacy/capable/src/sorting.c b/legacy/capable/src/sorting.c deleted file mode 100644 index 8f07c870..00000000 --- a/legacy/capable/src/sorting.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "sorting.h" -#include -#include - -//if checking true then pid will filtered if not in tree -extern void append_pid(SortedPids *list, pid_t p_pid, pid_t p_ppid){ - SortedPids elem = {p_pid,p_ppid,NULL}; - if(list != NULL){ - SortedPids **plist = &list; - SortedPids *last = NULL; - while(*plist && (*plist)->pid < p_pid){ - last = *plist; - plist = &(*plist)->next; - } - if(*plist){ // if while stopped on valid value, the inserting to the end of list - elem.next = *plist; - last->next = &elem; - }else{ // else last NULL pointer become elem - *plist = &elem; - } - } -} - -/** - * return all child of given pid - */ -extern void get_childs(SortedPids *list, pid_t pid, pid_t *result, int *size){ - SortedPids **plist = &list; - while(*plist){ //on itère sur toute la liste - if((*plist)->ppid == pid){ // si le ppid == au ppid préciser alors - (*size)++; - result = realloc(result,(*size)*sizeof(pid_t)); - result[(*size)-1] = (*plist)->pid; - get_childs(list,(*plist)->pid,result,size); // on vérifie que l'élement courant a des fils - } - plist = &(*plist)->next; - } -} \ No newline at end of file diff --git a/legacy/capable/src/sorting.h b/legacy/capable/src/sorting.h deleted file mode 100644 index 2f2b385f..00000000 --- a/legacy/capable/src/sorting.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SORTING_H -#define SORTING_H -#include - -/** - * This structure will make a sorted array of tree - * sorted array is next from SortedCompositePids - * trees are list of CompositePids - */ -typedef struct SortedPids SortedPids; -struct SortedPids { - pid_t pid; - pid_t ppid; - SortedPids *next; -}; - -//add pid/ppid in the structure -extern void append_pid(SortedPids *list, pid_t pid, pid_t ppid); - -//return all child of given pid -extern void get_childs(SortedPids *list, pid_t pid, pid_t *result, int *size); - -#endif //SORTING_H \ No newline at end of file diff --git a/legacy/capable/src/sr_constants.h b/legacy/capable/src/sr_constants.h deleted file mode 100644 index 48db8da5..00000000 --- a/legacy/capable/src/sr_constants.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * - * This file contains the constants used by sr and sr_aux. - * - * Note, the copyright+license information is at end of file. - */ -#ifndef SR_CONSTANT_H_INCLUDED -#define SR_CONSTANT_H_INCLUDED - -// define SR_DEBUG to log messages on capabilities, process attributes, and -// other privileges. #define SR_DEBUG 1 - -#define RAR_VERSION "2.2" - -// The path to the common shell -#define BASH "/bin/bash" -#define BASH_OPTION "--norc" - -#endif // SR_CONSTANT_H_INCLUDED - -/* - * - * Copyright Guillaume Daumas , 2018 - * Copyright Ahmad Samer Wazan , 2018 - * Copyright Rémi Venant , 2018 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/legacy/doc/SrWorkflow.png b/legacy/doc/SrWorkflow.png deleted file mode 100644 index d2a88c0f2250fc3f27bfd6961474bdc89cbbbb7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681162 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Ây@i9Q{jx%wpAk{-u`aP331FtKC;WeofP401QbWajYb$9P}QVE8L4wOB~Pxd_0|cN^c$eK0u+ zYUu}7b%N8bf67NKx@_64oL%uNXuJ@bjEe8<$zVT70y(eeB(Hb(D|oEx6lb~pwrF_J zg)q$by`8)H-l$yaI+U#xeNjP<+h-E~`LOl~bI#N{GQx1tCClEmHFr7pqGIy?Q4UT1 z_y{v;V<&1oTxV`>3E3XwW$o?Qq}TFi$J$Xr%NMe~%mMqmuobIrioL}rzd=WwUp()@ zn}KP_E$KyOpb3Sb7VHHk-=1#9{i>V_s{8SGY1F{SOT_W)KG*gRcvJmlOCf|;G>Nr?X~V!E8jhOJCiRM>R>VpI+~OV~cX z>fFjOlENG0gx*~(Fgo&)_pmg|Fwh$WJ#Xs>8@yoG7OUdgMuUT5Dff=Eu-A7kOkR*& z?B?-$;!2#>M_hBA@?tvu+W}Y|IuG}B2Z$mvc*@~zp$l^DD=W8)R|?>zsl5?{C62_K zvQ-U^FbZSrW%gW(AMs+-@t7n5l)IZVxh`hhxeLW{ZR(-ut-puq)9}U}gt|S8mI%t} zKK_vXM-=XE@OQH~d7(fb1GrUqshp;f^YJ~03>BzvdV%8Er6En|l!dyP?F4^!CWPNT zDdWjh;Wy#$_jAsQ4o0BK_XVT+3>^P{lb|8n#hC9bDo*L)U?nDAv`r{_H4fN60B1{0 zT=H-X%x*DD?qFATbTCd~Dv=Ed#>JiQso)&W`R#`ntkqCa`mAREV}PjjRa{kFhb^bf z3=47v7y9VOxPd#p;NYA=W4`<#3>#6UQjuE~LNe$q$`;En9@ZLd02%+OQ8m|d;{l$- zTbT}lywGHUX0#msiWyN)#%n%ouau4IO~h%7Vp|Mu@60t;#tr?zp2d1Y(hfX$9)1e~ zs>~zhOsTJqr*$67NE?+iq=Wx_clpf;i;HH7ES>KgijiQ>eMMv9x2M;d_bR+KJBtQp8`BVN4}AcAj^({uBFb6&!XKp^!FzRG#{ z4fkn7tJ}ooxY#Si7baJy!-%3Qy{50==8UegbBdEfcRW(YP;dezg4vZXuoJS{YCO_% zoyp&G{i*t3&2N2&s#63frKPSci3`0$2J<+QKCr$am_e`Q z1>yqk&iJ!9H+TWGB`hd2kG^$vDxj_8klB4KX_*yy!u!{{H}jrZB@WbkruM-pyrNy2 zA7M8d`hx$|wg#s$aw{YHlp#;Z(DtVGRr%dcTMtJX_aWe736`bvs(byp>10mCIUoZb zDKpgMa^1N}a5{R?xl}c~V3Kc?A!nmHkL?YnJXaI*6ers|bOQ^!?!71^T zVzM>D_;!zT^VhtAc&iO$mxtX3<6WYi9yTKa7-lwq@jGg+D_^*HappuCvSjGNMq)8% z_d8JJYwDhSv`MfQI{f$mKub^mNOHDp-9#coO3KEi3@WJ2g8Doi3#X`w7mZG-bs!H> z-3;XY3+gd@de7_A`nq%IUuQaQB$tmVyLek>&2m-QUE*(xdcjRHi9J4shLl88{%x>>BV&hRzIFe7Tbi4lTB7 zCP(BB*wG~f4ILFG-G~Q)6N#ubj+Pvc;~}K_dD)4NTbV`v^mLZsi_WJR-jPI_j%DZp z3>~}b&ZdO}A1}Q-GlJyXRm3cH3JRQP+hd8FdU&44ArvVe>a+?5b>IV-Rki`#C3>RW z^W?SsZb^;7cZcL}?7I0tuW07pis>Twa4cs!Si&CVuJ17F6LNm=LY42sgoL&tw^J_7 z5A-T6)hNL=;ry<;V%F!F3 ziV|7gqmo%ZA?e^yo}Pk|2~XKaZE$5%aF=KEFG^U(YBMc)t8U=KKY2vX_lRBdJf0}4 zuV_gOZbHpXcDi}&rKc{iW$4=PZ}{rHt0@1qyP>ciwv(@UwX0ign6ZdC8IUZ&`U9qN8 zk-*P-xs`cFkKTbRHbaQnKt)~#KNL>@Qb}a{O;PIL*Y@3JR<_OTW=RzfNn`F$)e*?< zmgAVc;Oskz-5J9r|0(GRPxR`8&KI*VAx?fys!VqAu;b;=^Da9rH>t_5N4qEj8G41H z?kNrWyS|99TCAI9eULF|g@~_eiqVZdTDLCb#o+3psR+>xy)K4^4qJ2zugz!EgR$YsW}e-e-+cQt z$hW2gs#7P9VvbA_bbUXK|9Q7t$5=P-IAxnyOi}y(XinLoH(k18(Z|P9+eflK?wnNRfZ0lgNHeMPT|4lNvMcfVsG3Q21bj#r!_s<@*1W%nQHe{|bds;Ezk z3FylSbSWN@dE+~>$(r!O$f1QG?e}eef29(#D~sqjqK-D;{SjotNddU>-@=UR+AzqPJlUNv*3?c1}tlkf!g3#oKx)lBLk00(xK9?0?an-?+e zFi~UM`HM67PlB^KXQWsCBl|XJvXBM9r{JPE4o;)cg-1Om`2)|*%{S_tzfs~c(q0^= zdwuh&mun`JJxHaIbrXtBMrFG%H3w zk2uX+=CrLvn9pnHx|1VW=O*Ph?>q>e#7XJ3)TcqtncLncjTC1ymHkDZf%E?}{-Smk zf^<8yLBL+9zonB-Ex=FrRt!3g`@DLA32A3?E=)RJ9-k-dvAlRd9s!y=Fr&=KGCO4} ze_&uwU19xN15ockpaYEhirg5aivCJ~1kZbRq1o3Q zYI=g(OQ3cJYxd{F8D@TCbHAdjm0+t5CC9fLoIQgSb)z=Ww)|d|7jJ_zLMHUmzXtiF zAzcqW-9Lv1ShHFzu&(|78d25SR6bGt>Y=;X+vm)@rEBTBF1X;^qy67QZdCKRtBIZay zxF|8wms_<%Hkwhl_CUAG;FOB zG@=(e=Y_oaUS!9|5;^m6+ohUX1UnBu>kh!sq;V}mrb!0XGxkf!^uRLfj?dw$xb+a! z?LgU$EVI>LI7X7U8g!dn7mgk8$O~wNrx%4)eQ|qIv^P9GbMQeGZ&zClKvDNc4<{K&xB`(*gF$* z5D|7{pLp51W~NBb z^~0k`S(NUDW%JWHu6h>YG(rWkAwHSZC zn$G+y%n)z?A7>!*_Xf!WaC_1LB8wC0(MksgM}a!v>syd%Y2SH(1>HxL)lm}n&bNje z=4i{9#2Ieb+?DA0IqeFs0YYfF2(M5+`ryG5D5zZi$sLU{h)5^7J=SAKS1j*FO3%j6p`xZEVn(&8&1Xc|SJ<0B`&oE|?6Z9#u7mr!#m(#> z=)syXd1?%+3yyg%{U{q>w{c)S0BG4+%e@HDLE+2+iLpy}X>nk|=oHi=Qvh%TXZdb; zEoa<>Y{=XCXOB}HF!v9<+9Q)aNBDDO>ENP7j>QAio~z%Z98;VSwaF0_r*dLL>0ZlTHVqS?;h1=z1w$7%9tq9eS%M$LaE=0mnJel! zLOvs}uZ5vTx>Q{GrYC6?QGnxKN)$9zU+y3LYClPcs7j6RhVq0CmNAIxWto2FI-MhHUv>fQ~Ep-t|9)T12Aa4p4y*_zPH zBmec+tS+1QT7Fw+;CRc#p^6LRz*@WRfQBm>cQ`nteR(A&EW4;Krg!l9;QQp0(dyNf zci!jijYw~HlX2~+`2}?))tWenDSuIu{fHvw)Ktbd0JW~; zpOE97^!~c;IQa!AZakF=cAAhky>;5HX6%^S-BOUxq4$rLIhDB2SZUL+pr(lkFpg#W z$7okuKBOKu6U*Nu^(Y+Uc9D|;5{imC8AN-|O`gh73h|6cK2%WYqP&rw+zpJ1$jDRU z;-cA*Q59SXAkPj~*j_8?=WOf-Smg|=Uh%}cQGqf`>?$EvF~PLI3>!>B%uZ~A%2Vx7 zAq6TdwL151hFnu9(+@N%8HgUN-8j5{uS~d0HVC0)4Ni(V)w1-{?!gZ}x%FY~t<1Z) z7+CO`id=nW5@-c^e0MNJMQ|!Kq|V?rIF=vgRY2V@%9dPx|GXmLfXC<)I`*eSa3=M# zpY_Jp&#&kKJ)6bbfVEUCSj&Q&weTR0D_rS$!g{7jvUJj?1r~#si!}4cyR(oFun8!u zGl2`JychIq_|K zmEamf0CMk<)q1BzWvdQ56$rS))-|ngm-AER(K@4MW45oW*CO;GuLAYJRlXiRG z-=9?sdoxNmN=+THVCrpWV4sFGoI*K)qST@Jg6=_}s^^@Wo|t9niNRCffNZB^L2{r* zVlur2WuB?W0--tcA&7D1HEfMKV1x1@uRFFfo4#=_j4wnsv^KLzg8v;5dzg4aHaZut zFqn|{sc!!wu?6Mc_DDlM7^(FvRK2gGf@uc3M@8Urpp{ODEW0m*@-Cz z@s}Ek(swGyKU7{>cCot^2WrkS=GhF^p`*4X+S9q=d;J zC=XM&qGa?sRf%}39`I{hk_`@xHwA5A!Ui8$@A?rXkD5FDEA^yXCX&~sCW-F%Lk z@9bO!TFsT@Y$^yGEAAWr#&RgtFI|YA{@|@S#49;|_wB=fe5VPx?sUr6w-i)Vv4!r) z98&om8N^$A3qN~J+PV`=)kX3NxcR=wE0oEPRBQXWz+H^O-3+cq;Uf-zChohCLeXr~ z5%qo(VZ!9MkB6LEEjr{Cyp?%0TTC@@w6S91RWj;wpZ82hV0juyViu(Jcmgzm^ZiJy zCvDH~I9g`+9H}LNLMrA{-KFWxpQUV2)GE8;c;5k2KMouun}9+O5Ex3BGxS<2+dp?x z7qrfN7zfPGuR9#_=G1mb<-VB@fpSz0BTbz?aiPg109V>Amp{P%vpWSeWK}qwlySXU zE_x#F3uqcAaH_=XHFy^UiAx~|q zdb;ITXIt`ZJ61PC&D*X$Ct>nTP42xm!mUq1ly8CJDrH%o=@F?(TbY^%D?s0M6lHeJ zFA*%L!^nSjBCe1Q^wqS^Bom4RQ(qOCwSa*`mZJ3bGa|zh(j>Hg7(90v$SqF9jnfXl73rc2HXSGn>Kw#B!ZAB6+*Iw zdaE4qbr$8hyMcPwFR1q}3O+TR?61rT#1YyaIji2zmbMWWR)A#W10Lw;JtK-4nN&T0 zF{=3Uoz#JS*C(IYJBB1f=mR=yEjzXRxHaKgxp~qd4IUv`Yj`w8E0nr=Kw^1BSqir5 zYs=t8(3V#Yw0&44U%rUj^=A3Ngtz2IZx9Qd)xCWLicLUC3;Qya;x6s?@$sLOZ8*W| zba3tsmxUyd(Fdn{wb|>#53R*u{Mw0G>QW0l9kKpvGV* zw$@oE;09C}sSF=v?w#X7)wP=7WM#iS?fa_b%s}DXn$uhN?$(nM@cj4kX&2|3m3hi; zA~B!}c6z;$rh+-6BgBcR;|Yq8d*?iSbiO?ho5$X+PwfE?MH-|^Jwy4mF`W=BfM60r zCSb+t^qNi$a`(U={Js@Mz0-WvX}LGCTbWnQTXa3h87O`~KwbJ-ylOh`%3eJ|zCjA_ z@@r~~GL_}n=!nV%UUF&MNwb&d!>vpR3ZQyzDgpyD2Kx+c?<1d1X( ze#iO2p@U#%Yk3rHb-?I6n*)@&Pn3J zqbvW^Sd*D2p)8?(e>W!cYR$QGsSe9`(bv89?7V+1i`r!|e&fWM!tnMEi=1?^I|VT+ z4vD*Ca9S7bW5HwLji`IN4_GjV>11Y7GD7LMbtU~zhLUD<)zG&M_V*=uRFw(>=96d8 zsfHopAwJ>0tkVMiybkWbPPhieJzBc3Y~~af;ZJ7yR5<$1H7l9a5MN-HyI3hOUkWNl z35aq$y~b-5StM#iRji8a0iFYlzeSVh2^{eP%uRu$?o|b*I+=4h!i_(ATK*Be<(zbW z#xNzl2jTUK2p`uEomAoBMsKihy+dVTEGFr3H^?S_6ZZxw`ntb z{wB!^Cfd5j2f0pA&_bMR(?DL8+9uxSILaDj-bejrfcD+rGyTnD>Xw$jXnhL%$W_4r zhS!rcIO#WBJoSl|!_t$&hZmHRDdQYiH;WlBA=(ueP^gBJXkq2|r;}eY36rDOj-!?z zpYrppadPBUh~!fR4?}RBww~I7H60g`jqWJ?c7;Xv11($jR`H^O_vs7T<>O6;dMCm( zU~@022ae?m9%13)m#a=j^YLpkEZ4(0Q37N)=JJocVQvODGp)oD_(S-k9@NM$YPSb^ zj_1~|E#(&!BTHwgVNtJAm^bEsvTz-^Vea6K1Uz`(vMgQ7xf*sa7o~d!POtdZ-%Y%~ zH^exJ=@`x7C`vBr%6g)Af)@F5YkLNob9-*Ii(?+T)t%=O@a>apeH9^j3U2iuwg~Q_ zTGCmyWj~k)99%vA_ibMQOHMsr2c6mp@#uHkh1>2vEotBis)i{4@3j91OxV)69UQ_2 zEjxYe$ffV`|EvkxnUG679zk29)8-tgkl-qHNjbC)gr zoiAOI7_f4D)-02di`RPhrgNRdr2nCJKC&L7il z+&XvI2%zBwBS$Jp8eIn4)8EhTR?oV9ri78d$s7ToS7QnIe$)g$=d)?HPQ*O}dzH<3 zQ~vZFO-^eZ#bvxyw|{!jy98*rym(Af+;y_C8>iFu_>KI#<%s;Ogmu4g*NYNz6JH3xqa6tN2SREktx5#kFTI3}ptBG+ zMT&;MJ#5yz?clJIR->|+xS^{&yfh?IDByS`37EOE{LY6jZK9-5K!TgN@N65@z-*7z zT{x3%Vx-W<&W?V|GfPFXY}ZX7aY+X+%F}adZ($4tCd9UhKVD2`ZWr>YM}aSlPOU9& zFy;keN!6uJ|6$0}E^Vfr-FwSBQz=HQD?-daB?&SA6ma- zD06)eSf|p0P*(Q?>5v|+l=5NF8p26+#SK0YKTrhr!Y^;#PE>r@EU9beU5HFv9lKcX(S9r&e?9)pi6Fhp^Yvd$t zW6b^LKCcG7IN_PzLo=D1)%7)qlS23QFy0_kgy#xcm`jrCGh$cW_tq}tKaF_k(e18g z6M-{fnG3OaGaI6*Cd?rrGI1SZ7F$LUV&D5_dm!^&xz4ksp2s9dX{lZhVYd9TFvZ5K zEDtps%2J$94D+no52rf-0o+M_lS^`cdwZ&6&~;p zNW})mPee2}KEM{Gw)`;ng#`}wyneN-R5D-V>@9D?4}#wZ1iwMU&DqTP1TC(~{A-GV zu*P49sCTYqCxbbP-*oo>hY`6swk}|fH9mUO|1iS2HFXeDulePWdO?8t^X)`yFsH|W z@@N<(j9dP&9cySiE*%{fU`WCRz|S?d{qQ*?`ucYwCgKbhS-4ysH5m z`s0x371WIq5=xhI0HY^!gr#%d-~A2jqEKeF4zN!bo3?zJbM?71ks zoBPmiY#~?&(4^I^-D4m;A{`oW*P`h9ZHHB~#vFqlec=%`3nQGg0=AiZ9yb_YNdp+Z z27>#ak9+~aJ+2-{h3{tQRKpE<~n%j?SE23GfL=r1LZ^P##x%{i?A~01hol=z<||u5I3zss;PRODHeCf4@8>tnOQGs_@cyXlb6De3_h3l(NiU z?N~He(?AF-Pd(n61||_!;lnl}>mUy=Jj?I44|W2!{|IdQ$AH|*g|-8dzins0g2J)F z_S&`QfjX!N3vhq%186~E4S2Z!zgzz=*Z-5kL>C;wvdg#bw}E#Pw+d<0^;-*O{;q$x zxN>%w6+G?}A>za5r5=&ZC(rv}YB37_dM#9Ul(62?ARn4^(5-22I($Z{VQ%huIOzon zHRX5~fI0t^kU#y7P`k7P14(`qo&e23%@O!1wa6ku_~-`acFPdq=~E$tbHBt|-^@Ws zaXMi-W%ytN`<}13A7+M1Dn_>QdF#qA0xPOoT823QMbb&Nubg!Arx{8!5mZ zwZZ}qpP(683mfbZ6tVqpe#E}H*ut5ixvmyA>n(6#(w}bAZYJ0Eq3uJUoh@~;;0fi> zwpFQ~v+iiwpR69busZflE2%!v`$q@*L=_;<&_U)~qtmLC&i)O;h;Wz>d`Bd>SUU`x z^wSM|=bI|^-K^SA7cd43ynJh93vd1DZcb&`2=)vtDa6$ zr7*^Q)ByN)!89WuJ^3@ja1cU&)(+!cB8WjUT`F*(mD^*yq&S%=KVd2q)IrM@BYv{y z!_`1lE_K|dxv+jB&>$!%$^_Ej`2XzMr~gO4BH%wE_qonrMVkfQfB_R#Ng0Vtu{|q7!dy>+^%P1pSK)OJ94h&079rUF9y0G64N#%;`)V$9vD^dx#-c?r_Q-7!yj|cfi2{oQLu)e!k2G)P= zOk`UQh=~U%H)bo6zz*dyt+YLkyp}XYeWo~7-5c3w%WHztOt0vrdwY1mhN$IIRqt|t zte!4fC>j4 zPFkofWz>^j6}*#YqKF(RjL9X5qpb{$x{O+>9D~S%`v}9MrP6vRj?}x8O2sl$X+zs0zXq`jMWGevp(b6qfG$+#v;T z#Vei;jv&W~GV;JW&*;}uBe#q8r%`4>XnNF1-!_8c>*Zv@rRF|eDy*F#g#TR<2Z}0M zWB(*7$2p0Bc-9=;sC41NY)^O!8D#i!gxOIodc4Y#ze2sogYR4>OWs;^={(@sGib1|)E`2)k zz!hp>L@+2#jKy17m~E1vk9j&RttGwhK44?gx!3;&`Lu1(t+vUoQ<2e)X|2R^!LWJ@ zB?yGuUP4zKMn5K9X8uO&T}1;LW<5NEDL)js{bt3eABz7h6d}@?{85NAY#>Rs$y|F& zs@rNuP?}r`Kx_E*f`X%_3JwD?1e_^%R9MQ+GBq2bWFhl?i(Cdq`wxrAmt3(<1Zu|v zm{Q51rQ|>V_`o8=slI=`HAuJgj4af_ZCJbT$I&YsPISb{>P!=j;u<@;WzX zjWQb5>$OxJ4mU~WQ=Q63AH{y*yx><(S%YfB_se3dlm-aD)euBlC?TUnVVZ{G)|Inq z!5n$|{(aY&ZQ|yePDi%c`{>PF1K1V~(`e|%bqg;Q4wiZe@BkEp4CrA%-#r0Q;8|lZ z)eUeR5sb^P5buPD8Um_rG+x#yE}07K`RyZ^s;9uf)$R>>Oo(4wGJs~j5LLx*1X=Z7 ztZLeka_Y9zkxeg6&3s~D`k-Db4i$ARmg?ja{S&nD77(_^_N}Kxlxjlg;I->T2L~r* z=Uf4Io-amCa%Qw+`eCIA)L5Vd&xcq|c*ED=_pA*>?nK6xxObi)9$yMbS~se5FC>b| ziUXZZXH|=`;3?&fYr~XW{N_sc31$!j7e`-M-<-wAA$jR}{2D7X6OF%aesPQ)$PKls z?_r#-XT>o%&r@555+`?J32B1Kgt_>3fe!$p*h$JacJKlo3yX1ce)gq@12`v2V+%3lvZw5%y6}%<$rSt8%_TD}11yzVz%ioK? z)sx*ZpI-x{97}1sif>i_$qH?tRFlrq2M8N4Kxzo)Sp5WNQ@P!{*JQ|ISh?Ste4ttD zLDgJu5MIFFGlo*@mfvYneye#hVX1a+v3g9}Sj_E)D`PjMoo9_VDa7-U8WppN-}t-a z$M&aXNx`;(JV3(k&YaEM&?M?tP$608jNo!o8Mu>GP@1tnD&zjl?%iReFp?rfPx31W z4(^{VppacCXI>~iJmj%_MgJiM z=5jVa*K)pepZ~yce=mxQgPh zE*ulm1%O8-0Eg3AP*`ymg)zYMFKqVi^Gm0*jA7okC6pMlcA?J$Br48aEn}8m!Bj)V zk8_&Qbf8oxXlEQ3X3oL8Ryb~30$M>b`)y3F0+)5}yy*k-Dp2ms8*84TA@Oj~0=Att zz`+5xf5&%zum0J8Nn5!;jj+Cj@@N2S0hA**bg46P2f>Cls1K&IK7gPno^MG(A&n#Y z+uD`k8e8-m%2~Vv0ls5wNIt(YHd+3z!vDzVPq>Ua-(j^mZ>R+&(rR)?bnq2nHC+;M zdNXRG!j;jBl7sPb(9t|?VgTI)9Fv5**5o)=)|gmqLSb1J-Z$r3JJ(db)0zCO0M2qP zp_~-7&{M~pB2aK-&UtwYgcS)Ct~xPpBek4C6wKeL21U7l5wkb2*Cr9gQu6c@^;lEvl zBDZfRHyJ)4huEt->xEMNvWW3*1hclZlT0Y0;Z->%NcJHieYrnmx4%6x#XWyE7G5qlh^A!&wyfHnGsx3~Yv zNioQ+vVKvk$jT(-J^ke95YS^}<>S$ZtJ{14d5uj9w?ag*ES9>nkL!Vo1;@7&?*2w~ znP{`3=Be3@Bvs-@YREL@)#%{R`I6qhl^okn`` zIK5PXP@31rk&q|Mljm=bC@|mT8YJp=$P4ypIWgk&&z~+{NvD7NM9~Sh*1*IWEHzR;p!%N<=d=A>TVhRg7)1ZC%`d)S z)KhYMx(3O%O=bydZM&&htDTb_dKALI?RrKaPF`f0`QlVas5C4Ra=VqQgNi(&G>p;F4ygkK>(7Da>;?3bMqc6#?8sUY@MXA-2 zDesX8y_$;swo`jha&}ra@>;fTVUAa#E1IgQYta!?^Ac#ad0iVTHi_U3w_C+v{e-uA z1T$VG=hK$A^>CvdFmp}+(0Yn@jU z#HQ%VhvL_6smG*aPtsP2>1ofC`*$BwVFFI+VMh{;$b&6vpt*or7MC#N;kh_6iq1rN zjN5_vv1GQRMJW&Oe&XWb74z<_L9&Wqvu{%$_gGGM4vJ@-ia1W6^>*7=MsbSO;~Ba8 zyKsGFmepQ-KxJzT-fnD1+kf`*Y4=MsKnE!E%=3NUdgvNzWgoGZ2^G_HJIc=gLn&Dj zNI_NBrn>J-UFv?>{WqQ2S_8ZKl5bbb>5M)YjLdg7<8i{UDW>qIDaSYSp(-jBJ_xLU zIZWUlm_NSO;@VW4%|TY#yAfMiluEm9FTVn#*YP!zsUE_*i1#!us2eZ^_UT@Yy;vhP=k5XFSV4SqKE-dnhVvQp3Z*^ft(o|aHIwshO}ECAr18Cg z{y!@#wO19kGi3K?)jsE!U6Y58_uL<=J4wK&^%2x~9rX0#P=zsUm{ob3&o$RIE0fjf z)Ianivb>JEBf?2$Y|VqO5+XjpR>}2bo}jtylR+&%X2$=EKqVDZE88c!0T`B=7_t0a z{{w73FidrX#>C)hDuTm(p<-@22xB=iujEVOG?^RU+DH=aufM`hQFBt?G^t7+Dl&O1TeBM#YB6CyqUzi5|9Ukj%`Tn?l+7 z8=7g`xQq=pKXXW_?RoJw>tYzG+t#&19W`sjE4_+d5?3)zX%#6lvfVqsv{rPwe+Xau>-ssIm0qL5C5(X4ZYs}+1bEFR7X&G(I2WV@CHFyG|Vg~yPD&W0+ z)2~%ZXe;}>#>okNxt?gtLP5@4X&H;8SCov~S%9I_q$fo!RS zobo=q#bW+5U5aZCj5qERans52;}+n-wzQt}Cumelj{Yz4MOpqZKz_Q+G_0x!;xlRYRGCl1&U1{R3$9rtbI>|^CRg|Rgrm3tWr znxY-?okN_b!-T4i64+FnsEoSPkz@hi`h~IRnn{ETo$Oc*(el#a+pj-IoJV)r8H7J> z8e@CM@O?Zn=_DjJL=NR1BAc%oNTX=2z-Zpm8+w)><^bIKP(ZGM9D!#J?DX@UYD@DA zWr$~*Lm%@-(ghRI;8fKICVQq{`3t~7r0yr(@H%7j3Y7qMgXx5}4Sc4+%Fqbu>@f9D z7HHzM_tGl}NK!=(g(cCWj*H`ZzPo!zUPIT6)ZT!vH79t|H?g~0@gD55#KZvjTdp4| zfk>&qz!F5>mD9BBRCnI`w&})@zB+2%kpOZ(FRpC!lEzI>{}VJnOCa-Et+mEc6ErIq zUB5Cmb)v%qoyVRhdwyJp2-xG0;@(HfzZIDA&rK3OhH&ERH70gUM&n!tJ><{Iv{?dM zUgyvo@>HFXx()toihM|JFXE+bo8}J7`6#R5o)NAKH_zfEZDPKDbHcS)qFQ~OUuP?Q z=<)8sz+3g}5V6GcLOH6J4y-{-7CACu#$wMC@%)S-Y9?RDZM3&-L25;FmJcFYgVrmx zNfi)T1`5+o?_|h6zJhd>rSVHLIE7eu-coN>ZBEG{3V0yvb4cAd;+qqY0o<;{13G^o zfjPz_1Eb&qMv|lUTw7*;mInXJ?GrS0Oz%BLahuMy34r!P6dMDKeQbnBK$C>T#*E^4 ze_nByXLZW3*X_o-vNXchu?a$tZ=IzJ9=KZ%B+PueS~bCIf&W*?Yo_7?qUBwiC#Sq4 zQmlI&QQweN2&1JHilJZbZc|9B@E0?mAE)d4T_(>ussQsydf&6|Bu!uGtT7x(8og-d zi4T5^jz#7I1huY-5U90c=xs4Xif&wZLecZfCumAm-iC=VF%#}AzBOW_4>cv}SaLf6 zW-9}GseJoDy#g*WlrfID<)1h>vZtF$R127sN)7lz<667JdClU!fBQ<+1>&mSM#%q34}sYC9?-LgfN7KM?%d zrNPTSZBL$!PekSd*X#Nv9c{QW)~okW%0IEdd=5@fIddLi&$Lx3WgzLe7%HC~rNS|1 z&-;Uj(;xN6VMkpt1G&DK8AcMTu+D+U3&pX{jH=za(KMlg8i|V!+zSGY6b8U*j#JBB zRSLHp@(k4dWz#WaMO)h3R9d8S{9{r9P9=wZ6~zs-^mvA>HuV?}lryeiGiSXm4C*VV zo#;iQ$Q$!B`?9G8-~QNCrD)7e>%-%}mJ>2iaF|sGp07mLsGuw@Y9F@TxAVZZ&-Ik| zH4zo-{3m^`HxcDSdZ)IJxGCqZDbRpF6#-Q~X2HH0W=Q4jZ0BF^8tdq6kk}~TF@O2R z=|EPP{&WJX;CbFoD9&~l3})YQK_k7icICNPcCB@(Gp8_VW?!q`<^= zY)_QTek!gEPDY8t zIKn}+g;1IIi|5N|O}=#PGm$q$)>flUJ@E5qHK&v2wTS!q{|Jfgi-0l&ufTzsZ7`K7 zsU*gIm+dc@g{pyTRgkldLyozAs0eMJ)Sqae%Yp_@cx*{oT|xO&8$YWBru^U}ux*9~dbMmWl_ximFHhN}B3EVS&?aO$CzV62I zRO$xfdoTeN{_FYBAp|=s6zYq|_hmoY+;A}a!fUEeyh&~rz!mg!N znF{N3H;zS<34dq^Vw1WMAd!q}^(;TQ@91M&n(vvJQVp^deRID0iNbb6b`SCBaB2u8 zDX1sCcGon>Ja)^#S<_f#itjk2h8FGyv$COOU|I_Z?Wakk4Oag*_}aHXpz9018l%lEdIh2qs><+WTuwZyAvd3q>pO4?OTK-ve?&IH7AG-;&WISW~5xya~8% z2cFDBVy+iH<2c3IfNsM5~B-XZD=Z;>h7;Z6lW-WVNQNFL7_#I zGAso-`v%cCG}lKaOoQs!$G3b2g?0=B);%baPzjvQ5#w#Pm}(V>dCiJ?D}x(elV{#Ou9legK;NpAn=h=ZXG?s_W~QhM41X> zLkLgJ1-0`mo`L9(R6^zxqlh{KgsNBx{3KW_rYCNWWX>H;wB}J!)0R~nQ6ZnE2z=T$ z!t&FRL%iUnk?_aIN1m>GN(tJ2dRmwzH)1jf$#EyS~>m`gEOOiKpMQc2|N79%X;*Dy5qJVhBjyY-$*d??jcH3MkOdrge*sE zDbV1qS2x2z&xLK3Q~x7-fztfk8y&gdY*jm-9dvB1Vjxo7{~{PXUKf7mJo2Xf@)Rwlb&(HwhAxF0I-_u{<3D3CS( zR-W&;8GHS*=8YkH2kHj$1U2Ql~-VdT4qx z(;0m%5Ru=z4eo}s6eO2T&SWZM#DBSe+zZ*~D~QwMg;OGau-DOLB9EpkD$@pLwemnt znftJ#0py7tj=d`HIy<5&=B zjwo0V1f(||M-fr5qf`+Q=|bosi4F=VO+iGu2vUVmq?1Hxk(M9`p(a9r2mvA`gd`+6 z`)1~O-XZdw|9j5wd^jK8&v0kAwbx$jTGzFAQz}RewqQj0SHb{ppkQNe{S4{y!8g@? zk&j`Q&r`zfW=H$UZS2K_IKGBt;KCAUp3q9;nr z-I4IM=q(GGR$;+PGSFEXF-kcJ2!AV`%3q!Idktg4ZuVYwua>){V+MOWSo%((wFcpw z-``p}m(!j;dp~LGP1xzlqGzf*vt%T+U`9bKS3+Lj|#J@VLQ-^r;7Mib24{}s8v zV1RFt#8%6# z^m`xIf&`EZ!16c52O#+NJ)hw-8Co)yL5bon80cE^#wfdM5RwJHjzgh(I|ca@QKkUt zrY}hXc-mY05~C88dJhD_P3*;sG{tiU_^)iU&v2Ve3I{Xq1G4m-i>%65g@uGQaBqZR z_*r)yw+8PNV=!A-TsB{N%6ER3aFxjaeW)H$0zj)A$(I!#G0uBS?bJg0<(0Tg*6yiY zp}glUxTi=6B*~tGh1QzA~^|O>l;W=aOlwf@%PRNYn>W7UD5z(+miGx5qtK*Hm}U-^zu+Jguo3W6ufy zi`Of881wR8#^sZIzShQ#we|)}By$!9gdv1qkc%U8beC^Ampl8x66W=?D(?iDXtjh| zO}v)^;mjZfsXJK)Bz9gKd^%UO zi7}XhoCMpYn^V1vq3kJI#!$k0-k6YId0Yl-40Fd)Rt48yxC~ZuuZ+w-S>DiLpGB;| zNv@TS{fVVV0-0A1iIPl~BV)(#r_UvmzWm@lZf8KOWB~Acn~2sOmvnP($NJNgm*mlJ z&FndPRUnhF+9q`TuK{S6Qe-y>w=#)AVP!QFRcEH!t4RD`spo9TDvja4A*oKEV zFkZxU`0#qY%~^gRlo)_SCE9=v;3(TVf&qyQ%gA;%%9On->yra}H(!+chLYN_|BdZn zq^Ol}O?-{4&m%rQ@_g!g5aLcGoSC{pyWSIJ{oQSLN^a?!&FsP`4{E+YpqWHX4^rpG#d2jg+~GQLT7M=NO1#J%bUK3wU>u%XPphl?E~@TA8eaq9c3H zQXB4(HA3{fI|Po-<3zzC1+fr(U*v9Ry312N`gh9u93)zBXV+`tT`Ov@$von4efy+e7m!B#Sr ztMx(~IXyZKv;DZ}2=(F!pYPoCLyhtDd!;OpRv!gr9oT6q0K8+G_AC|4EK$q_*1*3( z2EhuTm>CEX+hMr1&I82P_dq0VyD%nS3+>sr{xjvaGbhm@pnxG3`BFvWIg<=HtP}NM z8FYALU7v;h-z_+xnnaILSS}pP1BwT?u#P$mgORCJOdW-bHuSoxrNtyjZ zG1X7S9^lQzDDqt7g1%kHJ(C|>O2j9lZfu+8!fn6wJl+!dO=7MOP(u;L&>}2D4;XQZ zLxu1J$be;_gRGwusOj3Z1x!Gs6_~lYhA6B!xbH3h=)|8phB8{fB4OD4LO#>rO?i&i zP6#P%bE(&7&k2%Lk6Hp4IEEp}AR>-jkq+?lbP9~qHiX0^6hzKwOmaSYKhwS!8zOQR=Rg#2M72i{HK2+V@)HH2FHR)_ z$WLB?0X5Npr3@2ma4gJ(c?kVjd3aB3nHxSNttQuOiP1>3G>m+S z^v9);16cP^hD;Tp^R7&>{M$mUwxl#l8%`C3efCLa_o9QhI@tU&Ho(48F%g05<}89- zC%DcuBdOPm$h0w~S`Xphngt}G3Ec?H@GJf}jQa4A zv!z&01ZO_JWI>YE)w?Dr@@D`o5Y%Em+dg54<)ThEC|BG3xssf9f62bSKsym6e@PEM z)vmYpvdU0*0!Zq^gQUS7r>!bfBtdz~b0Zh*P?2=-b|+!L&+sL;&0%@dU5nN}2mH%s zum8`P;?gA*pHJl1fR zvUdu7B`f5IUr$f=IXm0%_gvW`{Y>8sr0%tEOtGU7)h?@nwFZLCS?jo>k~^>AzF~!V zaNuL7E8v8c2w+J()wgNRQp&8m^Hdz(>w{#aAYx_InH{sWIsvg4-ll9}d(lIa z9_CvG_=4WW5Pk;D*<6cr(t9Ds;BL^)o$}jsLOY07lYZ+cDpA@1po0<4ndtcqO4yXB zs(bdcVNSU=w3a-MTvlzmY8TZ0$A8LB{N&(gVOt8^2 zkH9CUAkeSW#GWzeejIXK5+%kUcGhN%abrm1dN$QmIvcVe;m_s3#>v~ho(@kL+ue`) zQh3y@q12XL=4&Ny6b&66luc9;d3)}PY9 z%481c_xa=rF|sIt$gOBE^>&7M1vQ>GTE`G`_3vsz1LEjsFp?c|RwY`S#SQWaLjiH9 zq#9&xty6IAXn!tG`)9#&lxfY78uol1{y(k18j%+4mu|AOO#A#u%o%vKqT~{c-x<0LSb$#0H|DaD( zU0t6Rzq&r{jcq^;K1Y|G%5{*|*+kUK+SC!6Lw5pO7NT3)J|c zpUdYXhj>SQ#=Fu0ivR?|I(^>t*hMaSKTDRJ>W9 zyL8uJDzl2p=S$Pa5W774w4}v^WOT1$z-0paz`yi{4g#r7#ws;lAST1K{iQVXR$g(7 z#n*X|(gC%YtIDnK#W8yf{!()F->#qjPK$FK2??IEiZsTr%#YQqq91ztw-D_-(1B^8 zSJ6a`h=LjM+zpR0F?64BUQMai03q6Ui}~bN?+~U zTuAnn;I$iWwc3C${Ch-!tMuxA!r!xnAd*&**Jb}}C7iLV7~A`le@*q+YI8aHKm54h zdrjc01W5elm{r7x|6WV^8PfGReR5ny#CZXPl>2hnSw%YEN!;E`L!E8YkAU{8kegV5 z)QwIZj*|_8XHTMoIPwDecU$iV__EpM0FU+?4Ygm`AIQo2cvpZh9SQKwnWG-m%%h%- z!yq4d-tN%z@q)(%!G%lRFyau18~iQ)AD-X^KJEZI4guhxh~asQUk-^%Z3kJ&mTmiu znqO(&lL6s`iVF^um}?k91t?d*l%4A6z$15>SQhJR*^IEI$tMdTR)VEmpeOOf_j9o;hHt%2ottKE%SMUi$JDAMvfv^0>_gc%NhZO9`) zAJ_uMMArry8Iy*~Bs>~(5F}_9X-$(3h#A5%HW|Az{=5rPEc?FVEV4*Q#BMX^Umz^~ zc8}XH@^}Z1vKP)5&Mid54YQtQ|Z1Su_8DJ{D+j}h!dE{-zl<@ zL~+@xAfHwU{BjBsrJ3G^U_NW2GZt$G64RP#;VkN=I|x-@Kd=C(hiC8^JOR7!ZU0Of zUDl{WzGh3c{zg0zqf5K8Fq?}VdVK_4C7gqu0C~hUD7Sph%srQC;PFL$JfW=s^g8)1 zfOw^z7@zGVEkWE0K#%(_X#^le!T_7HXq&HWAz2D3%)ANUd{;yHpAVEd`k&HFaJf?3 z8aSv?-5ZZ_uY^9D9i}6e`#))NJ8q@s4jk8J=@tO4A{>0XV?9#?l8r?zXAMjo2Xoxf z|CHzVvNR_kmrFMX(0fv+Su(i);}Tz_mlbIG3*~!R8gOnvv1cXo2x%DAq~+ap9}=-0 z!HOOLRBxCG3zT@;w!S=8FiM7-N(2s+}>bos@%fOxVZ&({) zAmcbtH?7kFsrA_A2#`wkLU@VMWi(EQ{gXx)V;e|2N2*rl4B(vVqCl1mp%1i=Ai?&4 z#B3&jHye*NJ8%U3Gi1X;NXC6#hx&p59hc7)^X!ZMUtbjhbPdv_H9OW7L`AbUbTPz- zxgm=V!mGIqIZXm$SF-9+^TqdJ&^Ngy0ICRv>UxN}8#XnatARlI!;k5sR}r1G#toZD z6#$vZ`7q3VG{FL_jJ)M7AdKe#x!Kh`XlMNnJn;ELSetCN@jVj@@1XAn0syQe$d6}( zRE<*;8sr0kMQWLkB{beJerpC9Ey$K(!apAZ5XDZ2Oip|ZvC+XEn7GICm|#*i0+9bD zR3GrI!heaGWqL2*Pek7mGnhTSTy9+&X-aeY_)JE?$XJF@TO)iQ0-B*$#KK?DVJ^iu zsqkLJzdQLwP~uCoy%f8i%t~|IeS2$R*PV+W3OD?CXzv%GQOSGtcJJ%^_wWDwaqpL3 zW3rWZ$7PG(ITrb;BDzB7wcKxwh?8ygbaBLRt7eRY+?|hi!u#@!IKLQ(ir`bri>^_VzN%H1lB4%O3U)Yljed#-vFf-3g zmS%9I0M*1(dbCA}&$1Tqe&emnDxYa}A1tBhiEx{F{S=w?M!RwRzV=L4qtOqpeO0Oa zYU-8qCGLTH^iE3w3fLHFK~o5GK5!IZ&S62bv$T_v2ORu&E_9jVWFiw`C%y*WCGN)G zAN3yh_+ytQ@{XqKltwrZmc0oexlew+cY(n-nsZ0B@~&9p=}T~*(Hae=xWCh`qMKKD z1vJ*SQ@>JA(qF5eo-Dnhe(!p~q?}6yL3!mdc>DqI0OnC2>N;t472akJp2-#z{xM0^ zLi2^snSN+0vw26k&U+v(vznFkHb@-xlTu!KKJRI##BqvcxCe}u$McKgc=?YL-OohX zNWRk%s-zrH03$PJ*DH0DqNaT8V8N zL9~|5;)8ne!t~KQqoYILs3vC#ZvD;wZhqX)YGIm|cD_G)-t$I{{7!SaFGBK(abFhx zD3Wl`a%BQ_K@*s&*X)ygP|El=;va8GD~u2GJbl(fvtptNMW*BWzYU}0>uT)?+LTbt z<7rAymsxPi$pX z&Yr<Z-|e6>Q8m~#ynCfcyoKv44E8ck_y;D zR2D&d;CF_N;Bpp7^4^8vu%-qg%t|F7!j<-+gpD(vl}+hr$}ts?DF+N9-yqg$3QzDJ zP^xnFLH_cjZ@WA(XgGSow#5SF(&LR~kw(t-j1uz~lB*v^D4~i?qiU8li91Ya6t1f5 z!saKb^24+zvv!r7ah8-2*uNc!-X9$_8+f5Fx-LBN(-(T8N1K%vHKQmG?GpWrb&9xT zybE*tq~@)~gK6(f1?{ZoO+%m6Y+9V3aQ)|4W{T5GnXA&47uedmY8bb)OI8Boq-mU#4^j{+WGE ze$fmay``VbR$%mNdUP_Ia8c#?OAZU-{^kLgQC9@FQ_f$qtcD$Ol=VW&w*JqnO}j8I zUkXPiF*aJ`^GetFWCP@Z5Wx7ZQn+YO15N7M=Yy!_NkrNW(DyF%6syCn9;bh`#4d&p{?< z@LHRk0O|>Jg9^VdxV0)vP`dbtC?04u1wqj)xTeM}j7;0s+s*Wa3OqelZX+kaZ72*1@A zxPe&1i$)&*RXx@#>Wm?{Rtu6gU(MsPipth|Z7#tgP|3tU446;)PgX}JJJ(=mhi{hX z%PwfvxRA!*kErB_J*iDflqnz;O!xr!>Nljb0ySGR$WI+3U3gfhdC!XBPwZ7(#>tp%orrQTbxG6Hxq$4 zn(zBn&FeP7yTRbsr=v18ci-AY6MJ()lKrhC3=ZqZiBVW{w=dZ6OBX3@GVzASK-?TB zuf;m|c!x576PmV0Mo8lUzVgG_R0+X_@271u z@J{Pqj}n9Ib;x(WF}-EHTmld_T8_8I%FAbem{}|_8w*d<_R`VZUaqr;<~$SLt7b*X zG!w{6`m}zXFSZJhe72cusD#}osTB}-x2wvVgAq4FxudC{$+C?jkqQ0VLyFTQH{c28 z(U$JIEimrd>TY!dO%AbIWsff zUh0Jono_V)-H~djipJ>pOX6w}r<$DK6afOIWK7jgVzD$z=1NV}3{A>FPIWwJX_k$X?4pRV0}-x%8@eba*OEmS#*@L|CtF(R^Q^ zc|W3#s1WHW8S=u0<_ILdH>5)r*NZm3t=cO-ZpJ4!5P6jO*14j^^=pc2l)R7R_4ioH zcKN-SdqVP^W~Jo$d<-0-GP*dh;=r~mfzrTAEN5|pB8PFhD5Kjj*YeI#vd&3-$4Qu*8RGP0?0QZeEkB!CcBE#mcfOd{X!4iQ%G@we zBH&mKT2Ysc0|jI=z>QiA+0%?#;8@9UmsZvi?*DkR-ulat9{%k|C7G$@FLVnW-M};0 zh}vy6m@T_-U9wH7hkqru1@epcj>ox;j}9Lwo3-!O<=T1%k1p~wi^Cjt7fd@es=CG5 z5W}6Pa~D+dQjrFjg6q0EtQQ)Br@il0M0SFwdk#9>4(P2$Ic}9*2-X+zcKjL+>!d^O zz76PlCe+nQXPDqrG{T|o3exG`iO|fjbSJdtAKt!B?r|6(%)b0wdexMt!b|_Hs8>Vp zI-Sw+1XcJN3$9&c@pO6Cx_P|ra{d)6b90KW5@r%O#?Kj1a61A2=q-2hR_?`Z4sQ(L z(?@gy`75tPIlkuTEv0XnmL3)yNllOO%yl*te~Q47aCH1Fo#FaVXzYoz~bd~VuK+<1h z%^9})1^@DhN4+&^*$~*}1}{`w^NB!oMmjf2yC`XhpYgF^u901EG;=jY`78|#&Bd9obOn>F@SaUIYp8cJ zh!6gXit_yz>XK|b7LBpJ*(ci*)`gDqbf&@+@KFq&nz(#f?$K#U6<(5)1PFlxDi_xK z?ZBnU5IavFeLhg4~(CdZk0v$Q)-gLl+ z?-~^x^TMic`1B+b6Vax1Ny?jCl|*;3`YZ<-p#uNICOGc=4eXtX8C|EhlpR~N<-DiD z?941X^wHb|z;*-CUu@D;%@Q`B!t{u3kz9&R=d-l2i&n5ts)CN!(k#vr|89=#!UhT4 zjz~#0MTSY`w_-#5LswDUlfvq~k(qoNOF7U>az7JZ?JmPFLgss)vYC6NP0 z<6q0F5@7Wy4X!SPt?(Lxox_ow1$7y4FkSbggsEAhUZCS&9J}TI5yUHE1}qe;fK|f~ zylVpfM)RQ}uJz#-(x^xoqc;|Yvgo5?4IttteJMZ+&(AWUWEoD*%$;Hr6(uxVX-X@X zbNdg#v!jiPWT2}AA-qZ@At*}nrL{xqv#he7t#HYutAShUFV1eoN99~jv>A+nS>>g) zVhW(>vNsen+?&`EsV(Ocz(g&yY~|MKq;8qg@ikHs!*f0SBn(sKl_<*lU z%h>CAI7q-=HRw%qJ3|o@v6L-A^2C;EzjZ8xf4%jL=x_BzDScE<>$ck_`@Ju>BqgO&~F%i%4%CB$}=pGP}?X46%xQ83(G zU3*pbc}^*a0v_hO^Bi%zi|{3v%Jp8^Y43^*`o=Wi5|dhzV0hIw?OViI^|FUs;SK!* ztP!KD!To9xcS-`<-qmk~BO;Bg`e(;vqG{*Z-fb9r!T_f~F zYqqOOhe=AwdZ}N_rueWh_y8*l$oQs=Wfz{Lk1kf$(UeM8k|cT<;4+l0_I$}*Abd)q zyMBCCU4)McnU{KwL=BHgsOYTa-S<#c!Js;E3!++huP=-7L&d&=Vn7r*EM0A6;hyVp zeIQpHtOvQVad(c7{yPVZVeU-S{wqr?k8hG8qzHC`BiIIkQASpDuQO3fQG=QEL?G8o z^5C`3b+klWFFeHVd)@*FQ0f6Q`_%;DcLE0@dJ+Y!lg7LnA<==kBBab~O$A1?dbEON>R+E40LJ>lcPQl%oACO{;Fg{S@5fm{DWBan>l91u!N#bW&G;Se)SpB# z=5%jskj<+h-Is$4C#x&l8w;>1;*r;Ud;QcI5lTEc9GBJLy(O{o0IdR~Jtu=?@`}U| zY8b3r2;xnn!JhVAQFTuYDNRyl{K0Kk`3T**djQFRDf-U9aLtq0$^5tOcKT4b7J$Gf zl~y#f8~});av_3PuI_5=B$cCx_!e6@kz>=nSn^^(aEZg9dN-2&X!2acj_^AyHMrVme`{Ly}3jR zh3@KJfFBISIIgn(3XnuYtq=C47Ej)iEHa%kr#k#}I{R@+ZG|`KAvg}tuA_sz>C{VK zdQ>g&$&VgvBWyn9`lR!L{pD~O>eHIxsc?tm`hbx$ve2+~Hq#6#@j~!*3cOszjeZv3 z>M(4Lqf65^-w}`(c08hD2 z?^@V2--F;Pt?Tc0oj1?5?VmOXQ6nOIvZEl7W51We5o4SUI0`q%BTYOP=EiNfAxG!K z9|_>sCX}Wf`qye_#)a7pEV`FeD8UcY`(K*wAij{2@EP-OBI-^JqiNw|ROgBJ(;;2j zm!yE-8Bt%*w{_73xc$Dh({1SK4N#)1!bdM^1Cd0>ZuiUJv>KBJlIwF5eX}yy_|5Mv zMnyF9mQupe<4@9Ow#B(MkL}F~eF0i9=lai|n8f@(^N61hYYbY-ddShKnd99kyr$PLxZDk6A^-)kU4_s^l@$)xa zT6+D7n6WEx32HA~g6k3LppKr>Z1}{`5_~hY1)-ZKmdtKXX^JnF2(X#B)LmXw;EHrL z^^_{*O@0bfGE%ev{#Ys{4ig-?*@D8koL_!8k8~~!$jQCH*f>^#t&zKsXG;yT?8ei^ z8IKn6ip@BEA7*U4RNWJt&Mo;Q*hT4b%(#rN>_R4+2MU5KB8VS~Zv$1<=SAWJ7C#{= zzMT7t8m%f_o@?(ShVPkCphCx9*M}DfSTL@n)X!i%HpjsgR_voqGw~uM@$3cZaq8h;8ubNL(@Tg5X)L!K!{e?0`c#GGJ& zeYIbfv2AC;2C5SKjwYQ0uVb?&&xX8j8+_xwq%U6H_+Wg1v2>Kp(Avrb4grwMrqbjKFJCqryRI_TT_GC4EqvPt5uY zQACfe`CC5cWV>aThAeL|aH;pO)Hb&8xw~-iZw21xKhA@hw(W_hJ$mFjy%|c&V;K;T z+b;O*IL;XL+qtl)hBwg{*8L$K|E)1pyND;^j`EWG3+!n3?h1Zux{Co@Zs?UP=h18R zhH;jK*p5e?iu@|7T&j>j@V)+D`po0e3EAmc1hg*sZQ057o3|KG!#^p<5QQ{@H&daV z0O=FY_arzNY=+|EaBUP~mo{}^L}8L=n!F4-p2G|;+yhztCV(ln7Da#mEB60VIR=u2 zip>A5a{O+z|E+Qq9>hOXj>2vIL*+;l5^w%PGvGd`Q+l;=q%%^`D3{>CP|J|?r zYeIH-(FSJDy+m{d8G$6`F#ZpJ4d5%&Xiv8efy3p|28jaD2jMli@a=D%V$K?-fwwsa zJ`a%g>6d4Om+{q?zx9(q+&1!`=6z$;!8pop2t0CZkga9~u=letyCM^-6(qHsEH$%z z1??c6J9={<{OGL@6A+Fp!BEGrNQF1KmxsO{oIA-nfq!(8E4rbMpsREaJE>z!HOA$T zyxrh5px;lVhyq|}%X%5Dqw^A~ZyHe$oGvd=x0WL_)?_7bZM2^6x;JFU=w>7By(f1E zSU3f=Dg}($)PCJBQM$-)Y<-VyH~61ai*L0)z)0qFxmgWww!EUr5> zxvQvUxa{-%%P1R^>s_nQnSJz#wE_@iTptb4j$`IB^<&EctZeN(>t82qMccOrz5WrM zeI6*$LLKaV&fTuJ=8Zz|h_zy5akHE>j z0b~|3=A~}QNcYArit}f?xGvY6Y2~Q$^x>k(_Ngxy2Bz;Pp&R;dumgsbbql$+X%!iW zfJ&cak#pE?%*L2^0H>nEhvH#@nZhU;=;sdjpbG4vo^X277@Gx{seaQ>ZO@9b# z45(!BcPj=iVOrfUvwLblQf)h&N$*rGKm*7Ds{VO4_RqLXc~=s^@oh}}q7TBp+85>g zmzH;c88xvr(&Jpt2-<{D(uG;gL+EKy+uPog#T7@oq{7JZ;pf3!p(mnN!CT8QnI(hx z2XMB%N%bP#+U(MsZhgT;&hGK+=3}70|9tG?)epOh#QZ$!&H0koXFj??#jh^QF$fn_ zf&pAGabCSaL}#J?UehLA!9wvib>v}Mv9XL_r3tAQ_H{$k`v@sb&BaKuiEGF%aP~SzHB8WA~|3T_Qa#bTyYN0lgmd0zem>xVRK} zk-uAOsUk*FNRhXUlej~GJ?ti^s%n8s9(qiLj^r@XK&>aB60GQ^7HK5rhWq7)b*3qa z)>ukU4(JQWxXE;HY3-X|t%=8_tG}d~;dDDWVuDQNNULk*Z>sD(I(|xY=Jn3_y|7sT zML0m*oA~rDuPh7w3|KPM%wN^*zc}d!emFh(6B(3x!39cNH(guq#gJz@!6Htz%K0Bq zSeyPWv|s-)&h^`JDe>+2XdDCHJaY6lN2^Qy-cswlC)hg)yrP!HvJtofDDnkwt^WM} zbP9YX4xJuW;0bo7_}8x+7j${Ck9>UNs5J03w@3oYu3y#>U* z56VF-Xp>S|0gJosGEo6G*cgF7O-%zu!QAxm?tEuSEe%d6f?D3uBGbeB2FlUR@_a2C zRti99L!ngs=NyoYG|l&@HM)Z3Oeh19X(#Dp$9fx&RY#<0t^@%@(hB`E!PLF73))@; zDdIz{ylJk=$H<`BOze4pJV#q&LHN4`OIUOo$z!m|-PAHbe?3oXmPbCr>VqP7 z2*4#ic?gx~0o-k-5^w}1eXcK{#11r|o4`$$2_}RroI|H)*ku)twiz57cij!j{qwWX zkrG4K&0xHmpWUWGX+MC+7T^`>{ooNDH7ihaO~LAm7)~bFYAd>{*biPty-BHhWhsVa%IhZj9i@VAswVGS^d`C7+gQ}TPFeFB!SbO=)>dg zP|7t;=YBAgT&0q|-&>I$3lw`*d~0azJD$|FfZ9ZHBmKIkzauifU1T0-0Mhpk0D?eH zCl5W1+1Fx6YVYp=FA(>SS31Ivs|Da#2$=RRkystCBU`{Wc-nLyQ`NtnXeo_CdQ`9VM7lvC$pflG zFqE&#u}aD^|4xn5yf0pi<;vi85;q#m4umC+^mMVxj*W%#{+;=P>woetB)(&g&3j)^ zzxNWf`cJ9P{U5;<_D<^^JVq*~l8KUHIhR0oXAih7grjqPsLgY3h<%oei*Q?df2w*@ zp*~hFZpu%V4dEN&ig1?Fd87b>cbkstkp-0$w(TqhLU&6ftAht#G)_c|A*BcyI$O!D zb8rZdeY(a)H=p6!c~p>_Wg3ON#s|RA>jPoIE)Z6oP2J{Tg+f#JmbRDF8DBDXU5F6P zz}0ELc=4zWJ>?-xnz;$+W7OWBYAG_Q7rMaOC>J&ZJGr#f-h4v{Q@PL%{*~U_L(Lxa z01pW4&rv*IIjrtrD?~9oJ(xGe zSw>SX+C1>EbgvYk#bl*Q+@UPq2j;nQt?twp>|Ul+urKyG9QO?N!2|l+RhNF9)cvX3 znhjJpgZ!ACU?(K|tOcyO-JtABZO6jm=CxFyz44dEa)~+a@My8}Hze{qCQ=WWDS)%W zk8LkKXp$-qT=8@Tki%uflgP<)TDG9hDQw>0&U}mpKzQfc|>*XYuNau>Wr zTE@w&dDU9LWfK18>Csyx>*Y-Y*j^k?9Svs=0mwMwmwPLX7**-^sLW(N}g!f5nxJ&)g-oisD1=Gw>Ee7VYqx7JNLm<@z ze>ysY_ZCdE)LCt>W;RugAS| z#HpD=(*b*l&^*1kG6ufi2QIij0aXN-87#YUK>AZS56&SOqv(YpgDcx8L~y?bxa0Cg z4MRtW9t@F-W1Hg5L)t8__&?olVp(<21?d`P2Ob~LzZ6J`WKebxvC?6TIdZ2EoM|Oq zbhw1D*q96@J4v>e@EyfR9qDaN?SsmIAv(%GkpRkTJHhU6_Lp%7b};LWKeJNCI#LIy z*ku5j8~S*Wnwu1h0mH8Y7ic@T0z&U5XW%6EF*;)@)l@EfB8%c1E@UlaK#M-m@F8Hd zq_Ppp>%%R4y&;ZBBp{u(eFoHp5I_n188F|j`lF|>o9~4B%KsL=GG5CD?;)v~TaY<+ zFM&&S!cPL6yY5TVT^mLdJK4btDdDkX}r*7 z*~h?T0lP7P>GmsNV%791!xcov0e9`$W-{=yb@4VpLy!&eDl@H0^(56iu9bo^JxXVe z^VnEpzk`EstIz;=++isD`IX96&Gz|D|BChOfOM81cHi$1VKwt{x)4m?x@q7v zpnbES5i`S65$UGNL_SVu`rTpnk=B(DF8DYq$@DT(%z;W$ZNbi35ULK9O0>9V@ufnWX32)$61-MaeAe*deS{9n=Ms!u`wzmVEy z{OAlw4|gG25?Ms}sjMTACThnS2^;>t@EiXAcTqPYQU z_(eV*^kV6bGbb~XllcT0&7syiQbqVw8>H09Or>v&!q4(?A))1=r^CG@i&8fp4#&bR zQaC9Qm^6mejKbuNf&b8}3pjOfneXG>)jibS@0a4}+Aoj{%=~x%wKyfG!&T31*ttdK4-zn%Wyo3~V{>c#-MTQjNy9eJ6fY>uSqlN%3DQAg5tMh#@ zYjg?B52b(A351?|I|v5Pm|AsqAQj_t5PUnsR~b4$Z~kg|)t`nIcGO#aA%VQgpnyO| z(Wn_rnHpx58MzN$kXmjwZ`Ec;|1}|1tBv>q^f(^W=fk+we)`G3KAv4|KC=JS^5NB1 z>VEUTJ|156W1uMetL6XukE_04^38B&v=C2V^W}ny zBb!sJb)h_E9wfqES*>B|Z=deuJV+L*p(L>w1a(}d62T{pwSATj`Q~XWp zJj? zsj3&<9Ha%vc3u_^RTZ*J^&-<(j_f0NrR(28p{^HrVPpzuFCQb`SBN*=L;!Frx~Q58 zw3l^Z4wg}M3z|+*jPfpws4rkU@b9&PFjnWz$}nsXxTVW!UKMSoVXfqJSrXv1aY<_3 zcR?VQ>2DLssGi}KSDk?C!m3qEgor;1Abz{34NA>36>abSghqZd|gF$%|GD=!E%tm)KHR-glX*jDB|XEWyTEll(z2% z*t8$HC-hgHf50CaKbbtXa%xSJZOoWUpL~k6t+PnoB?czDsVURfz&K^w zp%n4qxsyxrLNj;2_D#KF*VtQUM$^GvM=At6s9;QcyY9@$G9C^`caOvBGSCBVmVZ26 zQB%8ru*f*Jeg{b>j&+XKIJ2pHH`G*)+6+L>deiJ~_+MxB;f2Sw@%gXSSDF?hG!CUb z2IC3(HC5~oY6Ib59$Hy(rQKY3^}J`lyt6g`2gAx|70Q^nq@t@eX$!R7iJl3U=JuwgJu%8G)s3c9H;=SeV;WtTFa=d{ZY~o!|d*1VzB|vGYmZ z3Wr4@Gpks+%Z@*|cq{H$QIeIi%&p$?b~9U>g?aAKS4Xjjg!S`1r7l3mIcF=w}(u$i2GY}MfXx*6gmTmqL!7Z_6cZ=56 zz>$)fmI#Mkr6V2f^smoARq>Ca8uYJh8s+^E{9|v}-K;fJKRf*)*pzb$QwZO&>)_C|aWSY+Q>>!=2CRo)b#0d%w z<7#4iVtastu=kbIH?5~Vc`{c%InIg*JFpU({&~O8hAbN&n6@Yk!Z059pwNIei49AgMkvU+B)j zrcs(=YQKhIcPR$Cz=NV-qoM+xb2Yb&cX^PT+i4GHn)o8x6N~riAI95`)G}>rN6Ukm zXhF`W(Qp2&B~7jFmqmF6B8g<)+Yfk6x2e)52Hq~uk9aaTHEFthuLOnv?i8UeSVQn@ zCW`vus7rT8Mz}Q@b*6auo7m};DylWmY`^cPPTQ&NILL=2ea0hR`GiURSr7b$FGKbpi{c+QpDIQIg zQoy)8u}c0!8g18Zp~vU0#Iae}mo*IFU-!+GbKj>mVN@aqb0i8_k{1m{WHi+DP(a`0 zAiPD6gDrAt*V~utsT$<#U{$`o6W7WsL?cF{+N^Iy{WS1;INB=A(&*MjZ*~bT+dDOp z%(l4n`t3B!uJ0XVS0<8I&9r`uthFzHSSF=Is=z&|?{Km^J6Uv~udGwQN&QqqgKb{~ zpnY8TQDoepDL1}_GpTnBL{B;>h`9E7XEQaQSd@d?$=Ob0sc*236Uyq^=aVk);A+~p zk$yLF>^DcDK%uSMzim2T+Dz(G)SIofrYQP8(=@vHLP>&*V0J08U-R_%4C z=;X~&EKzlly3W=S_#Nn|Io#auCC_{4a~g+{{(tC-l}1=4C8o$anJ)brmQ0#Z_|EtI z{@5ydhyUTR6PDr?zu>>TUt{>j?iaJQgaASHPPr&82P2aQc_+(xzthX6V91?j=L#HA z&Ne*C?Nbv^T&ukdG}$VDQVFyI^r%KusaMrYn^DQM_dy-5x0EZ3?8G-=JZ$of``>WGMi&=Lns0!UstqZ9 zXdy1#Oz@lS`$fm5C)B|xO*xumJxNS&{!V7l=|wiJoe9Bi^W#l!YN5wzj>v5XY{IVTMO!ED^cxZyc_u9 zwVq?1c_YT+XKP=FPzZFE+XS1q?F#ISHMpoTv73a=-)$B8~c&o{qCxLRi@Y}JSg?9dx z!_4bHwB0&q_xRndRC$}F(Lqn?VKM1&^MD(dIw;K2uv9K?ym?N!s3v*TA;-N~yD@lQ zn3kGT)0=Syo(^j~FKX6%rx7s{@7a5->m;;P??J5q3mOw)I@W8^~r;nWd_pL!2aH)fc{5 zu8Zn;OZg+PooJKjH)kjFY?iDDTmrirc9m6PS6~H7pDFt%o;^|89}12m+3%+H_+!j_ zRp*wN*lT+XO84Mzc9jWw?SC3MoLE{uV!$BgYS|6` zq*8Pjib^lqwad&NJ*`K5(z1gaAJ`?;aS+`8a~#`vwQ1a3=A>S%({!4go3~B-hnwRR+JUUEC@*E zf+%2%7(yVp(mVZ`X@f346o8A7ziROg9Y`M5MKfxgn^=U2B?teh`ak_ff92Oymv=2< z0Zp-G#P}EU(tD42Aiy`WF?hw;nj)6)vJQX#JRZi;kUl1ShW+roXOr&ok+UA0oMn6P zUuvq6&o5_c)BE5FrS;ZVEG=ExC42Qk!n3br<8qtnhRK*c2wugUQjUi~r`wWsm6bwG z_tl%OS38~R&L4PqO~1RMdA{IqBZKfO{4((*;u2eO687bU|BYK{hO&C*_Q4*l9cKT9 zUgTAD1X%S)y)4h|aQJ$aR>^ord0=!ATQ#-QVAg~%gTIQmQ?9OZ#phQSSf8Q|vdK4+ z1q$foZ9CoHdQApR=r&%rbnmL&zYt%p`vObOvQr`hdW^}TrRnF?B*5^+vo#7u z;H6c1qQcmfrP?4bU7yzUsxq7T_Czhxw+S(n1-&wLezf0dfRyVhGdk%E0xG8gpXM&# zX@!194+=46WsLK^_J6VW=J8Oj{~vJY^gVS>g;r#3mxLr_?<7eot@b6Ui0oT~p-x${ zmL-&>EGgTNeHl}T5MzmvwQPeKCWaXdGtcLq&iS50&hPpC^ZfC=UcbNmVeb3BuFv&Z z-=Ft&T}0J->(rVr=KM$c5N%;%57_p+Y>BcL5ajlvxZpX0KURqqB%5zfPz-vQcX0{t zs)Hm7Tsg=fVjJ&)A|L!9<)6Mwx177$WUB3^c#f`a^hbFSpbZtTn(tK&yK+y=gyPhH z%M4*EnO!rTs=_-4nC3*df0IfY zi*&(w#pYsCw1+21)AhEE8CAU{c|DC4{a-bF^Wg|~6a8xmke9zOCQ6LD=9GDl_)C5L zkUQ+Nh1=#=jWf~3T`(Cz_GC)F<&4WS^z2z;Gq8;df>NKnOXbXI^7aH)Mpm3Lp7IM< z*^|P(w18Nsi!>)o+OlrY5)%z@Uyi4-{s^4yHd|TtmpWfuQdrxcmg}RyiPl!wE$CMe zNBhm%WFBquq+>unt*j1(USBSgdDy7C1` zyzZo8j&nv;{P-MxtP^q2jwUpks!>)o2rl{DQO>ho+kjN;ImqMS2Gs-CaUDY`FX4ZvaVIcw1#IWF7R}Pmvj+IeUqhV+oKQ^i&h#oS-wbybt7v4A3ar#MpEIO}@rdP<@xyG3Os1f4upz z{5MQ2s-Z`IpxLA2m3^%?)AT;=f-y>#^z#U~fSrgpfg^o_*YYpMxb+a4TO~e}ZRFF< z$0%j(meh-?o#Q()8S9(?`I1%hW=4j%_DhV*NP%gCI^py$UtJl_4b%S}zfoN2m6V@p zY~M;#UL*X>RuxioR6gJQggYez@BPHP@_={q?+l5ait0k9!9e**@!}&EXQooByhc4( zzorN(q<~rU)yIn}*)1&{S4HmMDhm1$=?EpuP>^QoVyU0Jo02J!lDY8JTjWN45!#98 znEAEGxl>Xm5GwK~oTxOswWrOuLHW`0fPlbCC}2f?X&5UAPM1gg9|yxzktTD!t~=HN z_NJBWOGt0#K}+?RLUwq5faljEH7LD>ky7~tB9al*Q6v|7NiU#Ik?%5I=$4db9CX=B zGQWN5sZy%zZNuVdl{+nDzM8>lExS7XIrMv~@PQn;$~pX$T?b;y)cE_2M+@ubj9K#u zVUm0NF;Ni(Hj|qfe=tmc(@K~}1>;m%rIIN);ZVDQu7nal_uh@m;J6F>FYY?L_P|g@ zO@ZGzhG4X`M9u?#T}~nJqKB;OFKL>gYqzL!NZYy}MQZaVR)jQgZb;s?rk6kM+Dp@$ z&-9E{f4}!@$LIR+fxx|=@-Yii2i<4K56zT#gdcaX5tFJ(yv>kc=;-?}AV9`?eo&uCEYnyxeAn|p7^RWkIKN=AD0h%Zc^4wk z1hBf4U0Vn)SJzifBS}+{Fh^4&>Af_?vGb_9RR8J&EWfVCNl*5Q-&AXO2R- zU?FMGnl9V96!jw?e{t&J2Z4^g4tt5lx*}P2oo=J;Ai;nNl3CI@3_Yif7N4`<7&S!d zY>D3N@jjpn>l^>bmM4&v6VV;vBy)8k&nh$rs*c~PP z6B+`SNRuuH6?edjWhNK(TDd`uDCOqCDI_FYKBG%Nhv#34hrE^e?ySb9kgVb(mw>(V z8$P>qgVRAdL4vy5R2cINtAo#LE}3*Ty(&WIJH_o(VWR>{)o>%jBq`iF{1=-%#vOwXR_W@0&wG61!%_*N{I=1F_9 zKd0tn*-%b4{vOt`w-j=YLnA@@W`HG~EqLgZIAsy?&?)^j6wkF&y!=mJetaE(z{E0gq^?%5ahgkHVb;|UQb&-8sySGF2k7*v{=cN3e~?X~H6w=D?4 z{Gn=NX;^%BAFR1eZ z##0q`6_AZ+2Vlj~=dL}R`D3k#RzNn~AR&L-ot|q|7>H>o8hw0SC4btYcAnRb5F3y( zyj@ON;APJ&HhcPY0-QF_(o!57`}U|dVA^E*!h;1 z&V(?Nr;)1jkq(<-Nw29a4fEvu?*{*K!xG$D^W=aGWx__D(6+Nu8;%MShZ8UwI1wyn z>$a$^mml^hZTUez&fod#RS58oUyLy=?TWsB#AGd(vQ&@lw7O}=)O@EdlUEkYh;cw3 z|Ch1+lyZBhKd9Oog0PzAvli#lZFq0X?vK(xD(f#AY-Qcwv=m0(w>?PrU}h@e@`Vc> zWs8*R2Bq+QH>cm!tA+kv3Ac(0Z9S)t4wm{s^~pbd*YC$chgrQmt)$myOF64g?72U! zeCwLKah&I5RPaM0$Au+j+EuRS=aWxd=k&iG0g$U6pyv;bm**eH-d$ol5?c1hab8X#da6MF_NP&^zFxE%;0r!TE`q3zJ68K_jVBy6vpwV) zPC-Cvy6U{^slMyC5wJP?Yo_*Lemd|zhCf9QM=)=txV=k@9AluuT7iG!^}rj z>@7#+ZaVVHTI(N$!lc1XqK~0*xG(f5`sPvlx6NPgmfx>no z<9-QENxThi~bUY>$A02veJX?yvKUKpwyNs z{Re5b(!Ui7)0+-T>C`EHk2wN;B3~+HQS;)}%vt>fx3i4EUuFZw8y7lzM)9d8Zg%rj zy|PSvPOv`e#=K$(4^!%o7~uX7Yy2nBu{Qn z*G95Kj!q(^x;*ZjLh-o?&Og-=s}8@vA!P8`Qzb$Q6KEf0`hr2w8maH z9(I23Q5`mhgbNgUJe|eQsW4UK>^-UHcP55EM3EI{55=!qdSc>qK9tGnzYleoH|mF7 zdO&Kj!8MiGFk%yCz#ej=I@W4G6{N|3d*0;Gx9C<*55aHq){#dtuU^lc$0=q>j@6<} zaepWBtJlK5H8+d^#uw^$BWT=}b(1qsbzw}Y2!oCNS@5P%ylUJDgVsfm0i7OH-$ z=G>Kl7D(rPeEK}FUW~H&#wPQo>{yaa$WYc^+Cfb4%Meo)lT?Qd11_!5p(-)%I>)$N zoYfz-u}FJ=PT&$?Vbz@ai&t+ip;Eer3{?;9Lp`nA+ax=#@BqT;#T(C{>gN!w=lme* zEAz6d+r1T#pe{tJw(=l)jHvljUcXWtx^hv*w$!SNHJH)S+p(De2dwTv zi)Zb?PG;i3B|*RMRAC%ABYBLtH;t!u3_qD)wAtBcyto9tfmhXrcmS{4a{*&+JA>Jl zi@2*gSLibx$)mK0_egL*jO<{=+|b4)#D_;iZn^~u=BS%+U3^eiaiMa!t<$l--A~aQ zT;nv>3c7d}4f^z5E*%%OE`O3c{s+S(i=g7MK}A+Hir~CK--Q3HAkGtaF0zBZa1hm> zIw~Jz%KI%2yY|$c1O=1t2B+SoH z+OvP2wricTMry={E>=8s9+Lf2bcgP_s84qe{)v@lv=gHP0|L{j%VX;MQuu@32(3vn}2f-1IFnWilpb@znsB?pX$D$^4c=-UIoOs?N+ zrRe)zpUX{CPm?{o`l;&g<;gD7r&h+go#zvsIoULYJzSTHH@de>NwyWEb)ZP&&b))g zKTN$+8j3i~LV2@hUr=5sZ?HOQxG(o~-Lm#z2i(S-K0;NlOFAkb>wf%xb>{ig8(w#qN-w%_TTc4i#KjCB%$GSFU(Uoz-@ zCOLbR{eX=jv!a@TY+@SkndLs=3-_#tLLK@&GOz5PU3rL{j~0`W*nL3%Z1J89XmLf_ z&=?h8S=|~JE)Ks ziW9NI06_$9_W0;e)ftZ98;Iq<(;0-+8Xe<%X>~Q+-i5V{+rHLG%>#vNjo32x#TVZp zqRL0stt@luum;J=M z)*WW0v6j_L<2-?tTxB8(EpW_*few1Iw3V_5NFq{hFAWKI2&mJE-$Wz;$k=VOmv)pc zR$$ka;}lN+EI>GEUSp?S#8z$C)Gx2>XJP7{Ahndta`)%waI&L5v|1H)+sC{2iXP{S zTB!92#YJ73PSbuYSHGD7J=Y9}U&eM`8g4f@ZG^y)Ay|M%E8o=wrRla~=W{lDq?{>Q zXup1C+;?Br7Za4KR>DVR5u}gM8_^-=*q9mWH^o#-d-5_c;IMpX@PQl(Z%x2BT|QfP z`7oVF44%Zpx$C%V%e$_t_5+H2?G_e6kcAFsR8#8th@-X5kzs3MH;o?#HW|i4x_Z@w)Ku|*m?rl7N&Gi!6 z0gY`orI2g`g~Y2bV}Ls_lMUK2qFFsrEoi`jIgs#}>-4$6oOlSjp;t`bqGtx|A=OUp z3W+W}(E7$p=g-(a3Pg}-+t%^tk_ek>xIEi$kJrxQ?~6%#IuqRwm!v(%*kl<1V`3Y9 zplv7v>a5O%joGSYIP|34adZ8LOIhV`(1iQKANes`&q~fSS+A$OkS6K6Mi)VkgU8%D zDQ{2L=x+{*!zz93oVr{zTWkt_ihlrqjxK(-4AC4pCmkDxWzAfd9MO{|BzqvXgh?{% z?db|@s~K1~GS%-%2C@! zp@UV+b0-6VuCAyuU7{UYcOyw{3Z}-vUlsqRD!z@KBvV}!=#9dIvFXd9L;KJV1E8!r z?!92CR?B_SU1arz}*p=&n({|sXwzPke_29l=yq?WHtoi4kZZ#j}4i)o?&&ZCu zFj_!p+Tz$t?QoK`I)7_E`$8(gpaO&M+r5`Y-dv9ZjM@-GZ3cwTT|fi>uCfwf>8GQ` z0?<0^D0J&H=#$H0Vh0~4$j&**67nCn%?`o1*&yGG3CYVkLFtcCqrU`xBxwgl;* z468hEJ@CTa6(VJ}C+g=^Yci;B!)anEnTgBF28?$Q8{(v>GVKR6=8 z#6ouY0J;FUf#``1fLZHcBzYh8ghNAmD9~YP1LyfwpjbZT0BVZ@!m+H%38?Y{vW~COGg^b^6P|Q_!B9XS7&n{2TQ$2w1g6d>(}+=#1)ezZ7Uqjm{|! z$L_5@0oXyZ`j!NKAcu;jXD_W}j{Od_S_574&=l8!Hw@{oQ-+mD8J%m_$0uvYDyt)j z#j_5vk&52_1LR4I>T}53_BsJe)6i!bu@~rjox0|_$Ld1`q^T9tv3cVi@&Zk6=Pw$l zvVnyAT*h+vLx3ZSU`*RTlrocSQe(Lcd$%>qHrOU#U1n_EIWneG1d#cmG>@U{A z(BRy(<>rLJY?|!aX?}s>K1QO{mJ8Q-ZcSDZeFCh-o_t3C7P7)iWRb;9y_yHykRW)+ zl!f;u#P0({e}z{Gb?(hN5AepnLSK11(w>W^W)draP%EvoYi5=qJ2Yk|qF+9<+I&~o z?+E<>A@r%p#iAF{KagLeVFlQ93Zlm6or_`HI)f1^@a1z0KS$2So}c{KWcTs9Y1(qO zCY#g?-F_eNX~|C4J2FzL)lZx_;duC3Z`!o}PK3Ltw z#~uSZ*Vsphdz@^BWD4|=&ERrje*R6H9{+sSlM^vwv}^|}`yM+|FXx6MPe%gE##=Ho z7Ty>I5pvsSn48j;JNuS(lhQzU+${i-8q6r^Owq7QkwLy7mR-Z}exG{`;Yz|d4=sN` z__AB);m~rC7cRFH(=h=+BiHL+ET39Oo)-)n zVaE5y6m_}-Tp<4oEk;h&>h@AIy=w(#nxuOjV{}tY;+Eh(^w4)+eAEq~W%z=hbu2Hd zUPoTq?>J@ywD@KukA7i@QIS_qhC;;`!s|^>SX$b*D#n~YDm_dx?R60zX!9`{b+(?% zzS;>`9<~dz|V=EB4~VFy%s9DAbA3Wy40pTyMrqM|P64(adsO94E_;O<4E!Zn%zb;PkFV(5pa3#;6c|Gh z$kI<8grdXLF`;*+SCB%4_FNzD(iCGA$IB{-hA=(7J{K86^dc8OFZ7fTXWU_`4eWu< z2+t6SAbpkNDAvv^6K#U^bqITXBG6))_)dabyIGI$x)ENcO$^+`=E4g#8?+|FYhA0g zU_ZbdrGB!UpMrzR@k+6r+lT=-Qg^Xw?OID=K+DabH?$1Y9GBUrFs*d)+?uLg#*mVS zS1>>=v!~L5>wZ!nSlng+o>qJvc&TG(WH*C}B!rq~%j(DVL@%48K4?3)X$%&cw{1^G z4zvJ@_RZ&U>OP;6R>@L%eHmATnh(g*d3)g8f8L9@;9~7+#*Kp+HIg9@Q)Y_ZxZBXX zVC^%?B$lSnN7nCk{Vc9ORi$0|TcDgTBEJAF1A@VuEnrW#TQYSM2DPsBqdTbnOZ{Y% z5%7--MY6Jmbd7|87`tCFIpHF*$KvED(DQkrv46<6$0dNYY^?)<1YK4SH0F&rZBU0r z3jl=MkJOe(o-5iP={k}ev47XDDNGgPTAAt-y6|RBe&wCTb|HOt%%h=5s|2@)%39_M zTww~EHr;ZbYq|s8b4mWWs`TQCt(!pEHv#+lpQlOfkPh(Q1;lUIt+7-d*H3P`Z~~a; zpn6NTH{AWWe;2rm%`nBKf_SuD{RHxM5d6}9_u(Xen96A~@|l00CfP=_$uWEDDTA`+aW)mw(|l^xI1$%ZI-!>0k(IL zsIgpqv54xPy0<5*yf^LDNP;)rZJ{tHJx6Y)cayFezW*phnWg%^kc_^zuO4xdM0L`P=D59aFgJJ?Z`6`8|e8&-NVT;gG=3i8}W55&)Yhz zOII2mtixkg0=6_XE3IscvQQYW`HnSbY_?NF8z5B>KF4 z{J(p+tM11)ACX4naa)eIJNL&KiSxp?C>Luv*B|BB6o$xx;AUR<<6|1g3XDzJl7AH8 zms7s5UcZc2n|OKN;5~XrZ^87(ciY44!;=3npm$Q7m|~jnrN1M^s#OMutFlZ8PmL+Q z)tQnHw(}Q0a9Gdncj40TgG)6*>t*iy`2?i>q`|4885Z$5k#x-&ox$I;@#LBK?WS_6 zm_7k+PcuWkeCl1sx@C*2!Fx?Nw6K4uurlMUVdZD4-Ea9bNyl&L7r#598Fq0$pS`e$ zzPVCI`9exzx7&xMORwRx({<*QR)V**r)TZ_9lx2WfYbMV!}bXJB${$>G4@U(WivJ{ z`<~v09MY?NTZ+fzx$NdI?wX3LT_f9MzE*Bg-6Ww`Bsv|ZCnptDzD8a#hKo}Y+;Wzf~;N$GM%2TB@%K^&3k|+S20IRy@jW ztlxezEmL?Kw+gmv{#4i}4Z}BRQ%_|(6dD6cYD&)xT`I7qO={$^_PbrrUsO7+d0Z_g zv7SULw?OaF92>Cd@ZKNmwm2?d`bL+)@mpX4)(X9BwyrSSsFJzbga>K&@@wa|a1=Fk z=CyU63UdyUp)+gLQ0g}v8!#DJzY)A${PG_!9rhHM*&n5}W=a9y%|PGIOgOl$=4SH* zNgQtcbr!atd18?fylk-hV0G`Tr9D|q20>O#MfJXc8-E1{)Cr8=)%=JX-gG@SUh1hW z19!T*lw0 z@4;aQWX?CjDD90sB6|GG)(rf$ONZ~GUqzGCzF~5S6>{S*nY(B0WsZ!q6C7hF<=FPJ zY#JM-tFkz)qdn9d<0GC#`tjpvY9u)CuG%nfyzTr2nH|L%{u4YIflKEOVI|A;8Jc1) zfB$5ztW7@LjVo$9u^3u|`|@&5#jLtoyj^|i+`)zxGVjcdpO?v&mDhl!%|)I`{Y@_O z^u)FU>DFxdNi22rj~qY=3tL6bXf}p+&R;O=>7{3UzwVc*Hi0t zu#~dT=wG(TuRggxq1OhvSooRv=WM^4&wM{$)ME zfCsMSwryTKPQ|K$XK2bJK6hEFF?WODGdgEYai2Fng+usWjd;Bnl6)6aGXE24*U}Z- ze#75bKJ)X8?W^rd2jwLb@4142!xUPBf(^qw{6SaEV0D+v>+pw-rH)VYrY8ntdBNm6 zvRRLiTb1Jul-T)C2tTFl1*h4*d>U(D8Z9MQiqBZd&RTgX$~zH6UI$)@33(kTjv6sF z?}@=hS^vzpN%=3KAIY`Jt~$9+!_8U zoTVrslR5fgFn$-GW#PVMD=6;Uv8`}=PA=T(MP7yy+xNjNj1hf)QI>ePxX^z>dbx64 z_uJ|E9u0wI&;CZTwqV;+jXn?{^|rveWhOEn z4toTG%Cw(Ys)dKEHkMWdMD=l|+!&ffoj19#y?q>wFM&DOZtKxLLEqLue_C(qUcX$h zCm~oy=QwCN3I#nqT!YN{vVwW%!l013L95yiAF0?_dK?^Q81?G>d;>E4lop7w;T}Ob zQ8ETwmKyDcU)9L#Ao9YGn+tR^AMVjSosxpb#dMp0+8}iE>{1uEWA}y}i!zzgUJhjZ z^5^x9x5z@QL=@cW3S#7Py5mY$mp`-`c?e{)hxpb{#H)fmdPQXPCg$&W3iOu`Xq6gy zyB%0?t-L+BefID>lT+M8=zOgNyMpBl{F85obZ^lwf#FU&kmU!PZn$aF`Lx^m1YNNG z#NMUi4?!WnekJM@=Jecww4VKL1847MPmI*HsWU%l+Est$fjEVmMvj~ZKbNyL?Q-CR zFoScqWXZu# zag)uJthjCay6jTS8{|zq~7A>r0A4{!_-$gV2T`xp$ z`!Nj_Zmt4Fi%(sAQmC6pZ*_bqO2rgBW3G237>O5BoN}s>(zrU6Ewi`EVus{8%3T2f?y~<*0)&SR|A;JT@uHn@K_m zyLA?=53e~}J}#Z9QtnEpR6wlCFkegB|AS(A<5$ow|>o^;%1aX+LCt(62fEVBkAp*~d!b;;)|I<3#=*56+e^F9^(>G=3UzNXo-rgQm8rhcxU37_|^P0;dMjX zB5SQpA^X7`&3eq!a5`kPzl-7!BD8yEnm+SH#8k7K=@5CPTqKNc_rtg^Aj%L?>$Ia& zA3J1iT1Zz`d!%p^hmljBgj`{TC*EE#fBs?Pg?;#Yh$o?T+TB@L`&!v;+9>>q&4%6k z8h#bw;NO1ISV{2=EXCJ$3sXEpzO`M2*ZbV`?67&7Dy4rGZ&1MG@gA9SXeeSl9z+>T zD0z3ev9yn}p0s_l5W0sN-4i{2lX#B=fM5JAtQCem%Dj7kYZ(+q=i+ zl^yzo2UteRUstDwh7j^QY96;!X9npqV^eF(g;;YM#GVMx z#g?f71N5R{f=80>f)O`WV7yVGAU_xFd@feS?DPUw+2v!=A*;IBL*)*r*{Tx1KsP13 z1<@n6XerO@)oouRr11~&HNN$BLHK4F)kT|T@A8s)rcTBTsWB%Rl_eOQ;PiulP5%;? zrF||0CDgdEz}(~P`N%$JiadQ$SLuO%m}2w{le0r)nv2SsqI52FLx4r8Vs4yORqPlV zP()Ql527Sk3xomHK;IljWj9+-DXp7B(kLEA|1y&eBZz=5(&Y*UR=m)E$YS2LWrbFew; zqm7$*lG97xn$|qx)zUsZq?vwu@np$HyslhdUyBLuNXXs>r*X@L*dLT}p6#l@pw1Lc zhUln0hrFmKg=oOYW${ox^(+|4q{ege4fk$r#LYF@&(B3Y2=iJD3vDQ-h-IpHf9sh1 zT6IY!LR!yz;qI0JRcrktAD*_KC)Z@@KZVPn*PwSq2zwuIOb9Ns)afM}LLFO~?IeO@ z%~oQhdbiJiBZaIv;}A6sK$=9{0(xu)!)`K-LS#pHcw|H7hZRp`@Lypfc z(E_(rOtn2t4ZX-2p9$~reXQhgClmZ*Q`S>SRf3pbN2y21OXVsR+jsrkM05S4LmzVo zoOUTRjvP%})6RXvU%69MxpRBj5GiX!^?BPPXZ5zb*&~Lk+A~D4V0z&Zf@G$-Ce=uh zPn9?!w=}liEw4uG^<(^Mq;@>VCwtg}Bk}h}Cye1HuG8F8M#R213aAiiRoDpl3C~g{ z4(Kx5}+VaFa*^4vd8;aGn5Q{SY+Yt$=KnG^3|6bl|<%-ex?e$AI|7v z^s+qryym+Sg*2p02+i~5!~EstqYs6#I4zeOS1^k)XBYx!odlDN>kYjcNVuuRcD&Q9 z0OBSung$M=QJ=o6tjNpf+J|w2r0Z*cBz<^;tww2n>Krw)ondG|ifZ?;k!sAp#{5^U zL33uzH{*OunmICEkA%2>jhh>lEL4o{?hc?V9_Up*$}GE=k6QZ$AL}*5Q2dYgM7pv9 z*=UOR(>Np@1@7JRrVBe`&r9z|86El3*=}uHtTid)z39n|3wL8l^hOpXzt3ukQ?7nz z5y#JkD=4Jh64J;qiP}j^@(y{44I!w^_Y4jo7MWDeEv&%!!=4!G-7{;g0lK2RdYJzvhP9xip5C;n_=@u==bAr|)ENy`!tN?F8b+z;C_j!K*R? zd};^qp!#K@rH<6XFj$EYWqGo|_|d-hw>O>C`1b7yjdQFa8sLWK3ik+yy6&NjSZf#E zx-vDpMSFYaYx5xA%evzWQ8a?e(7^t7(%~wvX?$}YVRB4T`B|>7AcuD3kv0g=d6>vV+X2V|YC7Ws=vQo2lYe7h{3*juoSf zf3uck(yZmJOArTlCkT?diEpS@m5^{p0?OW>@BAZ7L|un4CH!fIk2hk*cF=;d{} zeODhn|Ax7Q@gpS_gJ(y)%3D0Wwagb=JTci$^E1{SBh+Bk_iFDNLixSErkIg$5DGqzXbtZRO;>WbiV<+Nwf*!yw@a`y@^o8Zc85(zcWK+FC{UT*9H0FA`-lS&0cr@AYba zlk0sbuC+|V^s2TV@2ZPHem)O@bY^|`kpj9ERUEX4@M!ux0 z3gVpKD{xE6qLX6RqmRoAeZR4k!LhVRcwV$&>-JraoX(DJ1FtrP-yHPx9Hp`pi34i* z7~XS?j^uM~)4BK2j{b{CFh?~Y-u*Sk6iV&6SnUjtqOO`~n!{GAi(tAMSz2{*=#I$v z@jzF5N}w9K!I(NkJl-?n+rGMWaX!WIpfTSy)v}ijp{kP+FJAwzMwQoUjA6Nrc(>G| z+>VC0a!V*?C4PBFjOYF1jJ2f`6z#`xEiHosy2@{`l^86f75-~4KT{RqyEZ=Yx41ky zXCimfhO^MqrDn4=sfB#ijdIDR9|z=F!;0ZGT>Pq{k;F5M#Y{y~6fKAMM-$%~b#Is2 ziN<@Je1%sX8Wnox226>ZYMiRla~+_2A#*!vuby7g)>2V%8i-O@=oB;YQncWR!p_!T z_Pza=^4AP+^l(~VK0AJX@!h*xqVBZt#&#@?k>svq(NHdd@~j+^dr9MK_4Fo9%%`9Z zuAo2fZ$RSp*y;KGn_lzv6s}bXO{%?d*r6J5jW?zyTk*I(`8#QWwq2jB*FH!hd|sFg zZ7eOW#3)nV+3g9H6c-D1yK>I_gX}osM8-xb={srtoH;e60jvfsc}gmPUhbDeQwzMV zPt8JJmC$K@hPs$p3a%q(tB1ex_`jt#FrcKk4vaxqMl&Eo1@p5FeX|bxM+uUskAFzs zCQT9e6iH79QHg?IJV)>xHuul+2c&RO|Z%3>VJFOd(xBqOx+UL~(Ie^)qdTs^TLpacl8NB9r z((l7vIF@%Mk`DszDqosy*FiV6QRzdx+lJY0s6W~^0>76Qp*Ruf_ETu1pXGBU zzPgZJNn7+p@GPTmipV01aldp|YT&?qYdHj%QbnEc!X>?#BySEdX=R8IpKEK9=;FBGg>5U0WZ-&%DeFg4~q^)>@-H`nqB&vfddAMpEXm1e?>~yE_9>i2UJz^ zc2olW!;~^UrWNzi!w740>?q$z7W2y&PE+f=T*qmxpQgqGx_fqZ<%RAZCz9AU65-pS zIO(K3m_e6L1Dz(i*+*o&E_w>#NV?#x(KD^Z@CoI5u>uHUi%3bv5LW=1kNbc zZ!@!a0=PB_ReGw)V(1-vr-?;xes0gnu1S_jDZ?#}xuEF1K(b%dbrWDN)C{~}G;VlJ za~3P7r`xyf?)y#GmZ_sh>z7o_S3{W|4LOp4k@PZ+G<4=PqIc9!;%QexZ*vu@&`;{I z0#yYf?=g|+r`}}}%(^{UXsYNb!E_7F_}vW_!~{1{PT=1CV>-Tr^gZOAx+vTmY2vs% zqnnmp6R=^E{90&AmJTjA!&7V>Yy1iNh7!fg%kqmzvG>^N7&J0J26{CB6KpIU$pEXI6B@p&)>}{8|LrM^GMs zp-*QbZ5eEJMXHvZ8$jrXNrHn4HZ$ZC`J=x%c(=dOJ}Ou!6o zWviv3YrjLpWOo7^B5s4S`xOka+x(!Xd*Sl&1i^TU5a7KSagrH;=;zZC~u?g@V+KoPc4(hdGFg8P~xRAH6=;PC+FxxR-z@WPuw3&P4dFsRtR6<9X z-K0nXNPok&E33mi0!LITmjl^e#KeW8!f05wAFViT7yQ6kKPNpEuBn@0K%~{C4SwKF!CCrBkled2_XM7YtPo z^uFjpROJcMt}NHKEVtm5xp8j6qW$ELADSw#BHjZCKRkB#0DlxB?1Bpiu*8AD$}&xyBmn zTCd@f&Vys%tJicSk-VwcV>evR>gA1JS>6X71oQfX-Q5MUK`G{RSVT@D30*JPk;J%1 z!j)8ZE;W}`nV@X%j2RKNz<-RxsT=Re*v%4-d+O+TPn$m7bYIhQHxF%J-PJ>u;)@F^%+Y`g`SITAcb zyP;PuSrU)H1Pg&yPcc*o8U4nef9QD&0f4QO?ke=FTBCxb1@G$uugiL~)3)sAnd&ml zGi5_FSXd3uoG8nH@fuM%Cy$!j*FQ_l+|C-uQntn`}7;#4kBpJZi`RA2$=MN#o zh~~HRk4uYB#wlGp6YW@oHUrJcfGez&KOy7+DB6&!REIFe%y%)PVMFKMOD~&!6f9P= zK_MM`2%49&exJ2~7agsISr=?*>Mv}8g~lgbl36lwlF&C5P^Uu}MmnuyV{4CtcDHLS zwZ{?ee~?B>8_a00EFamj86yl}jC9Uj2}_PJV73^VwZF{#3N(~10VBydY9oo~pb~xI_pizKF>S-BK`MDfWK2!S}g(El5uCwW;I-3CHP;K z%XW?o4cyUvd$(KrfZRrp zz#7a(Rh=N1(RVL<3@T>bP@eH@q4A>LLv-KshN^YvOZRAsUXi||#|u0k$T}arb6E;H ze0c>{`d{Wz)&21S?t`2V^nZiqFArD$mCGE5BKB*xBm`y!HqYdMg7QKe$+IW6+{;Pt zn~x3B)SeJqCKw?ItYM#qzN(RS{z&SAdx{WZ*HTq^#CP8xp@%J}h$UC=NJNsq<*c;V zQvUmqyl>g-k6CT_zt^w&Kj8qgj;%R2GF&i=<+>Yk+~`O5EF)Bo#DN-KJZX?i>N#|4 zwCBZC)jhLGHyUkZBctCA$1SYktkmo<$2_%+s23s##e(SWV5s?~;#J+phLjbmgupWq z!N8Izq07jXUwDDo6?XVy9>ZM|=f$Fyd(YyGdxEj0gb+&}+K~{o<&4Q*MA>h=dZPH; z%|(tjVWMatRJr{UajyJ_aX=Qgx7L=dVdLKe1jytS`q^REPsFZQ#fOyIX+duFmsM5R8k zebh02#C(DAS+}wDFPiF(I2=Ce`)hsJ_hB641Y3sB|KX}msr#Gz`KY&#Xt)kO`aJ3z zeH;7ZgOFo}k*iIbY{|yOe{)D%7z|G>siu4c2iPYDzM(kUdIzevxq@E*6{2GiXH3~}eck|5;osz)k~e=P>w zy7pR4*BsC6{CeQeE9XYIFXhH-P+X59s~TZH@#pd)H;xIG@OfAl|Ml5`G!+tRx|I_# zj7OW7yb{^f5ug6&J$lbO#-!Po-5r}hO8?V}kQ==ujDvfwz*~|3op+wu&c2Fx2RimI z^FeMRBVwv2{yQ+vm4B1^&);yb{2RY4V0xdw0gSy93#Ph%-cEO{@D-kyo&SywbPK~Q zR;@xISKujpnipnC5piMcJM4}%w^^_+(7HSA@V77`OWKtfUD@{ag%z>b+nWNC}mxMlUopH~4>N@0R zsAH512~un;ZmB8$%h(YT_(H8*MfbCU2enlG<7a!Kq1d%WE+6|TV9msqMm=7xE{ywv z3to|Z8R^=r`4v{zJvk+`oLlA1bu~{Pgbc2xrWsc9V#M$L2~+PROl5p1`{G{C{VPe$ z#gOEN6*T=#mM_bqlegoF4%Y_Z=*edLg~a^HaUR<_9e~Q*Jm1rTJ$hZ>HnKXXFy#g? z;mw5lVmX_K8eC6c?z#eAAB$SEW?xtp$ z!%g8ZoY0kqv#xVWr0-V^LAl)bJ8Zvwdpw!lgD}UPT^cQf{c-2ySe=4sW!%^#L2x%) zLli!(po3Sk6Vri0o_5PYhVYr+R?Z}9kLY`K(^Mjm*j{A`KB2mly>Y*~@aN5C&udoF z<13H8b|s^D3XA?AO$N66x=4~;g7#=C91AG7)iA|D<>plWQp1#pKFhwreEQW&lPQ71 z(9XwfOX^V2W2>?12kKlZM7Sc<`7R(d6SE`~jX(#{^kWzyp@?{&YpgVxwv>BaU%u{! z+omt^0KMD|JI;PZp##3utW#agF{{qRSn=S&URu}y`}Xk>uN8GRt$xBo;W9^>rjTm$ zTbqfqh64OhIO|ho`?df$7mk^WY+GHa?nbfyeouB!x{5hFkR^vYd9ytLc-SmXw|8;c zdAzymNv_Cc*}eMCGc#milP$_zM_C~n0{rYHp}$^9gDZ8f;)Swx37qS7m6;{xfHg=; z&bzDLnf(yEvsCO2`~JI1mqr{GUSNwzgxl34eZ7TdkcslKG>vry=Si5*m&$ z7i)FBzZAiCf*M0GSA?UE3fZV^`sdB>>aCAfaB|P$=4wkFeNQ^sb@s!f$wjDVl!xAL z&$dz@$jkM9En@qpfTW!(tWue{_f+tCnOFNzL1&DMJ~{wsFE8jenl@N`{Km{%`?dj$ zq6FL5R9Jub(anq5f%QqFJU@L3{teMKa_@?RDo$kzyi+|p8zyFo*3ZB(q zoNP#G*v>2N{!Jda>^{FUY`jzr_MuFbef_B2JM?|z>(W;mIk&p55e5uYNjAhZuN@h< z4Y#tXrTat^?xk#ohZ$yI7vehh$FBI{BOaCGCoKU>Qd7tCyz&0E@pZbLs}Va0_^c@7 zbJp>THb_*OD)L`59s-cRm9~>@*=`i)1&|)%Isg1#&`RHPRB#yOs5QR^Udn7B-c69l zkw5{v9L^G>3SR6D4r!RnIIw9xe$h&+TfbKyl#ZGS-<;gVsx*&dw; zv#uDG^AgSIn<)s@bx9jRsZB4u7%i>>pQG^SB3Z7qNTPh=Is{HFp)KHhF$0O5ZXK^C zYt2W@3vavN=C9Tq)Qc4$jd&~W8zn_td8Ve13m8^wNw)U-W~XA(HrhBxUR}$;c%QY= zqgR;Js3WG(L73$Fu!%8)S&)yINk3&9)sCMzNnY!f?pnSLakJ*z zmGOU?y>ZKm-_&?=`;^f70c}MLexW#5gPa-MnzYHpIi)`gC@HQtwypI^PneDRqik{g zgy*hUYVq0u9Z$MN4~?iYnuhyLP2>!R-v;@^u_g02ce`%Saciw{lv1U2IteE>yHDlg zlJ^*~>JoxFE={3|<+zm-EZtRwaF&_oY_l49x{{jrTh*L9Ewp}pp=Z56cJABs|HIy! zMm3piVWV_=lx_#mRs>~;IJP2#BJ&WHRzyW?ZA3*tL_k4^$PgfeXd?ubK~Y3x5>ODC zL1vODQ$z$rW&(*2AV2~E0tuOKy#YPlr~CWX{c(TZwOsr$snlDwYwu@2``PtQSPiev zYr)Txm+@Lnc*7NqDX)U-0l?T)$oVrG$L_dE(QYI$Z7z&_WbbinW8KT(I9U!T5Py>x zna;l%S?GurcyVLXM=J3U=y(F}k@wifcClj#G0mGUB^6vvSIw2IYxz3WKw?vqjIAl;?L?UXtQ!m=UoxZaFaJ_;@iWeKqFDq z@8n-AUwf~~GXnH@AqDP=oNC2U^k}wYheamVEPAuz(IoxMkwV1CNFOQzT65^|LPie| z=a|;)-S(QsCUI#q?68*mWbO<-fD+yYmcsKQdX|^aH$7{#9G2oYD$->Rq44q)!r1wv zn6Q2Gu3?Y!M8B2KD&}vvv4J!(6Fjf!IQW!UBTY+$g+&DCgbUG+9vqIVI|x}rX7$6hCRubAlb157*D7sTef>*L6u z{Zm|o^XETR>6>osHl1%ui|*lYN?XNW^kU$AF4FkR1if4o3#S>AZQ!hIU5ZOP(ee-c zx+#(A(<-V{elCByFrlo0AWALPv?K>#42x^V;HVP-w<*<{uDMms`y^4>$KLE;V*1Qa2Oh7kK~?lQz4>(;`!IfTO#0+i0^^Ih zxT3iX{o&!Z$E08ZlhB(*w6Q`nbUM47^sBs0IhWnc8KM5G+P#>#xqn$6* zA4+yQpv%cnZ`>Duv*GZP^#}Z$_19A;GKlYoJTx~ImVMd534*)c^c}Rb8dWxFAq80} z7&^Mmicdg#W7UwAx>v;0#JJJ^xHs>yVY4AJE!>i^mE>Gp-dOOFkbY1!7%r7wqrY8L z!bltROI`88u7Y3*Klt^7tfiHw(R4V62={m7Id_MpXQceHf5(nSX3~5XX75-yn(T_- z>@Z`%$Df;neZG=&5kQo^!3*_&M!Eu|OI0g~PCzdPt93BJ&6X5xo=^=hqI#lWbxbTR zIL>?TN1pZFZM$HwDBR5e{$0NW-{y{*3BbB`ifsBLmk01-t7elrgUlCr zRbH4(y_{2?+EeMYyL5X2x`mm-ufWD+Ynw0Q1Vs%)4DfkH&r_+A{RHm(zU1drKFSyO4RL_)7Dt-5S|Sj$f-tb0zcrr^vTM2R-xktZ zQr;Y&Ftu8GKEEX(DO90Qp69`-3&&N#*|P)K6HKAwt%TrM>nvgar3m89)F`JpE?iyJ z%o}(>DU06@{lWLJpNpn=a0BgyC(36N@&l7+>@DHfw(j8x#-II4g%tss(e=Q;_)NY( zaP?{dtAj2#nDhHnFqm!ZYqw1&)8q`CvLEN;vzptSIzHbcmMT;t{e1cazUDSRI+TwT zZY(1Krx%Gye&0Bm_5<2V_IgzyCJsZ(oau~6r$irp*k;{pi%MvdYf7+hy^w;hy1b43 zdh9+0@=)gxsEOycw>+!H?zleS`6u~z9cd)p&pQcj9}3B6^JL47X%19sGfDO{11a@3 zk6JfetFwlw-l-={DHhr8H$_6Zha-pEd>sCoBcFf5VF? z7@{Q-xjp(0RX%sJ9X#a2pn(&ZpPEvFw&9CBeMTlhrfp!BogM|(!SfKd>BMU{aBeis zmAZz_cuR}x*R#!9GQunkH7X`Qxtk79&HD1llt$X#1no!;C8$5DQG;1uyfFLthk&f-irXT!Km7{|1xL)w@^a9aCA>_5!CF z-9yTGxm^i8(L30eDdq&5M=Ng{^Yy7SrOx_#;PC*m;hFbmKrAC--`e2_*y#A4Jhib4>CTQ~Tn4sR2SpsV!OhcK``Vsl*ei=8SrO5+Zg5An%N!%9${4o_sPRdjXK=+PW?#(fIm7 zC;>ZD^IwvONsR>j#;n5m@)6skj9if0nQXQ|`WjyhU&j~ObDr_E&+1%Zei5SQHD^AQ zj&sbDZ(e+MvtfCzF8fJ9(YDA^ow>mU3e-`_kUCB}Hg(;JilfOgF-;XCj{ zhyxAA95%LA&Oz*To+BXtDO(oVLqcL~ru@AL@XK2qx^WA9PsPHNO5W%&8+d`K*%@0g z6&_Y>ibg_-DZtLpIjuc*+t_30T?hlKn1MxL1L_08pHNsKW{h#dXui;pH>@r5VI68t z;khv(bsiSq4x?tkWzWTGOJ9x0p`4J)Dp>r7F# zv`Xi4k2*4*uejzxG2Hw}`V7Duc zISxmHN+zyt5j;}s!pbHG2bV?n?q44Bv^SYYa3rkx_v!@wNwRi__;!KH`7aam(C zYa@%an~97aJC;{y;$AUe$A9^o`8fX*_3`~7brJF40mgwVdRMHP!c78=k8YdFpg7EZ z^&YrIFy!IEJ=!IWljbK)3fno%n0(QeIiqsS{@am9>Dj>xOoOtDuPwVO(RFx%5xjYm z;!#d&)qj^(zH%8zF@%K%v)hVoBYIhpbNtzB27%;3|8H*f#>aoA)r#xp$BDPsp#ser zGxW^{8eAcigN%fuK`ykjECpabL$ny=Rg7TR1CxDM2mqml0_tE`m!*q&wYWmc%7r#C z(~j_gaGag`LQS`~il&@U`tCejlulDjMo1Wem5yis0k>X!2>%d{iw0(m=Vf$6SrMB} z^|(TS0b)L`Ljf>5%+Ac|>(Ao*O`av3v^VD-lE%(gkxw;;o49>0s2tWM+Ls3rFv&l= z?%fN-}}Z{2@|8M2N2vo}1s-}B?2YG;g0aSV5>(32Jxw-Nvm+yxFKWb6s~tQZuY zfLI%JQ|uo>j^~#Gayh2^tj@w`0ktP*9SR_$N)M@^xg2hzhm4B8{*9jblmG|Hy%UHJ z-0Cl#>rjPcKhRbslxf$jM45wr&(|-&ghkMVMd89Q8*vP4;o{u8;$(zB9^42F_=UTc z|Hy?ywr<D6H8jk+8Ca6cfSJ1hn=j2)&TdV~nPYg5bGjtJAuz&s^LL(AS0= zb>wy!>L>$T?(sk+NMkRGu`9pj0#raC7Y8u-}eX&VxOx;;^B%Di6&2q2#)JD8*ieg{aazX-rS6 zw%O181WxaxU5Oi^RIy+d1($_R)?l@!rz`+>WTf@n#GRRZB>R~iNJtL@u6lSr*5;1} zr^&IEldgivxY{~x%?NRSoAr3Q8eVTeqjJ`Nu4rK9*(UUCf1=Z^g=hC>Zem7tQdUB2 z)u!m~j>vly+4vtLdmhY}x?aL-(0otvdUnhd<~bDZreT+Vsvd10e5h)^@h{8NM%Cb* zSMp+5%*a-RADwKIErEbi1N`L{KC5%sdt*S}AU8}xMV!|Chnrb_KO#J$hyN8El75D_ zZA3|WTK1_-kDy97nyq8UJ@1P+Laz1eb$k$MLOGEN1ET=YWZ>r7x+?|eBfy1VU8H+? zhcWNt2+HtN#TXoKI&~&C<$=&Ne1*U~Xu8&eOcd#0v1+30HpVKg8*V~?2R9Xpn<;ds z`<@~&`W8w6TJ4YFl3&sa-481LI?8XHCznJw{xUf~)snz>ulyklNe01{?Dfzqb2-M)stWj@X<}*5Xi81usIp$@V@+<_a@Et;$Z} zTEAC`hL8zZ*IIA#DR9KJ1|vcnN%xKxw#9xZMy$6B#T${O+epbE_S6@KN1^8epXY72 zAA?RL8{+x5WhD0u75emi@EYtV!A^PFfd8@zW&qwo=wS{&u$7kxh`-X#nZV8$&$ZkK zJXSEixjB!2cXLiJqLILht(G6aZTke$r*a>9%b!t24?2A{g{mqsEhIr~!Piv|(PB;? zE!d`GhS6Zc467&E-^Wbe&ll@M6zW(>DZuwpDg>C>q)eb$-4U z!(>xo1DRuQXe?7!=fcWaHDq=C^Rj`#AB5SMpP>U|d@)6gD=(=Dia%6Yb2z_zJG}n8#b*ASbZ$1`p36lZ1&~-sM)ym*_Hpt&mLuf zs-ZDO0zzJrGXBBI9(uIy5%KobI?pj^mj_1U&AqZTrEx$ zPd+=gG(h0bkmHrw68XK#2|3*8A1q=(7=g~5kLmsYllcE`CHS7eBn9Q{GaUV{JXl=wKW@t?>X>rR^Lo^6p@MTm$i&I1#>$uPYt6%UL^H-e)Bnr9S%Iqh zM$IxW4yJw?D+p0Vc`vLL5UMZ)OvbejCLqNMaIpFVuv{MasKWzsqr|PelC$SLWB@G4 z#gngnB>>#)F%$U49b3YsU3VK`p-l32EN#Q}EC1Mr4x$=Rh=XiZE?Ief79C_X$H&`Z z-xtG)5<2QvyCph`jcaM<+)Z7du~STV`S!pcD*Ip8hodK1VhI^P?6)l1AM@-0b4W{A zQm*UsqObRJ%4{}SUOCP+dYggBq6-+jYRzVI zMjQHr=~L?v*)=25%84xZHuMcqV49OZ;Ql06aaDz^Q2IrD(XUNbb-Mg%1Sm8B71{2^ z$Jt;OAn$-bO%r{@Eh@JHVIgUz_H65Wad2*!(^k35b>suOFpx|=gNUK~bf_XQVH3RH zwOZLO7iW_1Eup2#ztK`N9$kVlJp)Z`KswLvr+%mjcS|F$iqilIcJxd_%^E>l-U7v zJsFq;)sLc^SOZvy#SL)fo-wKQxdo$A6a2r)y#F^9hGo#9#OOh zXou&p2cT4QPMTr4Cc)>@EmC}UP+z#+#9$gt-V%nWjgB9DCdt$ciIQma>&xFGg;p7K z3Sw-cg0TMiKy*6JT{6u;S&(m#0V4`HDyZc9?AUUJLJZ?+E*~cZb+_$hFyAlZd~{N= zUO%4F9RLt9ANONG2gpJQ%suo-&GtTzyl*7TqZZ`{ci{GkN@H_wsMsZ)`~Mvo8l}pD!Oh{-IFe zEGA=J)swUgySG;;#NkdogPoELvSl%UTK{bOMr9~6I2d162ora@={f`J>RD{mknPUV~f4FY{YI&={o4-w&;r%)NB zsR!$-e7@?sj9zFYk_=MN@0O|;Q4(KzdbO-88{O*YzRMo3MiZ5~;23^PNc<@U1biU1 z2Av^OXq!WMDhko(l;yJ&k22gnEj%$F9u9&0pFfzh^w(8H+@w=>kT<&C*F5-%>5-!bkSw#bl3L#Jc$xXIa0@y9viIue^pF1M{!BH43 zKHtH=Qm3K(tQmLx#B8Ci;Mt}n*TY(LJy)&=ThC=F`}ej$ZYQ)%qL6#{LtVHX1Q&Ki zhorkUBTv5cR44?=AK2=TZ^d2MoQZDJ_*Ug=;gg;adCsd0q-g^ znfhYAys8q_v2WGJU7G);C?@kUBdxijzyrE=>>jIG{H0nU{5bg(2egX~=Zb>{V-uDmo?tM=R!yxXjUr~eo_6+V%RXX8e%%`vg3kwZp0O{CJ| zGj*RSF%G5M5j}Expl;CUG&pvFC7C5V<0#;11!k(}f|)eOPFb-@BBy@R@k4oIBh%)b zYy<`esHE>K!^rXDO*Mt`8nUa(j5k76ZpTS)!YUgGRF?iIIK znPj~B@c@*!5_>vAo0Qf|60`2b?5JK>wV1hQybWVsLUlI0HHG-2xEtQ9DzU^dkdVkB zd(l?AqC-LDtzfj5VyJOumpMawql3IeCGk7TudS01XUe-+<=~1kXZ#Mue5k72Tt*MzPcG!{K!Wo_3d zJoC^E58|ZJE#Q-VDa_Lnb@g2EQO1%;0#X)&Wq%B68&{R>N`h+o!8_eR(Qp%e9o;fGEUbgyeO}p?`tt4D`qM_dlCd|_?HU)`CYp5n#pw$oPJWh$@0cBs z#eBMmv`tvX1{mW?WKTZCQ1#WT+4k?+=9fj6s73Z!8~Md76h$Wj~R%gNB2r_UOzabsMALV0H%8{J$ z=LWHM5Urg(9OM+@R))~VS7NL$ z;`Uv!Nw9I!JNOvrm9tDF0;#o8*##2a-O7&=C^F{RX5G#~E}s`B@%e|lm;Aeo!Pi%5WJ%5|#&yTe|9Dpvrg22cwH@Ectb@6Fcw)u^C0MQ^MmK)x;-*<37Bx4)# z>3@|SLt81?t&pWz=`YSIvp=N~qr(oOiHh=TLtIeVP02tu0NtkD=zZ6MrLm-St7lOzw5F>qMzjPpv|#HgExh?I2nF*> z%#{tH>D|URh1>Bx23DaU5Yp)M3MgXBAvq0@h4QYov2H^+#5)Ai^gRG_o%PSkQ+D~F0XUlfB(Ik& zekB*hm01q0k6Eb;8;!X_M-jRNsEsKeBf8MMq~?AH7J>vu&{8om@h){+L>K7raazV6 zqhs2=!Ii_HwW&02NouMWtVv0Qz7%*2T06l!f4z91=TUq=^MX?RJYUQrPcELET5xhw z!Lp5m8&t<9vVjt`FfE_cYjZg|S@x0-M`lqD`nj3Xg!~l@cUz@H;KopG6^l#Fpt(xj zURPz7Y~qi=;n<4c7r6lR~u1zH6KU9XERjp5HL_c;Oyf`KXM_Iw9_y^|N1 zES$#yvHAiXzcgC!x6xMir(8$Z0jrmUpM&eS`N<6*&wV^<*FW?Uk}>|Tbh;S4)JP7U z#L=;XvWtgN-^V%G@-|q9oh7qIG9}B19_xY@!LVJb+iA;|d-p(Q>c|cwQB$j&K=(i( zW=k{FUeH-mdkY^Wfer)vB+VQzX-oF?@E4MH1*LeQ)J(E!2X(>3-a<;VC__(|2iZly z1@BKp({T+z7yK#*xSE3k-%2iM0H$-TqX|Eu z92ZX|C=$uNx>i6IxaIwhjob`#v1er!+#)7KEj0xrLP3ph6;N!IEL;QybKOKB=@oq4 zBndvp2}_&1`%Eu`AbI46AU3pJB+w_dfRHseO41&@(B1+`@6_-~)EyRQW(Z5Nd~iFb zI$qai&6}Sy^Y8`|W$dD;euguvEJ;ixBg*{eD0HlQaJl(qU{xw+ zE1~hfN(t=oW|DIX{ldFD@51d&zJR=b73@Nhs*(w#t7<{|vMEmz zCS@-9UT96l4BnJd76`nKI3eSnJQeLdduCS5O^*NeI}^@FXs4O20^c6fkK?LRw|zk1 zow&$iAZlyWDfh9He{F~{uFHPC`K#uInC&>5Ip2Le-g%&bRRCH2Om{QrTaaC4N>GPX z$TT@gszOfH0J-2>N?Rnl^5x5`Ruhp`#!B(x`o`BAv6EPC2!A$`9?m_wr zozkqAZ|C&l&xst*f&3EEV)_^0K}zN*%qv494lm7q`}~`y04W>ahz6Coibp5uPHc*f z-w7wPMEf75#_YpDPc?X?#UpM5wRL@va|pn_%@H7*MajyWG3pWU$?ApU+mF(}4Va}V zm!x>F<wLm1cz>Uww38=pRTBB<=8)6DFtfeSUSujRr^t9P9vvGevsM_rwV$yK}*>p!E6msmb8dh@m0E6 zWUstJ7Pd)J`~;mEc;=Sx+jJbfE%nYq;_-};XC{W6{U5LYDs_8k-#?b_bGHtt&Eb=T z$cZK27umhz+aP_v`%+Y8ER~jUv^(4OdFN&|kd{>KlXB3TpVN1ht?!>ybzg z4>ocf>Q8b6@gALW==&0d9HE_0^Hv9us99{{D2uA(-*s#^1T>ra^=knkkXf8 z3+gkA-&XhK)-qt9P~c$`5CUdHiw_U1t^2>M?eg|wX$A;FHBiVv{rr7F z2LABzbODmnW-Md=l+zDVKFR+u6fD^jyu5^KWC^1$!$xUcUTiuBBTU>mH|4KwYV+7P zO4ksp-8;Tl>UPV&*hj*e-RgACg9tUyp0c!tuUtNm8TT24`z_=8xyz+Kd;Rm+1ZK|` z&Cbdvm^P?oOGBM4-@f`{EYT8>;S3CO;iA*BL^3#a3TD576Sve%`6V0jAh^!1jA-ax z8j_wCl=Qc+TkO6LVA)|%17=`Y<(=c|Qn#c2WzLE^SH;Q!z>5S?4u1RUZs%rDsTI_Q z7q`&&dOu$!^+NbBD_t2)2efKgf@x`{#-&lzif`Yx*gXkU70%)+B673hh>yI~LB7I2 zciSWQ^PHF6S-qW5qXl!*cXN657O)$Ut>agd$|76lpBRlSmny*g%c4CF?ZxQX1Nji% z;rl^;G7AJ<%0RbXEEYP2wA)Kb@m>FE@@230?%vJyZ70qFEX1?F16o=x4NRm}A@w)L zbXcaiY68Irl!haLByZFi+Klmo8ir+$eW%#S$Tc^4U^zVgHlgmh9NK411Ere>ZQJH% z`WG8x5M^Rq5L5`!00pSQ{#KI>P(%l;9O_vaR}H8xL}$wv)QoDZDI!eGntV|`M+@9r z()W=mG+qsNISMJ~K&0?(r}efY1ZO}=Zu%x*Hp=+(f1T4=04MpBgL&TnoRkf^%X=(S zSw{cznmy|I$MR}aB8gRW=1^PgI;%?FdWhix%t8*A(rnwo{3>!Bt8=OaY)g=)Sxm>I zdjIVC*PH)XkFf-f`Q;SfSaHplbO$wcru-?O!>cl9D5Ez)N7L|g0?2oJY1X38J!>=H zOG(XY|J`eXZraa^H{5vVRY301Q%)O56Dtb4%VoGRB`cr2U38{dnf{s; zQerp?3ESy<0Tvh(v$rWmUa#Qr7S*fo*Irqz`cn1Ik-RQElqyRBH;bTs_uhk7+J z|M_y|w+U`$U#3y^bW=;6eNh|A%Nt-i)uGOOv$$Q{L2{w%)|vb2kkjv)6u2K-t4LicKj| z9H(o6U#|JrdE~YlM@J{>zhYz;5Svo8yglE)pIc{X9vZ3_tdWCfj^7k|!y6_6s~=eLv>8F9UYroe8IMC~=)ViDN%XGG$P7Ny z;oLu6quCxZ6*9uQ@09WBLq+}`^yN2wd71~US}ql<(|kP+k#eWxp}DXXR9UID4W=%IbsZE(W!wi`xvM>mxibVcC^xU?K<$H3MuG~T^2EW$^v$qG0y1d8L*U8 z40AMY^ssJSpdg8z8>j_VnH8}S8c#fDaW?GEL@9z>aW?X;HTX#ezkBSJj#LKEB@qkx%6 zj9MlPi}rLQR3909Llk8U69;EWQ%zj%wrJy>=;u51Fj-@KURtY(!YQ;E`=xubprN)s zZatIZWMyD-(xK~lFe8@Fjj400*6eofjKgu?eg z?GINnob@osN2Et>R*ZsE6Se3uYsORTTDtS_tBrP+sCNr{9guth-FS|~eaq@%eloBO zYC)P>2BEK!kOfVuGYkB^-hJhEJVOCWw1$wvdd{AbrJSA%&=gadcjMJQ0r9g{tqTsd^VV7j5zn!zl3&*R_FGG;ywn%X6-&VND+el&M%%Z zc!W+~IIm6&0QUaIE{KpgZ$I`JzY*lWA6vI<1zze0=v8wu+pRrWXTo}3z47?)P!$s! zAXCN&e#u}~nZr;)zT{gvl>P+Yh1zx$tBZ68di$ZwOz(@LHRIj<|Y4tvNBB(3YmQX5j2}pV?nFVf6eDA zyC%!$aYv(@W`isy_L1Z0MFGrg$7=(s0hkR=ETrfaDWznnSavv(HUwX2H_d&hUxzZcL35ShAB00m!5{mFT`TDMA6oUNbGXm~-i#+aR5)Dc z>z7nx&VH1*zF0gyo>d3`X)R|>j48N{;$X=Gits9q#w$cL{GSfwMfX!{Hq9n12qLq! z8h&_o3r`~#&_@0=Q;!>9{n3lU>E) zWi*qsDv+apsW|sFpO!?!5vK3AaHg6ae$e&CnMW{Y**StC>OHtaOkf0OzVhUA!geO5 z1t)4BFg+EWFf$d^-ta>sKBq&`=7qYCaL7p)m*xe-UU-0>oOtlE%-JC90@Zor=F-U^ zI22+M+v{mw4$PD${H%OHYgS&VQ-d647WXF!-bqwti$r$1&oC*SJeKJ=E!ZHLvrO2Z zUx!Wv^vv!NU)}V8uIfY<-j%iM<1JA8yY04-z`sZN!5Jt2e2l&iguVXNTYtO^h#}~D zFN-rHx|-n1pEq4y&dCI?wQu{G6*dBqc#r<)qVX)7kKi&T>@uVLuAs5--vi7}dlk?; z%wY-Ml?_f&tK!5n$S-Dj-6nj*Akwrz7tu+Jq=<+$A&$U%VXr==_&EfYw10Z@yxVx@ z%=yoL?&Nt;tf#WDPe~ZIw5j-}{!sb70Jxrr6QSSV&#kr~CtryTL_fyog{nyRcJG#n zP)22DyOvn!7}gAu$;g^r3P00p^5UX?$yd!KdNQebLWKt zYS@hzAL+{E+0FM*e2hznR+c1Lt!Fm*!*+2cN1>ZODt^Ie$PCL|LQn9p=%v#(m9sU#T2KOotUpW}+uv63*`(cawpQNHo zwKM+p8;(+-9PGT{;;CBz)V2hjmBX{^GJ_a+E&ksUl1u~PN$xqyLsD(%u5=K z(G&-i^9l);VuaF9$<>!H@aK~+J|Z-&U@?m?V#vFM{hHmZ;4LZq*z)MJ4#+&whs9)WE^?;7m%2f!#r9gkJWL+6)j{sgt6f3zf@B}&F97TK* zRJ1^Bd5+BQO@%um!#28Kg{gH@AsyJT9^ub{HjLNgB{@)KV;KXz%uxKq_v5sBzb!!wliOEE?xz0$U>b-P*B>5` z9ITIFtCe}2cp5_Kz-|s|N`JU>9E}Wg9^Z~RYE!F&jmDUlso{y%T1NRnf&I)+>i&I5 z%tBc8VBMKKI#*8+EIQo|%Cq~mbk>$-cF=93=zX2kuSqnGRz;pE|9SKVV~^Cq!mJ0j zv!~+hElNJ5z@)2J+EGC8-pzbFW7?Dxu1Ls#osIZl)QlC+h5i{QkL?+9d!2PE`;E(r zE*>vvHxY{8J7lU}-B;+NEDXb6F}puqA1d&2@N}T5mXFmH%g4=O4L;)3dET~9y`Rk& z9cIhf3G zAw6XUz)!adkM|R^N`wh#>|Kp)xuNFXngpRvc_z(i38T+MKLehMcMtIac>i14buwDV z>If<@!owT>q_LYL-5gnPAzZAO&L5|*%eVT1=~P+rW05+NUX@oVd~cNU!DzBdqr7}ti^6UlP12R=l4G%mi3f6< ze#oMy@B{Q;I{K3XbQu8^PCD(?B=6bl1D+x4NB4d(YJF41-ah+nvGcAaV95Ih!{meG zy(_i5Z_pPwW-^NFN(CbX_BgwqS#)N37aWcyK9|e9wd3n2 zx+S=ZBXvWh)2`u5q6%9Cz0+xE+R18c{OVDI62f&t8H-Sxt*Brl;nUH|MSajopNrIzr%Z1$WYUX6xN;T)xbDn#M_4rAU?TOQorVTjb=I($ycm z>{gk`RBp~tJFo@6unoBZ_amav%-+OAh6?i;3rar03@&O?t;u>|CVTDQH$~S??4MY zy+rN0#f_$0vc(N_1?k$VN($Aj!GgTY4BI(!NfZ-3&^dB_74GOs1I!UifrerZp>;(q z%k-WH31-F+E(Kf?6mUz6vsL&B)lJdS#Fwq0esp@(PR;XAh4y2I9UcQefQwc2yM1V@ zFpiF0&7GtN^TkiWMOzLSWSw=-<8qayTxx}d1Y5e@uzQ1*Q+>=9wFc#W{rr23TGUg+ zwHuisf9PeS*e^f7u)5^DUuI){?9>BX;>$46M=#Vzov+qW^ox;Z_8@OlV;Xz;n}|qN z-8VD?cXUT^72!{j$@)FX!&1&Mk_F=2;Q5!;);{p;8h|&J51e2^bO!ahiO8_B}gt^-r=eZhtU^SCnxH(1M>+;(#VHX~gp9=SV3Y>Ss*iIWN?;EU} zV;`FpZ9>gnH-J+a?xtTxu2ZR7m=%@mhBw0hh8&?z9XaLi&e69!Ig!QfL$AqNO~2I_>aBl0>%5tFVwU{` z^)6efyJR!AdT38kQfu*4tH@A@kQacv34|n&@1SsjGX~w{n8nk#J*oX1KDs=p4T1;(IqgpuqdYE5Id&=9FIYpVs0Nd&e?D;- zePBc&cf>)IM&SpM=i@8KmRWPFJ~4~?(BwELU|4HW82I1(nJ|TWu_eGfa+A%|Mbc!! z?sOMFl^A3RpwZm9|Jx!R9IdDteZLG^q=x%yt7KGid0)y__=Kb9g{{L$h?-AdRx}QM zoK4bHlWFoXwKKqqVyaC>RHpY3eRE4y^TEuWU&Hq8M_7M`xC|ae6UT3?ZZdLgsTd$j z@6x;wi%fnX{%W;80RM!#FS$;O#`kO#2N08Q1^N@?Y4h~k*Df{t4o2BIE{tXTnU9>= zXS2IDXQbz8XxIhU(o5FUZ(+PXyuEBOgybvjD)dc}8U!Tb3g>qk{HJwT^(sS;RNBO| z#~Icm%>9H`H%@><)W3QBYLApg1Lnde*QXLfr({d8{FC|Mu_J$RP8s>xg>k&9+CATx zo#Sp2N-k2koz;&Uy%)!uM02d8MZW@uZZAS=^tHtnu&*PX3thM}HHjz#uOor|*shLon)T?QVRrlh zar?;U^OvmOvI6n~8HiuLEthN18UvrY*Mh-@9HLEiKA%3X;h8dsC73XIdxdoaizc+m zrqW7o-`fBoM`ThhyxWM|4DMX{%z_|@a%QBO1rdIHfV+R_BZ0&gyKd#Q71=V?1MA6$ zTRX3f$gAX5Qk;WRI;U88B~oc(EB{X5l+BRosoY7*lUYO31)6m~^*ColUlJ#KK!(ZS zn89asK$Y~1Ex5E<;V!ReGb)QG&JE=9)t{jCFs%}$IQKwofwuSx(Yv|TM= zqxUAS^S{d6^#FPLFN!}I`PR#EX-P9va|drCJRMTy3gCiF&EX`^sXj&4sqP~FqqH!O zwB&P&mJ?w8%DVN&=@;*r*&~bsgLqrsS2qa<^J`~{X|yC!qI$|Fg8`#fyJX~Zt|CIi z-$aww9})P$zO^=TdnMG1+jP$d2k!Hepm>lA@|o3#(HA0dPbkX3zr6z&$bz>b+=ATO4$Axa z!%7F?6Lne3vCqO}vR4&r4m?wN_)#VNUah*9-1q{8`q0g#WTeGx7kblARa3o~Re*I$ zK#I!yX!V%s%<)b$?aas!a~rq_>Db0Zo8khmDTx{dBtaxhO)IhFwUdJDK#I`!*)7qL zmn%)_B|VMi5AYIy^`y z?%|)-!?)fPj5Dues)JI$I-#JnsUun;zO1J|*euvA4 zn=r{n<$b{p^>R71OI~Q+{EL|2I4=5JRV%;f25G+uQ<}F()s#b2&5Z^uVWzf!^5#Th z5yYLoD|`e3j?9Z6UL1`DaAx=7DUfx82>qCZIB=USS0*nGqM+Jqjj}YtEVTh^8TPwV zL#V15cB6o^9lX`{9FWGmZ~xQG(CJIaF|UJrI_pn=#^Ou!r{_Hg{VmxiH~x~3pxvP^ zV9!(6UZS;kDF>eC$^KYJ?+mc!z4WxQz`QQKOHUZ~&FxUlj{w-kD!=9;Jm~6s3>-=K zSdI}v+0%QXb&!UoUH>mp!L+R9Oipn=_gGp86*?2TpSZOS*fyey!_9Y|B$4>!oG*is zjrh3fj0xZ+2JafIs(H(?+uU#}Dc)XPzq8d$fU}PB;F4nRYfj8m&$#a8_Sgl8O=LX% z@YVWbNx~jeKi(z?(|1xoe(_p9$B2D#LQWc0?2ys`G6Yh)X7!A>9eHZO(0|S-6T59^ z;xp|}RRE&O&3}te8PEJTN&o<^I!C+z&hN8}SBJtl*kx#Z;+>%-&bAILdo8U z!?Qx72pU!MAKh<*$%m8AP^prZ2 zGROAyYd;JB*>`@8a;7quosJSX=}4IV@7DUxje%CVQU(NKkkCjFl)z967JSx~#;$1V{c_#>hNi6`M20hH9nO^lnV26L}Ej{88 zJ2DSgZO?{SAEOk}7&3YDx!{?Zx$E~gxkLi>pcwK!cI2m^R&hW)pE31t4)%76E_^#f z5z*^&m5k^_IwBr+brem-CjN-ZY>94r8Y z?IUK*3lqrIEl}c>n6h5{^{`c(!$*i+S5n*!dSRtDO9AAXsp^+qu*j|4!q#M9&kCn_`!M%dvQO#F2PM7%84)gr^`)UUo zRMVis$$8$rs&+G52rm_kjCThbGkse{wme-N^C{{}EzfHq^XunHDn=f#IIv7<7D~z3 zlaSH{Dh`?X=GCU)YsCg?3r|_>CzW<5aCjlwZhckrk<~jJ4$=Lq&JC38dJF1M!zpso zeVW{K6GuR7BnIbraGNlb-K2|AAYZ6YeaqknyEIi6QDnV32LQ34XgZCh9Fx^;@TlU6 zTtDtNcCaMP0@n~5JYXM8LJvZ)b!b_=P#wR*S$ya2g3+5ERs(I+nPVIqoYycos;{8L zOmSOS$`6_fJ=`Y)5U@-P2XQ|j2`!$)fLDY7im{D4@)Y8DrHDt5$80yaz2f$vw6g3% z&L|T5U&lbZcvccMf52^?O*0;vzI8y-+rK!IiThedxFWfIzpMwgKm^ba2_bEni5TJr9Hfj&godL8sNg{_Qy9 z4obMgM*8p8qL#}j5Lo>qQ}Vy~)~+I~Zhvb3Wkw;P(*G5Ic>$)~D!*8su@Dj^Hk}&2 z;MndU@Q#kN`MYhbh$rVX*fW?i-_2w9qi>H8)+62X9Gff)U`S&H#g@Q}(?Ox2Vy)Fi z@`6Ehg6a8NthgFgY@}A*6nDt4hYg-+##h(mq3P9Q`oh`far)U$BTxQk$ujh^3*}i7 z_`C4p90+U2bGkrvwGnv}yg2O690(Fn!HZ@JgHu1fpEGdDZ?-F|rDjB%0>BUk^67GZ z4Xb{#U~-Z&*G^}E651-*LM>u$V*mfH+aC-!M!jIF;Jf?zC0hq%ZnMftm&4Ig>ivak zOjE*`w`|v(2NX-tMSuYDXJ}pP_{gefk%YPp!ZA0;9l+|BD_;2o( zo36wKNlPT6|K0k7C3{?S*i(P|&F-b&1XKI#?A*HA-53MHzdmgK(!(x(@_Qib%*pKR zsp9>`oMK-st^eXD^>xq0Y;XMGfYcvVQy}V1{KdHcc>2vUBp?0Sa|~Fc^k=Ella=6| zUZ4MBLs>UUG5|4-50NN*|AJpO`jl)&r7pru=@PJtXL{ZK{o&Qe+(28^Uze%q+k!7n z^!wIa{QcVhezMfW9mab+B?GMLf1j%4Fu2NH{FjybNN&kNk0t%i4DJt?lDL%fEl}d5c;B(&hVUj?GO1b^RFT*ToTU-gpTj<+5u)KtW2uY|E*1 zx6((DCLMvlyUCc-u2jAPAGOo2iIB4i158R-tV59TjRA2bf8CN*HonzfH1fsa{=4tj zn%eV2Lyi1GLDCR9n4VCne35BU`?^8vx+rFDtso=Q-b?)BQh=EA`}f^@o`V<1Yq@vw z=Dr5Jkqx2SWx-7Mreq74H@|lu3$TJQs^I_`XeUH@P@edv>0z@;RHE3)NnX zyK{t;3K!e+z(qSYhe+4dRmcw~x(r=-Py@=?tJQ$KI#BNaq3pe*no7I&VH_T1Mg@Gv zQJR2tR8T=_A|)y+b`%9vnur(#Lg+1oSiuT5M5S60kS0Nq^X z=P_E8#lQ!58z^%aSmF)JDH!SMM^>#(UX$GMh4a5G(Ec>wr(HWn$`g`}tWq`*yZs0j zLE<#+Yq?;RoVCT@;-Vhc zPhQ(~KZn!cJjv`HeEXM0Di*<6xax7!13>y>!yUpNFZHy@vNe+i0So%-sAH7R7nbM* zrGAmwFuUDc%m9{=52Y8++#>RhfhE!Sn3c&rg*giIM+yvoy!o65&Gw8{le@*snB69% z_nNaw3Q(0sp)cr3++efZ+HNqzXgOM?mN;7^_k0S50*#x_tj19SS+G>FG3p$2CBLF_ z9`xi6-VC8Hd~5VbJM(+VZ^AQph{F?xK25hcP48ZYeb4=)mpPvy$I4xX zh<|R$swEADcPT(7zxbSW#(ImPPe6W}T`Tk@8qu2^yW5sh7f-zTo^c%RE$gXyll=c; zLZ_MQX+7K`e^|`j(cVMNW(7c+-A#9?m{`2TBaCsoKQ>8_FQ4PKiJotSFZ7x_v9{`U zYDkJGJPJA^rd>=$R<^(Lkhbz;EP;RfS-G6q4vIe3xNZA51lFEv<|Ch)x$<x!=CJY{AGgXG2Jq zx_Y9ayP8I)=1tnpJonk&S0O;^Z(t`$?HYPXZ>&m1xZmfN6zhM8+Kd3!1;5RiXxJdP zaybEkDl@TkUze8&dC@=j!fa`riMC1g`PqM% zSEq(F>W^k(z@;Kg8Zp>O*uD&3i<@P?Q3#T$-*RC1Yz#?w>+Q`c!&!?L7;1@+F2aG% z!loc943~>H)9tq?AG-m(aU#!h*f9Ic7I-tdedMu_2DW#h6HlR9L>V&Q!qS&|$|0n# zU3Wo)b9&R936d$EF>Cx59JES#(+=_gM{F1Co$HdJtl#|NcLvt=bj#&y80A*AV{TpU zc{~I+di_R~pWKzx@I|6oyo3yZ{5#CWGdDQdw|_gR(%j23ZpfUbJi^z%Qozz72r#zd zAws19EM}l49Q?({S%d0uh>16|%SRl$OlO5&Rddq^E+U6gdacW`{H2k0DMlOBm zDWBYmPO7hAo~I`fQ_p}%#omM#@n+J9Grl<@6xI*~Q zdQZ(aj3u}KrhF_c*2kX%X$Vi3)T1=5_+OZKdmj8BUIRD_uSv>#IyIjnYM3@Yw`qD& zcg(&w0=Xuuy!A<2_tC7TAmqqwK6m<>o*f8fCfN19DHgMRH-a50fWblTNyIe=k?PXp zEvwXnBNugd%WZ2G6_+;+<6}YfvGf&e5fbcO29kny0@U;x%q*SN1j3hoHoQ?E$cA$A zWX#z#g^Q;@I5l$}giNdPOB%;xeBUx>Md*|a+ZC30(BL@NG?7{oZ*$z1>^KU92|VCX z*?lFiYkF3hXYv-6Md&v>PaDVbDdV^hAZ2C|txni?a_Qk~qRfG}W=-j2JRDj3$+Vvo zkV((mHT;1EW$Q5?45`G|tzh{y`DG_MDh8ys4@2*{jz5K0)6sf3{9#kb3p2~U2fr}2K3am z!O@*Q1S>wy&RXN-*S&-aYcS1CrR{-|c;*Ho6{bl)@w$cwIQGj;M0%aBoUW2n7=)=I ziPGh1ep}p4R3xe`RBTdjA>XNzRD7(z=aVLgg{MR3yd%pjD7k?~x;>YijdFNnTKPgh zzJT~K0t0%@H8RRcjI9)Cgq`6|0q?;n;61W*z~^4pqwO!{jkaLA);z_~c2MDD?ay)l z?mBm<)X}HC?vE~&r8zph$Br2$jbXuQD%9gu7z_ZTYZR>MENi{m8KAZR1W_i9sjFq$ zjUw;o1!utF%xSu$Dnby)L2oIzc0fZ?p>v>w%xPVv{G+5On-l0#wpeAvN2gYQ{0!L_ zDzi(|-KI)n4(q0%`p+dHwbvH>{X)qD!c_WegU#fJ04&osvf63zlAU~VJKX|zAS5fey&iA490l(3wKXhr)~+UU2>T&E>}nL~zB+;n?%f(Yh?{t*ai` z)?B3e$Q8bP%2$FwmD``D)1>34MfDKWQF?@T9+}SinJZ24Z$^7 zNYDH<)B_NJgvk1dr2YmnxD9Zzxm8mzXvHO=2L07l2K?bH_qRz}Q#!RnN8Y-wrNqBq z!2)r63I^PEI<@1!og|X-$vx1OsZSU}OzIIBsb7C?vh~uMYONP$J~U|RS%VcXOeuKQA~qHpC6yu|h6JSyCOFzvdXYmtPoT&@MOUKVFdTZ^wnHNNVR zE0KT61;AmrxC_xe?yDt0k5@a)yEQiNOwQB{7}GPj2RDEmNi$&F|Dlq4`Fv!Z%A5>gr$4Q-s21E zLB!%|5nyq*iS?g}eMY|JDop78ut3t?gNI&g3`pPik;A|>P1Du!7{y3cdSiqNv+aV< z8fzMo$pa+TyGE`pjR;qGmbr0qb=HrxLxle_72yk!Af=)6Au2V7X-buyxkN??TfC)x z{#5yLT%7XTF!N<86ou0$x3<3s>nF|mUUT=_liZ53>9--C{6z6gNM>aQ)VqG#VSS*U zN)V8FC63Aw6{wZzosNDVFu<{byd^_%GTB1JHWL*V;#&acr$7yU0M*&N78=zJKW3QU zhwTgBqLV)>90FV)-p>@}*>xd_OOlzz#U_zS%v#+s4Kc~@K;cUTV#uH;!{+{)4huSB7 zLVH<;_Dm2w0x1iUyR&y&S%l&t_;Nb7eKKi9XS`V;)FlOFt;FR9WGtSX?viOFumZoe zt5}#yraFW}g=?A{h&mOb6%kI`fq$w695MwdM-Qqc1LO_&`vGCsMx_CJ$m&04ooYGB zh2pqV#@`tVjwP)Q5jx|S)!RO|Zn#RhYf0S#JltEPyFS95xe;#_$paw!Yw5ctS!j4| z>_dMFtwTd%>Ez4Npo&f|f?xR*c3GWYregym4v|$W*MvIb^hPUvfgGm3LlyTIsp1wK zuYiJ#-&}UOBuQEmIwJHfZ30CB7fH4uuFC@eZ_)dmR&7@lU0XZHcX9^eZ-34Jq8%)? zg4D5;vYGBR-vhXGK~>?#E|rmDxDXxDh_|w~s`pJ-jgqJLONI8OT9*oNHtqYbPrI6o zAf>B)Lt$3}kKV>}+*G4bN!du*CIxiUjUxxC)6WD!fL0N6#SMz7)I^w!*;wsK=LnyUT0x*&;!wCU-Y z*prGGs|zpg)(Hj#M&XZem9bnRMX7$B> z)F|`GTC2D1Kv5o)fxn>%d%24z9&W}5MZ@=z%m)S$VfK( zdmLj0y)(q=fSPIb5&*ZjZ6Jvi5n1>ejIVlp5%*Gtxe&q;frRl@c6({?*Cmp=X!?KQ zU~R^^&ZQ=gtXIn z;w{3J+|D(@76@$!ykg3R5I}h%e+Dv%>zIX8%W$b??6eeIJ46;etBI2njyv+_xU&!e z=eeLdB;(Kocn6z+gEcz_VloB6I{Tq>YtzH8Wp0PbU%%eBxea&wjimirzkj~w_!VK? zpEDizg#$OKy7@TrCBl|3!p(kvE~eR@#c$=>VoAujtwsoGtXR25dE;u~*U?}9j?~%~ z%A2C0?mank(Him=odd_pNuMQF!>t~VMio}|6x18}altxQk0^=h>^0#xj?}}it5&>H zaZG$XhXulGCpc_AVg8{S+G%Nj3A($%bEwy03>>F#$C9tuj0EwGYJ$@46M3+__xwUH z%fC<}^m6>+Mbh?A`ILoISn-@WEa2zzNOmw`PhTa@dOiAq&8S8w%KWW0~C-%lwoEh+>{(LqP zAy&b=A2*x}?tmfP71IKIrqSwC4d7PB@Lm34@&Ib6!#9C-9N-`@#S12lRH;1f`-JwZ2j} zfceCIpImA*kn8O)8~EdLHjq{*L3&}e_GTZvdtzFd4;k{WtJx^qSQt-dTm|f1{)HL_`Hq6+1OH@W|~Nb-C-+dyE9uyfJ`6( zuRRaqpwPI)^G~IDzgXJzj#|D391abw^<~I$3BlWD)SDqMBvs$PdeZIQ!%`o)jc6BC z0d|m6o1-lp$ewJzj<4y8Zq1tl6Y<{OFZ}+k{Ff#=k6<=M0Ebc%=cS|cJ_Lkh9z_Ot zX38o6NG~|lz@eWLNCN<=tqfd_(_ffGUeYWDEJjmrW@jKdxH*Li&+I1otNNu~&%HF;pe z5o_AzSl&SAU(Yd!k6(xtS|O~naC73MBAa^!uihY^nZIo6FIjPZE^Ac5CMpv-fNb2R z5evUn{iGGjM#x$22?nux2zj>4XzE%ID__0b_aUfC zsyvM5{C0hJEn%3~f;l0qX#$*%2cBx+z590f#8$Vq2da>~Ak}{6i{C^h@&OyD`oPKe zSTA@P=VVTemuGVuvdE&wv#-!&2m4HYlhcn7Dh0x&n>$N-4fAVw$yA%UA{PSwVt;JU z^J!eGXiBhu8d^(ePD*Uri*-b7c245#J70R+Ia3W@s287r{T&kOKj@eoJz?h)(&xI1 z@YXAqBb_1nz-WS?=lqiWaRD? z9X#nPJf-((_FbA6^M$Ej(~E83dB<}vLMFZ3S8#{JjPJQm)I;uZP|ElL1?{*~YPsN~ z(nvZnflc$b{*JZG!8P!<+P#J?FJ2*$>!05A4j|NB zqd-oGFhX+_{-wAFmsOgUO#D&1i5n#T>4NZ&FPHguB~4t;qvSYoIO3n40U*%Pa=`nl zaQMb2h1yjU$G~4LA0*!bbf0s~n>RhXLnv~qB$h89TzM_#!fz{;o~^ra;o0x62f~u^S%mPxrp8A0_)di>pf8asdGC}b%&)lNmMnx7V_}x$kx*TyJHST+EoBn+ORNSuvD1JX8Lxkx<{8RmINLCp zPJlNhTKS(ho49r;G<~-Q#F-buytva81a$uxwZqU1Bib1M(-JdJ-6lTz$4ZAwSvO4k z^3mHXyw=A-M@*!1S1n2q?owYs&CfL_J#hPoCN0@S`2OCdJs4GoI`XQzZh@ZU+xa>k zdU94g_ij34EIMFA#QQGyG8C?F!4OJt`~;t8U5A?FCSWOfv(MJD__0=#97}QY-%G{g zmbi0ENPM_+F(|^tp)SSIsHiqb!PlaQC)L(y1YZANXjnc9tW%+7Zed^7#0$ zPs*QatM9+tKW71o9Z5{e4PcBX?8I1Fene&Bm?+f<0{eN?+G+1mV$8a$+r!*zeyE@= z?%<1Wge>*Q`Ibad%PV`-HN@KHq2*GQcHGWrwx)-7cel=s04Fg;osD_Cr^nD& zZzuC!mW95g6Zq>XYmr4IMk0uyg!-hQ&3b0H2GPV_S|h_&c&iVyrFl1t8E!S# z5PS=(HQIlDZj;3HP?|>nWhffGw1#My1+QRLDOH{q z@Y0>>IZq0n#q^@l&V=fA3@QR>bySxq*i6=H>= z31NDvJY$0>H7md4n5uZ zu8Qyf7B0E4n1CO=ltAT4Keu-I=7y?d z4+8<6Ld@owu>StXWl~VRllR{1#lRgZMu_}?t^L<*+XcPXP5ty-2cC>ZOGbIPIfR2~ zMC|tCMMaST0ST|HQlY!>2CfE?pQot5nfq*@qDpWxF>C${ZD!iH6U8x74EAODx}O$XVgd^>9{ zHR9>O6Osg_L++09*=u<0vyWpny=cU?2QPIfz8R1BTQ=Sr!kABU%t4U;Mk6>AZ+nf{ zk#(E@rbAlZ>-&IByJO!H-A{S_AEVDLYp3J8<<^YtmL`fRbo%~utnryq#eF))X5U^_ z9ucjk8qn4z*P!7c)unOz$kvvM)I?bn_Y$$0mLC))F1F0gr@Z}!=}i=ul?>xpI6V&Z zH9a>7aB9KdPHOo-YgxexX%uM5Wb*oB6;-})4TsfeL-Qt2xUb&lJJYp){B&)(TK=f@ z&H{aIk%0HjyYm_n-rwP_@v5r5AAEPk_>53&Y8s3J@qQy;a_{73Xo4FnP~;KR9d0jG zVjRI6FyNa&$E3G9SolY}_&_dL8y}{iGn-%=>O#@Tkk(eO`UCkADtbVtlEKL}D=Tm%wIQVM4PK}sE3V|NKKg5SmH&fT z1lA>-y+$m2a5Z7erge&X%!4pl7Y){vH`ae0wS_;Ky@KVBlB73|UnNSWYRP%j-IXD| zex?_KZ7TOx%VU?CDE{C6h|@KEyCdPt37%)P6<*i-NIp1VDu6d_5jQ(bAkC3f9QjBo zXy#rGMUB-GB~n9lc;llzTygDnPIc+Aon-H>%cw6tA*20zw3*KMFUAhDast2Zx}>bO zNr}{p7W^2yYz%%?20IvPz=*RMOm;5Y>SY+c1r4i*rtw2>*^Wo(>qr<^kx|Yv zEaz5f=~_<*yeihettk_3#o6q8YOCvj_}uHJcO$)f!uYt;$$2YoJ=WKX@TBr=2A-?D z$jj&gK9!E*N4LJy@V**_=bU?!pVwNA!u7`dr#!c-IoBYiGSyzN-BU8v@bA)`EErp7 zSkXdY6t>*EWXkVoXO2Zy+W<4p`gE!vmD>7D#a}DJZKUjJ?S&mO)Wg{>arF7qTf+*N zksE2&PNh0<3`r-b?&g2Rzosutr5~d`-%O{lfNh@u_M?kE@>`Ero*ZYP!bA4xO};-s zEo<@du|?bwia--xk(&sM^@PM_s}7EK`G)X1ahWVN-=bowuF>=&9k2VhMOq?zhQw&a zw6@sBUJb;vFz!?!>_PQ%D95>8>zS-Es`}9~ZWV zH(|ig+J~Z$$wSr>%h%=5@(c_=S?h3eceA9XioMX&^q#SS3P}i;SXw`w+?Jpl^P#pN zvTxUp<3IpA!(*Rbq7Wv7w~==C+i_XfkzArlX_z&*6TVB6fDrTc3Kyy#~WZFFdy^;caF* z@7`LkE1+TU;f}HO&!eE@GD&*AHqY1qC}OOCkEF~Z*$?cOjPMH#3+dY+)jUzb4A#dU z^$-6TWV8^h-jVS01;*4Fi~wZn4;qE_4a?$ElT0#Q8-d&6L@Z=;_Br<4htw!9ULu-hvQIw#$9DUCc3X5mPhG4!6-)^J9Q;so>tpa5BSuQ}&sxiR_KaKts+#x0kv4x~lgKhXeX0MC$5&di8WT6~3B%sR|yb^vJ`Fr2n z4y>&c{^5OgAXu98jO%Ix5eM4c9|NexnjTQ0v#DSyonSHJde8g%W`Dfnr(<1z`~A9n zTy=$cxg7%aH~eXxa4Dw2?vR2ZSaAql$VB79XYf)e-A+xq_~|jD5Q^|P;l`>EQg_pFA!_m(?qApO?Gn}s376P0}=q^w|iF`CeKKMGKIYQdVuW>_XK z3rV1~zxCev69gwc=0(oRw0Z&)rEk{l@@UZ zQ=$k*&AYfg>xUs}A>d3q*{z6!``0q^PorOH zYSX9VvCE&orQ>aNB**8~M(STE`1H4EK4g^xy0DCs;Mg5JD?pfFf5cPU-NOQlqHH>9 zv~)%Wb{X^#=Pe9Y{02yci~5PnYhL3Icn;XDMM+H5Mw6nZ5jOsmdP;L$m5#pmb<-Wm zfn?7ghuG&9)>sccxAx2X`34hT-V=;7E4u9Ohiz>o5{=}e1pKma0VhkC$iuabKVR4Y z=ZM;e9@>u#L98?@v(<4Ke=(YRI~xC#4%job!J%yXhU){zUS^HH6=e?`Z@~K(99tzE z-2;dN4*AtsRM6$1}4@+c~oDo_6@!8O^%Z#b*iVxhM zDvL8boRXN2T(k>qIG;&qj^SF|nJ;o(^UR>Sa;oTdsTP0vDWk1EVrXXD_xXyT!n+_U?A6OCdew}W0IW*O_+L}6{NwfW zgw#y-f2c}`5DNY)gbwq5=S>Q8RY8MevJsy?G-s9M0*FiIOG1=SEeUAp92l^@sSpeM z6cPQ~onaZ>4gANN_`;1Q16ewNb2zDspXyrp5nk!OnG-nct9>i>eONMYWR>mJ$nICOOMc|V_M@GuCnfy`oDcfUx zDSlLQaET;bZ*APik%#2J^z)% z8s|Me#Joh&JqjRrx`f@<*HlrbHsYiE%bUI=!w3Fu&R8O@5PPITev|$aT3Cbpnj z<_L$(j_fo2&ULO!U%OD+_ry36l#IP&A|mwIDU?BTeL=LW->#dEF6mbcdKS^3%Y&yOfX6W~GhQYrqxElN6 z#sNy!q)C@>cs0(n$jw^`4I|!u3Nu$b`$QpJtuVu7wh3YFz0Y4C?jVu%V*A=c6#Z{Y z7rT=r_;i4U93dH~|XBy=hdCeilD7tCIv2zc3xLf*m!90nX zPZuhKqy6$U&%I2HK-p4*1g}ZUKC{vHjG@C4*28G;1&V$dFW8ES*-`u zmAli_7Tfc4S}%K;PbB#Y=Uz0eSfey$1mU@-eaDBA5Ils;am{<0cn<3dlH0KH!@f5e z*qQt0{I&TXZ~Vo&F(Vn7JHd5F(ape|)_>uZLvG_A4W)gAc{k8z4zB415n7ZDKhbW# zFn~;LT{Gm7GJ;aa2^JM8(PZtx?F=~8>ka{riT-6wrsjZgUO#Q=t1wHN#JKC3HnmX| zgwfZd^k(2$-ktozr?U0)k~;&Qb2Fpo%<$Z7GYnD{ov~UojUfBVP+x$0JDLXR%e$Tc zQ!Gvy=?3(z&9>%B&A`eyTup-mV{8V#ab{v=i8NFk#?!Fi`3;_mNbihh=s|!)Vg|0U z6Vt2f(u{t_j;LSWaALF~4bB0qfa{8E__^7GGl9dhyn&f>te|HjN-TCGwdx0}verD~ zc3?eQb6Db+6;{U0WjRd&nG${mkX5WH1DhRpPkEY(J~8+yIG4H+(h+2i%`BK)reG%g zJUGU2VAQ{vit)ehlPnan2PpZKv87*f%IZ$i3#kkB{m(!$7J?U>u}?2@(=%k@+N+6> z|LZ25tnBWoRAOvINviM%CEfF^;OSMxrjS>Be*_E( zOYwRQ<^11f7|Pe?8>W^ao1y}^$pXizO&;vnDHgY28EI4FZwTSAtQKzbVlHs+n%w@w z!tjj#X4ZHHHRr<6v8gg>Tnnp=V=autt3%gHZQEMQbiOuJDk7CtvKavTV1WcNHxcES7(CYUUJG$qSlNV%) zAZ*4PG@^r5l%jo77Uu~flWUc|YgM>qJ>z0Sb~Ygnq$ny<#MmvwTFQA2Fb4RUAOt2@y>Lr8@uW=8fm2XxD}ZE9a_y$P6-Yxe1=vXb*S=iY zq_Iks0;o;p%0Qt5Miq*nMHQ{XkPwRkv}k?tvZnz2;wq#&EX@l3p0xBbKd$uddvJ0C zN?eG&2qy}Fqx34EOtZG8nup6iAi~_-t|(?H3TQ6QQZ8h z8yf;^gew?>yQaVRn!emM{Z;mMF+52P({o{G;aCHtkFXnXz-jz1#8^+A-+{p}v1uy$ zazHd6z3*lr6@=z0WHcf%a^^&4qAHM~0uTmdWNhI+J14I1c6XNd?9s$&a?hjzHMxpp zw<$KY3fObPmuwG2!p_Laol!QdPPL#){eW4XH)dmw!Vczii8&zUOBKh@lPuvM={G8S$d%qR%L+Fo1fG*b%g3~SD%83HNgHlRxMw2sm*O)P;foM; zGOzXY@X1|R#gbW8Gp#kbAFFN)WF^E^*dj|@12*VPYbj5enhR_YhcHsV29I5pMIlvPH=Uhre0 z`Z+3nB^UdQvc*4Q)fZ4-L+MuNzCd??&%gX$b%a*YKlJc&GCDeM9-^KCS3A4}Z(0d; zN={G^R=tO5D?i&Hp9h&sHKA}4nq5eB^N2OQiGABnbR8!cmY{t zJZX2ASaYL!hL75WUBwq^d+R>ptjRqejo!c>nDv>_OE&=7yv-%DLEDO3HThsUu((*l zwb9sf&+(%KhHJwU$2V@C!HpF zh*lOK3)4-h&g&02aFP6ZNeEUF)MC_2SZf9g#Q8_(!8T=ZJX5tP}5Scqp1! zd*LI(``K3JmI)WZbpPq3loanYn!yRGzg$$GMt%3Lb;^A4Hh=w`8n zsn`SWunE=0(c_NNz!s`hGw5~PjaTJYxjS?GhqxX6NE*DvL$S~q^!Osj_Y6PY1F`q3 zAQ+t(f}dq&s>VhV9PMwJ*`REBdTaEqQSx}oHiG}!ZdvA*AGe!EL0Yo&K(0U|4?8+1 zW^28%zgo+%`FuGfvgQY76TW{fM&g)kJR`ed$PYe4F~-f1-B>rss{jk_rlsX9OvRC2 z{zcxa{y>3u($XNr1tcBNB3C(wgTckPA&t3VQu~-e+6sOCY(7KJc;B(S2Wp)Tswoe| zT;C0z2aQH5tiU?)RJwfmAwr1W`7S?7D%*U%?w+MiV^&2yHc%4Ay-#k-fU=>8 z5|_QZ620s^z1Mqe)X;dX*UkoRr9_Sa2qqDVBaBdxD0c^gWhHRg4=*!7rkA)u%U!J+IbIG2H*X%ASsxnAf7|`&R0zLjh@`x!^0(ieB<-! z-bh5=YrIxt6_eMgJ@x@1QvyA?PA+vEZ~AooeD=q68?TNu@a>`dEI`?z_ohy}F+Q8Vi*{{bzUu`mC?` z_->r~Ll4?gyuf73Cp|>cqqYRzV9O~L-NV?&6HEzeaZN~ z%y&c5C&xP%$WVi~_CC<;%c*0+j$SCf&X-uu%;kwk|7W(*4Bp0QXCdVU$dVt9oQ@iO zdR1HWN>G_@P7L)`vd=aj#?jq)nx_tJBW3zvu+pFk2 zK1T59wvA`CmvS*|KS^iG<}HJxGBU{_S0(xHUQm&k5(=Gb^QVv!aeTQa6vbwn!(05D zjuz0^k~qZ2>d3dzAgXXtYN$yQdY=Tp6=v^rCK(hA&^jQdjypRn{Wy z?{a%W|GMv~A>~z-tNPi-%^+$@KvW!=xNF2la(O7NSq8y+jf1j!uR2pD zBUQC6M&I|n^NU`)AzR-Q1#P7=T~h}~wLHr8n^^nWJPd{B%}SMiOdLp)3CZlhuWW(> z!*~61<(j1)f=aGa3FcYtDGdd5haV|1kY0;(A=54|(BAWQH~Vft_^KbJDqX_h(6KAp z_eEqTt)qSUY=JGMp`k%g>E;3mN*q+I02AUU__&lWvQh7>sbL;IIZ)|Cg;<-?9V13X`K|1e(q@W=Nx&fz>g=saceq`x6(9!K3( zz^_bkD^i*B8ak9b2CboyAm#t#`YmdyVEh=WS^*l`w z!FBl|ZZ z5^c!s^HdRRw!NTDQ}xnV_Rj@{Z>}W}4)fe@Kcwyw9mMdSMV`qNg7sQX=_+R5JbwM! zoxo}iOoKGkBmku2Emk=?I0}@vr66eucxdA1Irzb^;@X$dl_}=tnKG(w2XmR9+tKf` zE#JL$1WnkFMuPeWX>k%-Fjh(5sN~?XNj9rQ>y}v@s5ETUDCJ|EF0Fw0GM;z;i~H>u z$*mqv4kuC@=B;~P?K#BDF{GI1U1ZkGTX$eYwzIP*#=?Ms$m8N{8ZKGsoGf^a5l;={ z)@g&RjWIH?M_`2@*vh~S%=@S?uYc3r9AIF9E=gMw|z~M0>HrQTb*hlooONOhFF#QOYi+}CSz=O zN#@3Fhqm@!^R6Izm ze>kB48xwo`ASg$rGIP!Q60+wML;gZvsKt_1U6H$)=26C{(WdKjPg6Ig@(vA>I!Lb7j0?7u6l}toU zcgyAHc#?cWCtqa4Ad`*_|zQnzBp4#}`RJF8A6I^#Mr zt;&5Pfd4zVfAIU{8vBVFtZ#R?8r<5S#4HuMwY6N~vQ_nm-*bML67C*cKfx5x&@T8& zp(YQd-kF6}D}5{2C{_dMUR>u6e8thV-xt1$OzGt0QWe;D9osO^OpZNUk>w9JfBPIN z$L|sCucwMbZNEsfvbg{1!t(TM&V(PYC|8$I#%&#__M@9*6`UzY+*Z?Wysg~s=15H@ zbQt-X72Xb9FoZ$bG#8#XxPJNA<%(*}?Y>{k0wU5dIMcTqJA@wVwlI~_-2XTNBdOa~ zSJh(A%7{(Q(MiALwZecAy3H$4-q*i7?8GiA1_ZP&fYt69*8^?Msb|TLirA&l$QU7)w5(i^N*XGu~lHz0A-I4$3(e*qr01#$*Zet z)IG_weD~Gyovc%dW_$UlOEdT8JZhTRISl5`W}J&AC-166`R)X%WKe_b6GMYCJ7iaZ zPkrX&w=O2-UI|e=6Ng2acHuI$&Pl~{iWzf0d`1Mv7VEPclP?D6N$l7E)SRpGY{|8> z%t+`}CpLStZhRgKtW)-6>>|M(D0Td9#c_PO7f)i_>dgj>NZ$>?k90S}N|s;f6#!Lb>J@D)}BUOnAA+z^eZ8`O4)dI9?#qL$&uv1@uzK#JHfv zqURm9@Hc42(3?0fBQUkZaWWBBreGM+vxhmadoK!7(c+BvAy^lOPExu}l>(PF-;v)- zOK`g|24>O>8dSx^sb&>XRco67}t(O*JPw&vsw#jcD%Mb>@5K&cd|Zs zrOTr`0!Yj^Q(mR8sw)YOD@63kB@SD~PtY+3B#F<(UkeGEN?iJe0N*B4y5@2x?bi~K zetxmb>e>&ZQ0UGc(5$ItTsNK1KfNe}P;}!%S2<)e+UzBX`P;hkUusK4Zc|265r!Zk zzQ@!LM8qGS+PXV?gZ4d`lm{g$87aCvz;3*J%&lcx?9Mf>DE@rmZqU_wIsL`XjRQfZ zSnKZE?S|H3FBL#;=SVOgwp|aB*|d;I2Kmvu6|C}YOX2#*EqSzhMNlYa%7BzPg6s?4 zi%h)F&Yu_GmuFQ?KDnkD=*`%OLgPT~9$fIf6X zOa(JGqVt#tW=hx+N7h?ohxcU=w6zVa_53ui%2{#nP=rpgfc$>c@&2Z)x7FMmeECyy zdCI%gmq)?V<=_(=O!z&9d}SO$#^if@ELk^Hyr zxx|9M565xZ-~8E^896ZSC)qpd_*{>?_ogz5x4)cCjf{TBwyfnp0IP7Az|z7|T-Aw-^z9a2FvI2Tx`xjg%~G@XLE<({A7LHX`|= zgWQ?u_uaPIRCzqVO+qpi2;R3P5QN)LEc5&BDnr9^G%|ZfH07*ua376f(s)ftT(UK& zh>i)$Hxd-Y(P7+?dso1%eJ0$xGRpQv;TlP&vMkK-I9;w0+c!}Ucq#ZZpA?|Ea+2`5 z?1-Pam$pWk%Z`KZCV!LY1#m}i$9(+~mwbDhuh%#lQAUAOm{iS0n8No)3LHJ!E3UY7 z<*5<9^9GE&2C?PE@0n1RShR`%RdNg8352k#&s=z0=!xQHs(OC8t*zYkO3ruu)~(uI zan_>MnxCRPpW5x0ApREVBdE{gzdO0M^lu@6(la0fW;*8bhW%lJx3X14^BG#hZYc9owHblsv#M0*(Tn;@IYoQ12IjXZHh$*B~p8TnA! zM9DfXm)PWX#1dpVUfpx_?MtsjtVjd@(+^yZ7qQy33gO4Ta4}$fn~5?|LPVFJoSQqMP6w zD;R>-N8)E3#<&@)%$xMoRph-arQXULgD)E=a0n@DqPz*zf5D-?^kv5@@0>s@w8SR9 zSMHmitT8u9v#IUTf`{KFat>|Nb^;D(373MpRlN_(%5T8_=?;gB!;cDG-VWY2I@}HlLE&#^vj~31|-{CRusoGpJOG>%AJg==5a;?#}$3 z&Ae!=5P8qQWu{`gSB0SlExsrmNM+L=lh1gR+DR@+_W7Z>Ae#wL98<<_oU@92oI%vw z*OwVO$xABl+P;7)oJ{6TQ%B_qRuUUfF&Z^%u&Fwv?_vpkf+OZ;v~HKv>ffzC^N{mH z2GKhV+?`Qy)=*V2Wc1SX6{cQO_Of-wnKyX@^cpwN zdq&s>AhFh_#nMvl#?iZwdQ}v6jFxS6}*3Osp9AxBPzF4`uHy%we>E|KI^cCPM zrefmHtBs$}$zePlL*(6XnXCQlRN9W9?_=Kbf7SGjQ|_V6p!Qk!L#cdy8D&Rab=316 zh5l@95Gcu9zROkA-L`C-r|Bc8wAgfB`SLXBsbM*OH#ZSM?`3B~0z=ZwmO7WEN^LBW zS%ifQKrJK^>>(L}>RLko0w7^731B8Yq)DjAj@{ zXRhlTTE^o_4Mv%7B%j<(!zzypy#eO}k=d4R9Xi0%_n;R{WLEt7AeW9AhjCW;v@oJizyqk;nQ6-eznGtQ{}bWH6&6Ek>aI;eMTZ7%-)U#xsnuo zs_`WGFwoAsjL^_DPaqz3+&+fw<}K$qjko$dfy8X;^a>;J(7poRGj76n9Omn^Z{u7x zlRrcKBM2mjGJTIRyi1oR5@-L4bqN2iJuWic;mOL_HF(kSY9e*axh|F+pk3gAoQh$I z&m(c@s!)}A3K|sc1Y*sL#N#^1A=}}xn*~Vss1rf#b2tW7*+MXmEn)fZ<|?16)a1HK z%6K2l0#H7PIaVstkuOG&1=aI%hSpi1aD(8=fbq{fRQzYhm{UP@tCTbI9yk2Wr78P0 zBc}-B+Peg4-gFyd6FR?h?vr^k|JiM4yu)tMe|8<;zH<4EEzj32-}1-GODpd$zr6Zy zCD}vjM;AM*?>Tf({qJ%Gu|G8&7A={3-=~if;q#}_;Ue2Vje;w=ji_2r<_j&83irO= zq;9@{G=1n(MNWcOqNRytLM@l2l)NK1{%=;153}msbv@1UBKcQ3Ud)rdo7z(2-W{$@ zo|kF;dvc)(itlOf-T$#KSxl>=JI37(KO^;DjU^)X!oDp8%k(uXms*71$x?Q3 z3JxE5*%#QQ)hPGF3Ae>!yrtZw!$?qdR>9UOqJ;QrE#;(DAN##8g>3WxarWL}O=WBQ zaMV$cA~1@AQfDmK5JZ|tiON_|5ge7G6af*WMWh4>Nw6RyO+`iNq5_H#kWNTYTBL>^ zAdm-ua92N(D=@ zO^u4kLPe!w;lQ;I6#0`eAq?+}^Y0@LXx!6mW4=F+6KZrmLv!0vWhDsx=sCvDeveSm zceRQ0N3Nfq=vKyjY0LF1RYjDlT8B=^ddj39Q?eW*<7#hTuQI>Wr7PKDldt?NwSuRaarl*pealtc-^}H^W8M z6DfT}oiI|>6-otaPa7&+3ERhfo{J8ib|C~u8VQacJW_DJg#r1ONciSvSGDa-0+V;g z;4h=)uo$Q{{C8)DkOtId{$5s1P&ypmgh$%hszW5KWuIN}P;3a(ORyAzq}A zAU0M~`p91rctxN8@B{J)?7E2kwwGx#{SV6Z?Jbj@l}f6hN5{aSJsFuNZ&=dN`W5XR zp9d~l-txzU$8iQ&K_W!9d0uJh|9Wd_iGpsTO%CHNRbEr`Q{Hj#uv_jVT-bhAUnoj} z*7Tn?2Uc^@=B{qcap&1SCC*$#^;|=|v(L(2f;(bq11^Cnso%Q`UgQjjd*H;gh0Qg& zxY_OlbT-+4xg+#f7cT}z{{7;;@a5oQVC0Mc8|?Asn2sZ0cNgys{`Z%JxA}in+yrwQ z;Gad)Qr_&m3)Z+5w!ZkJLXX5zBI^2oAOp^kQ#dDgB|UDuCwWQ~-sfF}-J zEZtCr!|%)HoC2(tpQ_ zt$f9jV^Dg|4P_q_)!C!xQ#X)EWsQvZ%xk-L@gFGqB%RTyA@%$J9-I|(fG#us{d%s80)I}a`kK%yOoQZ^YhMr-FV>DNj^rS z*;n<@iC3F8yV9n_Mbi%+D*n=tTJBe%d%v&`e714n`v10jb`rc~p3Uh>R!4hS^QQhJ6XZ>sD zpIcv;?bzuSi+O_Re6w|~Ad??_`-a4oAdmD+ksJhe>s$KV4OI|EvKn`MwL1`10#`WO z!I@ROGT?J%tC-5&_!OJw19JtI(fVwkc(OxVBvww*27J8)7@92aSx)(%1nwQ+SJDxQ z>N;T;uAhH8-H8iIx8|M9i|tUsa)q}agtp&#aVK7~czRqWLeK5+Mtt9tVb9^md7_B< zJ$3Un2EF~-wFdO;s3>j_NE|`-N8@LPO06WHz~@4p^-@4=c@ojo989n2@2;sMj6B=x z-`Q5psZzbGu~9-3z3r{v5VD%$NS|=>r)Li)A1KfkCMawpf%c2)CLt!(SkzuwXjwSj zr1wmZsmYq#&nn7c575p00|Km{$e}vVvd;OBLOUTH5Gk*!tSvN;YDRSD_Q%BM_13oO zlZwL({3rn}+rz^rnvLLa|J7NYtq3v6jHqrZqc&qIG&{X;D zdK*y}%%n{lMy#DQ^*otk)o%Z6VC2=C?A8h~VAM%pJ=)|(;X!|P)kOpHhw`bIHkVzR z1qyzBY5n;%l2#xfD5+og#ZLL^*`yUi!*7|1$l7Ij@W=xAs;K<#wOzR^^8tRvAZu7X zJ2Bhe#i{At`J#fgGH15Yrquixo}gIz5=bn0YV8FnyiOJ5;=`f2n_9CMo{+ zI}PTKMvuxO+uTtmOlPg^M6VC;N~kUXusnZRf5T5Gi8RB#$=1-06d05R=8%njf?1e( z!)kl79{D8Z%h7P@h!KDH32^}_d#6tRk=iHEse#XXUv@^{VQg;@i!WAqtl6m$P@&r9 z>~F;x#s+UWz44j63}QsMrJxc$y zbQR8@k9(|{%s$|7s_T+|fS@L8@|f@eMwk{#VfIj(kNHHSPLsl<6^^RV*O~HXDLnMp zJ*GepQD^r8?JX0Lv%jEQan@JvN)P)Bh6H(UBeAyEufWWrW#r=#mlno~IB)C1;k?p* zG#>!AQ^<%&QGE7L;r*Bn#&~B@ffg&4JciW)AVC>`f)lLm=^h^mgFP$ap3bvA9Fv#1 z(j9=EJSNkpYDSzSor>vjxz4lDBc3^#S;O11CRCv#o347c^qQkn3(-C=;Z{&{g>}z@ z)y@2Bbys&6luAX&z+Zfbp>Q;uYT~lEK^!YE`U63PpThoo5YkY?@t46N$JB70c!Vzl z;q5#eeu9epmuJ3S5#2+EK9Aa;)$(D;Bl}FACR5M1t7KZUPq{|a+a1D`%`h9EI*=nw zdij}{Uig%cD=uxwyE3Qr6z)*>jQ03GE1HLg7WW-B#)sdtysZM$8*iLy1217sJItN$2vXHSG-C4C1MuUVFCS6q?f!@9@43961@QbZ37#e_G%4 z(+5%+uiNd%b$qTL(#R$g8BHb3D{j(NIkLgsF7hKzeG2P8PHJ3?rILpy&{u}4;@}(i zrq%E=8a%U1Vmi{*o>=G`58Ep(0r>eF#EOY4e5&qMm3$OoO{YMymK(272z03sGWwd* z4@SWbF44?pj<2WLH&#DWpNS~;MZY4kH>vH^^BKKIrVI?2+vXscoC z+XvY>{sA7Tlkaeem`bUbbHE*|_SG^C(P7(uLL3L9-d*RRo-;r7E~mV=9{ebAY#a0Q z1rXpNRJ^Y?C61GzBK-|}t7lVcsEN1RSLV~HkNgCc;Q3A4v!rKq(9Yqp9rjUUZxnDLfZ&UU!# zN@|#dR?@G&vT1jMpO)8fQ~D*Dj@k;(Fy?T~x0k7wx=uq8FMX?h8Y`@2Cd8YWL`3*S zZ#1w0$X{&1Ow4wyZYhYR8``(3pOfHiAoEc)zH%XF?tm6y93|@9_l6?)+r(&eLNmC* z{M>kvyxwG3)@MOLR~N7~NTZIdaR zh`OTXE5UmeNr>07eyrhORxqTYDZ->(aqWN)zieuICukF24Wjj_d4Gz)fQ^&8+LT;2 z5l9U@{pg2a511_%|h3-#>K zwAUtQmq1wa0oeGlL$wdvhuk8}3yc2%p;3&PA?})}sZUCoX;TqsvYv{t0*XJxb}$;g zOa#;r^`~}=w-pU(Sl{YM0s*IQrH{IKk0Dwkn`!;R9`4D;%p;`pLeTZb zg5CTJhOx_l*jqsoxGk$UHPwdY-@WQF&D3>#j~nHAO$ud+V`8Gb=k!N4=~p4>YK~3% zmkz^3{smgLhMS#nCPg@NPQcfj_9sLb{0Xx7%EIDzxkw{p3dDB36)dN ziHpzts}HTucub{>j2%Gk_a1D#?1HQ6k3AnMs#phh@CpEKN_bR?7z{)}nU zon|x&^2`HFM$d;})9&^0EfqB2*`n#kC zK6Wd${v@IRxV&whL!wbkM6HhIco=42H}-A8(TP`)qYa4rd@h5B#&&Nj=DoM|BUw#! zJrP4Hvevf{T!P5=ZwG?b0jowcmh)?8r&g+L9IXyNJhc89Wg+}sh?Y3U~n&*bwX%_m}?NWrtVC}Ah1Hqa=^ zEaF29wxm8BAs|?jp8p=(0m8ZzywEd|8!HkO-|87z1ON(DIlW?7#aE3eC5q2E>=}gMZL(?7>$NgDu`gC%WuSsRing5yeB_jYd>$ZT7-rA zQ>lw5(6T@*P8V`0219t6>(*>8?V^|xAds>B(pn_!?kzbI+Q@y+ z9`f*r?w=)yHdSD%#c9W-9e1Y(-wh|W6wsn5uBhQY?+rA>d^t=`Z0yMtKcfs7X8^Y_ z@s#v5Wo*{7us;}aXOk8^alYwBjn8Xb<{2p*S%>*2Q|Wls?DTHpea^9^RT;(lvH;Y>y^6DQD<@2F*y3%p?y~#_mBW=-%2t~4d;X74t5_hU}*`duz14U=;wbP(T(*8e~&_i8{z-qSDLQCmmk zucd%b7eSTwFE-IpA@Altf-Qd?ihFx4dV(D+D+yre7EA8u1b@W(L^SC|Z<715!5-{Y zyqIm{BW>HU+EU|)korasN`JR~Uqda}dU-e6l*hZ4+35`W>MfFQPx#2fS+#T#2#Wfj za*rB&NycPcpx90_iSnQXj~yMv9Msk+LCWk^Uz3PDqKPf}^bBc$i#oor1rX6Gn*r$Rj=`*tXpKn0++5sYDZunVYs54 zJHXRrlmXUW0T1pl_n)|>6IIn-N#|XKh{fxXp*FGJ)N3GcPYRgt(h5u(7?yogUI!BGk)4ltMo*xFwU6O->HD-Ia;)? z%K%V;CC+gHC%S(HEsGo#Onno-%IG9kG0yA5KKq-100Nk}WPAFawb`G*+3G>B0JtJilUQznIyuJN#%WcQ4$hSdNM`MjZ{Q@mVCSnvWBh?Eq8w zsCN$g7HUY7y_%!ky^kK{yG$U%2naI-f(3?y_Q!ipBv1`*-l81S-vj#LRF;tfLGC{@AZ z+l||5wE%#8BC~*oFFOL#Wp%P)QYLfBLB2ModDOY>kSq;x&D={^TeSvIV1PGB+jHhC zLAaXy%mv}9X*9|(wPMBqP7H!kZ=!kNhLVfac54qv_je{n5MoyT91&0)Hl-OYJt^<6 z=LHy$Fv5IH*5E68kv?p>6DY{mfD=@8!psW~tVz&R=?o&UI(FJt+&pg!XmqGkklGu1 z^LOF>GT?J3W?!rZFZYd)0|4&zp|gYPv5M?jb1TnZj6t1UY?-JUC7oyZsc=HAnYwYm z?UNDksNZa1fuTH@Uo0-$?g~(zz4y0;0jw}+Cp2z^9HJ4J8CPD9H9i*Jyfy0+jXBj| z51JmHXi&%18P_i~8$d?@2K#85Do=YvY$ z##!YO^?f@QP%SJ;RWxqzZgisjJ~ZZ*=Bf(bZXS(MMZN}UCw_T>#)`}kIdJ?2LgE{7 zanEYp-E#uV7)OdWZOxkQEtvEvN+05bHUGAR3tYL0+qPG3u|~^K^RH4}epCR!nF6cY z0l7C#C?-EO6m8!6J2HPaj|d3Ifdk;j0fzz{a&Z&*Lx4QZxoXD(2krgi7Do$MnV!IW z&ftuedYIw6XwVqqF9x8|j{cN&1%R_W;qMgi)vBL7a=Got>AAeFu}n?YR1vV+0U(xLbwb`|(p zefKu+Ol|N!&(Hh?`Yv~4R>M{w9T)Q=g&jz@j`2DmsIg=DcEtP*x#-rTSA5S{^yi%a60%`GJ0X{TT4X& zwFs?$0JQ#0s6rq7QK5t0#f}}IjxeSdFtCoDTkoT&w^HgN)<2CupM zcit~~;@}4h_AJ>smulrrXL=%wLY0e!+ZZ5Xf|C2Y;fgx;J)y=1NbqK7wD9eVzy4sD zSp;hBkj3`d%n0OxoN<8a92V_BCllC2)h6&Di>=26=3lxUJpb*7&G|<8H}nL{$r|9m z-*3-z4z4m#!iigK^_i4jN8&>z;aM+EF9sC^r{tA*sY4uynLqDQ?|@*YE+qxjNtvp@ z?oe0Ov*>d!j>W?zWXffx?!xwbZx1EW0F5^Xl8ip^`+r_}p*uYD0KVt^jD8}%wr9!t z(HKYwz8H`e_XMACD_E;&1$%s1a8drRo3Yx%ta#a*j^~+gICH&Ina4}zktJ$?Mf}+& z8`HodzbYy9_Y1UwhVLMVuLxQoP$$Z1Z?xXb>0)asp_V`xqrR$waT0J5Tt2wN&;E2v z=79Z~sH>M0)Ey#RK+gJ+-vX2Oxejg{;>`j+$E9`a?~(BL%HZVPpMT%Psl8+x-Q3mA+2 z{t#u%oq@^ffcIOC#HW8o>m#G_z%Vu)1J^HhZx;gU4qd1a?pnb{W6ywB_{qKQRRhjc z^wrpbm-wE_9@Z|Gb>`eJ7axyD{9_~5-!{U-R|Ag0%u96iSi=5YPz%Nd%{h&iMi$lfY=FAHKflxQ?42bWr8_mCQOvKGf`Ad2as|YxA(a0-Ycl4yqe_+p zIxyE?cJxE2&O4;S{P$Pi~TlPIk7V-2}25M+&oP&ViL6zTlo z2#z%LW&rA9F^1J%UX164MNmu8gW(7Tpl4c{BpYY8jMknaar++t5puzpbO1OW;S)5k zl_@d6+AiK@K|KLT-yyK1xAp?As~1p@=Vzle)2W5>NMD6g!63wPhwp(bx#@@eqMr6J z*jfcC>OQedCk(Qdg+Q{PU;w~v5FEZCUJmlaZ8ZvQBTyMA0JI``VCHikT}2tlLpBw& z6&{ZE>$4|a$^f)8jOh*kb8$1i_8vY;QChFlnY^%Pmo34~7h+@b*N#{gYilPY27$a` zu|XR+9D?u3+jUj$fIMx>qui@5(NMbii4ksG_;3+ObRbVbiEj7`c)lqCw6zOXp7s?Z z1Ax0|RErIEqngKX{@JHFV5ISyWB;dTrMx3yCG~T>?B8v%GQ4^* zC=u2Ov-7l?pOe9g@xW&a2XkPTh#_CQKY^e+Sg^LmZobJh1mruPZI|SlnSSZWw@Yl*Te8%8g z;{dz>19~f~*23x>m%I;<_-bNMJ9;sA0I-qvI;qfdt_2>{RGTR#hi5Alq^XWuQUL0D z`5s$sfZJZbq)HSvtUMklB_nDVb?AsrWj?D}<7)0jei^T7&40gh*5k2rX4ctQzzo`c zx@}RdtbcEQNs=u_nUsj1U?TiPS9omK(-~M2IHv@Aiuh($Nf3(sA@*4R))T??DXJ6% z&urQV2o7Z^n|Le@Jh~3~K?Zn5W1jH-b!1H}2rIUr1PR*!7Ij-Yhr%js+rx`zSN z(>MzD9X!+mVg>sS35B4fwCD=bCBJ)s7|t6@^8`eYEx$oLY%Oek$gHQ1VBQ_*0a%Xy z^V%%O1CaUr^fWP0f`_8-qN9k~&4{pq0eoPh8=yMdeEz){h%rZ;hsqJ#;ABrM5eY0~ zt_TsZ;0twHpu$^7mJ5#gL$Q)Zxmgaa3rlUV+Ve>;z=-PlFq8hihTL+d)q{eQ)}Tl! z2Z2XRAFK~B=~$rGSimj|j{9TtF0(+del?&@4HIRuKV6&DpoWRU)KvlFB>{RMDex(( z&*=KW9zsvYf>S+3yxFses~3#mhsx!CJfO_|OZ&i^Ap%>axO;}?^Wg=&#f}g9k{SCRv|79hj04{u7u=_L!H0$S=9aMwb zL)B#Avg_RUh*= z`(=>P|6&ioDLr?9ywlt`Cj@11*Fu+Ree?nZ0oVf}CA(Y*YYYG{U4-w192`O;*}$c|=oN}{I?J{?MS{tfF&9AYhs(>1;Xqz}e{sh(g zIDAV5Sp@u-DGS*9fV03~pcKCtAqGt#fUy`OPMpONcC*y_`(5%kNx}Y5MUUti8eHmR z-Ue2#rTm|4;0Gcw$%dS*%X|ExwJ?gQ1pfNLgta1Osfio9z~+OjD#rl+_3w-Eqsuv< z0|?1!z^?YFxOU7u_gDg(1d5?EliJTm)ePq6e;3yOM-%u)(4RSbC;^HgG)EEyGr{i{ zJ<*>xbpl?+@7_Dpg%1Pa{NKImD>DvMaHAWLX(JtZj{ZHyRwWIEU|#uNqEwB(PA-Uq z&?b2N$4&U&(LlUK~$F3k-qF(%O*9f&1!t!Z7|5p@UP1r^$SkeJS z_aZ(1nkEq97ofoZ^3?S`pB>CnDZEcxB1NHuVY%aYO95tgm<{r*9bh1|6dUg^=AqPT!?1R~&KQWjcJS7hhmKF>JBc-gE07=Q!WftBxIYHbmcEVXT28A9MVdlDb zuOdvnVD2qM|6IZh>yiH9x<4ud{X8Hgd_~cg?8J2otk1*?ALHg#apoGk+~|L zVtV-|e|Krh<;-fA7s47XLDB`JTGelL#sua+!uXFx_)r=ElmpWT#N+m+e{R5neCL|GykHQp;9t6bd9!0d~2rfxY-d-SLXO!j@i8K8J|6nyFP_Ax-LFkrs&he z|FT0LO1(f(B{YDR-I;St;%7W=>+&}aO!%j_Q)NJS+~!^11o|Xi0jEp*L>3+<>LBzm z90ErW-NJMq$sgN?x5Ari%1uoD)tLvfZ=&jwB#S!7dcgA48-JKz|6h^>)?%U#|J)({ zVZU_rqkK^rAGEnHQ^?+4t!(Q+ZUPu0Xg8L-opL@Z&}G?-Yj1%~>(+y>`j{cJMaiT7 z*6dcDs^x(xdWjlv=+E+hcTX{g??8hcQ#in$mIjo5Mp^?JwD+0lDml+i#~iuXbcD!@ zXoMle9re>S#{@f0mG;sa9qV3R``pAgNNkeWJujH!%}!focfnY@;K~ibQ}RfYv`x4+*KFo%NW*U0Y4)xVD%C>=BZ~ z4DFmN)Gs0=06!k}l!6)gFGLP!5YWE<`57R70|bku!F_wE#MjUVspN?F__FPFHPiw3 zo(Q<3KaVGwo(cKRgxC1UW=Y{V4;@S6(qC@$O-#IjLIxekLO%t1d{aMR`IS9JKKI{z z_Nlq&NjCR1D5BG|UC1X&3+lLL@U#Mw$>XjBd%vKH?0=Pj&^Lg=D!s9u7*$EvO+1Y4 zwuomC8B(EwU@|_rj5>;~n(lu(O8}J>91&ctyXV5~>}Z>_FL>6VetmhVIGLwE`_aA} zNY2dkGQrX}luU*`KYum$1j(!Mkw|&~E^W-EG!xQAVO?d9Bk%y50Hu4nYi2X)58^wmK# zZZC`8mudev{-mnz_}c~#`b20@Uy-O*u)JqCrm_yC3x&-2p~Smhp#Go|Df!FJ) z3fIkPzARoh;gd@w@P&g0MAH#}fklbdh8%}Tp)1RKxT%(@42zi#XrFKW`OiNx(obOW zla1X6gp%o=-D_x|IhcGv*lpJ*;i&wYqIko7+38cro*0iQzM-xAzB?dQu~0xVAB!Oe z<}`?y5!lfsxI}F2t)Ylx*;#q-R3pR1LBLv-j+r0f6MZT@g$e5)NB2+~H-+vhi8l|t z0Osz@0)U1#e!xC0GbX`)Ja6Z2u}Jbj@08h{$8c_B|5MOl6MLa-ov0=L#+8(7=L@Xd zeth=vhA@SWq5BXvY?d3ddyaMAa$3oK9LU`#>De$W=**=sWJSt6Z6Z@Gef{z>tt=)` zN}BSe<0;eJik|7yHhyl_*~o6&jAW`TVRX1e@s>pa|5~ZNGOs|WBkMC7I9+IdSsqEM z9nMP}aLG^MV4=nwgJJ)6RC_&XHt>YcNP1=v9pk~uyzWMAyZ8Y8yu{SSQ(!^R+JN_o z$G?nJBj%$8OOswVd`&NlNe2A;*NX1aPk~?H(2&3Vy3akGbP)GvM1)0TWlKt%OVq)? z8+B(NL3r$(@BBSS?4}Ek^XD87c{7!(-A@h3Ng+#j;p@S1xmF`nGP-Wo{yH87SxT#$ zWVouAo3@&mZq#?AM)BkdAVjlFM=nlYD)epWjEAFN1TTUPWrOlNxed0YjAso%kY5nj zBbA_J&9f-I;^Hp^a*v!Ek6jW-flks2eBXu(Q3ve_3ky`DrLmk8p7=n&0jOv`GF4zP z{r~Tl`3DKGk*O3;Yvstj;clsJUI2|rg(?RE=zH06?jFX2?CTnbvM+!3N z#*v{xZFzd7-Bj%~>e^@PleMPpKY}hO5YG%q_C6WXzWmo|wd$E8yuut^QuoBjHK&4? zUy4f@Pys?4Q5x^w5E@&n<1^2VZDEM9PyxV}lr(7zY97t;OQvmN{vM>lWp9dVFRI)1 z4#!dIA3Q5z=U{-EQ2=PJhZr(wLp*{ffVn8Qhj)Y6E;a&mlg29bb{8OLO{_$nJ$oN7 zF#uE+Gjk$=irQZR!Xiun|Nc*9<0A3*ajl49Z6?AMwj;$e5k*n+OGJ=M2R`__txG%o zXMZn$g_#Q_IaDFQ8=*RrNNID z9ywTp#w279-ho!)-P5@-$wDJ@1cyHO3yl zt;N5CN-rVowwbf1*%yD-fxn*8zQT{msOOVN=l|}?Z)S~vI%SB$q))x*b6Mw9L2))U z64UTUIB)J_hSo@Ro;0MOW$~50pi+f+QUL>nim8N1gY;(2p}9m~ zL1lQ?)+|7P@G!K@d}wMUr~uy^UK#|#gIt8J$2l<0;1E>s;7HU#wBDV=h;=*ekm6^w zCC^5^2krh-kq98{rcq4wgs~-4u}BWvIUEIaeJ!kKK0R7$ZtFhwXLuhcK~XsN2pj&mcM51SjSF6y=lhDs4}`lgVjcT z&+0qidlQ|{G*`8f?04Kzya8p6MEf%ut1Ra#r)O^!%RS@dfnl#GBnE0bXLukeMJKs> zj&8HpuN>i85U#jjh2)oXDVg=4UZJ<(MD-9J+`Neq_gyuLH>v_MoY$ohx(6d>i^`$! zHT?e`zCPJNj1G>K(xb4UXO1JMO#mlInJf!m`l>+Uk7L~goVcx(A!IY(asOauxN z3n?jeW7pREGxj^4e0wKVjaATepnm|+8!^#t5LfRL1xb0%(`Z#% z!i18P8Y1&1PVb4~1I!a#=LJ?ShrRu|Cz&?Hi2yRQ>QWqPrnH5_D>V4r6^*rd^mPO8 z*Rx*qO*Q@>UoR5LyVo3}uni9qA9Kgi)LlRE5lYoW_$Kp$~8_KBU|oxpc^p|NVse%}1_ESNYsGs3f) ziV~hcq=EsLYIkc3u;f78vchkT_s%D{VcC%vzZY!$_8y=qVH61mBnh7=Pf8vg*&c^F z^SA&Bh!(?0Ff{hE+e*j9KLX^)5uh~zZt8~@)&u?M{t{Nww2)lNJa(jKYoj^tywTG3 z=_OyLDt`uS^R3J!-$+a)=+N9B+;mJ6tAkuLK`bFPjr2F!)}Jg*Z*qHNw$(EBa8D?4 zD(c$7P{|<nczRh|X%SGgQ8WDo>;^aFCpO3%_=9Q`UwLDBTnTao)y%2MtsDHs^FO@G@zP`Lu- zj$0RU4K(0VM9RR<+`3lLc(%nJj3`?P+=zTb>s}!k&e$zWf=1}fI^>Z-wS9SsGcNg= zMoXa)Xy zUp27BNKR&RKF~jkMD^rCDp2|ATMO>aYv#+lct%=P5uY-0;>g>1|dq`Ey7cQ8?+oW&F|k zPEJKnyz+ciX%Gla4>>G3an@Q%Kz{Pw5$`*h(I}ma3(@UV`?S|FarWp9eUe;8!?3K# zE5l1*SOlURP5lKPE8ll~I@`9t>S*BXJkD7cfb&(*G{6ZYJiXopUQ2Pciv2Aa6f}c9 ziCcAKyk)N0y?b%aVfhP>Xgtw=d+-!-o{;515ncvd z#+7fn)PiM{CE7X@mGLEaAU=TgUHpo+`BnVN!~k8fAE`pMgOi`>Kc-^X^o7X$`^=yI zrjgGTp-^CT_hMS4&f-@4(noCgf9$-Za@F$^4P7bM%S}|(LuZ;D>#p8IGwt4lpsR)y z(4inSv<0uW`(HR5#Z}U1>4e81jdT-*>3#_|lKX$%$fc$B;^{W?Zh!lt0HF(sd)I)$ zy|oR1Alc7JK?DbJ2qrJe7zd+Rz+CH5NymU^=4_N;`)sk1-+!0~8#XjYw;1=^k}e|(L4ixZg`l33%vjFw*BJw9uu*#MX* z*Hh3f;5MKIUvE6&w>VS}+KQ!t;JP2ZMR1+dx+EV{!Dle*@vyymBg9mKg5#FQhXuD; zvKQpUO6KC}380BIzZ3}lezXE-<#dt^1G}`nCms)N6pz_Qdb${_fpRD&v2W`8#5ZQi zFMZMZ2)V|s2gfXDx@-Jf{dyo=d+>om5}>nzIu&qeL$mV!URe8^WEt4(+)_x7c#pj7TT8#54CxIv zg3`Sa3~cm1R2X+|wK-@B*qw({cbO98+8J@ewHsg8gKwV@f9 z3Q*T*C~jJ)iYBZ;7xsVrCE&C#6U%vtey3jumTsnDJKX>;Px|%)i(7VY9tI1b!QPXl zVDEoq>3c@qXnvsN9>JW&e2Xw+%zf0Gud9HxCHFycw6E=}GiPsXhQnZqTCgwRLs?(G z1C_v|Pw>n9-H`UU5$0UC=l=0JPb(n9_`%gb|0oWA42p+KU;zup1RZ>kWbTkHgR;^m zQ-eU4{zsE)J7xxM_tNVR+_OCVvEp`_sp+E$*J%2QzzRWew zEdOc6zR6(}-zej=DT7lb3%WRw@b3*yU>e}5A?yHy{bWxbc|G9-%|zx{*@7%J_j{im z+K}%{`psdILejw=Xz+CrQj6-Ug|kJV5njkN5`I41K}G_4_wP#!I>)oZPW;r~*Kc&N z^UKslHUBs%Qos4;yH!gM{bjQL_ahd6t^ciJ`EP42F0cJd(&$=QF=0m) zox_f9IhwpesxQWHP^Y@$RNdu$9#w{M6`yrW;bawNLu=kW+MD9^;u{!3B6FtV{n(qn z?#zoEPx4&ra@dZHJKf=g#wkA}wBV=IV;1|?c1Fu3=a$r`g6W>2Z00DLjyUyxZUt-> z*g~ARInZ#IffFPPnNSCxMSroi`m_)nHJ&8z4Q zA|>L06HhHa$QNr^nFU&Tw|B!}_tP8k*;3c_Sqt_Oa#UjRoQt=w-*1NRNLjMo*obC8 zh|q5E?bn8GheRT;5tjr4znIb4ukapdG$eo+@?iXGf((ktoEnGr?Naih#zJF*dH>2v zuQnR|_Pa@THOi^)4S8dvE(xgJ_tU|4sswW7uIXO_KzVYg6yfmp1HAUy<9J*HRA!(_fc~1{5(EkwWm93M>hAF4VV8L z6U3H)B_^e}rk1?jvsSeis1VPYeeCI&(oRG|CISO**X(K$=iOaIzjoLB?2RLsYkN0o zpgbl8L+9E^zU%kOkH?5LXaPSINy4oBvGPuubF^^1#IGyAw`oECQ4zCRY4TRGKabHk zk(E%*bDZuz8GdXD<9Uc2SZJ_DV4?Rbd|T*7*GaHO=>NDz`TZaChImXMhDmK7%O}p9 zd79N1)5?{?nlTxtizWxXsE>^WZ)ue5*&9;j+2He#TS!J?JzUY%ggfD4x3(v4s8TZD zbeitv5)aoI8`f!IUSNNesZMnBn=0Qs;>iiRA(0wf9wEC9NSjStC(`ml_+ydfH|30P z+o#lv>jlfp_^*+cKbk<;d#Z<9nbmu&6vvr!;TEia*YhS-urn^p7rozZy88J$Vbb1D z{jY7C2Pk)paOh7Q=skf!IW3vd`4j+iIr-NqaD>P~kti|>9~8PwLeSxF|KtYX$|;iCCoWAbglrfA}+`B=pF)@pa>+9(X?W~}&W<#olRV&i6K~Kg79E`Z7l zRC#421&pBzGgF)0{MQ^v`5=rKy)*vuc|gU4;jMt3q!%eny@1w`-g`{!MMi$A+iXBX z{z>`nv$=}w(z#MRQKe(zue>qMQbFpqXjD{K{P*y0j4 zgT7=&vHi*2r`MJT-s*UwC6HCddz8E*njIky+B`p zDt&e|Cc3(CbEGgc&q^?Z&4^O@J4W$RUEaE0bcvpG1zT3!iHdexWk#G&WUtLN@dg<; z<=@{@%YXdUkRTkHvQN>ZG@UK@^U>o1W15zP89K!xrh}r-8EGtj>sD+_bv!s+AG72!n&SrSY^5}EP=HK&Y58;{$oSn{iRPHmbCyY(-Sl+rHf#qx!C@r}}h zwCtQNa%F5rWvL3QG5hk&t|VH;V(M(HFdB_V$*t8SPGZi00d6`On?to{sXZMWy?@4sKj2dZ@C&S- z@EevduBe=*sbzQSCXSs1M;s_3IL)Ww0=QUD#Kxy3NR*hK=4&fP@uYMr-BwZ;bbDgyF*T;Ds<)G6n*vwp7VNrihc~tvQ;-4A|FXZ!_BMdrFvGtNox3~D?Asck4__&3>0B&>Vo%ik zBh}1TR(=@RAlHH}fzZrSZ}Z7d2{)zdVv|Gk7!asgcKX1Jt^lknOy#@;%Ao4SpJY^7 zrP)g=M@H=s*rGq4zy(p$dgn}O`mX+C%YdHGU$V6gO3)Sewqq_ZG@&?iZ7>fj1u}cW zS$e**i_GcLVUcYaW=j=uDYZ6HMK_)Jw{XfYkI z?j!^?hnzIf$#Ea;BrON1Rm^n6X5I=+8IE7RsTjknEESi6e>q&}%u)by_#fC${ePHzMD7c?W65FmqeOO`!^8TN!%IqM`Y~*kg{*1^NV}>zG+QDj6b>&VdoNTV3-G|&O z;;G-EV*bY*DQCOjWffs=I?Wstx;;ro0@j*y@B?HI`$uv(AQ)oz7loo;kNmV*Az-r# z+A2f+I}@X}D|a@6u(aPIf$w{^p!>|1kSFX8isoe65*!CO0@XD!>My$D zJ)035-Ooz;%XwNhcK~VgPiAWnmoG>$CjQ}5<7&UuJM94XY&B||rWTW@#?#DJ0U+Q) zLA+o{h3QId#8<`(k;a4ij(d==TwT9zw+yQ>x>EoU&B7XdQIiUol)sQyznEr6eoC`W zeTwXKx?q3m)spign!OJZgzis@Z2J^4`RYN$M=feRry!CU_dCUhg#7d=pC#A9833<~ zh62uK6N|_4T4H0J1?@Ubt+}7FNJ+gz?k}a+9yZf$9jCY)I7H&*`5$S zBt^?f@6zbKqY1L3V3cVIOdTK~tt-0k618Y&aG7pWG~O*Qs_#m|?gU{5@YjQbeb*xl z#0g*m!i2n(hvti=X=N|gE9wpsJR70#9!p?w-9u%{qSOA%-K>FdxK>&Sfs)lUL>G_o zx^l~!ejX*f?|C?&>kgTUXk0qb9gemEwMqZgL2u-MEL<^@d&(Lf%{QXu#kXA6%0?=H zVQ+13Q$k<7$38f=(;g9&KeoG>lqS7zU(s2f1Km%@V|+{;2nc)D@8XHKgQ1G2;ABX? z9>qZpnW+X9C|TIyb8Xvu$jt6}Z~LVhPkrjyUdqlr<46&1XM#bb5#2uV0JF~-s~}Tk zzYLY$o?#H1KQIH9q_Svt!tB)ya=~mY{Di_5{qaGH@Z7W_yDID$dn$jVac7aW4I{Zf znl2t3c|f(tr#sm@-2F7ALd?j1TuujG)O5t*{N%PKpcI`^$}0T{JRX$L%03oF!D!-E z;J8o>^BiQ6l*~InQOuiO?L)`S#<68`Pl1BF$ExE-34!m?Q1-!hWwZua@TMWrf?o&U zPIbtS6qXVd*??0p|Kg(4SGa13te}B8(ZOxE8J@R`oU`$-17C&xfuL8&pn8XmGjoie zxt&T{vFvn0Ovy3GJ3hd51P{ZtXF7mW-%-QyPwaP?@z%Ckp}-szAM^7i7>!0zX!n(> zSjhQ`mrHat^GJ7Cv)j@<^h+7GdM%`l8jgl%q>DqfX=&z z2FG4u>BO_lezHb(`3>9IXCm*~|CIp*n`w?WmL+3Wen&|$&%rURMh;rOl?Y5Ea^;?v zA!vZj`e}#Id?Qgzcqi@^{pl*OCMFuRg*92ar-W4$$2eZ{-h#rurC2}vQk#E|+=e>c zb{`Bc*C#m)jI|`%fJ%$K;itIws1+pE`{PVsH|O#MPMFB$A`lsyN5GeohEP@uUf22p z8E(@U=K%uxR_b6+g*D0EVS1CQrYmNwG?Z3B>zMe6p|#++hd;L?OyY$RnZXJhpm<-R za8^P`9p_uO8~6Ds5!>f?$79JsJrUV|&FK8V6JYTB*_EbQ$Ihspi*)V|aKu9pNAL&p zFCVrP5p4ZaG-n{92i1vaJY1V_&QB8t5)u)XjE&cpW7GKrR>^3uy-uB zvg|jdOr)q9jaEl{U6!M264*ERzd@!CjUNHu-xiJ5`dk(8r-p3ULT%2^_F~dj=v9HU zXLaWuve7cR5d3K%@O!=R0Wlp?*r{W-vtd(*K?0YKCGIXhcW0*z;&sjq0{Dq=xyVr_ zp>K|^hv9RVmV?X~p2=7m@&miBWjyrane++UkN z7#9YW%_ZPCvO*qD8;%-xqwfO8!3EdIL;DMA4r@ko+%pQ@Eg-N=QVb)M(njjD^!jG6 z%}^DXt`emm)U5V*yg3ggxsrz0(#;j}EX63aCH^zbacuhnIkAW!otl>i&Y(lKg zESZS|9xvoaKyh8O9s5K*gQS8{sk+Gp<%GKBHBO6dd$`TX!66l11J!nF1lxrpZLwZy z!~K%pCg4vLN(hxSqiwhxxER>DP&#}+tn%p6@Y@S!T#Q-CJ{gbVoJCw%!5k*jtUIHk+N$*4jiPWf+00AN( zLWjCk_J;wB922KX@`IiKHl|s&?9;w)4%Uc$ru4K9{*@o zA>HN@n{T{ot3wu9^h=aB|p8EqlMBf0Ee$(Kxv}<+&qn1II*`9#hb5Vt^DbQvc{8L9 z=X9P(?zJ*yMs%gJTxNq5EBsiQ)ORIBE16jcUIp(;i*ZJjz zbLz5HXYxh-EvzW68X!xfvRsRHuOhTs>!XTo3}=Wvo>v?QnXZKi)9e3s?t+sWrLhk% z5xI_tT|S{w3iKjiaK`VYbmo#$>GVxM`&I$DpJdJ! z;GCQ)>)jLinf{*g1e}ah@3oIL$qHETRGt?wjdkIJs4Ol;IJ#oKA!Wb+L@1DYa}dV|q7ELu%_!4dYY zOO*G)K+T|&qy8FMx(4Z*E5`r>P37zjLQUK4(~BsliN4gquU7=_10g|_r(r|J1v%4q z4qR?}a^L3v?cUA|$=p@hPADlz-uf`JH}9)t?zL1@@&*C*{IVc=4rgtw>q%KsL;h~s zG7z&O8GhAlvz7hm0$@HBplg%ZcMs7}%3b2$ZbFi2`0`)F|*SG(a&q@-d_sT#%jQE1{xeEGUfvR1t`8ULIunPg1-yIpqt%QcobnX&xlUbLnK zoXzncjY`hxKOjxyo;G@stTvIJS5PuW3#54zd-Q~w(FWBg+t=nnuRxl({B!Bko`D)FlJra!g zM|(~uZ|8M4_u*pqro7pV(%M}VByZ7Lg#H`E_l&N0{vazYApdL#H@ko)R!r`Y?q>pV z1=`CLQa&o+nzv&GJXQiQ>{Qp6im0sbwj0~c#C;XRiev=I@7V#iI5+pyGP|`Pfk`zs z-@IrHnCn*1ULb2W)T9x(Jwo24lw0002C+$~rG-RpliprmRfsF0e@yT_2TXX30up%} zu3LA~g5-^N6+79t6*zyoYyI0KR@WvXY9PZ0tA44aa(W}926)U&3Ar=}}xmuDsHo9m9+=9Qt6?gg3JeJCLZ%;}%7 z8?UbRcj%aSJB9_xHao-vrZ;W}hu`Nq()r!Kbjc$UJ-B6hJXf*A@CYE;UkcbdW5&sh((n$4i9hT(pHrXx0>o7w8ExIn?=!cHu%d>0gPZ4G=-}T(ZxXCqRFQxv%+_rla)VQi?{DYg z=??0LmhX<}?VX#2;;h)#!Lys4UWylJFz2EamxfU1WcWPcWy}>5D@2Vja)#T?SMsPW zX^U?QjH%l%A@>3?qTnkpES^mYa1Hogm}c>2N?Q$esipK=(dNBdgV438#B7YCi%9WS zdH=0S)eoL}2N&$klgN8@rn4SI=fXMfWggjq+6_NpahL%htJ0pvkGK6TbZ}!pWaq}{ ze$5@|Oa5bRH4U3V{s2oFC46beIvFmeR+0fUZUH;-ijH3fOub)UVF-0+LrXbq5CeonXM8Pzybt1&@gv0E#rP zPI3nnZ&%7cQeXdxlM#{E2;D1CTD@d;hc_Ea=PXzhU2jcqiY*SR0o;5L!11Uh1X>`4 zsG55uxmhjtUn>)&C#0TyCg=H6hhHwoAh$#M@QnR)WVriYijX6%=hsP)1uC=49tMV_ zUBLdT8}{n;QE<8@b*f}q?mB~V@iEwZZ2&vH0yaP|AA46X zKKAP&(x+1boj1pV!!37APmy8{Q(}RDX)=keIN6r4PMR1E@ajktXr4>*ev6%T ze$+MMx8#?erBHi<=l7+ixBB!D+^T5Ps9ht@!^1aBzec0!SB6<82zzY_i>_c(^CL5m zIp5RjGU5$Ef0{YrJd$45BiWClEv4}?KS-_nc?1tlo4Vok-SM+6AUr~QmQO0coM4g^ zFo+54!s5v6v@2n8#l?PF{p)CB5vrlX#kR_fj8I-)k=bs*cDHewdK1dQ-f!sppk3SI zyHCyZ`cvi?g4v>s#$@DRT&IVK9yD4T!)39hx(4g^`&&BsF7%OU_uEU zIFKvONrN<^%6X*%yLxc8?Xe>t#Th`amnOz@AIlE2oh}f4wQt=k2L6@gWb9zyZ>z-Sf)X6DVM{vB5VRa+P8dt2JD1~d(z}gmp)^`ZuD^j;F2qx zXr;>P^og_Vrg59(L_}7F->@K=c&Zsggw98TG?{N1*;}@~i)3HVgbYwfHk;|?d=qO- z-X{RNd6?vZ=1jAz=7+@6$s(BncZq?=y3cuj{Khwd1;%x1uTYbqOd4?{Jr|w%0=rk_ z_Kn1B_qf8(ac+}f!XUZ<9r+Bn-B8b5@0P*f)-qiAqM}J0uY|jaJ}8ScdNgcc|FmlspNf7|na8*|zc5R9K>^(et1Gj$Ky&Ejm zPg9xtv?AO%-|V@qQAhL#U^7k~i|yf?LZE_G-&;7KmUo*`jEeg(ST_btG9M~@diJEm zj(Vl4?(;jyZhAPPedm*>Q+KyOc=DqtCRP4++d|Cj^ddoRsgK^EdI?1Z)-VYU68ULj z55EMicsD%Kemle;mQoC1Np6)C?kA@@-(t;(hkpN_UXYo|r@u1>v`=lB22RWrhMzP8 zST+gumw@HE{^S?wQfRMoF?|+uK031l;lbL+S@_n4F{C?^~>#08_T|3m<0Ab~zJwtwgd8 zI1oPG+~y{zaja9q)|~n$(NFh_xSdAbk9N>j! zK+USF>?h0QLuF84_TLS%SasSQF)AnLzikp^)m?Uk2XXSsJ46b*6@OW-(<<3)kAZ!{ z#8Ij&LW-DXeV?_o3@WZvClYUo!{TsoCas6dp=i_|= z1CHz**n~iO8N=;r<?h~3n8nBwTUq_0WEp<{8U%^g)0U0&4_zFd^Bb8oqdXLsY z?y<`6zFpoke-!#jFl4C*;G82VhucaVuq^hnn+YN&>yr4)SyG;I{~#dHeIj6(85-+W zn<7p(OF6F#&<3ecUl4ad*wyg=&-*o1*E>BiETi_nhv2&iD(p?^<&)p|dfe->ZwkZd zg4%jc&wL1dbJFH@P$CB%(2dc=mwPjHbE-u_Ba#jb+ni9 zblz9sXey?LehHMl0UWD}CWJaA5&^bZ;J=d;Hi02S#OTQ3b=_EdzY+TT%q)%Nr4!bj zrSu{9*6z|n2sIEl-rScb_n5+LcC1-OM=vZd6MXg$%Swvg`04bC+2yKsY#^Y-pg`;y zH$QJQ{RYkdm=uHCWs0J2{OKb=n+Xi34eaHIeL#~D0If_i)Gq|D2euMBKOY=hBZUx( zpl=b#$NI0=yz?`d{oymD0*q*{wk1QzE_RSX1_?*pi2HHxFR63x=OKp1Sohywv4dOQ z(qmcrgKhU0D{mH%rE8eheQJdFi2OVQIhimgHRuAMANKi{54I%>_|#UY28MkIauvIe zL{ktu##}+H)-VaBumA5e0E5EevH_H%yc{cGjs5Ih2AE^UgrXE;N_3kpfb*Z0;pahw zG_Kk#G>u94m&BTtwe%LX92QcWsTRve%OctU6Bq02|V*ntRV?;sKoga}0h`c%~8_)w~tt!CZei-!6 zw(u$1ZdLMuCi5xC{M8i2u9Y3#*38RPR!$Tc7^%srMl2h-lDn;G>pJ%T3>Tkbv!J`U zfI}a>$g}~D3n1oOJKaNN*tI7> zv5B6QE?m*m+rEF&a6Lx67W((E2G(mD%IZu4c=^_V1rX}yt>wotPy9nbbgelPDhkr~ zInkkEc0Fk5i#ey(+Sg!4TA*(jm;r?Spw_)B99FCe@rPp22<0EyLSWoHqlmta@pM&q z^uPW8>xbaR&-^1Hod8PY1{CoC9OmGGsESu!>od-Pgf{g@5cw2)3@qSU#DtBiMKxaxp z$S&Hm+Rp*4T{K{!FHlE8d8iJ6s%;{SZ5)kGiwRL@?oR`lKOlM^%fn9 zXBUA??uXv@2U|@tfl7b=wNNXcUH7aBbTij7JY3gaOdSjt%^IJx3g% zf5b)u9`KO~_7s85EubX=giukQ|Nl?#M*?xJ((zV&bb)=~GzfR!miIrK#^7@BzPMR~ zcE^^xpM@tIHlJomSq10S^bQ6rVl~dKHf8~2gl#ee$Ov|g16ULj24D0IJyr{7tJL5Z z*S}c~VizAu>^afIM(%s?`Gz(B(_H}YtcEA)2eV92jPCtU2n}Fz)pjpk88v6Q_h$qK zA^Jz0$S7I20uQh?Y6yJ}c+IzGRul3+tmxWX{`>@R^0g-*`ubZe0NOOb@wM;zme&Tz zd~gOQ%7L+b*X{wv=1EF{HHZtB_gY#YwZarsU=(dk@3M`;txQ;Tq_U! zX`R1^=|5Wn38G5|MZEE&h!3E^5M%gx z83D?#Ox?F9u6p@cal10=pl;}I?^@-$P>BG5+1jshgfk2<@q~TQ z(^~u=R`i?wtwHc_R0Pryf176L>)lg^q3szz2bneN`mX6!CQVR>;1vwfpx7iia%oli05lhfboK|`yUdDUpxv*2-V%XL!2BG?~a2zh!+ z*XBQ@3czu$tfJg6!}>q0=>J@;Uq%ASYd;(NH{cpSkMaH;&c8eHpWXab&?AfEYmWZQ zGpmjc6~=$F(f^R7LQAo4wTSVv8~?mse|GdAPyFoYU@X5w0T|2g9tHHF(+OXsfEx8P zpR|50>^qU`^k!(@?EMR|bDbYh%OqyoU&DLySfD1cZlD4-`~{PGW1Hb~@%3iDsUaFdy+f5tv`&O7K8wW%X^^g)@~09T9`#^ zeTw5L6L4H9hU>os+Q(a1K#PSMX^ea|TNji+k)r<8TTorLrD8IIw=H_{A%(t9|t~dS@w5<7XfO%MhcmWF0PB(k=(DqGwo53>& z9Oy8gf%gc5ewj^*3!vGy$vb#ngpt=aIZSG{s{(>=Cv|apYP#SI8EB~IKm+_)pw~hI z#67^F?yuCbZL2}gPB@WM%Iw`?Dt`9wk4%<_`89wDZ7)H1aCDXj-e*oqW9 zP4|KQQc@G|4m4Uwx-mQF7E`%G&l*F$JD}oU7Z9F)AM8KBHwYL03v`tJo98u12t%Wo zshE#AML>EtF*%9Q9wqXg39p0sxZ;n`Zcb0IS%MnZ9p%g64E=uNMEpj3UrowT>^J}+G%AJacK ztO%}unV^x#vkzZ9t+aXf4qeN5J(w|_E`T0}nhBK&`KdmPn?Mm&3Y8`` z_=a2DoD!WEfocv<<&b{4@|#2d!hj>Hg_nEtZd0zD^Is6d5X%vxMJb?QorTb~^QUX@ z%Z^4adl`;{yX6)JmOSMnxI9BS6i1K*l_KHG11g}@iVr(guy;nf!w7ZZTYQI@)Nipl z+Q~g-LsIk&MaW{^sPVL}n{D>2yJ>v|6(^{opu3IL-2n*sM5=R)+fbKE1Ks{ALVs=bVLmQ!mYo%YBN>dBpq#D2aixe?P~xlucTnxzjn}gqhRJo&{&bQ8)?jNfwY4j&@(2pvIca zW|AEK0ewZ8)1t$+Xc`rLq^X-YEBhfn-pY4Dc`~$}7;I5s zg_Gs)S)kUAN_F+1NxO|%w^>eZZ(J%W7l|zjs>w95X!9L%UEudjX!8%5+0LCUUK*+A z_75m6mkeO+`qPeAh*3auA`299ptdA9$S%=yWTesDg6+{n#i?+wz4I;1P&6@++ug0C z06MbC3=|>GM%9I?GIP#ZhQ<$DjxNx_UKo?YVH2+G#dxTBb8?8-T#MR0t+MU1dy9S6 zuzkUTtLT8QUhN#OG&vROgcy9T{tw2~$@`-ePw4DDE>9Kb7VB~B!Jo3EKV>gr^m5Qu z@&SijY~*&v>+Kq;PyyFak*nkA(a@$G4$c^;1+YW`yY&$+T~QJAW(`73ZbUM+X3}ts z+ts4TlIHojy$|R5rC=-}b(p)}VuMGYRb8mRY2oN=^Wclgg`6jc$xYR=yqTq~n>-a0 zPW4)$OYfg5AmjJ3lb;#kY^y#^k<;I+%Uu`E zX#AY64N0}KAyJ@=ebm%~GHVqZ3^jpqAy0;KlaKi~#gbe(?hN<$+WNLUZ_wDvrfbC3 z#rR~JMeiSnGo*=9k~Wl~6tt(9|I%+6LcJ zJ(c%9?_7FyNYz_~|BX8Y9R?p+fI{N5#w6r7b8CIItpu)oX=-EKsr4S2s#80R+C8SX zSH}>g!4`tgoqbWKCPSnYtVadA7}@#WFAIjRWI*kj)(tIk#CSYUmOI|P3K{N-p@8;v z5DmAX`f``w3!BZ_GL1>D+d<1hzsEoVLAa-u;EBd44Q-N5%qZ;#E!?}n&Lwf+e0YhA zY`$8x4G7TdF0}mH{S-ojOS9P@7Pr z8{GX-$^gvn7m^N=Urp7Npc-&x;w*Yjzm0Uf_?B}=JpULLPcZW*dgZ^nS^{6 zZ$?PqyedbvZLb5Uvwr519qzBTsB=}rtAl=&n%26vw0;pV3EJeUt6YvM1*k{U1CYR) zgOIBpz{Oyl%epb~X^i7%zi~)F=f7pQo%TRsf@;)ez2f*f(6t3Mnyu`jg-W2H7?F*L zk%5&w!nAtPf+g7?GT>q)|5J5xxo;g157yM3Ef#FlUZOwuwWt!cGLrOMH@I|3Z`NN8 zMAmntkoG7)(uhXvX6CZk(y4{Fk2>BCAm_zdB|PLfW_=DD``cfMJvwXsB)GLO#(s0W zT*;`_0Gi(=O7QuKK?>g)HQ1=6rwg6IrF1{<{LP?*s$>yAzr24Gq~m)G(1Hii=S%roBPkyAB}8?mnZw=mpzM z6q0b5QdwJ5F>si2kU6!tqkbS5_zvQJ#PY&%)Pf0!neFygh^bn7VNi{-;-haQ6{5wf z>FWF2LSX;h;0w#RaM>J??n3P}B5XkzqE|e{d(+Rlt=hyECpKTdzD1#r;>Q0dfW1R? zLt9L8rion>KIyOb#^n3Vqbc~ql=~qUlXVqmvC^S6;AEEAoFI7_m%h(#Rqb7bXH=>$ zb1EL`nz>MOm@)+Jc|^qY)EWn>mpGJ-VUYj85tPLD3*FOWdpSB@fNnRnCE8m%a}f&J z|A5*=>r$<4MjAstn_ROObAaj%df&(Br69U0{NbxU0+IC2XLWReb4{Li7bQU^@OcA@ zN8QN9vXBl+_bkmk-iInIeB-fVk+6F~wx&bQr+75rVB_YgOkUu&8DFj%5U0xl_q?Ij z0k&gHhWwl`g8Md;z*V{R_CuQpOjHeZduUb@ucE`>2M#1}zVt=>*6Fj3o6m;t+5dFl zz}%ioM{a3OB&FOoKXYc|?%mqw&!=WQIHGo1f4(Za%Aq}?!dk+-3XG;+A4#j2pZv*GRQQ zimrL5&B7|Pb{3ZvQW1VTww`Bv#4x7bVZN5EveQ>8R2F&HLUGn@LP*Z-ZO47r1=OQ% zK8mLCqgV3af*!Y1J2#$rQm?)vI1>i@8h0!p%e-?76EvRLYl>^dN~wiCi|KCPGBS2| z-dn`vedAOyC+zP1mU7{s$*>M#;xMO?YS@0(J#eCf9+$vglJK{qVG#BnvJJjvnN=tj>UAP8N z6${)tLI*xvx*c(2Xvh=o)=j(nxbwvxR11HxIS1Smd3|d7quWFY_;a;sGkJ z49C{n`!AUb{MDchgDtAM_fmRU(sv*)KLfuI@$Mep)Xq(=XS41aHw~PVardf`5$TJJ4%sc&&U=*}TjF)yg5? zdPD?YMx)LfmWU1T>Q;7I7TUcG>#i&C6AbUp9aumpo3j#~iP=t*@Whasc|HFRcQoxR zXCxJM%)+|wcnhsx*bmOY|8Qx?#xpx*&zu0U^_625>{zy_VWM+vwJ_b|&cmsz%^H4Z zWY?YE81AfaQt5E2u|T?5QE07e6px;=;kr+ZU9eZ(J8vh|fl_G9M&*e;0tHxErvb~J zK0_Yyhl&D?xv`MzY9YObdHBk zBM%o~y~giekx2HC*YO#Xn|jOh^*;dSH;=U?(Fs#saMj7#b-ka0*vO*G%}*g$0PX) z9LtyEtYcggnXl&jUl*l!uw1#)KxO0cE4V69;A_Kbs^;_giM8xV|NM(~mpYt$MoNl> zs%4d$(T+vWY6fD0O{Rz#xsT~EAdi`Z=k`(f3Vh4_z2iKpgk)W@cuQi!-SY{mc1*@I z?tFGKF2j)Eemlq5#n~@cCX!oYZ9-xW2}E(XvyJ*5=gk{#+dJ5Yt(K*}ulapui)xOe_feI&ujaRO z7}o~#&G$6%iQjxNI;BXW$mXDDYykuse&DIK`Izb1<1KLPvOsz$!Q-?V-d)=gYxtbQ z{Yx4l93f)=>d14ueD-D`>vLLRX~r&gjDBBv|E??u6Ff`t8!Dc^l$q*Eu2o zhQ)`E9X_;%l~V%Ln8NwcJV~tfa|h&E79)?qqX(QcKOEK(EXl<1QO;cO9IGGMBTprL z)>n=XztMd!-=woKLU~^6u}o!f+;DM-4jE~2OhD}ZLcDH9+Jsa}_)b04l5Q(KWMY0uI)Rcxn4Q1M8hP4cQE&6U8*B(z|8xk>~!xV zMK4;84nC33gWQEpQ$r8hv_!%?X37{j4+-?EYJL8isa9^H@&@`Qo~l-i3yQ`Ay228| zCIVlZT6$b~8ad?E9M4H_zH!*oP}=+bEkB9(&}_3R?X1$FGJ?TQg09@UuUl;zNvJIM zDCE_97=_U2Z?-E>`M5dwREclh+;RG+Eft%K$K~H$GSYB}$-|%M060*-=a%md80^bU zzQ1no4@%g-Pir0QlcWx8cg)-d$;NR@8O2LT)Lh92a5Is&kd&7Jiad#B9-Wk_;O5=9 z;?x!@fBgV7v@3n%hgcTQDmAYut(Rw`=7B+|8B2WppyxA9aFE@A9}WJRCG3gOJ`SXdCB$UHg`f8Bt@(Fo|-olq;Ai2i%pmnpxA@n?7EbE`@j3IsGS`w^?t| zZ)LAayw9Vx$9Mj#KkW3|vZ?1No&2$8)uKY2s&&d}jn^&8x>xk0uoI^IL* znNV;I>)|MF)EqA3KGEbIUN78u8(>YGRcndfbM-=wt1c*WGr94OM2|-IUJU?RTUMQ{q)7j zi)x|@BGmF0b$e4KD@y5*7t8z%i2Dwm-j1zHWNm;F+~AakAo&hVg5sM3)RN0YV_{Wr z!lcu22*C)%Vv-*c@+;RkYIIS!~-CSs{UJbGXb zpDObVDBPIeqsCB+JHOdGsn)*gxD3rXl>@E^VzkylS+T+mzs)nO{HekbtdyiXs``P% z0dP6ouY?vt&X7z$A%mEZy|s!b>^gNWL+s!%v1CF!k-|A29z_R z)P66TQoynBYSyOy{-h19bc0RLw4zc=WiIs#T%7#MTmJb>1|FqZ!O8o98EFuu(q{4~ zT4vA)w{%VYtv4uf5cy;78Jj$x{BnH#Ptyj)6^OO~aO>TWarvPJqxDpk!wIYF zrZWx9=mzU&d%4-NIov1m*zkfXRggu9lVT^o8b42Yt`k>V=N9Lsr2&>(r)H0}zx9Vh zn2~eadPjpbor9Ex%altNIegAOfbgEQ<$%7iz$J6I(bXG=3!~6h@7(X&v;MxuS;14` zdpL;k<3Zv&b;YXv?8g!;=VQw{6Ht_dI~$_<&s2Rd*a-WTPeY#c3UQF=opkxBLD3{z zuBEPVHd{CUR>Q-4og%vJ@-3!bT>g-Ea!)eNGvr~2C>bOjC;CW#S z=_{ml{}-?`#^LZfZI+LjV`^|?5KzQ@3D&*AZ3khnU#Rg)`ZL8QjoqN5o=#&=yE`1? zODHI2+zZV6(o;6c#*MM_))n%b&yw)Ruj}+=T#M*CS@V&v0PC~-;$h|&!O*&}dST_c1kA3Cqp~JiDg@e{YsitkB~vpRK9O_&+i=-7 zTZ5G3S$c1LS&-*1F#NU-pJNw>Htp6s)VP@EB5y|h-Sh*FJ^$KGJm%Q$(CMpN(9{%{ z2RGB;JaKtG(cp!Pq(VxXqPLOamH5&uAKNQ zln52gZWE!^_JJeKHvt>XK)X|RlqolZFq3gu-sQ*_LKQR2PTs`nt-NCluXxmY02|_Kdf2N%vSM2x>6T<<>0T!H-;?$)z(2 zK1GD~MY2MRC%<#ir!C`hxb0`hf#{di^Ew)_y=f|AwmY)e~b z=G6j+d)VXQTFkSzks{{~?|Ja}k%)@Ef|vBcTHoG)rwuX?lS*~hz`J*3R2ksxN(RRr z+wh|^8d?6?9?YYhyGNWQJREc7=p_ZlY&JM8L3PA#O+-*5%VTmla=}EUOLU)mSiSmA zU%mvftgAb#o@}+UBS-@GE&)kGk0T6Xaz8mZ80(5h=vG#S4*5)j zD5~#d|L{M(j3+UjlUSkG`bsbO3({HkS$4?#(a$+FQw(3W9l;}J4yr^FyjzYxZ>v_T z+K`uT9mV;0*~QVjBg`EbK3_pNG^E9M8&p2am{Z$a5KnR4p8toj9J>L?oGOMEzqf6p zrSzli%(miqV7G-i4w-`RX{AmH_}whrLA6v?uH0pj8XZVF7=ho<8Awq)G-6NcD8!wn z$JPL2UoKHsAuQHBd>A4zE-Xi>z|Rz+dbrQwrS83@VgfJ_M*ZER*@%`5|e!w#Z{ZN0WZmZ{Wgx?%S@m0(;7M6 z>x8HY{8A}1f_*=qFEt-QP@Z6L$=)hVF*dRvPIY9QnUATt3V57`;)~sDb3xPXL5hKJEBXCO$Ix+SwEiU#6?NqAjzg z|ERQYYrZ?DH-3Bj1cgV@bzU+;vnp>oCNmVxqgi!nro`dSB8Q9txTR_sry$XltKP2b zFR-wsN*%6T7xrwxcKKu!zP$gFpRtmHq2G*Sma`Qr(eimpM?h+scZrbWHTV37LD^Ft zgeH*DWC!kkN12ebifs0|VJhrJd8VN}af?gVzv!iLJpX-_oqpPG!R<05USH?-Z`Gj5 z!#CO**A=oL_T$*_mGA0~U2X$MY;F5JNPKtIH7fN3V*b7#;jqm*%#0j!A#GL#@KRdh z5@NmwIc^Yd@80RqVT4ufPrrUI(YsG#TgAI7l5!wcCB+2iy(l<%*Mrr5yrA%^H0Sm-Ag?$E@|Ou9VS{eyzP( z{v^uwt>`-sB{Fq*X(;tH5!u5Wf%q9-_@LhJD6*9)u~whUBnAj)A4aJ-_$D?8{RwH z01~W94kc6)qQ~@i%2^)vg3n(n%*f?YW|WRs^&7UN~JBzz9UKP{uTAG zrbq5y|47$%?N&bhglYHz0!5*iYuQ)6{pubHr1 zR4`dcjEwHJd@abkiDv8v?9#%xu7HIuYCc?NNp(!Pp#u!x2>E}R<qjOuk)##~KS3 z`$cpvSE+9oGgGi~p&fekQ6~_)wky}4 zl zb)>sTi9O~@U%L+_QOE9CenfA}AiZ|m<;lpHu>u8UqlIVn4kHD_LfQCKngn2!9}G`gs15s`>{aGOun$xrSuEGl7CICo#}G3=8;0U|7+G z7lMknXl`W@?AMLd?kzp{&dN;0adf~_o31;_wKLvgct~f!Sfi3=1W0DSm2P4c)6QV$ z*Lm#SlR-5mv!zNk^gTJV<6;R8i3XAN1HMl*n#0+1_|J4i9ueHyTbnmaixSBiB=KI| z@VBF0zkpCjQ5YWkP)Oz0TBJ9-ycJ+tT?+;IdByQKw0G!Ow6pGE z@#iW%wZ$}bto`iAz_gKkz-Gqi4F>XvUdb9DCC_wEM|MtL_2-0Rg`5pd@r(*3gC5p8 zP$PI-dEbI_^D)4jEsPzmd9&ioeiKOU_7odm?0nK`cxtIkXI@y&?E(}xQ(5+Ub-e9|&wR!@*A;Az7DAG+#pm|5UHHMcff~D(Xx@H) zCD6g6h(55p%iX|pNkG2YeZD?+lmL`cx5An_cpf7y>n-j`oO3n7DMH#NOKWm7k#l6o zwsWiX&Z?Gi`)oa{goRPDuut|>RlwX8gfw>6+oL8yT(cycvr>!XbBmGg*G0FSgp#~} zb<(q6491ZWy(B)5CFbd{?qM4~cFP&^0LfWiuZH>9dTA3j@nj83KmV4-ytk@(+2YF7 z4K+&$BaQCK2FZVNXK9!C=UM!)J?Y@qNu$8uai*63YBCV;5FJpM2^2Vr-&He<3uro2 zxHK~?ch)oBIcHtSvhb14MqKfQo7n#}B^DnB3G5h8P<^=OKlJE4n>l7x4u-WW@H|gxLal?>7R=`sc+8dsk*lUU0RQ1qsU2rU&30RlTWMTqOt$} z=@;@OOXq8y+idbMzheX;yt{_}y2QK8U#Wtj;^^*$1eGfHnI!a&FKu9KadhJnRVE(- z`gz7~GF`-eh$vbw&h^K##Dn8Np=8G_0Hyyz-*PT`=F#OG+$((yNVnC#oQnDARdF8_grI;W*tB(;DkoR$WE4$f?rs4yFfVo@ur%m~ZeG>K8<&_SKVV=zR9EFeHDD95V|2-PB(zo0}p>^x9c7ftWOyY|&IUvp;AbgIiK(Oy7ce zN5F!NPhSWHqPI9H#`FKb%17mvW2Ux5Sja*Ga^@oykJ+helcfvlL{f|euaQEh2ir9IC_ak4*`&2w`< zjvHSo;!W4eYhGLQ*Ss=N0mx6qJW8N81iyTHbUd>>?3ERB&UEQ@e}5rDh!wXiQgK1N zZ6etwRYFHHw^|^_J^VbE5ra!|_mcjsJ9Bo_=w6nJm2p1cg9>{FuS3AP@4@K@Oz#r_Gj>6_rt&DW|;*dB2VqF@smVpPG`ZN)+A1gL4JJ{P9fK zOW`6rJlZr}S!I}>*#5VCSCq8PLkzG3a4bt~!%YbKPPWaK<`y(TR{j6Vf6{LGnm7qQ;j0}l;=$Es}m7vtwZnk*7Mnp#= zCsP--6e+QFy5g@Neh-xVwF2x{w5;#P%FYJ+`FH<()%6br{B)mt8D~7Xun%O7S@*4DlzMuwHDn$7V;K)g1+9Enu9%VX#7V=-TvfaIjU_X4I0syjv#!ST>R=tGsIPG#@j6zs=$OxQ z`;$X3DgqNymg5lRBv3&0X?y7dv54H0KoYiOCG8WxM>+|c(pVQzz`ya#*TC%%haiP_ z!{ul5G`8B;Ms87__)0F%e23vso_N^=;3pU{)*zjIGyFvSqm>*o={Koh-9`O&az`H>-rpq{G}LAiwQN7% zVc*+3mV;%4v46Hrl@J?`ifK=XAVEoi(oV0MOy9S@Oxw#hY5=IAaqY$~#jQYpK55KZ zsc~)JjLaeVAY-0`*HHmNTbJ`F>Hl(;#x1u;p%&jHw?LIJ5-^Rda|jT4;Bq+xM!Ba~)3cg>L+EQ#y#q|4IY#!T$B@=ClQeTB0@GhbUSUT$y5#%|2qkr`D%4e8?6}leyKr)-SE17%h+Tx)F6|9q8IF z&8Irk2u}3p^MKDv<-*^M3sr76*kWi{IwAf(Sx7~M{$;jy*s(v)KYn4pDx!>1ha5|9 zrbHL&3rM6FlU~SPH-xj+FnV{EEWQ&sV7qX7sffAg+NbZFv#By41bX^jdVN2LQQDC7 zY7DB688V~lS9@l=GC--kGr{rJ6mqIfhph~4S1oCY`8U6-3Zxs4vG10*R3*r{%k&^U zH8k=|OOo|xmeU=Yn{s+xSZ;RuJ~3e`aaU%}o$+4o=BT9HN}9s!CPc|URY%}!wSlO| zQ2ILT<2WKN*Fi1Up?aUlW9m*3`|hl1@8>VcnR&JusJgC+X8RX)5nqwVWDe`{;y_K; zFg9oMG0?&psMDr9y8zqiXdVQT7MOjXvA;ed01r-2t1f&hmtWDU#4Inr3`4=HCiXP6PF^F6LYW zzV(anFy;nVpgrN=kE}L|{)e>PmHc*6k<@sgcRwx^@}cO3^CEO`Lez;lfzWJFjaCI* zGHJ7!V!@r8(TS-(*kih&-{B*@x3u1!otK|lAqn7L#>3Cdz3Q%5P(RL9=|q<}7ykV* zASe5}x2*e4cA(yeSFJbr_bbNt3PeZffttlJfI~Rti79`lh`XkG%>|MUq;38Yo|JyR z!In;97C&EB!Ga=DE3l!dovEo-=o2&kbbG+{<9Hq4CbrCxi*We-<*RW;yl*UJecB@{ zwccY8?+BH-%MO%EHKQcdE0Tl!iz3Ib53A07oVvvo#h6kAapV@4t?nf03^Y2 z88iPRaO*}3X3^6&PO3erRU$m(j3@Wa$dYhLD)ypc+_;I`qD9#VKmqZl%fzIjlQTO4 zJnqc)mln7^-0Vu&K36>vL82z-%HJRikvB4BX&Y+p2m0`q*(kDh%@aP-<9&BP0v7~M z58ef(Pqs-HS#Q7nP0d`l5!G_nK{n6wWPqj!A+mm|SS0USe4Q<*2m=F!eB>P z11M?8kNr!>LC}gKS-$m*x}n{^7!j?nlWr~8ZhKOgpPVO9lc#m~XaTwTSr9MHSTV-v zmA|ohwm`;mEe13y5pH zd^xf7sMuvZGvJsQPcxe|e^4`}UPT#e3l*BMqcNX+SLLx%e#dXpZ{WmvHv()S}ag zy*aWj6TQX*DCWn&Gmf6vd%B!H4w=2+I(25PiU9RYeXo{g<$+ca zi4YPeF=zYI3|t-o)YZh{6QgfL4@h2MF=ak!X75g5_a<2!tFVlewB*vH|aYRfr zw)vk=K;H3OtkzMUILnhI(%8^eThww^0kpsOEDbV;5Rd8~f$Wd#6(VvJY zdzGF9)ikp)#%J4pU8Lj(peHpMRA1Q*;!EHHp!3hw9ZEY7amywfNje&oKoMwhnLWF! zgz#oQ&EwgY9lLnwEy?l46>@&pTknyD`kCpFFMEHTU%;gl}~C=h)v= z@%+rCr$TQg&0C{7u;|MUa@qR%wPAIx|UIYWbahXr-!WA*&#hSMytD(pLd`lIkQIh;+> z%u!{nmL|%0E!qWrlP>9iscv#Y^JXUga6L zB;_k~-1OId1=_CZ{$d^clz-bE48d@o#zF*rNJl&E-I~*HUQk80Vu&xbp5|n2{JW1H z@pR*T7jtwvH^{>PMdnHz^|*^(ltXlMWnX!o3rCC^XrG$wtJ2HLE`e)XL*FrU+G)?Z zHzA5a0bOhR8y`4P^PQzfIXr$2R%rYCKQuxy6DDo3;Z_>_B939g3@DEX4R^E7gJBw8 z!aqeYV|Pcsb*jw%tdg#n#nj6fB2Z7oFIcftv}^;fl}_oQamr<8ox>rTZcE)ZSNr(X zqpq0nipP8LY*US}2pG-+|)FL{qWHfiK)xB>U1Wvb4(R(WEM6 zL{cSJyH&O1!{Js3T2D+g%lqe_)aM$sZ`zs(#mR!A4nzk_8I!B$tb^ZWE#Y{SU;dGW zd+VO7TaOg*6Kj)dfU%hxeOLVdc|F?^svv!fpPNiL3U$t6$&26H^tna|95^ChMWj&M zRcK8Nz?1XFLc#SWH7M=-i&%i(-_(T*?vg}EKZ@b9SwXlZ=yC6z9KolC=0E>ykD zr@su?z=JT&QTdglX!7ke^^Aq+7&!IZ^c(W$bh`@-R{9?I&>?#T09Dvw04hkO>FP4k zz$APj)qTS2$qgXJ&o?!$Rwc>ok4gzSo^@lIUx`W2NWD^#A+CS3v(%=py?M$@GKMNq z*XjPVz5P9$->O>)`FjtkE%zhQEJAMxBrs1h{Gh0sKG&>H@%miZUsfFA$Vv8=XlBIa~^je-f~+H?z~bW!7W~J`V;hHI1bXiP&5hN#Kw!_R%_% z7xu^XUE?L4%SCI9uT^xnFCiDVI6ThY^Z87X(cxqR2Gi``*x-? z8iM?eP`D^$BMDUdJ}Zhg?Te(0=#n=T8#!aNhvb9(wDc^3<$c&E-eGE>edN9XtGJgM zQ}oXg{FI}wU5(6WQozvOMSHb?^5xpSWcsP0y2K|UM5|g- zSjGGxy!nSDocDqrwCaE?CO$)y+23P}$t_Rm_Nu~0%^Om_m@^ANtiXw+ja;!_&P-Z=v7 z6G&3Ax`W9Zqds9vT!|s4N0*omP81WL0+%*d%5QgCwsDa3aMLwirX{JV5C6}HchZ3_ z+A934Th+i&ks<&9O#(1SiTHf^HBaZz_6G=eD6%&m$aI#GRP#p=*;y7^ASIaHTYmzu zYoQthGtvp)_`b6+ZN&oVpCeu^cIkKu2mo=myTAL++E{k7 zgEpk#B9FHiZxMNr$)ufv_pqhgIEH#^zBB>Z*?DKVugXxy^uj>>BvKrmZ=5fMyNaz+ zdTJB?NgNy?CezR5HTX=)HYB#_5HW-J<;&vyl$Ux_Xg%#?qFA3Y)`O=IZFXNWRYK!` z$ut)@#(Nv~30*u6J(RC03UzSNIS0TeB^ZO+XIQi|%ux-nNAj11KQ&PJ_A6uYkEz*^ zK~g|doupi{k=2V(eZ2J=CVuAuFHL`qfQf`2uF6UT*k}hX)pih=6@2m%zxE9T(Jl*5 z=`Nx|wJ_;^cR4;PbM$ztFzJNL{ize0z+T;SB+lL=^Jo+DW{OrZd|A1ZH5HW~2pa`I zZkH4sRGSurDZ>73swG@>(Ii8+1b{E@t4ix>EVuh}kvcP60Fs5}E-zr^%_*Z3G@jKrKkAIe5c;|6Iy+5N{eY6~ z7XCf|gZ43)wrQaw`evMOKRdJFBp3H-B}BvgLNn(eImNgDW`dsEzT6Aln%$r@42==6*h?R$3`}MFw+6ZpGF*2USdc5Cg^d>nr>;aoxt+ z0soEaZI{>KV1E4a6Ru8_eTB<(!C$8w z&?}b`6t5CO#U#@sk8}=#?wa6bP3%0+t@3>Ouo>s?D)rd6Ab;sSKEB5T;r(@2zcxt~My(WQL)9dj_Iw=nIy zyL{cpd7Etl4N&QGh4gN35Y;G_Y}u~0eM$7)?uVD8TLpVUwB;TMvm%068Bux0(wS$T zbRLZ(oxJf~1zxp|d|8wq8+RLztt>2XzOx2Y`p|G#b23%Ban$@)hmPJYHgafS zz5EM}RN|i1DvqJ#N6t%v_-k)oShpzjKsV<}vSCgoV1U#6Vuyt&doy=}0t&Wz=>AmjD$2J~oagV#a z#uhzwep7>##k`x=^9DRZ{e82W{l<1=4Ahm75+MTJ1vwvLaMtL&Vh!ke{ z*-EX->JjJ=u^7g1w^dW1NFROjgDCg3=>no$C3?cNDeu8_HxTqMgujqvuX64?MCWJn zWhCeBLb+Fcn^wL%(ZH=(11k3<1RMwL?H#5+NH#!=m*D}{{9|F%NA!j|j?{JH@Yu>> z5CE;BuMKbv$)FlNYC3nS9ft3nJK6QF=!V#+gIc=h)urvvD;n@&!P4600X*8fp_&Tz}5VT+Lxffy^tGF9junHJCw(S70Nm;Pne(SV=4 zaXZlA2rg!g@v1dHrZtEfjnN;RB*c*VVf?k2%B`r85g z=AT7Lzj@)>5nQJQ)Qm4-vp$eaM}gD2iM#kBQ&Nq*H&HuV1$>VocB?#AEAUw9Jg%Sa zw7ZX|nS74r)k-Tze4r!8L>#;4K6#|Gd`aR~Em@_m#IT7q_~J{@Riup1!ux$$36gZ4 z!A{F|IU(7`8|*ebNv!gbUoE>;+!Yn=_bISnlD(0{s)=az+sD6znJg}Qwk0o=O&6N) z=3KhqE>n8GwZYX^^1E)J|Tn~45>{A9f8`{noCn9zJqh%M6(UhA%L5#xk6pM~AV`nT+hv{t-(hOy4_>%TE6X?pS)*Kuq$*M4! z6nrid#MRajbJ*WHJ^0ZetWM{!6%vK|qt<4V0A`E;+nP`fEh5wpqDwv^t44RXy|ppKA&B}1R(hlR#ig=2W9Ps zm)qjkEqe88+aJyz_Mt0)8)VN2nnBIba>0;YQLu2Y;CnydROR-C2&4?qE9b(1JXdNM z^hq9@EE8!16)5NYgUx1k_N?N)Sq2W#IZcQ8@y(NKPo(FQw(%MIFMLQf8aN(4Em8VN zB|1|8W-2{~&vbDcM7_8iBau)|@NbiXc`Sz&Me|+%V_HItGw=d`B5l9BT=%zu(dqpp zF*k4B8DGMa@CvPOB3Y_*^)LvcW!s>YBI5JJW`!roM`LfbnLdvXE}h1DTA%OiBW1`V zwt^0g#evBMq+jW*wdfg<$%PJ0uC}IbkZdq2LI3A`QH8SniGk>qE}f8CP1i5#iU$ko z){rK}gc~N3Km&W}Os_bvWuZcJos?yJ*65Vn7fq0?|3+$DSaCggZ?i1(x~mPEaky7&crqPWPgfo81#x<< z^{NvRLmfc>&C@R5?)9#r1{|i{IryBhZf!(!YupV=CDsv;`p=nkPkMUae7&1KnUz|X zF=_G0A*^|21HaLM-7tHyA-wFY2|JfUAqbe(4h)ccvSz7KdHYL9;>YWL3!AM1&E z;m~*hvnFw!$?H?GxL5aiG68H5sPTn}se4+9oXki)Y#TV{@vt&aI@`IYcA_3t^3zl%X> z9~!=J^bJl&p%~GqqY}Jgv2X1?EnnExD+h3j%c}o&Oh3AR)Z505o(?t9u`l&>+5KJh zzf6eoN5COL(AAP*DZeR*_>Y3f0Rft8ROC~Qi?x6uxJD2L+6>ntndf|eIt(&;j_tl` zWC)lMp6nRf|MF#=rp4}*fUb*Ge+76q=7N2C4so)3FMzjnV=?Iwu(^96feLz+*paUf z^}ufRpO+q9{j<8QdEzS_A}I+RvL}~)BXc(X>YWgGEYdrnP{lc)J{chHGh<_AVazBz9t=E6B< z?2p|e-kqHg*r$4zDke8db|4Ea?9M9%PKQ&8u8nkrCVK})iL~*nYj;kS`xcQE|p~NmiQ0@Et zABCjnr0=JqGli6mRH>vB}-j6)9%8Y55ZqPugB%#T} z!NxL6Fh^b^Vbr?@2omvc^)&VJBuvHJ^bJX8I;{|tIt!MF%x#_i3?~U=P%Ck+)gk)& zwpIZjdUWP!+U98BcQWsNoGc0n>x|^e#(%|!bz=mn2v@VKEo7^P{?j(MwFHuedHjmT?$Z@yWbWQ1biCAk&)uzG`F> zh=D06tDI#$G?}rm3FItWc?%2&(@vCi@HWPSCyPD==syBz@vqG&Ex#JDy5B=#E}T`mY{=~uIjMCKl6!M+tl<@wTo@j682@nh&jiV8 zIS5fw(E~Mg#JM0P7a&kf%=`+ksTW1;?29LOILR#i5GDpYbdGWy!4TV7Op}`(h_-6! z!$hI>oLV25?t$zl?6sQI`oPdAA?Fvh_J}F)$h4Z_@qFEV)yT$<+~(n`?cyA*8yi63 zQy5lrT%48=tS<~60C_h zx)6M+9l*VtiIaShiFx+g;9Tb-7z)DjfFRi5LQBm#3nRG6V&TU2Ckr%{GHF2lDzgyk zRmHAGIC#d~MrMpG&ncqjP|OdW&6GyJ;`x($>X2T&XPN(alm{3cTPz7?d8(MEfbKhR z%Oqa8_pjW$&*;o~>l>hL<2eIe=QqLMrEh}2Rb2es-0!$})=Yd+Y}W;1JSu+UYeD2ZHWP9 z%cWUzU^9*bL$fdd=U%`Li_Sv9>T1O&gnX0HoS~-p-iq~w z*_GW!KAcT@DM{~mr^v|xNnoPPxBF0WlWB}nOYEGQ$bX)oDegj>u>7Wlyt|+}o*2+@ z@M?blyuql2%LVD!-qymaGY%Jfrj&8vav5cd4<>A9WkU$ul(X+j7i8trgWZc#6vdjk zMDaHxTmBL!(?%uS@PPFhxyVFC)j2W#PkRh1<|rEHscWxFb9*YmT3#v6Nmn@DU~r>A zLTMm8lYI*0TpHGyoP>f#WHzgU^)_#&*g^MZAlYk$AB zLEcv&Z)3rQDdgAqrnCVu>b9Wmn@uaNXKzJ54>;a$Sq^%X5x7ph4${EGE$a5+%-2~KUiX$Sl9=UNUuYQaUx+B0>yL75!hE!Vbq1fS3y(~S6A}nDVjolIr*kJ9 zBP%#Cz5Nq*0jeFZ&1=Z7@09S{Mdw_%0~ZE3O#3cph4|jK^zTxMrY4y56!v7^t6j3zK6b9G+TiF>jW& zLfz%m0qcQy_VqTRr}$v|*KnF&5>%$`(b=3En@pFp9?R>77}Q?a?60rsMtmS~Oq&~f z%W2sZ*K@;gZ-}#g2YJT)pj~a3|9YH@zUq5BrvMJoS5@U*{HN1p{G(3xklBHuPzRVt zAn1Abd(a4lkc`W`!>|MCw!pixZ%JHqUGT4)BAz`lL!T)umJf#w`9JgnZXRpyJ-(`& z&t*`{)YGE#1_YA?ftgcZhy`5nv!N++>Aw$?#mF#ecmGY=cFY_5&St|h38(ux*~55P zHkA8{9nIL2m-3cjO-j*4XtGqc%H9!yN4~9* zMDjP=s;CxoU#II_b}y+9>YGBegja+O%b${%!Jq}X3nr7}*uxU8Tsx}}To_h#ja~Sv zDjz*3W~E+v=A-NYGElH^IAiEo0CITiy7o~n7_eU5U-hV%dq^CVMjuE9e{)bY{4`lX zgof;_@)N|VU-WN-;WDADJYrP(uBgIpF|wRl{Hy}oGP zM%7}X;k1wSwpOtXCG0L3-4I`CN`ekz{;bVv5!H`=8|l6^? zuc)2C&7MtW7aGbd{bXGL#z2b~nf*7Ji_F}6g%cHcR2yriQX}eQEK_)q_5!ae=4)mE z&9BHP_b*)Jr*Zw>m9ze>kpOnnYt8D{QwHL2>u#Eu`IZU#luL#^ALytAQA6Cd>#vum zG`X^?DnF!bFX!1XdG_S@Qj07&$p}qQRXRU^NGXQEfJzsufk7madrR-B@wVQ>;)!Kw3NU{A1VBtHn0*P@yE?Q5FRx%4Ho0gaRkw)LcPwT;M}9-uyY{W~ zI~|MEODquA2B{Np1Yr$o{bUxGRlg!L7BQR(fZ^0}KGJ}0o!_U`8p3K|v&;Nb-?~3^ z_t#?!t|S(%!bQZ^osz~oU;~A~F>ogy70Y|^Jco^VQs&GnEx$fV5t;OAYjZ<&c(U)8 z=-#FrV7QmZBY=`?hn)!?^Op{fzfB5jxv&isiE7gW^ek7@tsaG7ka3!;j$h6TV!!TK zq+OdGts{9-^n*dcO9z^X?Fp|o?{t%ae`f!BUJ>=8`E@FBMqIK(67a8Uo%ezg%E(yB zNu$k{5#4bu<_;;H^`(549sS{G@}qH8t$JB$2fAupgiB?=waqTeQ#JO5PTaqrV~`*% zx?hwh>N_imQj!r|D2)SOvgkFfkadM;mL*}<#t`p*0q2P~8CIG-6h0dS935$h1gZH+ z%Jbo82o&ZyaaQ2B6aDJHl3`3of4WQC#3hf(X+I#%o#~45$cj4#pmlUWn8BA0ME%9$ z{6qak(EqY((`x|m&~=K}k*oy%<4N~VAS%OE6(SbPaqMCV4dx#}Xlwmbs~Xb+d;7EO ziUzc1Jj}Jl?n`oK)(Sty=>!_LS}x9)vBZnDTih*G-~$LTzm`4A`Kdx446O~ zourRl`v%>h63x&D8oG(NJgKJZJh*_0?fzXUkAz0c6v61gHi_)i%h{3)7(hLU1I9Lf z6e$v}74f*M84hj2>INt2E`~FrSGDMEbB7w{`gz{Z914_3>T;7rhRWWJXD)DOA_|<< z#Ve_%d7x#pU;L}DSKkohF(qK1*V>pjA$Y5Pz(H&noJHr0sm_krYmdSF@4^j2ck0xw z3~e$XtwGjBuy__3W^*(Od^fzP&~js2JSQfnd0d4o%6x(0C*<~PqBweRycgI1=HYqH zBy_GPHcy4-wiZJS>V-vpGQAy^?Y_bc7$RRK=f?+gwXgtTct6)@Ivmtb0n8cnWzImO z2u}66kBqf`*U5w?(68lfx%XIB7j$r;<(Fa%jSC1f=aybhzGB>2ee$Hp z(HcV7yEK@f9LJs*vlqJ_H1`p!t~7!b0dH}38Y?|j@dkcfi+5l5O~JP;-mBnV^wfrX zayY_2ux_&$;}f03h=5QV%bO^#_&VcQF2Iflb9Z z7@&=Fj%QzafVN*4j-8*m$J*;W7j?5P4^Hq$!hL=&YO@*r?{iK9I)~joj!Lr}l76%1 zaRu5wEG-w-Z9KotS6vG^e7wnN*p#`5YSatcNuSlZwI*ZF2UnEBMUPjlLn*Fs|E+MPQQhr~x3 zH;wyU&ywgh8o@j^V?sR-t_GTeQi5hzj#ZQ@2u!>Zurgllga5nE?cY&JA zwwnNO@%G#2gKypd_fI7STD+n()0sG2@~V&up$|@jD)9CPD`b18rnZu84!ESZ{GJhh zvX-d*#_$zAP$K>u2V;&tSG6=Bt%h#lJX~(q_qssNnr%e=6;>eyJZ>dcXrjX*(#0aA zZl89FFP-2ve_HYVG!*|$iR=R4GMJcvY}uOyy@UXl1>&>so$<+b-aBF-(|@KT`%|~# z#G}N-tP6x`n{UtH3btt3PCQ_AwrY)E?U<4gLv*(V%WlWqZQK%zx@UTG5Eob>P=jy( zI0K;2upRsj2ZZ+z-Jz1uh!Hws_I+3kBxOO4h}9L?~GY$I%(HCRGye};1T zy1|o3e-bHR<3Q)iAG5PoRyLH;1_#4V!y@&_3ceS%6PkI%#KVyhQm_;Y*>4vlY3Y+` z0Zx{r9ELdWEX31Mpb_@EUzsoI>>(kjU-^Ur02TP~;Sjenny^0P!~g9wUj%*Xq7chV z>Csyh)*S`~InwtoUqk%IyMsa_ZU~=u(kKS3_hw_8ggb@rL^_=9Crwq!->h%*xO|tXkNR zorR9`6AP2F#pjYr5=fJ!#bu*ToFimNwgj`An)Bi}_fOTTcH&i@MYs|DeRAC_`l^l@CSV2F09yhd*mt#oSD-K$?6dlc<#?-Si@(YRfRkCUZ+D6cc$ z$0~j?;B=qTs9E2(oh*b|qX)RFM*_OC2S~3k>(Va`(sAz@^!#vEltS`EWUzwliae*- z4x=}?QJpmpc;t9ZINR)DDJPab=ZB_8;^12ux}E4VZ0lg>_2vWU%q<6ymDgul_M@gQ zA$9Vg$99!_{i-yg$3}UP*J$Z;KA~dy3fafkX!}HyHG8Um|!_*B_D>Pq-aSa?x}qZ&noU_g7tmwe2RjZyIV)S3FVf ztcf8uFYk5_Ff)pnE}jss49gwbI$m2!vA~dF>k_Sti_Ij`pqL;<;aW&}%86GvNhwjn z5EWb=zx^OzyxUNdo_m6}lB?6g6}{QWbt+t^w%7eyNVWWxXt#FFi<6$MQu800Oq-sW zRMm6PPnToypY`6qd6;7ALh2H|8ZbhhD01&woS?tqX6V@u#y*8jAb8xQgW&nBPpBOQ z%e^Bcw^Uiwoo3o&N9`N%A;ZexO|j)SJ$cWR1WS_T#LnxiSVpj(tX=2761Ho|o!@zG z+sJk$@6c42&xdeaj32L-E?K9sznji2$d}&LQSvp~F5U7&t2EP=sqSDjXVr+_L2I`` zs}4TuwEM${3l{h#r-g?XnIxjQbvk((e5Dr1B#&%MigH%HYD2MBvHLm?MZKA?4;>>Kmfq(F(D92kBvVaVG0t4xNXIX` zyT~5(-{wlj5e1K45F+N;Z|<#I2ATpF5KLcvu`~T-5Zkm|d;;?+14$bcKi9A!Mp^va{<^UGgT>-_1Ibu3GJ!OeSrR z7BUuNcL%Y?Y!5~aB6~-V9%C~Lj2BO z*BhMce#*jIp_g~Q(?Vz7hW=94o@L2(#zu;s`1{%I=qtPKkay^Ah?@5JA+A7M`n*Zt>*-_M!ftzPHH!w`+}aq`a2Kc*jBT^ zk8F77qHys_Q4aqr#RZP#hw9Ho2+koT3)jfz5hJ(4uKzVaL2s4NJ!jp=VN0y8(L3Gz z+6Xt7?_t+SzY+E$g~F=zZM%(*!LRAwLMW>ARevMqDkRosHiAY@Pob7s~d?2^VQ-l!Q0Ia_GO$UDn-w4iU|qnU-l3<4-G(EF2LwXxXf> zvgm6Y%~7QPKp=K-j$Mjd)U9ZNbw}RRVv&IH2f3oq-}cH84?l?KlV7Z^$Py z`&7xJ$_Bqj=x4(Y!J!PmFf_p@b=iH+Z355gCS?2fokC-kf#)5cAIU`}$*TRM7h)#6 zFrIAA*;Ycwy^)mFurko?)+3?ai&pym%2U~%$4W1?`JI<_@R4roa%oiSh(rwa@c8IEe3U2rWwE;4KVyJC(g8zv8o8gI!r8Mc& z%SDDI(pTnP)d&tX?B@&g-jwP+uGvKyw4pfH#H)W#Z*b>PJ`T-smTjUey5^l-E3AJb zSL~$(w3q))V%$$K4Fzt`$?Rh7VYjZVcO(U5sNkuss;LBZx3YJKTEtdZPfPBADj0s^ zcH5i#_zl=?d-wXP7m89Bx(aGdH1Y8&(wisAL|9<))#Hern;Y)zdH)gTIq8f~q&P!9 z+0N!tz0r(0am&tvsJJgU*^ubFpX0e*J8uv}Zn#8uEJwZ^k*DP}cm}nKRZy-KlZMH5 z?KBspk^k$QXUfy9XCC-OoGk0$+-+J^`K9rmi0*{O2sHZt%|!aIAlVvAriZcy9ns!W zwyaUe?+LBO1OF}~O?T}v>6yeiJd!jb$rEAdv;5AVmgY#38@DFgxn@gKeD33SE)d(e z%$x}PLVQKUB2s*kFjx{0NeRGNDzTl9@l4$ruN!;Gf>`zhVI)1|D@Qh5zH^r%) z@G$;pLhvU_P6sIvyXX8U2bQPSVXWu42Dy?m5}$Ux7$3N-1Kpz%{RR1I~@U zqRe=+ao)MkjBRsoYu2GYElaZM7Rkn16e#jh%yK*RUSciC#B>TVgirkQ`)fk!{HLEf zEDTTs!tzbkxViO4E%9w>+J_xo+s3!FbjoSCUNeNBpS2>DHZMNn9c8DrTnfqDf3_${ zbzz17JY_a>Kn)X+78z{6DgZ@UqXI@Qx8~ zT#0g+QX-W}n!Dd`v~T{x1OJ$!IpR(L^itG9BAq5xS`CJdb>GyMCYknb@%Oc%<4GBZ zQjQl5jz=fpIECB|B765}Hy-azKVNkh+9z&zX-b~uPPAnedO5Y!^oYT?yUdz@*KT>h zs}^_HEnfiXD5vmJy93=;n$P*`!wp<#tMp>h4TkEfu{p*8$JmUn53GEN-mJw5^3am6wGKl57K>d9W0k*42D77kBfe_ZIY>H{U;7+09l%Che3~y@yI`D#KVno<8Q!|U zDe?L5Q3qaY=r_WqdecjmJ+9$gUupch7h3IMJ7#g2OLPuszGk2f{*Tt}&fpAh%W~hq zTBeh1*!2@F*(!xhAuh8cbpbJckWn>hV>bL4y4&=ScyiikL{Zdby0Cpii*5JKM%v5D zvd+;6eyOmAb`buUM4 zuZ57lQc3%2nUPqc#Y{1gKagxKDPJN&yIe(Rnb*|cby z0=yRKat;&0y@6LBj@yiV9;b;f)Z%L;7@eCR@V}}h*?f97M+)fFqWG2Ok+F|_a4S+v zy#_e?ft=p#a%qky8T5DKSxbUu(Uc(4ZfgIa+0@N|l*Zzvcm7;1@?{h0Xs5#1L9@~N z>D8Jh`sM!BR=WzigIoUg*7V{-{kZ8^Hq$)!#9uG^aAa~er}9p16}dm$+VKw+^BR$S z+&PxclZQrboE`M;E})*KWaB@=4<`7QJ(R=F%i?XS7idS8DEFF&0^B)m>oDtUt5o0E z)TTph&g4_8_Jyw$+4#BotA;&Y(wZ)bEL=$J$nVTmA!U#+(G}pW->4b<7VckCxi}J= zYbq$11*x?yROgvxwxBJmBL-4~U+2z*Eu_@ndvj?(_VKjc2xR#0b?ZWkuii}hY0Jak zd&ChlH$vlj%p)Y#Y8?IeeDs+7f@XwW(chS+L-7q5ydZpV^?l)}`_7&mbBdq4Hf`y? zfsJ6!r3BZBrx<}*4)Y!~U23K7;zd_2SzFE%CK`oN0Ues0g$q;BG|IiqDxT{3ApftC z?W^%T+H@qlb)gYvDX30oilZGbZ~pm{>n(=8mxQ>Vd54OrEd9zc&C5d-&{xa<{k^Zw zg3I{sKK@a##L5%vq#c4ds!1WfvO!bXA3e6xxX1dvu})<|Ss)DyZLL}c@u6RFaH;T0 zTXw*!g}$=J0)p2;7VXooNTSe@4_iLva4h}wuD$A*mi9?Tys9hG6v@-t!RZ zm9}+Lc>_a%;$4XdS{OF)*9)#6dU*+-XvKXYlJgI-Fe`p%WjMzI=|1%z*^k_y4c1j+ z?I-++`2*)K1)&+m8j7RBuemlhXqLZYiAU3sJTg&RwtyMSS}3h1AhZ2O4xy7vbl-mR zX7vG@X-Tx*R7ey?+LT0P+8(aeFJv=Y&1TUvPZ?=2_%cAd)y?B#w1kB572nL=G(lH< zj1`YaK5rk)MG<|MtSP4kv&R;ZppO@5H2IMQYJwrR9E!+={lZ|KQ)H>)%f~ILuZhg1SHGnI_pfIuzL5mi z9cxF-JLVT2=1uk_P~3Zh91idPSq;@Hp)P2A)rJWDZ$ld_=-lCC%+Ak!Q0r@xeBjlv z-ohbE9sGkwT$I$#m{?4fRR^Z&DThn!r-gDDHB#-mg`^kr?;D8Qjw@Tz`@B+cm=I10 zE44R+CGsYk`yEuw^x*s{EfvaEHueqjFQPOo z<@>GGLuZ#RmBTe3cUu?Z3xYHsuivNbQ%`I0utZ~z5MSD;-NeA5RF^NV28v$>%Qrw) z2q$J|Te_lW(PN>9@dZ@_<5;MF$qge5;`)w-#IK5t>8H<1owl*br!GId>OO;?w`k1a zwcuZrwCUKk5OVFkLsF@{DOE0$^H6Ci3;-~o(W{m;Vh3GcUTxGGr}1759-ynjzDS?nmZRouUqljTS_?feD2wh+%}cs1uyGZZ_eQ9lqPe0Y4x<2$(M5mH{LN4r)kfMRBYh|Ys`(Y z)ol3DH`-G;dGX6O0=+k6Hz%9!FkLzM`4eM;2QmN#N4qa5R{OPD3D?09-BMknzo=(X zTv|ymi!c}A-my>2!2Yb!?Q6?$*m7F#dhm(*OErI8zjX7`der6K(33|bJ1h4=1Gq=b zDgNK@t7$)gL;?3beZ!x_3apg@`c;byJ}=vkyV4zL?zrTj1FeTYXMpM6#J%ok9Op9mRVd&x+R+pRD{^`Ar?KM|C+WV8>lr4TPjm3JbkN% z?F|%55x9?w$xj+8c+f_Jl*U+3&qH4{{)Ub#d?xXX)ruUgJYdLGcYqy#Q~1Y$W);=c zo2V-4UhlP^EPtG26A%`LUdIqfpO?_W4cQgNdyp5)GgN0$b^zu)`K#9#u#r1yjFUZ~ zNKpNRs9%QWL`A3Wq1edN>m+O9y*0_poc=U>gR=!<1RK24_MIk>M|RHfe(($r{RciE z1ArX#qV{@511qMY&JE>?01_MtJ^n3R&x65wLIhWV^H&3)bB}Vf2dH*w0gDIAqVi^9Ds?q zs{?TQ`m#gwdrzG@=CrtTWNlLor#>@oVX2e8czf7U`}%Kx=ZWAUyYcRn9&e15FqhX^ zRGMOOseI9luZbX=14Q^zk-(Zi+?p55y`RTaM{i;`eaXBk{0M1uy-{k<9X0(r7goAE z;~Y8f)^9}6#nWLhn@q3Gf1y%Km&UjLrp2!}#5BQzHBL1DTL4_@5Ng^mj_0>yGVvr3-r2 z)+0l($n2MmT-j@tVzQ+c>W9U&=6g7B3%t=z+N=yPa_a)NBc{=17Ju?R($8UhvC@gg7narf<9s_wfuH%fHZ`tk4WCyS#xrfQ7st&h2~z?TC^b z%HWt(jw1jr{u}qGlmt6Ww(}sJi9{$=NtoAQ2hG&PeNQ*$!Z~6PM~c;sabp#Hni=YH zeIc#1sq}opoK|xZ)-U7hz+}yaKmO6h6SIo>eade5eIx%$z=ov6TF1ax-? zv3@_wp#EF3>uTr>2WVq#?i$yHQEl^w=3u}%GPdWGI>#T5@7e3VIwDoZJMARK+OOF2 zC5%;pXdP=P@969`{4myK0A|nJ$FNtYp3D?LxKkWe=`p`}`#D^3`rW}7bF9KWb%Y;S z%A)7u&^ekPqvSH@VbM+ZUb?^XUGQ0Hc)O@?YOwa(?MaGL_;)>6sg8aGs0t%;>wEG{ zwT+m$Q1v`gsUlJr&{_%oxF4_b*)4z%wit>C6mg+^Fan9r{9X&Y|Cj&u3Rgo0hmi)S zB%v61i|d$4RQ+M8P)A6dIuIo2^tG!HqnJi);c5j3aP?iCjQ<1F9dAea$LNyV+dS(0x&`U3Ua1R@T1rOqepIsD!ILa*$Zt0Y&SQdrVCkd(V5YP zUtf(^+s(Hf&wnTy?cTQb@ec~%dfDP!bKgnU=rhhVs`L#$)Ty3}ex(XcpLdf4Yu0}Y zLB&gPQwI)Q@X~V|nE#^wh$^eI>o2F=_>05t~JKT=y zifJ*PqA^FCrD?3@X(T&tK5&6i&kFt@h7aGE0>nG>9n|B^d3Li`Y7?~ASNy5~61>ib z(l=arX*Vtz4|ufBh#-k~_xDIeZsJewYE_)@?Rs4?wTIj}p4kPhJpzmJ?nVjNK$hl# zS+|6Hzyay9zr|iW(m?%SY*1&I#i7k!Winsy6ob66h41TC4!4U1sAmN*V6Z?uL=RZX zAywqpOWE-gVMgtT&yRiQb6R>Tx{m>%{EWkMb!bB!4s(pI?zaJwl0~?L{M?%1TV8EL z7=a%XH44O8&_{c%f}6Z))k*3Wf=w*<3|UBmOI}GlxH5$T)I=goiF!zR`3X6r(3zn0 z?76U-JcBxP%WKQFK*)!3JUFR(xd3(D1euge7Hr46d6C5W=ik1_ep4KP(8UbCv!S8Y^)8jgh)@#0R z*2+J;iEl|OXYa{>va!(&Y0Ka1SVKW51kyOI1IHY?fSwEKxpr7fSD2DS&;77 zAbQPuIW-5@JNZT+EADLT;iP(6o9G}+={RkyCq;g>zgmAdMa)E2%V)kGzC=!OpKrub z<7i7hA@6~hRU}as*dz{8IgI+|&ZP9J1kF&@C~j|0o;MKFZMZmYwTrGDc6c{MmJRO2 z|8o2$6&E7z*qfx_84WH8&O5Q0=>}drnPx+-+OgsRK~vxw3NKt$UP*mT3L?G??bVWufhlTtSk4ORdiU-Nyt{d0q!>Z$&_ ze141EZ@{-bZ*BC7v2)*t3z1MnkA<7}er>TVf16pgv+wRI+a6^vCs4Z#gvhp(DC)&q zbDy^8z-;0Ppy;Nxexc8}i?8Zl8myf%2N=iG9&3NOwk#suQYn9GN&6Ad7q2P21JQw7 z661s&*o8WzXF2crw@DXGrMfqSmZi`NCLg%BN#n|JW6Q9Cy4OpOt?HpZY-2qY zHL79l(p;G#m)KuwESx_=I4|Om%ZWDS-CZ>^RowV3`6C1|BD?tYOMqTGuHT-=bPgK* z0KIfqPdS}gb$32Lb1W%9UpTpMsVTEptC~1LX1#pQ`0+)i(*0f~?<*+Ri$UGe3k;wN zUyN^$gk9Uw`9^>;^wsEr5c!(SMS5(bPto@OKj&Bp{PbnN0w|lo_4f6}Qv>(I>ne7t z7}EQJu~W6off2E#tg(bDK8_#7Q*9LpY76h(<4K~E6Gf()Q^gdwXU7Crx#xe*zekvP z=rvfWSED2ds~A07oDK0Q8fA%J@L@Ya`B3$UId~_i+L)z(JP0b1Q2g z)i3u(20f2%7(~Hb0k|}AFL7suy zm0P!_=Nij_EV*1`M=$qdEb;W-3c?khh@7eAR}n9)>yY`j+Ige*-jE0asA0H(oh%*R zcU;1Vz6)xU6Erw9Igpb&5zYo9Szn+cW+FhTbiDB`=C{+u{bKx})I18qTUOXSf_3 zI4Oe#0jfZ}Z^R-m@ZaNwWS}m)isfdeL01D&EV5LOvHz>yL{}F^&BlGs(hXPkX4a~* znfwiq74_fRRCy&fTLJ|OaMeo-Udl`Jt1gYaZU4fUA1T>{OAtr*!sQ&$rS%?;-sv8c zf_U*(yXtFNDf(wwCxNJ)wr2k=_SsoT-d8f zzGE%igl1B%k~~!SV_0xxoK22@!VnL(-?_Wg;!EBS9E|R27B`2H702qHwecP3xzC8( zDZPiop<5u?t)<5{&^4?jy1Lb=jxGbztNx~^i#j>&ZFaM*L38_1bEc)A{S+{1)Y5SA z6@BsRH?<x3k9P z6DR%N+^Am-(B6yNggx zw}jFu4CK7BM$E*(vT1#E*|n6qlYXvvBvtgr_x!5)_s#a!=pgy}k%!lHL{@VLbG-`9 zck@W4pL}RjP`87eJdr;mb=V%$p_4mE`>vM5&!%O8fc5=Yq+G^r9?)R+0!8D|l2kb+ z4n>+Ps*@83qEK~Y4r6zfaLY_H5KX&gQbc& z1j!M_Jx%mG*3o@q`zUL)H>=;{nqqDBXZ|pu1P`u9EuN57+y^$4*s#-4!Q3Vv4vdl^ z>qBvGutvhifp1kd?+7*e%=K-!@~41O1409QTEL{-t=d zNsS5;xhiZQ)Mmj{`$V=UuHR66Y{KPcjz@hVPMUvq9t;K!z{9;8--%JSkkl9t%npx| zmWwELW`^ps?mi70E8-h7o-!(2-$9DbS@J9r8QAccQ`!g_$3UHUd)-7j-#bwSOCZ0h z0}rG~wAD+qwPu@#gZ_}Lmq}WCz1y-+hSMTTf{kFrrob*BfjNz|tU+~v>eUl#vR2FF zphAqVxmG~PggMb?9~Z)Wk%(2M?#T+AO!aD7i4RFlb2}b=eN;w>5vcVFjn5pEIh7i` zhVRM1)xMdf=vH0{5yDDP>Ogw$FlCBe>N4nEsSqQ_H(S<}ewVf`8UtRJ+h!6jmRepl zvk|JY*>#7be=J7NTNT}5w*^V_N-zDC%8xt1bP&zA`Mw|zHE-FKK+0IX_&^M!smWhx zuNx<3!1?Z*_nL=-U1IUvt?9YoSTLX9_SJT$_X=Qw^xz4=F{S~fluxpD-UnJ|)?cnD zbm~p$xiq_5=WnhZ_#s@aTLva6Lb32`2Ga0m<&how(no4X)old zS+q;K@YcCZbU)uv#vPv#rzGXjO~BI>IrWa!`agwah~5>Te96Je97ktBE`HHI8nbVC zu3t2vFelTy;rLe%a=hPA?Nzv^gozJhNXN*`1z0oLfRdad!Eso=Rd{UzDn!Uy+VlDo zrP?O3@E(sj)tM=q2MA9tCzDw9!q&WvHkr`cKI>DlR~hY(NdXHjrg0I{eG`J=?NuX; z*JaiKC;+8~rqdIvG*N^zOnQNw3eCdDo5x#XgSmVi`-vG_HFy{T_(;xgx|-(94TBbP znn~|iQO$t@fEB!8y2RVNdh5if28%t-MY6w8H)In05A>gMd%I5?kdMpvm3&&7 ziu&`HDD=CZ*e2VPc%7+yR3U+g%*O@5j&lNE$Y`|8+7Vwphc7U_jEygjeM6Q9yt30! zEL2dc%()uO+hxn|4U{!K98=hF4UN-msLIccvYZ@RyMM{b-8xFENDKs4#E!3H4=9rt zdW%3H#h9(dIUPb2HeXIIJxfcK@AgNwp)E@!V4%kCAP+^l(5c!{{EntBz`k`PImz9w zA^w71cM<4yx^i1?YR9NnZvwpTN!;cAt*cj+!qokB=p;d@dEJ5b676itxT_Oz_)apjO*z_QB%3@4GyydFYZGhY(yBlM$QG$Fh2pk5ny8 zdL@j-y5v*+Dd`zuiJ=sra1F@_-6tW!`X~2rxV&GYH=0Ozwxxn5);4CN2uR+5CnHKr zrcZ~seJ!_e?Uc1ODO;N`4SU$$$Opn%pi!iJQ4-HbwL%BQKaX=^CgQ$TZ*;k0Ox#o& zgYSMT<<7EPiZR8P0-(m8>jXf6Bg_X7@^czx#7c$-<~k%GPE(ucF?8AN3`74-={A4! zSlY-&f+-z+L8N>AW{u>eY6XAqr6RHJOo2kV>qy1GNg{Ayl!Wn7Gkf_p`>%<3!|Kc< z6DFONZu`^I-$wP((TY`hLJDeZSvkETkQ6FyzJUX{Rr;H-Dft13|E zLalRjU&aEdK-}0~Yz!DSp0d_4#@5S)$BN)LDq}@LYg=r)E>7HLOn}+3*}~3r&GKdC zVwVcc@Pu5=^1!2_f_LrVLy_;*XJuenA~K=M!*L!1oY8j&%P(=4CPNuv_e@^1tsieB zd1lbtsHnf6!;ZR%typ;YCX$OeROm$e0Fci)N$61HUaN4EJDdVnDeBwDAUn2zxtB?f zrj@H6tSD&UhPeN{T|oPJ`+@YRfdk?(4a44PnqzZDI3b_Pt&~Lx#fyP;6^(Q~7X;8? z=eEk78PoalIp25DEX6ekj9_>`_uDRRT5Z-2rE+VSVnnj|s2#2hVX$d(`0S66J=1C* z9J>;u`Z&$voTp{=DnTr`|2m=<4Ls!vOlb}fhK+{;i{*QZ6nD3#o3~EOyL>6E0rn$d zW8xZ(nQao)*ES7Eh%IvLc;f^x4k!I-viQ$+N|HY*F%V@0X8WCEW6XTaD2oljF2y(jCe~?0C<$I5FgEVh+;H90HAmB3hvU_ zO`(A+ePWb)(Nqz0Jiydn#6pz=oBAM+xNP0JYTmg}&b%3DDa$ zyQ@V`gs0sv_+A|DcjGF%`s_r>pY+0&Ywp^BTR!oBaLX@mLC(rC@%^(BS@1UAF9Vg$ zDy3LcgBd<*8<--P>MS)IelTPdje+K1)Gs@q>qDe%ex9IgxJEplSh9a5CR-xUHFs`fP-7bf#m=V!=3c88$2LT&ssV5efpL)5Zz6@d~Fy zYd;ho{CRAq>+7Uv%brR;1ES9Nr^{^o0&JpS&|+tstN>^aC6)D8{ebk+RU}RWC9{oBv;)Ri+d+dI-eH(FowMmSjb@4>^N`J0h1mENM7z*3vamjmvDoz{Mx6^DWM)m6`1 zoD)5?s${Ak-PeZv2LYXK0pyOC)ohYX323rns>BEfS;0%EC<71>EaG-YjQaFLUj8jj z#{0$Ha^8vrfKS+z)}Fmi{Vl=!5FIi)o^|m39Fzonn%}>Kdb_mkv}C#$u~klx0vKPz zw5-sJyD#Ep;{!oxEq26dnwG^pZ?Moxu*pnl1B<~(Z^*|18gB#v z)<3lveFYlsQjDX34&7@F)L+?qN>bn!cSXA{+n&s|Yf$ZJ6GhdL$u^@5JukO0FQYO~?yZzww(DMSP2b ze*h<3bWiE_MSA)X(nWB>j2)L1X?;qN>%25ybpMf7=3u4(!w#8i>&JBbt6y2HQR0;p zLaz=OX}4+DZY-q(s%U3hWJ-1JX*A${{}If$rWfhkM_2K&8%QM-%7uF&y@Yz;FD4jf zbJlICR_F5r-Lbu8p1=>)qZDpF2?5>FNjBqD@A}OZ6k6Uvt~>y;2(j||m0~B#0faRX zD5Pw8>Aa3E)cUp^60V`r<2!nmd1W7q*HfaYs^~g=k zq-e{XMePFA5ed|2t<4|4D8C2=C-s)LGOk0G5U>IaMVc@1z~0C_5JOL5a5cOVfat6T z_*s{sJ}WgclFkwRCT)iAbyGYmvrw4Fhw98-PCNSLuyU%1;R<8{X1E(=sz>bAHAu7y7*c9Vb!J=RZtez}tUXewZHsb_bv#pQa|jXJtmRq8ZK_5;MfQBv zH}?8_V!1wmP@h+?lA{(cfIjtne>pH1?mTe#p5v%%FFq@mVkvGQG2z1{H)$NXqupvW zpof_CzSm@QQ%1EP8Uhtv{Hyc(B@pLbV(goWNQtO@H}`4-9x~=M2TYHDO%OJI?6~0m zhg;9_&wF=Im5JWq5r3`=hF0BX-FJeGwS$^rjQvtl4nG?1dG9|jVHa2e-lUv~SJ^v+ zpcQylqbt96+4R4T>I)YN-j>l61hE~UrIA&iJszX3`_Jyh9HtI_CSE8`4IE1lpicKV9-YtwV?- zyeu)6S&^YkZ~jpBjCAi1F`8QPP({8+Sm;v{Y7H?0+zIR(%Do(;&oCVZysbq%X|}K; ze!>m$goe}!sqSQWaBnB-%Q}}3wZeGmaUkpFex)KTZjO-SyLho~ z^KY8o&{xar>YJaqvl_+O9zsM7mdri2F~q(fs3V@LuZQvhEWhp{)BV=Qmu{?ZJhy~p zTx#v-m)hm$g+^Wr+nVhUm3%7{O#q>DJ+77!e0IJ@rf1kv{m;4Km+<7bW#C1TV4hbY z5XxiiWon0%UPYP`*6ow8mQsG4naK-mvY9oeT>u8R+!cmNtG~HErCz~(5)b@{+1{~u zXn>~u2CsdN>ntr?`dia+^Cb$7BVe;RVpxYQPtB&57jPx3*ec4$N4R+~k8w=Fnt}EI zR1j@DD)oYyl5yWz#%L=5glD2U`mZ@ogICaR0ql}ks#+}RqFQ9Qv4FLm6_m~7lBD!1+s$guHkE9_+ zsU9#CG<(*R&E7)ESG&D@r1p)C5XVV8kN#maQ}&?it4B|U;VanS{UlJXvnR^zE!&ot3_b z0c9NO(}2zFSOr)ZssF%}m*wPP(5q{a^{%HDnA|OTcr|sJ{O8p0waRz@`l8oPC~+dx2L8tv zy{h26Uh|&&oXm`}*KOmC&hS<(<-d#}TPqSCock8v-^WSVe~uOSi~gJ@-Q}|V0sYAL z!QCuE1W*bO+FAIz9s^$cV=|t1&#}^XhkL8Cu6Fg%Fugg(COe|-E!NXA z&-mq}>eH67k)>MwuOrL0fBpBh10Rwczc|k}{yXood{@~iPus?F3-=Gt_8mE++5f-) zdZqMVIsJcp_Jb=@#f5nM|2)cnm_Jz#HMTcd82yji#8q)@5)Z~5y%U~7@Nrk1O$EBkymyBW01ZIIkU{vfEe3kl- z5dfBicdoKj!oNeRm7q?}KL8DUtUOIMrDrg|j4S^PP)GK|R?xi7*`+E(J)o~Oqin}8 z9D!qRKQJ1JLT5_M+Fr3$5x*atCZ&K`Ix6eG9^A#unZ$_NGN0!rkbUpxD58{GbW!Ql zLlSG`LqG}r4%mT%kS@8bH2bA96JG7u!V=-9!w)tP`1g@Mo(csZB4~DyB zfZ4x_jTEN1iC;0I%&hd_wtpo$5nVXAr{Df{PxZ0->%$5r)1s!dKxxQJ=*3vAPS3T_Scosr=&AwV;u!V29860?r4f=90FYlEAsA-PcdHL>ud@jetM%W>xj-Fj`2Tt8XNQMV~nfugi=*apoy?t^kEcHQWp@y~JPm*gta-T2s*{J|+m*=EHxk%3yh! z^S-!{RQ|6tdOmz7X0EHWO zU4tN^K&@anJg)^p@ABZb)Pv6Nsam9xj0v7$9my7~oyGx)3sG90U}MgWIJCOlg6Eh= zC7k#Ce1qda-NYP*Jpc=4lXNW2sC`O13m|EG+6nM0RoQbETgEK#3XK_$_ica_lw6%B zTW)x#w2@lRnt~?JTY}SG;{xz-LNmP4a}z1?d zQ*>r9^1zAMT)a#JR27X9t7Zfn#e7?6Oa-pu`$+javkU3?SEqoLDeLKBL!=@!r5V+y zS(6GZrDksCI^Yhgqhls-SV1dk)WFnQ_kt-L0 zG#jzc6=ZUWnxr+G%%jDym6PBl8viWguP)pMSo6E@?SB^iw_a;X%%pwB`5uRdWz=A# z{JT_pjP4j>?7=!=IF15ls$IGeMSZ>7Dab>R{pVbpHFDrZ+P>~u+=JI;NT50#jd}G) z2QV`%m&%{S#3N;a3(6ZSpJ1YJ)N`YT?*6GNPIawVF^-r+VN4f6WAzbj4Zor93U<6N zem3AeW!z<5U4|?NHR=h#sz-AL1rArnLiu=8Lw{E6ql`Gm;cWvYaHFwJnO=KCWjd?+ zEWbGp7&Te#?xOd6k4Xja^+_j8{iEQwv}eHd+cg3CV&2g6KAq?v{&HN&*W{f3eHbNN zy$`Y>J;pA95trNc2xrQ};3u|3WI5K`&cMj^hDmD8NTyASH*)gJaZ<0p#QC>urfFgW zAtvT#NyXyEVPiS!a|Qb%W5jS{xzy|IB=h35@_)C_KJT#~En@ywKZOzSfl?iGd3@h{ ztyUtKvlC265GyD8FDspdd~1--U4N-L`Sy=*z`2YnCD5;f>Z-0W4~9B->P$WhY>P|F z9gL^h6y_!x7s{hG(*5Ge_bBxAw)g30tJ-c59TeBDF(E5MqWA{S1{Sh8lxAMYE zphEt8Rarv;@U4Du5-7Y03tOLkS|^wTS7wan?K~P8e?+f)p~}0N82#iqBtw@h9G8rckRWsX|onAK2P;>7(HqA$n}FR&-& zfx|GW;b}$t(>N5_UvJy!4qgv>kyC+6>u=w5LDB*58i+f2?C@GsO1VJp+9%B0l}w=R zi&O;T$}IGI`+ zdaqb%1Au<%^77ySMjxIKL!<}Z#X!1IMdtjqU`KZ`kkRR+f z+vb3hJT!0`h>dVEv_uGhxG`bh*fV%X!mC^QQGGiPZ1N$MvEyYEd6;ii`GC93Y%}DJ zPn%GIzvH8B9G6ENP{?gW&ut*%`0Sr4DynaHV|#Z2c-W`&P5z+sW@}yK1}=g#QGK2* z525Nr@PKB-0VzrGs*HDw2Y;8WEhoUzDA0VgzT z*;6qKrq4x;eOlx!CDdWHr@YrU629QpMx#q5suyC299;J9hCehktZ<_Q!XfylTy#NG z8Ky|Zut*+VOyD(1_U!N*cC;4xXCKsR7V*zx)^LYLZ5Cv=mX0NGdiF+n1#)|SdRr>t zONA3P;=*?vIn z>OJ5vf~>ZW#$HS988eAhW7LJW?3QwGU&%NJ3G$ZvFIYV~x6K=@#EZCL<=R~ak5G^O z>GH|1lPKn+t~dNvFV@>l>a1^bRF**&ECDmlr*qIWXO4yyTAH8Z8{QY?quth+z~a%? zzP6FUuNrwG+I;vW^%`=KTv&*LwXY$-LNsp`F;VOx?!&;}&x@Sr=YN;O0n19OmEX*j zNBI0S2Nh`TG6ahO+3~%x4qNvWB#)o>^gqc%|6ha&<2|;?6+6*moBgIk82LTjZ!BDD1iAGz0u(Bqp$_gKzddbuY%L&M7T z${_?&+TcLyd1V;&i9s4r{%V~HhQU1ifxI42FGaxqRVktpYZZ*;GIRwzjY;gQqYL5@-U$OE+@P!rm3j!nj;Bnqk)Av;%UlxK(}^VC?}~x z7cqi7Jt%|R3@Mfr10Iwf+@{mH9YmfMt$;abg@y?{A>KSXH%mLo4fJ`HZ|Ef;)&Awe zLI35#u~RMMOpL#@cB0&EC4W3kGv83)RU~la98{lO8DfQYDyT>G>3|_50dlDKGpJ=S zbZ7rDX|7{khlhlZTRMuPMKxQ^IldVS>lJI({R+>0M&Oj` zsl+pWfZBlf^9_*Gs+cN@;wvQK>&Fn%1vzpTgC(l%=C<@X30_{8=NOm_T&EJ)pwEf`t=Tu-dR_kNiYas zgew149G^)KSlW_q0!*ib-uL8$8fsOM<}KhO8TYD$>^H_1V1Z+uPp6b%Oh8&0kVDK# zKwowm>|Gt=P+hhv<{pUZGed(Bi%j}rE)J;=23p?pQHRck*2?7CgNdE2;^+1$LNE#S zS+GYS`(&sW(4EYGtOG=lC#_ov9zn6Q>-er`zsxoD`HoS5Sa*Ir9!mjE&`D5G8WS>> z@SNyRR>OF(Q*2ooY#o_l+EcLgx!Lnb_qIFItRby@+fSeTJtX8LSgqRrO6c_Ib0NQn zJZKjQ4b^zYBlChU*@4UYTfBUd!+G6|*Q3b|o&~AaH$9@08n~kGpIf_tQN^PTXtP!n z9$#O|P;IrJDsD+d!*_0mkVCy?;DmIVle;<_;VohO3~vO-n@r&~P7OB)4f6)w$H_F% zdlfQ00bP0ebqMTWbqHjA93Q;39D}ZZ1k-tPZ@~Ad?vljK{Hzr&MG>$09y!wF8U`s{jYOR9pfcV{EBcAtO=ft)s)2}0~D0pMND<$dDdwr74^IRWc?ZQrZ z`qC-(Yh3OdPikJK?J4ZLIvYgjHP9K)7xamGY5MSUGPkdRg7i>`Lil@bF4z>35Px;{ z_yTR=vw0A!uej-LlVe6xKDQc%14<}e;zMz5JbiiEAEn-(_PIK%?V}vL%$uB_L5$Z= zgdIezSrhMHh+Fg97)VI-os)j`iE5^@*RQVd2h~0bm(yNl%55Aw_+zH8m_0aJV)#U4 zf(l0d>MSQFSt9TjT4krIAr8-vu1hM$2B3$E&@^nHe>Y0MVc3}TsPR6s$0sESm3L$m zX`Z{O8$vUeB9>#NQXnJm!K<@jeODomV;?5ZZ~gJvu^Ctkn@sfz=MmE~$Go!#S@xb} zuQ-rYc~aQfa`PKK5)iL|VFt&=5NH3*mMHAKriLid+(XGR{#`fwQ(2>!mE^awrj-(B z0O)e_COHN92DR^8kncj{{UK zh)yZ7GCNoAUvo3F^ADCV$zd@86tjtPxA_dj^oC5i*wXD1r_!USLB%FRXB85YBdA2Z87bWd*!bgG~|cW3g_E*RXKS^VrD!&Gxfx+ zFf+Bd%W?JeEOdC#-~tJV<0T(9cQXz3z_nH+ez9nN370c6d0_hNGEL0Qv?DZC!%|_j`&0B>xHm6!V)#wsK?>Fn_RPJAqN7k?0U2;luxDJt|SG+2U zm?47o33&4h4|@gPI(>QR*@f(3Hgs!Lh1A{}IAIyxALu!xgEF9O57L*Yt$OvC&M{P3 za6^cFsKI2kiWfOsw~eZ^QFDoU4;J1R7f4$XiA!Nr7Ldfu22NAo+#y+}wQeF}+B40* zKv8^QUsB~OLyF0t5&X6$RUE4nIFMv?kZy5Uax-AP;;}y$4?A%w zV4X62rb%`R<&?b?(Pp_ZSC@bsD9Q1#BU&9T^d-xEu$YU%75dkWx(C=PH>Z}qX_~-Q zjSNgLikp?@d$E|S9WCTo=aNdp^)|_Kh&7ROBuJK9v0QaYZ4Q08hO~FB&N~v2*9UbQ zBu+#2+Vhs2mTU4_#(oAjc@4_s4M^f;tCod%o|NsnsVCCDfJr1^Mt2aJv2au z_gT|zn6k_3-Bj)lE!k-Em!E zjzUXnMj%chvkfJFvwEgCO3bQ&vUaT|$A7YLu9`>B`|CZ!gNT90RpTp+6yy+h4`Ys% zvc6EaRP4hY^=KWs#ZK5rCC|O4Ia$$VO zXs)(9=iDcKq>FbzqWA0in9a-7t7Kp$HcEQ=VQf-dhi1^MhIk6LB9#&*3Ib?p5qb?4 zU*Oy-^haLG;-+Q$4jTnZ94~?O>`aT0WTt<{725~R`mer_VQ1;_If<(AbYEXfk@qZXOtGg)oi`3GyCHKJVcLoVSoRelxG6OGAUbQRykwkZ@xHYLo2_wNtu zOR6(I8-;BC8o)|rY0eJoJ6agG=>NJNtt>^lYrG=vd5Slx3xZSCu1|>h_5;D8iRKE%7C+}o z4jcMin#@UiQhz;CGmg9ZKJsnb(HUc9;%CCF)fmVuhJIWeu8z-*qC>E7U11 z8eO?B4s3W%IW25jK$E)?EZTvOXO+;j^u4Z= znxm~@%;hk&@SMlwaj{v@VfOqztUk&KM=m=PHk;iRXvDpqt~HX!8(=-o57=}YEVAJd z94@5=3!*i;{O2lyQR64UMnK@&l#=H&f~r3#%sN5ENrRD$vvI$PPWKC9DOa>?{55Bkn2-@NxId|haGRc@j)PK zSilb=X2-*V=t!OT_#>AZw$TcwMxvUBHTS9&r44*3jyqb*eWXwhS#KwCgElg?GpA&a z{59`qgx|vZ#tI1)wn>YJ(42`H2NB3rBd?YW$|M)XCQN*ctiA;@Ey&Y# z6Xj7p_bDqap*`$HrHS46_7`509Rp7Zy7GD>{mieY5`I`@fc<_*PYX>_>nO+1)xk4@8NXx|~p%T@8#-&w9H}4aMwV*-8 zuEA2=gYgp|9?7!^iQ5ys0vDBGjA|uRS~JQC{u?A5hwL{>OyQ?(p11GZY%)^mmEcFo z)ny21<+v@p7Kt!`9=W!nS?bzZ`^>VL+p@=$Pn?@b)&S*Cjos=bDos~#BA51LNfO=( zQe2WHozF`#*Qhjb4D=L&ZIcEKsm-!99u)y+#1bZa7z(|zRf3okQEDi7fv#Tt!1{J` zwst{Ct?Vc*P+!=p0Jqc{B5nRMEk?<5K|uYjMMK?61cp!g0?9LA_>Z|1+V_0_WY>m% ze2$q4b}E1&7x+h}bF~7Av~d3dHru?1?z^!lKJvY8M-I$4`O<~qU~s0JVIC?J$8kTG$*@jV7RTO!TI8U<-sMLf1A(kyKa5t`MG?-ALnGhSqD{oW ziia3wR2w;PuQhvK-UqfI5v#Pdpui3j3g{7Bz+sawr(~(#u*(!>`tIjG%a`og=G#5t zC;}#8|&wAIV__ZXny={4L=lb-Q@PjiBS;cQAtXUXILB*$suYo0=wr`Wy$b}t0GIjDu*TmrsqEZl<|2cYZyl_ zjKi!By!l{{jjaAWib%yd-9Z%(Wl@l^B``75G`b{lPa7{mzhEWLe~|-0Ywm9GftqG0 zJ+Tf9uai*=gv_&6x(}@kK1zwuqgNz11cYrOiHO1ap7^84^z|tWzk4%w4SJ-EQ$XPUWDE}vtZ8=NQrO*S;%48dZorSb)`KR z!5pSVdq!5U$#i569n+ZRDvT#xYz#ogj5@tl`BgP?|EwAzr+p4e0XOKYWxACA0p4g& z*jqEqrMvw*s!I>BoY!?9&0R&NZf^3>tMuGsW3o>3AC z%wqP2RC$;8b%$?5>#|ORMoaj3zcj2Ve8{fqw^!*Bb#}f*iKh;@J=-gE&d}!B-#+=u z7Cf_WL8`LNReNcogRCA7Jj?OD$I0SgH#u7&S|Z_;gd&yCeN!-ZYc3}20tK((XDlKo z?5m#bR3q$sV3kyc%sRdZ3jc%C)>oVEBOh)-=wDrpMsnc50nsDHjjw&+J6JmOlab2w zNtp%tI}Ggg61J^71*Qt8+ft{yPU^6nsFLs5=LhoG#TSLAt!wID<&V0*{`G;-*LApQ zRp{@t4N=1=U4KU_Wn($-xj?UTO53IoG;3$G8^VxKvIw{OjICYIEU0&HlfB2m5@z?g zHOE8I^l0YxNZoB$o5G$gtUsy>YYxSNY4flUAuEopM_FmS@MA!s_(PM5{?1vJ4@_f# z85FED2|hE)?OplszaFACVIu`S9`I2Tai`p8+bf}zJkV3$#JFPXrcra-<*)6el5v#^ zO7mK|e(O8nkN$n)RBLh?(;GXRV|QowgU#~iwHs2GF5K*t-D;CTZznJZz)3gWsvPw= zs$a5{l_kidQ7Q0%a&V*u#%Y&!V#@KKyMS>MsSD;vi7>kYxf1|Xq zCQ^IV`v=@CRLceVSI9V*>B38(b@@DrSNZzu$7G5Qr;A%`U~725%VpleScKw1zm1)C z_O`zTVvL2wTgGR>p9B{5UA=OoFnlXdI6sRo7E+$P*ZUcN0|!eVPCU>-M+lT4 ze+E6P>AK00j95HP6_<}P+bL=BMCcVc|Dv3NX#)u<>NhFD7( zsjk$4Klt;iz_#iv?}g7T5-dBXo##695MX`nl&%_Bp{dd<3oau7H{v`@+XGYH|2S%G z7_%_C%R0qnb5~HFE9yOrEN19I~9ZK7WRZC z+j|>=WPwD+Z9Pgiv5>zZt(VYF&q;Gp6Y58ox$P{s9RYz99GhpF)y!6$UkR(;0{u{{ z!Dw-zwqGm!>BNEGXHqr>Q1SYFN9+~Dg477R9xRS(-S3y? zYo?&rlz6}XJmKW6)(c#;ty_$M2TY80RvHnPj|sAuIB~F?e&ds*GuJK5Kf z_*IG)(N&a}=~v9G?h9lS=8;d#Jg?EVWE`gQ*9z*Y_o?bEo$_w4EsE zf7`n`ZbS%GR9MbVpC(VWOA@H6?l`y}N7%T;#qDg5ZB*@v%grT-jUlX%b zbebyQ0#FOdJcled`EvZ}LcP8CK4r9mN{K_i#z7^1gJ%KX8m6c1J3*&oT7XHyRcXLH z?}OfzEJ#haC6Jfd@J@%fdc3bA8cPQylhN_T*`Hx@U`g!wO&1n==&B#DDy`VQDSVXn zn6iBH-(=8141zBR*gs0F(WMOQag z-QUw05Pl^KPCO1#GfQj4GJVoGXi)!i$8LmRV=V0o(a2 zknHS#A(0zHpc`-lSwiHn!(J*6Fcl-rASMel7Lh-eY!K?8xRZkPj}ma*1JpKuh5?qW#18#CM6uk zaYP`mx;I5}TVnS8a%@YI>%O7g=o7{(ORyzb&_7W+N7^$n#Pq*rHzNR)fXqU8(2JAYHO7sEsG$Ed7a^(~G;y z;FL}EXdx@tDU8_w?dXcD+SS=o4z%DocyAu@FbL;+=YB6Ox||NutDr9;T(Heu zVQ%LwLKv}70t=w9hV|(J zQWcQT(#JVsl$$(P^eG_WL7)c;i1G!XKRk&sGB6c-S^2xFL)XSr&3nMd&7ywg((Tzd z@eY6{Z_oej*7niHw&O;Wy?})O;DU|^ zx)KjIJ3xu;wodGm?7v-BjsNgfVP{ZI>Z%`hB?Yh-@4Ee=r>@SNdod;$T)%5S>zPTh zz4`?kjujh?#NNv9HOI*9*OPlLjpdK*7b7Sl~={XT;6Vd<1A_|_UxvoBfUS4maa;DWK@5y)ps*!9EylxfY`etA-f9aF@SKEy>z_4a7lh!Im=P(mTZpCr9 zYSfJnNcO(pde}L?ujFB#0u1_&>hF+KB*uXsE>W$~tkH2ND$grLv9hR+?VYjcQw|4HtDH9N27M}hIlI&tE_+`U5s z0ULgz-Ef{_2l(5@xUXPRBniJRJIAm-7w%&E9eKy(oRfEQhcf$Pdza_OS#7F$P&O7j zNsY$#b=NwoU!>D3}RU@THLPr@I9uDlaUn zE|j=k3}>IF*jdu^_M#~=&R+7_%_HgFCIeoTvfKwWP_g2k`dS<-oUIuXG>|a*ZQT9w^(UwFvFdhb zDSqt>3OH$o%J9Wg#L=Nu|8^AH6_9ofD{jI--7;nj;aNS#HuUa=Ta~Ek_mx?36ymAK zqn3x=Uq5Lt%5nu;TM9B%GHzAT7 zS=?C!a%4B7*?8(cz)6y8@Zt3)%cw{7?e2Xbam492Bnfv$tVbxw6nIBk*70Zk;SNB$ zsF*Z4yxbsusH*DGl2xuWFK|jAvFj46y=ak?Jf-R(5l;}q(~3`%-F^BN*V8;uf!K}% znbLnWe{Oqkp;QRnd+4BHm2|mMqTxm}FMN8Ez|$e=7(&(3B3u<`QOqR(`EO z)0C3Ebg613&d zQ=OC&mF$L=N1Yb5$xeuoow1Lh6^Eo!Bzr>H8T&FymV_DE24gAvGEBCy3^Tv?J*Cs> zob&xWzkm8m-1l`~*L!&_?@JCnUmTe=7IF~SngWY;NKSeE7ZmCIZ<*bPuu9mzIjLvm zFnh~FirO)lKf&kaT{a&&P}^tFX5H8yKqO!c4L!+Ini4p`_IDL9v@gAJKhzSIK4r%= zE=+s7M)*>mV5-WL@!?Cji#MSDI;>}J211|=DQ_!=v+EJJO-#U(H1eeUr5vlmxAQJY z%X%_a4|n?!Tn6=qwh2K>KyuTSLhA@VMO+&~2@Tqa=j2-4bFrwk+26mDfxtp^hET~> z=TvhW$!nW%4ON6$EEWjE{o;9J5Zzo53u#@+1o0%0r{%f)li1uQA+)>g!gdqy$X>~> zp_;4yr?nF8;Iy&lL2ljo6HI&16G)J%l7c$O@)zoMZgnZD5~eDW&#ScOQyw;LD#B@^ z#ggLM;BTX&+WppYk(v3fIDxYTjiyQ&7V4Ya#9yY5DV&Td5jUv%-Djdlqf`*pWn1f9zu^A)u8T zcFH2`l+9NRpD6pf^_c*(!0gI?VreI3N zgrLpp1h(b)mHbTAeMfG)C<_7w>8}5-;Cx=rotwN5Ky5?f+@{L`C=iIq;v@pV2$RKI zXZ~AlM@N{SJlE-4&6*OS2KTmBv{fhT=DvO7J09M)bk6r5?4-r%tK#;%$xaVCsK9H2sOcR4zuqy3%CneM>?Aj7q=$W?eUCkK@rFrC(JxCH zN(aPC=<)kRilF(~hu2r`!P>pt$(W?dU+;9D!Qo3LLJu+v6^{d4<;#CS@5=mkZi8|! z=sp_zsZK+e6Ky0bkP__iNbVDlO*p68?0Kg0+Di5J^PR9gLRe`4x6ZKEL*ucO%fA3; zw4yhlmf;FO&ct$VUw!^4*!AULj2zVG%aCMD!DvUaore-(V0hyh4?S`*D@s9NDaX25 z0cnr;(_9&uzF|=oeWZW#LxPB2BEDST%lR3UIGFFY=}HNSEQwg zvm?{^^Bb}?4X#KCsntatQR{J z1%vve6t&jR4Rqd20e3y_C3))O1*0CTy8rj5I@*2g^t-6*3jD9@<`!kkpjmAmg0il$ zO31VP0$&RbArZ~5lf|VVz<$|(+-6-`r2-Ihtc>(rhPLDqCqn%zo~`nsg+GA;Vz*AY zuo=DkSg<+eIx~xM$c$R2+4Y|oZB-h87H~rlh+~{>2QOL$9M3x;W~Ub{X41W%KMf;H z>Ho|+ZOqJ0wpH_%v95GqJ)Z*X?G%z4S|-+Tq9fe!XMbVMpV{CmWEw+{;pwSu2piiD z-?UgncE&%wPpL}PRawtCj28BXhIW2Jr85u6KPr)+NH|YoQxYB9uR&9{Ph9HSd--8H zGuln}4VS7$!Su*2{!9_bL!>Mubn4nr`z2X2c+XLpv9cCf6`RjH8GuA4)I>uG97!#J zkoW-kBv-gpY4gSDhg+1H7oajWTWIATcazyJW8X?7zblHON(Qt}U4MJr&T5AWM#zq1 zs(=2L4<%p*!Ecar`}8+#d4b3BI%t@HED(NVJD9cBWpJrAFx@kPx5QjnFrXrNKg)(v zVAaYP@YX6I0?PLOIw6UR6p%@}E7{WhtCq1Oypuz1DwL3hki-&mL$<4 zbjUB=1q8DFN)}y&T}i4r?YXPr`aBUqBU4R&7KZN>QmJ;`O(Uci#kHGB7LQgjqpXT} zPG`Cp{Q0IW@Erk>FjI6~+&XMZ;BE!6+2ss!SOS0qR2lK<|Lt>y40O2}6$W+&Dd#fo z`b&|?VHNWHxfnJJ26xt6_sw7Aqc5T{VF%LLV(TM4Y$usl%xo;hkx((k7qEyZnD%*> zPAf_#dhZ7&I{3!>kO1mKowVLq^sI8CR`ODj7LiFl#>YqYdYsKj3lA&09?%r!i^CS%#7MpIZHUuV`q?B!j$dX~imr2Rp5WuMl zor}LE1O3Nf6OG{968#NJA5wf75A=6DRnCS<(p6E$iS}EJ@EN_zs0DzuPaNAC^Xc@P z5fB-`)tHyA31jw=BzV)(zF-6T-VvR7^mUtqdpfk6gaaHT-DxE+EC{_j&<&;1lQc8U zv_1TC7)k1Lvt;|SGHGL|!h(A~sui)fNU&IX)oN>c7+TUN7=R+c+C#>_+pJL{lIF&= zGp>_@Xy%7U%H=Tyk%%eTh5J!Ila@6UOcheD5JuFF`U)!t-8zBmID3Pb6_!<9^L*Q>%SWbzAHwn-Fl#Cx^UrIK}&u?57Sr z5gxS9y$)HcxvnvPm2^5T{_)oXw!G~EWYai!VXtX8OtqP1YQmyZGqzB5Uy^mI1i$L^ zR=-w-n^#`Tb8bFHlvRk1?FR9-uJ+Px@3UN&f^QAD2$dyhv6IzDhgCScc)bv71{R6SV z%Y~lFt7=9Jz)W?k5zw-CR)PfXyg0dJSLd3lwufZ)z{WDr<_#_uHyW2b(iuzM?<7>} zc~&l;{@Rivg1KP`$&QN=CH5qDuahFL71iXX_YTH|6P$)mv+Jp<6;@aZ35QEGTZl49 zPiJEltNee5k;x;h=XJvjAzVw3Li!*ez=KK@D9dxo4rj*T`a0rcox@$^YjQ2x4vYO> zTU)Ca&Iyj9nO9}`Uzn5iBM*>XD?vDy=Fh-{Pt4o>CcDy)YT$*Rz&KQn91_sK(%+j` z%u0M=k-ON-tqCvR77S?eQ(h@8kGD5&Z`=SFnIM8daRo)Pb56ZIhF<6sH-gr7iwyP{ zlA{{%?y#rjYs%Xm!fxnX9NAON+RNVNCu_FFvpvFT>F#ANn+x|`_EzQ^uzKvcvupw( z8-&klx&!~dXYi0f*G%tH7N{^dr~`d4r57$n<){i*etf?EF9kGGQbLkjSJV?(x`z-) zo^R-^rjf0pmtOux2@BHHVC@tyUK&0K>5a1kLzNhYt&A3J@vbb)4e3; z*>GT<&i0zV`Mlaysc3e>^=`$ilF{Rp<9kWgO5TIJPU9q@EXe@E)XMXmxEFEg4dqc! z6ZA%pXatB)r2#etth?P!Nqc3}>>%|#iZ)m*ku7^dXT=>eTou^NUt#Hc+*&U}6F={2 zq>&r9$jm;(xPWi&$MaDS61;haRoqJ19d<9t2|jZX{}N0-tR0;?iBQ=n{M!23Ci7hL zv7@GcNRcrNa$lXS<>u|*QV-{ZET^7l$2_j#TNW>1IYNaPI*QlMYVEf7?So!hb#s*u zw#lZ}wEI9aV_5XjZPnM(9VPJ|a@W_YuVH<+O*Kl zr%pdc&Hm5m$4Po$qu;XXaYzwWL2bWT*ajfLagby+;<29$R9YnDx;R4_fYZMbfL!ML zwNdyAtfIdDq0Vz{E@umkV2QND|K$mnapQVdRJ<*);)wWLv_)y@rb{cC8ry{M=Z#BQ zw40sn|M@eFaB7X^F!EIndxHoo@PCyfP@xomf~ERG)2__l3mq)7RNYSseL0C9A$sAR z;m5uug@0KV)OX+PW&m0H&$#x#J&+&P1~&f+)D1WvU*K-8ujixuYkd6Y-^0mKKXl!& zGroV~e@=PIYhCBhmRY5DQXHDhsV8?8r@(hWQfbK&qTE zQ>PKIkT*!nmpa$wbi$;+S0zv7yH)?^hr7z=53nUO7fg)-!?*)v>1i&0e+CGC ztahF0x<2Z9=gQiUC#B}$y0gJXd^2BgV4C zC;Dfeam9=)B+&ZqE{QsBbJiWv3~q;_Di(r#lK5iX5WtED=d$HLHRVuV1c^Xls%xj^ zESgfh55q*LG?p#s8xvKG9J@6dqd`f0FagDFZ)qZVGSN!l94}921Tw`aQk|6cE_L>)$-Yo2o$U0! zbKjS7&O6jVJ31XH8+1c+)P%c1R%Ty8_1@Fyc5Pq{7x zDVDVN*9hFyg4`6SmwRZ*AYye%ZhA2AH)ljdxEBI)*kZ)}-Afn?=c_t}rAXx-XYISw z<=~ZNbOIGCsp0zV_N)g0Q3y-?Hw6mj#{JPmcL8%*b@;X=u zuBNP9?vl2t6<@L$AWXdcqfv0?dF_Yb!GzH*3N!lu@T}1Oh6!X!g4+1>LpyVW6C^oB z>$a)E=VJjT{F$dpz~1bw0$@WiMG*6hoP9!*kWVM8(pG7NJyf1Wu-R%myW(}n%yAp7 zsl*TM$2KW$N#;!Vf&Tf%NdjcU6E#;-8_88}H;IQN-s`)~YB=WZ>U!A1f*ROq{i++^ zDJOtRtW>3eT&;Frq>cun%ms0X#0YV(%O>VD8INAVLmfUT@lK_`A-SzKphCi=JDVAVlt#mcK{)e-;?YYRtu}>a4rP7zMm#AInv41FHNly92Sps5 z<9qXh0CLKij;gt*V?G#=?}By37qqBnTcn1XbWXov0a&NkZ)ze~RrO+wpjCP(QBR8 zq2_;ksByp-MCWH2&3;mn=NR3Uq3rXC&W01D?za(=ok9rwyuHEOezMqqMpw)Z!NY3v zJ+!vqJ{2DP_(JS7PWU@2uy4&)gb2J%3tAu!a?gYz>F$e$6jk?n(wEU!drKIDv3nPA zxF2)d2qZSl)qguCU$)*xXz)nlv`kbn;A^Kchn$RJC&Z)$JRxp7&BNiATwsy4#QlV! zDx9PUVzc*IUF!8fx|7ormYSn-83w)wXN`!LhD{Zn=>}une?6?P-8(=G1q<_;jw~(?ozFy<}+S0vnAfE1l6VEFWTsV zkL%YIx4uZ-R4hn9H^ND%*3kgDm_I|e+OT_i%!u1Y!70gseZ~29!11wvScY>hnAcz~ z+cy3D+#)WlN*L{)wgj90hh6yc3GMWeo^yq;l}~QM1?||?=)7It%kefXz-Ogrh+@thzwgX zdfjtphk)aVfI~P^;;Ps?6)4Lumtn)4o&`XSU?=n0(TA-2)LO&$_QpCLqxms3eKe@q zQgF1Lr=L5AU}SZHndW<^#iqS~QGA?gGTykr4`Z4ede=|3QT1D5P4Aiv1AO*&l1_~3 zR&ecjl08AB;A-j_F%o?Kt=#jvr(0$R5@YE@>*T3IrDQPqSZ|Scy`I%27w+B>k_10e zpfbXYk}SvgWI~n8ab>Nx@X5lQ2x12k2(sm>VQvl*MXO%rdc#CW`-#gq)b|1A8u_CB zr8gNn84Y44WCCE!Yt= zBk>_@WX5Dtgvk&h*snMg0#|6;L!KLU%(ReGW+$~2a9FKdow@ioxjDIG4-8&LiV^Rd z%2bK#3brWE)=bYRKo2L+EGpEg<<8L<1)5Jxh7Q2$q;ReEC}^~V)D3WI>K|MpQqj@Q zj4h7(3b&aZg7mZgHNA)XyMw@L6oHUsV_l#+I#c?#N4XGa=sO5kmc4YLd)6~nS?Ww% zJ4WS9v=QiUguWr4H`=#=kzhgI9aKddE*|{_W7zGwr&EdssqW||Mb!89u+)mOx7l-9 z&vfk0#`>X2?SkAJl79&}J*7j=2pjZ8c@z@M?}`#MbV--6==UR zpy72X;0!zH*_UrWA5fa=)Yd5LC67V)t49VwUx56@RF=YreUItAoAIXh+7_fz*_w0E!s)UO9 zQ(S}Ex>TipCJ4h%^LYLupw;RZ?ycOJQJ{L$Yno}Al{Y|=Vu<{x4=x<=jEF#aCcV5= zug&pPwAYow+TwJjreD+JJZstQaq_CI&3v<0%=+4D8k`ZG%f3*>!4NtOW8FFCBW@xB zXQi+UZ24+6L7;&%V8saIpFz$F2syC-z*X`P+Qhm=ZFk!K1?5yL_(Mw9so`vc{wxR4 zN$r$q9Ts>ZQXL{QQA%CfaXXCmzr`4xpQ`QOFejW$#}R*y-Wo3S?3kt?3EwceP3b#npd#2sY!FRCRpu8)VYW(TJ zuAsDr`d3rW^f%!QqAo>zLNn@CETx#fb1;T(IlWndNAO5-WmriZ036QU>q$6~#s{i21WU^6%AqtNWF>Cb z;0yu!0O_!uj0pjoG?z9x^CJYBm=*E-G-qE(m3nFf)>Kiv)l7{E6vSh^fu;LLbZS`l z4A5fgV;A3Xj?4}?GMxaDZ=GGgyaz^1K~6-u?lRr(RarUn44J+G^~m=H;rX9}TMWX5 z$@gGVIBWo!QJOL)Ij1yAurCt!n?yU;jWM~xsLnqj zpyS|dqsr{e^lTi-;KNne4i%J>E_yi@ZTk>_RC{tvz{+b87rncJ8dk*vW}YqJ_c^mc z*+#ukABaNatmrWDQZ5MiAuSHU$=Z%)-+jo=tc8^B|1u#Q99`s*1kw zc;zFv3nMoaYUf~jY>b}}r`BKA@fU*_Rcv_T_X?=>XfsW&LI_an#6PJZ;1B|p9B8Mj z#V$tzoj9<_`uwohQryS3b|+(h*E|l%1M{PSf3WsM@rQKHUVIW{0BYYS$`T@+I)oR} zOdNr2>uJ+Bl@IwRJ}3-7md6O+$v94Lgi1CVie{&I86kyc9O9;aY*z!r0F#}=c}=~W z2GK@-RiTBzSR|4MY2o9p-@TOysDcv-FRIv;ZEf5-M<1c7xJ5eDHx{mc4}~R_N@n*l zh>)EZ5{%^7P6mfaah?{$o`LTf1on@|65T-850iVl>lTYasl1_(Z8Zwy7k}YK;R~4u zb5sM~V`yDg(D0IVWRz!j-H(0{Iw{p608|h(%yn&*W*cdwQ3u3HAc6()*Vh+(&YuaA zkitbk*_t@-m*TNA?*OPMbw*{x23Rj^aKr~elA3Kyscs5qJ}DR&R=oUF=Dx^2&i~+A zILbvwYPU$^ax>*mK=FmMwEtzT{iC-A;+tPXISD+3uIytSOt_>377Yt3tav7Ny#2PA?+&}x5y^E znRfW8#`@=GHBKdiT?_VsL2ZDz1t0IIH8sf`X93+fgx7@+50y)lM7Qho9glPZ7&}`- z4(N$I1v5_1jPpX*eg^Ah9gesqNOCvQH5D!aOeLDW?oTE?Mp!@(u5iZ@qchtG8K=&U zGhZ=)J>t#ebRE~9={%d!!3GWd%&{e8RvfRWJyZwENZ6VyRcXk9#U4nOxEleMF0W=> z^j!(xSq%|vLxo;&bX6Orv5Wyj6+!;UF>~Kl_nkSD7oT#XDg)eKm&Jb(K6uSY&xV-U z=ieGfLI?d$Q3PR@rM?%4OZ$qw5Rn|>!LDa!gQE%pU5D($#xMc?YslV2YVd_3gg;9) z*k<9~2lY-%@7XsHbNXvN=-(tfE1MdTzAic(_-?%ikbR~+%nRZ~)hVRE$KP9s_j>q{ z+IHp(zmn;I);!ugcBrYuwJ-{Z6~yLfZKz7aAsyAQDbI+5n>L6?hD&ilTc{tIr9Xe+ z%N%~>%lz{=d>J|@-ym#87}xS>Td2yYk6mI-)jE8Sbt@S0qBInFL0j;E^OhinPMIjV zNOk64$a#c5DN8(wMDiTlP@fKw`QpKV`MJsvG^^l2^s(i_uGP+rTq%42ch$9o>-V13 ziL|y(Ev3a=mp{MZGJeSW-|az<`I?b6%XS3V+#cykmMu{ zIMf-RW~K;^!&HI)z$W8ZfuCIghq7qJz*jFYVk6J;6oa;EsWL*BRcL@<9SHb- zHp>sqe;w&RHCbN6u7+K+O7Gk6*w`)QH1yvO&r`yb8iI(rnbnB^B=IWbs5;{4r&BE> zm8+%sTFeCmH%8}Vymzh=Argr1-yb?7E&|a_ufL))-Rl<~5qSv%7dW)5 zuZNqIT=5|je>F%`tqC!PV6odfG0Q9u1i~CeXfCI^Z^E1u^Os%w&Kd_rDfjF==VEvS zPgpW2R&-E?k)P9B!_nMDML$DR@87!O=$~3!l)rK9>QInhJ2V7d6o)ZKfk7~-Kr-`J zf*5Es2IW;ll@@G=+;ks5ysSpX5JhViDPdoE&t04Nnv?}kgKJr}~5l`nEE zE=;P@utX$unQstdvR6n{(Qh_L0{(VqvIpArDd+I)BGFPR;^qD z6yhdCte8K?w7Xj%+ZDWOuLGD-IZRWTq$Gm59z-65CPuuS z^%9D`^HA(rKu#FWg}Y7OPw;=0ajxF`Le6Sog>-F2)1wujaZ>2-SaXlLI{to;cwGpBOx6ioI*`x7=|gsIT>=1BBezuU=( z?{=3*u%99Dlf;i&gCy^1@qDE&+IMR-`y>MJkj}NNeL*;tch3C7{mlcHXXX%Y{GLvB zZdot)g>qp8RIJ9{mog0PCPMYITk2XmKo`X=nvg`>vrlAx*(4Xsg`-bJd{P`w&Ns?p z58ND6xC1KVwjxPytx;#07OUNbphvz7ZayEtdsC*DS`cIJx)%tI_nd=p1Wbfo-~#*d zZafcI3+yAlEt9`-Q*l5exqcItzd7l~ZxY@&II|p8X@6;hHt5^)2k@qI3_5>)Vng~q6Vk-U5r17WJxf$CcXu-#s_PMmqVIwV-QEA;x;j& zRQ9Y+cfd~(7fSlrvT(k-f=Z#x7nR+G;KI*K_P%cj~AdJ$&ih{I+4EN6$XYAw!X+Ltuh z-uo7e%=Z}fCELm{l9Wve7>A$`bcP=8AL0=QLq@!)RkE2wIz^}>1~XyOLL(zkXKEO^ zI{3^(^nd=%YIQUd8B_AUtu=Y!UR~5({7@4%2gc9*SVj+JVNB`mm>X@aD|jFLT=frnR=);ZDwy2ZVrKIe0Fn3d_J6QRi^_)Y9Nzr=_g}7kKT1g! z-2&o)^M_9qfz2_?08rH6-aEC2-U9d>91Zr~uWVcW>-Xf!sHLspOLU|-GyF4=*GXvs z?dqxXg;+YD)S|*3MO1CmZWv&Dz)|+@kjuovwDu0f_O|w$ZE(f5H}9*wLu#|UUbAa+ zIlp-dK5l9WeA=()?HPs$l+~1K-44zKAF*%{HAXn7OQm&z1@%TbEJgqJJ+;jD;4NO} zD32seN@au!c&A7H`D>Pqg7H`3aAQSBw1KPwrzmX@;Xoi(S}aO^OANb#04psMr?o{Y zP0Y4~g7t^*ah^-2lyQ0p#sGPAH0EBym`0$ks)%rR0*N%;`msLF#|K1CDc{_`N5v4G zK)fmqirZxT-ydnW8MrgHb5s zcD$mr=t4?Kj>OGqX0JgpbynaOS>)~9+2F(8x;gdF=lDb3W3nS+RVec9B>wz%%kyL& z<@6DwePGkn5xG#zusM7*dKFGdIRE2)4A>;UcxqSgRh=N+PSq9Jg2;5UZ5vxSmqh#k zkvwu`*{IZtT?+zdbPvbI?OKZkJlBz{b&&4)U+SN)mJ94Cmc{+|sL)jLe1>L{3#6Ve zIDElM9TOG?u@DIZq&lnG*E|4Nm~h5tY%2$5g$L@MO$p$%Lny!XUsdUxnQPbhPz=`z z+#xR&7ZIhM+d=+2`EBSL7x=1kdb$2~{DZSVdVPYTyvi}{6~G+(^x;4t26~4HrYD@y z>OjlG-Ba+X)XmK(%1E5zfVc5`frLNy)L|y=AdpP;sogOV!52|6<0dzm8DZRy$`~L; zqUW#r+isfd31s3p0|9p5KcJ5|cvqp+=1xjaFqN20wE9QWGQiI~E8 z2xwr}!$PK=-~Y3BTHsgG>&!7|e0mRpx{6Qzs8r86+HKJ~b%}joQ`WdhOY20%uzK!| zW@e!IbE@dn_e5XQD%)a*TEymC_bqHJpZDE+)NeF;(_V0y3L^$y$jOEkG}L($jsp@` zxajJ-sEmx0`!+VD$;fc}Ixha?cJ_<*nMvO*gv#md&T7ZhEb@7ZH= z2$io*gMWWaiqlW^*P_mh;@bKYzIKrDZ;&)tkG#sB7z5_|-?^xKit{BL%D$S>c0Ax`v~e$OwP`Fd?T9&PC*o)smzKKet-LA3i^&(m@_QLpIk=)tO2 zF9ODK%r5F|*GLhui#+9FlHc6ioS0OU#Ej4o;s78y@9Jualy?rQ0Yj5jM`^OdtuJCE z?%(wzRHnHNMPBO>?iE}SQ~zvG`FB$Agy&Z7mfk>9lMfyhx;On7ctlJGoWH*EBm5`o z(}F~;gUGjh12lbCrJ!ylVKJ)372{VIIjxbiB z_6BvW^8Kxsr`Nr8=BKZ;c6C$XpvwAHCq;BWA8W&O8ygSf(=9|$770B3S-Ta5IqA9bjlaqDHttvP-{5p^vN!#-x*l(O2mJzJGS8;{=yZR;zi$#tE0W3V9uYfd7JSH zTV}YcYWH0?p&}Qp$3LOiKa&F{7Pssnwt2&_nqql;%?4vuAobjx<$7{kWe?7qzmPE! zJYJ>!QDzE4!y1(C(*mu|t?jO~h^Q&W*`clcof8qcE0#CRGWvlU!v1GjC)K9oHhSra zf1AmLqTCfXLc~bKDDSCfZbJ6&>o!_JQF7y#?}2#`irt6g`Xv;zVCaX}3S1CzRhhg7 zF&)y!-GD(Rdo#x3s-yd} z1`0Mln(`jkjll**Rf~_oyDYkmxC;O4A8%_`8JB1Mnhh~!$g9SVK(l*~O?K6k}yyh|LdnN!CL*B%>vI_>NT(+5M zEM0Gan>jt(JO`7&xKZb?mW7QrSluO|J$$fHo<>Ee8!LAIg~I&)*()|g9hC0Wz%zvS zWlCrMfHIUzAJ(JV`S|#=9fm69-i!aV?oK}+f@vR+lj08|IFX0<*ZqK!f zHk7R;F3SABpPj~w(Wk?CC=BA!E4)yILN)tSxC^X&ZSe~}YU%hC1I|`MzS|M~s5)kf zyy2HJ_xtx(zV<9)SkLx6XQoB5;k(jxq(h_WEfU`zdYgnw4gA+L|M*`YZvbX!nx?Y1 zQzbJ78P^dn$9fdrXype}m+v@}y^boQrcIx>I;jxQr za5R;}HocOD*gTmPo?Z3NBj#r4iB$%9%J{c%=it{jmDBn%%9S&26LmxR6r4y-s>{97 znAh=OJXCwGwaMH#8rv^qoOkTRrL)A@N6#Dh&Dmm74NJK92ZAg%Z)YmoS;n)6PH>Sn z%NK1F7G`X9{qGj{jz#;S=Tl`7a7~D9N5huESbu8%?6J*nE2t{KndKJGgx1gAxXsmq zom5k?xX64C!>NZeU27MTOUNsbNb&D$m&({CFVQJ^iDLMnFE_p0FLSlXyS0%S+M96P zaW?ie433tUJ9{}asz|fgKK&x4tH^g3xg`4y`9wvo!v`U9v!&1;LvN#a=h~7Hl4y=( zf=!`BXRdbrIGzVNFgLLA-^qf$+wxZXvnMm76PYjIrZVF?tjLj9V~V3Jt^Is78iT?IQLggNyzl-sy$C)v`W4Tm7zA-PV!n`gzez z71I#uKHPG$GfiyJQ*2s9TA9{vN4JNyaFYWpyK(+HMEVYpe< zsnRO^8%>R89%Dc>#+sXUreQgKh+mXJG)Ge4xB3{!SPC^r< zXWczZH?7@MGuw`{U+7lLL7t|3)W1U}YO0UfRmF)Vh+g3zlBJcE!{Tn)M5bwLlf0TO zb0KJ((fK`UCOenk5@JiH&2e zv-NRYEh0AV%*ICnXUO;wqqpU|N8c*<-v0@r@;0CC4*GJAGiEu3uU-$kvi7=nE$tDB zwx(vpneUO}iC%h#lNMPk(EZrf)$5qKL2h!|*rjHf%X|3aNX1T8Pwgw)5B7Z?uEvg| z85#B;?_DZ;VJ2{AtI>ja{>K>=e#s2aDKb(+ltJ!z)bkN8+Wd{MnhtdvSlrdMXUZiH zdk5-_rC&62?+_sLbqTzEGZlLG&E^ErbmR1gy^qKbTfH1Aha5%nG=*d#0O~wtHW!t# zE}7ryT)R;N*e{oGT(fI~vxN8OI?GUy$lAr%M7dC|D-fn5pWS7my*OW2Qjg*cLAKJrUSL&r8rR z7Zy5bV^|p2C}S{K$c?MR+Y=4ZPaJ@3;je6-{_ zi3NJ|AF8SIRbB6^SOx9Vf~42?zmZVm1DMZtOWLhn@h ztxo?S5!Xro`dBQ*QbZu&T#zz5IgD7D!q9q^r8GWOVKTg^^CI96)q;Ly+W;Y1xO9nr z@alBz>QVo@jXBrz-iF$#iwFiiNeT&I<{9|jAI@T`J-agIVfw~RKMg9<90dl!Q=@ry zD&g`BKIjR-58s>2zLX(UWu2dJjC6tzMueIw%npU6?dkeCwy>&FaN~<;E0sl+y61lA zu4}*L1;&{luPOb53;nQ~5wEU93;~y8SwG60vknXKdv1hQf?aUwIIyRnn*cNW~9w?O1FUz zsbjGpv{SzpLcTeD%tOhx$KgYcR=oso93VgIOt7K$$-T7M#0+y)iB5~7 z+`uR6OYpY|@OHV5>zWa(`&u3GkY#&UW zuK;ZzyI1^kfiq2N+;5+V>j#`SH=03<7MK0}@pN^mwC_&Flb|KfL1uATogfOe>I|nw z{cEoHsQ8dGlUeU2QmTmkdXKr2v__EIF#LV4jn@=dOU%c$<(VJGR;$()tn9bwJ`rU3 z*rZFF7N$4wa*B8{xr}5{zvEKFPLlTaf`L=)DE|HG3RaiiFe+EJnvB*&hq;z#?(yL^ zWShR})+l7LoLc&|_v$w*lRSz>8kFO~$LPRNT}}O&`ST#^R^E#uPgpKp1ojnsT1DAhilONhX7VA}X6FXyNA;bUgeRd?mirrAZp7FF?~Z9f z2m8rVq+FUxE0Ud0`CWMw#yO<6k3o>s{k)YhGSM@}j|oY$kJTwklvhzN{75D zGhQ!T4W@b8Sw5tapqv|8_wKcL zDhs0J-9cXoh4dJ;`%1G7YZQ?hMZ;X1uK23~xhY4Bx74_-_EK;uT>T*rXiuEEX1Ukv zZ1-UoQmI4usN}Z>ZP_04U8j^2uZR@Kc!$=8Ks8G$Ll~!R=+Nc5ZwX& z1&IoBjm(Ez4G}9$Mf><<40VR-rW*RsSoofvsbqcfX<4NQ5(0Sz9h@auETb4Ch0PQa zC#mAX+&aaT;_y)MB)jim(anlYVF ze9^~BF1}C$$WslaK}PoKk@uGth>2MqMzYhm6yVSy>WS)qu8fA!rru$m>gT9#Hpd|J z&t;fC+BxZ?fUHfBsDw^*+Af&a6Vx_6QdNyRz{2-A>`7#I>HD|tf$E+CUQRA?e|Cx5o=lQ9M6!`X(hkz%X#ecqS19bBk)Dv&F3 zh}c>n&zGqsZHgs9qNGI}aGNoE!Xgf4eArzV;n}j3J{}>Dt1^9GV$d&cLdU&6rikef zmL^(PU1eGKb}mfU^+}r-lx~B_KBnOn%=>X5WK_22V+QReohXvYVT(I1yxQ0^))g3dyDy%8Hj4{96g%maVxx z(`cjIz#V%QnPqo7$~S4Bi4p5|9#^j2{B1jaC38l9-k7J6*J!4>R=F~u48ty!qdXL& zZ)n=`=D87K{I@NxdXs2cU3p2c-S60 zWUiB!9HB~^kaisok-&aFjWKhnt>`r!3u5mQi%{+#@O=w~&o#aBs0o%O@R^G%#|;{E zh}7Lu|CMBob2r;v+S(o~Q)O#2BX}tHJ^5W1jy@X{mN~eG&3@2$C9x*TZ3(}+X23tN zXr_%YRNDD7`XAD&1cu?PT-~@SNCqj&kTzt@CPc!6ROd?dtQY zlXdZaXriklb*o*-M~FdR)kEKsYyIJS&)h8+mdxf38Cf?eSIsRJINy7g^BVCta1er| zw>g>p0azxXEg4w0FpO2ey*Y9{hQ}POz=puLU*Z30f+)O;hK=iZU@}9eQhPCp&j)?t0?@yoMeq8C6?F zCXYz(Kdr}cn01Zq4ew#MILj~=yf*sxzRhaoS?*~c#YQcyjc1ww@?rf8b-E&%o`!vB z1$V^01#HinPnG7toHEi7|D|(~JNWFylm`TP-pq85;?L3|-qm%^$|Uuov9S7rQ)DND zF$JgfxA&aeur|`({9?W*)W?Spn2A!P7lqF7Hn6%4$r!0JGqPtgotiUW0T7QG8GQDU^X;qp|N!5sMxiY?H zMr~Z_GE9yW_tQ|k;NmwXz($V;bd+k+w69Bm>t8nAk0O*-x(p!y*=HO$#ach)3>QZd zyKhhCeY#<)o?*1S3M2M5TnNH69-vKY=gk%4Pj1O^vk$d2AGEy=3qRAxWgZtlTXHeo z#f}F#7*%EDj>DTt`dWz;k4giTbwY(sX9H4AkBt>Zv$WnE&TN%~&5|;!1@p+scIi8O zHPWZO?h&qr774uvYZcTk8zNoDo}{rmL|D;%-D~fKJs>e6OBZ8KBwQ{$^sdWvBg~Z+ zH%uGB=Ej3~dS2M--cE*Nq;JxGlk~Y_Q=;3+NxO-Gbw!sC-FC;qpI{&7OIOtQUa>4m zT6WZ+bnlCso2HXzm#@c0rf96HJNrnb(M8-T99oFGVWGCEAI5L{(jyMIM=wc<4UA=C z*rEpIQ7KmM{HE#93Q&3iTH_Y+XzP&(g_4#<=gXQy&zv{mTA0cDs{-%lcvtYIIxKV$I+pt)Kl6}^E4B+o|$ec0*d=HbtOmY{;hR9 zpn=Ey!|VNmX(8E=TQ`S>Eaq$f{*0}w&L&}{`KKgsA7}PaWP8tci)-gT-pSxVAORJp z&Z&qk;VQPqhU;#^iH%))FS8wKgUNM{pHE&Wi< zk|t=^#qTqpi7zsO?~)6~0<&^Y6a=&m>O0^HS^1?H1IE}iJ9?Iu&K-gtWl+iaqB5#xz@mKNxigCU7>@Q*hudF5 z0MnfMD#i)G9zNbpSMq2t!x9r}?uC~YzX_-i@SeRJsX`n($gZ?eOY$qpMHb<*XWiOp zrz@$3gSS$H5`zM(^q$;pbzhx}?A&UrT1W5ZlPy*Fz+7*`&k<)!*^WBY*bWF612Y{A z7r5+_CVO3XvU};|y#ovF*l1HgRoC6F)L=1F+B;pd-ng*zD* zb04t#z2<*nYJ^>I(gFJX1{Tfv=G8Unlgd^+^4npTCwR$j!B1qS3DW&G2CW#PS=u2ld@gU3^D{wxmAoMAfzc z_e6kIoWdYWh1Pm>)~m*^B^!lEG~$Cw%5-K+b;lGWJ?M5DuF!O;3^8ZHlVs2g3(Ph@ z#u6X%ZWPdyA*~d`$dZ=WK>6!wzg$YK+J_b;U5PTH5*1XY$ZG?8CoQE?GBHTDF z^hChEXuIlJ!!wjk6ulHT#Tu8ruA6WbGPS4g7wxPOc3TvC5|Ww}Q;?e;t51I=4vmyo zkTgu|IuYRubNN+<7nu8nRHldw^mi-sN{k>3yctqMJp<#5QAO7=@l24|6MiG5!tN zOV<})gV3y&*FSgGHf^T&OK&xp&uy2IUHgI{!zV5^5P-R(6S{OsZlpM!mvH~=NxcHH=R(Ua{K*FgiQ{!n`<0F}SDi)PGdDt2?LwASC)&)+JZ*vXbp<#ei zZBV|=6ZVU_cYn)^m&ko}z66oZC|;exQex&Fi36h!)bpw|-}KgtuQKFVC`0SEw$Sb? z*W2d1-3|tuOgWY$LZMGyK(~NHVS|Hk(knkaf@CP?Iga|Vh1hD~ulcCIk;55$oo|Dx zZ)%2I`nNUyZE*3kQA5#=%IB4V=`4-NmPSl>Y%}S35%3--g3wH@eFy7g9VX_hv*LND zPC{dS*$M4%a@1!Ze~@Y?Q$v~9PSI>6N@!(T*|aChK%?lw3{rmaf)Z{7;~c_bkqax< z6F*0LJ>`8fz{V-L^oaM)px0!za`sm=Z)RvlCql-VP1uBt)&HzY!*oqG-m)2P^FIHi zCT;#hsem{&(+Yxgs>WfE!w=&2B|}yzuG;q8uOyaqLYgmg&sbh>iEQs9y2L` zeWQq?+1IJLAN*Uf=3eu9r&pL&*tG2q8!ogNg6ps4oIbd3C^X2q9^KBrtEw$=qh8?- zF~0*>_EK%~&}Azc2ksI?+|wIOH46G43NhWT#+&rQX}>cg$&%0!<-baow|07S7@&*= z;Z-`c^!E3Y`9Z3capqCF2dOSZgpar$o|c?@16|`{;Ri^_3AfOwlE%S52$foTkBM;x z*qX}cQ_otA!YSv|W-o_8@lm?GO7XDFFyZ+hwnUSe45QuahhsO~&T^L2x<@ z8UkAx=#f6PDBvXs)S>>x-`xf}$%(4Z0zUx|@R)ZSxnxAqm?bNGj)m*pFCuLj9$JL& zN$E-i;(&t&Ue7}Z)4HDtZ|1fj7qW9+0cknKje>ovP#d!CxkrG?t-FK4%;fk$`HgF^yB&A^#daU&sB z0u;RixCdWve?|n*HwREC_}SM5!l=Ju@D^s4ih?*B;

Aq@* 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%0DemGx861W=0I8s5)l1BBYueoQh_ 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%0A#({IM6_cLyD`87R@v-|k* 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 z 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�kRuk1D8*JgHb0qww11}87-}Y{ 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%0A4Evln0z2k=Up-KF4$-Et$QcShs`LYW8U!WG5?DZ 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 L|DAir?)U!zB@cxc diff --git a/legacy/doc/Sr_auxWorkflow.png b/legacy/doc/Sr_auxWorkflow.png deleted file mode 100644 index 426bcd4b0fabb6f32549d3f7c16da7c4938785b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275848 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

}QAqW_+?0%ba3^f_9)VZHt- zp9?MdB(nQ(emh!2glx~l&kyI-8%~hv$5f^qO%c5ZuN!k7~ckjm3HxZyMzlT=CwHSns~0 zA9Pip0cAo)J1YD+K;B4&WZUm%tnewc$OktrrfTwWWn?~tt@)#YJ3b`LybH4w{c;3X z(Va*;eu3&*Z(-MdYT%b|D!i+2fmgM_pRjKDewpfOQ}Dgc)SjX(=3LWvVQZ|Uv5K5V zNFek6^>hdGEGv(YWqXq6((B5Rh9=tW)INtQ;-|w=M&al|hoqfaWY5RFn3h(rVI_%) zw6>&t@Qsw>7iPhj7`_lQzR@u5w@&9>OM_Ii=&6r<-c!K-JtUk_AQ^Z1XY2KA@8TD`^6Zt)!@W*Qm^!Oa8)`OOM|kSKeJjJ7 z6{IM|XnPv)rn(k~7p&X-H+4(Tt}tB?%SmpyT(5F0O6sdJAiP>|VKZp?Q#Uu_n3MgM zUhzt-tdI(;dHx=7^jE6*8-B-F--?B`)Vo)`*m&rN2!&#w=J%v|8GOD3N*#~)M`n4M zS?H72$6h(?oM5?m)8=NPQtpk;YRdokMN2J)xw&*vcXOT^?74SplK5DELD_)VqF?uq zT*+34_SK9w!%qCM$-%`J4oQ2CUus-Bb``uNO8hujwaH@do)Zl3Q{gd%7hp0y3iQ<{DQTShr>9J z50-NRM?XS*va=%B@*gYmG-q4zg^N!Cp0YL`w<;%}8qSb`**|D_-*LB^3`a-*AHSZ6iMM}N`Q&LjDhJeY z=U=cYbV@(++6Vo$^q*_ZEXfeGc zo257Cn4xve|6I3Z*0tjFL3sR2m+;%NX4iBeYb93*)7;u~tvtcf2ulcNh%&$jlLJQ` z_)!v^QTU-kOm=>E@c|_|ET&FyvG+S62)t9Z##BY@eBtwtbO@OiSHYzATHJt1qW8;Gq2Mn%sN#)@flDH}eVFEYfm8O(r06-v0m;6tya+b;pFD>jNA z1@GmY5W5k^`aQ!2I6`$eTcH!Bg6qs6Tae6XdHefO|1p=kK-R`3@Ih}EQ6t|n=lLR3 zVF_p;E;tdh?{+Oz)Io`zGUCr&O+Td`KGvmWkeGi%kdEvkF(L{*P*Ncl`x{bYJ+ZEXr6w~ z@Rv7lGuZs-@{zWxr3SpdD?RUl7%5c3So<4);cw4f2^%vGM%TK-f|Sh2V|^?fhooT5@pn6@nGOR}AFX^0o+%vq z$1_>`(~Sdy4kieR*7# za9jwDrGo?u?BMT;Lr0GrmbxnWK6L@sx`FgzsrT!!jH9*yJq^z=NvE&CD@WkFZC?tz z&7ctGoPF}c-lb!S;0;63qh}h|@G+A<^eR|KOByj(b*+umwqP*5Ctief(gmp+u1`B`BvSFzsH^NeZugf?8aIw5> z+rGtXoosoCnggNAv{4h4>-4h1Yu}U4u3i{-(@SHKV{03-`i(9bCW|vK*K|VUAK=Ok zJU70j)ZI;4?IwxFq6fpuZqF8AGnniPg68N2>FPLoS26bA*C>qpVKrvrLz@GHyIY@{ z2P(iCqf|VHV_k7BL4T|v@FNj5I?_gUFacTBQeIDIaGvWnV`k+3?wzclBw|$nfrakp zsTmMH6WQ%vA3g{02Hm8^3oK-sUjH7lcJ1xzuDwO3n3@SwT<_(2@h_!8!Ju_F7${Bm zqK9*)(h6diUffNo2Dz8u99%^~l`C*|f%qrYe z5jxumh8MffZvFY}PbY;Yv|(Ty0#5V{8sB#Oa93tlZM&9IC^F}sY;lA|!wBT(`pEB9 zqk_5v>yB6J?PgD#?EUpB?@C4*NGTj*Mc)p#_vcxIw6hgSqU3( zp;fZBAE-bJaQyzv^qO zm48`2y5tyRI(YHFc75FM#}4>;>^h(sXFzUPH)8x_+4H|F3$n!^_@eTk7StE~YF!aB5qW*K;n4jxjuDrD@G4Z>eHDCU)2oRruuR_fO zq=i3nLaKQoZ|08lK?}KS%Rlo1l__rT6UmznW;s6l|2&x0F9#!pB(#Hrf$D4W|2&wO zh27O>TyO?q>!kl%?k%fGS0GSYYkSw0o%sBCf7p-s{EllkOqtk#XbT=_P)-#1KP6QM znnp5^Lozo$H9%D>DEh-FWJSCYZw$8`QsmHtmvNqAw_V))^4h10Ho zdd9#{RrMARI`i^pGe&h+PLyCJdVg11Pvj4!0p}F9zS~MA504hW3jETZP(C0Y^?{tz-r2UcO%*TF|#JWf7`OC9FEsp{Aep&N>aP@V$Ss$}{fC;yqJ-p09g4QU!PK>Zw?4a%~Y9(?|! zyc<8(cF(SKUzk5f+V112`WN5M4MpSc`P=I3&mEMm7UIDtc`a`n-W_{wngNyk690E@ z7yvcpaZqs}Vm>t#=VT^&H0QE>i#d?9eouXRyESzlL!C*r73YiFG(T$eT}OJd8%HAZ zpO|fToIdZ#W$X8+KmH8M-}3a}V>U`{8e05)P;$dh{$6YF?)DY^RBdI`3+>t3I9L9F zIna4USJ;-BUV*~dum0S;yN#j13q z;RB#H*`7N5CE3fB&g=Idz{7S;*UJO6lh4%hsh;u~mPM4G$8sW)xrCJo%>fkS-ex`Tcv%c?pw|eGBtaR?)H3aTP$g_`0 zCj7lqG4kq!@%RscLIf7T4#F%AXosSl6QnlY(SL%_D!ItI9eV-o{7$0nEWEzwP=ly9 z_y86JQH@XT79npZKs*BlZ|9)h4FMyBED~BF zPeHW&t6g-_$Y%TeYni+K__YG-;{3U?99F_fJjX)R=+!Wg74Mz@AqU91zIAAq!fZMP zoZ3{4S+2K9Wg1q;uM;#dG(yOai)W$bF24F9amYKrwen{aM24~#y}Ygr`4C|4@#~*` z1Lv9g2dtIn=yU`AuU!h_;K8-7AvW`c>`s7uD1`x#5wyl`BlGJTkriHM)(GL!>pPY5 zk=7rk0#z+PD%R#<={#XHo#D3@#BbMLp~mA!E;7e4>CP2iM}MoI1$IpoN`~JctT40w zGI=Vm><-~??aIyFm<#gQ4;$BATL`T+u!h1F*fPa`ZdqV=J3n#h-?uZhyB+J@unqMR z-+EHk#yqzWo)x_m>u=@RPXPD#Ej#|$a{IvlG>W+)7P6AwDLRE6<=g((u{Ml;9P8z| z|79RNUib#@oFAG{+-(tm*Otug(bIMl_HWt}OtcP0e5>izcY%-J#M2L4<-4|i!f?Nd z$7Xt0JTL!CqatoU#B*!rzr+(;_Cq|JF8?JSWy4+Zu>6;J(svED=|9DT*gd-Ae;xhR z?C!A){_|LsyIcMV%>8Dl!MoaO`k(#_`PRg)luLHg_is{eDc@bn?Z2d>YaH<1CtmKR z<6ol-WIP5l-%OBG`+q)#v=AEH^WFD;)*Qb^x7ITGACLH-XYMZ=VsZKAng4qiHeCy$ z-y=y={Qrt*kVK;Pm-@-O{=|(yBA+B4ES}Dp~5M%CbTwb_tc^ZSSYZLU!76 z09x=KR#`7rmfn&?y z)6_eTJsS3_6_rVDw!)3)Evp?s`@8d^F%#$olT2kU*AEoT@F0%=+B=i|^R4Fpu2( z$%<4bO`hjj*69yYzC&#gG|HY6qGZDlptjWNG0=vKMzShc6kALJm{HJ(-;`rQXG_eg z_Y>3>=c6&j6nIds@1UvjAPV1h-nFN35!b*hjC~ck>=T)FtVx-C(V7#FYcNl(&-beB z491=7F@VD-c-o%Fv&ciZ;S~rsR5+RDzyd(I_!!fVW;~HL?=+l3HhmiRLztLp3nxIY zLU%o}$nO;+{Z6h!<+i|RgqLmV{k~^l?g|YvMDk9-5AdQW=Mwd!0Byw>d;>V0C>85e z!Xq7~E%=~>|^O)>>9j{KFYW>?k@o>;4nHhGC zx(o})10->N7fCcLbPnN}aJmVy!FRa!7JA;3<0yk9*DU*6z%6>eg5jrQ2Dp0nct~Z8 z0ZJ$bN4ySKLJ;bnfd|>{ditLaYX9U9CL|U^XOwMpXhm=yC}=#eKR$`W(AhXB$nRFW_qd_A5R^;eBVq_5_V;NnF$xQIk9VeTCI33_#=p)x0xX#P2|PZghfVP=m`pID-I-tXE0fA&6lrScQY;^`nTf2-NFUI1)SAyGSC!tF4%?`Q^?$u%CgGf*k}He7SB zx?=$OF8p6cE%Ps<76X2iZ})Hl0CUA)2v~CfIT$4+7FwzbH8{nzgA%$?}Z#C}*QxoAFp9om1a@GyVs0;6X)o(urC!h9eiaQ+;|LEilKS8u)o zjSd3n!N<5S*Ae_$o^e|ss(Ny!3&=; zV7q;{0P_|u?!v}M;g=R$#^9)e=wI!7Z{4StE#ns;X~%dc&L(afLPVjv3&F-p1}n9=r_dzSfUx8%PJScr zWUBDm^yh9RNLmx~|+4SzQA@vHp=#wbB(`j%E-A`h!FE3w@BQtZ7Mn*T@GSI0%QM(rBMV^Asx(sHnn2I*2bfJi7JAT8b9Z4gQe z3eqAiCEbjIl*CX{1B^r0F!V6Y40GR&anAX^dw=(De{5&JvDUMm=UHn<$XHr`#!sY_ z4%$lN1xbTgGvb6fa^L&&f~Lj{P5UB{$$~e?c*!8s8;3NHnO<-T4$pgq{HQZzXGQD?Ws9%IKw#q`nIe&DkX}j@#^yj{~-s@iJ$*#@s z&AlU+j1{Bd`?aRMO%>m_ZXlhPT|PZU)of|s)Vrg*TB}~{`eY9K;`Fub=+D~)(zWnF zBrvUwXI(OKHbaQn4x*Pzqk?1GfZjp*-C?x@vC(u;-!siH5_9daQo%nE6B@8o&+#x;5zu6f*! zC}9LAp3iAw7J`-jVJp*RpAuvm>hnyUHkTQbCt8F7M859d__e2iB8mX$8gGVu9A_)1DMXj9bZEu(3zPE>ELy4 z=y(>4SGw_GRJHpJyP(^$^`EG859po#Ymm-6zWm5zqGH=u!e+V9X>x@$xT+Bl4kHlD zFkmu4`l;h>D&!}bJ-j*-7`XxO%}`I&v~@PiKeMWa+{C4{Rswy>46Q+oK@~~=S=+Ff zmZ}3=_`rGqE0Si7GH{dcr3?$^v7DR`1!i8XQbJ9)Y~Et5uV>X*scnzPhkloUkk{jn z$P=Y`cM&CH@b50s&w*!HXzE^8oA1|w$ir=t|4*PPZ|VY-@=y5t#&|X7QG%ff?q!m< zk#pj3_p>69C3Vl?g$T1^Oa9_>%l9-v*D1jzV8dTVohfm}9k`DpfF;EiHheIf&IyKC zdxWlzXIk#>S*(pbDQ!>iOM#4mg~asIU5nONntSvQYL7JqyYxZoWq2o{!eIE#da`7a{L1|J=_4LwzOpd z2sojgDJ{u^f>rYX4Bol3in&_Iey)noZhSQ>&*=-tRx`LeiCircL+~%MwR?gaJNf<$ z0!y!Fkph#OT{4wQ&Stqh_)sA3Bnl~L#5>$)N^E&F6jy7s;CFzy092d=#^SE)pnLjD zNqJQuA-F(US`ARBYA_xiZ~buKO{O-{FD7(!3dX|bfK+lhJ(ZeKD|k>CslJoWmRRh! zDT0bvX?oj$Y>5_QV-ojMxhS|mFl*4;my}u=#>e@;lrPKok4zVf#O{1$ZBSnixFA8P zdO^`}XB!zz&7;Q}_15V@9;<*PIdGOj*NluOk9Yp*L) ze;z6{fJe##VQFiH`PgAE9kg6%pkyJiq8B0N3j)=`-Yq9RVlgHi_YDe8$7}VbqrW*m zE?4Hvn%Ewg5(W)+$_iBC9ya@yyDLLt`UmUEVeE{xUU*Y)v^LmR9{d{T68a0a1~|E| zkpjTAb~*6nXtM?x*8&~5TBV~5)~3$^_z07T2=v6xlMf_vCGIOSt}T{v*ue=5y&(44 z$BkB**$D+MzHUpSWX_uoUrpNCw4Kc)J*O88i_=M?uh?6bS&9BS(bh#00P4~&C_l&Z zKxEiIp5%V@>4nKnr=_w(Uz7J=QmI##hk%)^gR3hP@!Ts1*JX8D;$FDHv=4h@F93mC545<3z+=1|+RaA=k2j3+3#?iC!AjqX^F*ia zV@@&)Utc(nHeE1yyQ&=hoT_tNYsO!S#3^(A1E&rDOka(tz!v86cq67=7T7ww_p80^ zy1Z3vC%Y+oOUny?EK=Mr+QCfdKZ`Urx>N)bdZ*YRpx3hoO}LxdyR)@dVw-c+I%Atl z^Ri>?&1pNB{l~>n<3%h>ba{b{&o}c3sKQ?_V+;m`z+x*hTx0m5hQ)ykTP5BXT8wE z;wlRe!#-ZAk%v|@-o=QFIkbDa(J1k&8~kjKAFS|9JvnZ z*=nW<9|dJL-dqj$5r|YS$ccX&8O)-3L5szIzn0bgG=5u3Q-jGHBp+%@iT%;&_>)sG z+nP;$NkW#W0MAndpkx{dqw1Mwc%mW<&?f2+G}>fyO~MX@2?S(Ir}kuwriv)Yue9}> zm7ZYOnp(oR!s_P89*i~cv!+fe0em$EbLPh1Ody2tVcSZs$iIi&wOW>+j0Y{M9}yn@ z$fvkN;~Swknyxa^W{>*+e0QD?8r1cg!$gQzO0nT z3)Myk6q+iY_;$D~(}G(CMuLon|7*2Wip0N7ENlEK_=R1dDC}wh5}Xjx(DXLqOUN4? z<&+#rlV&C3xj2~h?m~Nd`Ay<}jlPXWi3GM6Q&GcYdxaJ_yluKyV?>=+v$DclXH!&5JlO)7vB6=CG1<5OQMXr^3} z4(cXQwG`xojCr%u6r+bHUUyM!$q4BA8s?rfFLm}}h2 zZIkUATJd2PzqG`ZRHdQz6FYp0qi+aM+SmwCCi{SOtE)Y40rP;|c6xq%al&;Zf zx|GX)&mcxKMa#bRm9yB`D1R|e=3DD;RHP~}5hIx9Q|q(xx?`YiK=UzO`lWE?zZGX( z>J!@`{9Eu|)MY?kJ2x-@lq*+_M6hk7Yb&0uy)ST48uOborEwNqH>CGo7%!1n;05z_ zEpKKCz`}jP?NJ(av~NWZV9}*1d?Z8VIPXmn&7yY0_Xn; zzRFa#I5o91Pi-1S1h-_jWK=eOwAlTm_#czutRZxV+t zaPy_M*`1AyFME>`9&aOXZ!oU`2WyGj5T`FmD5ZAg3IHwvlypI+kg&xVBz+2_r#OG~ zPuK`ok=;ubl*K96bQd8`q{U)=mj zTIHGl7DoZ+ky2~m_eo58l!=VZREr_}y1ygj$^2jRZ%&H(U+HL~+0A~IE20-$KOq3-hX`0(C^ z(Q1IAxavOGwz?b@91f@h_oAN+6L8fwx%N!o2XH#(0QbinlIFE9JtGPLnX5-?;Wj+x zVxgr+g#8*uVlLk3fP>?VDp7@t2@U%3vZZsFuc*AlGPgbd_tsWUa0qCtoB73fZ__Va zF({^y1HM(^kvXr)$PuJ|aBQji--=6@IpU52i_W8R5fNs8uB!kF39*cT_KdP{n-CVF z`e#HA0$dh>y4k5zo#1;dIq734@Bt?8J^*b7O2j~a4sF60`{?P8H}?qQ1$$P#*I-GK z=;2sa371(#4Elv}5y+&bao)Wujnm`6^`%m~7>=Z9q-0+2-@`5@($HZv-fEvnX9KWr zL%n*`-pFBNr*y_?UaWqz6AAg69G3qWUoQBWd^S@woP2q?^X|>wa~8!F32D@O-+h{v z^F@Bpx_OT>!o(HRswF|UUQ}uwJP-z2G`f~wR0EBOhFIU$Ehf{L`pEB5XX~qE!*NDR z@zwQ|EaKS19N@yj1r~W$VWPrpvOrQ6=M;f2qWEu8dB4fh@ZvkLoCP*w%N!MK zXw{>{ml)`J;5!juBjHaa^C1hRoe!qOEd=gtP=bOm{EN>JYf=FEX(K)a0-RtrwmxXL zT}od9y|2w=-SdVqnrG?Au7=a+CNfGhg6avEsrHOD#RzKA6jEoRCsT9frcd20b0kVO z@@|x0rY+Q(v+Q6D?7ZQ{B!OwZS}ld&=QY0|C0se7Ar{UKAnpUupSk(A4tWWH*Q8(I z^+V%36X2)8n-zevl^l?$JIsKUy}@r-J+mWGob|?AHF^Z6TbI*i2DQ!H(8~L3VQQ~( z+oi-A_ifM3VRezVo~`Y#caLf=kkw7cNr6^Sb}0Q$80-cdU@{ikDV1Tuw9lA9&m>S5 zJE^L6qK#+515b4|VY{*(*{>49V;ur&tIB7aSS=%oi-NRQibiHI2E1k@!7tfQT(JL#N9GfBH&zt@y*Mx3e{@^GDD z4m8ql!`HNGhd5grFo6)|qlL0kp3zw?)x*aH@^p#CM1w${;&zJ3kFd>$(eS*|8tW{f zeegXp>lW{pYeubkPXRzMWhc`~k745eH>+417PerU&$But*8rpq6xMN(*usiv-Zz9g z;M#w5!2Qo#Vd032iZAGs(X|_9Kg>wCTF;ns zMs=Gn5bM{r98a?Ha}^SoU=Lv!~25rx;t&=)yYXCKlHeFCc$N1oy7X) zbM30i@n?!{bM9vYM%k&&-N>%Y)Qo4rZ?iz@wvI(;Wu4o?M>Q0{kJm(6Rl%Gq*dCnE zx--c?pa~2z$prmX_d|K3RO-Gk56G-|3Gs~Ec1?GHAa@sb@V1_F%XWIq7Bn zeZCD+R#2vjk$1)Kq*eIY*34Uy;;}BH?wa6}QVBgQpaz;P|7%3J9-B`E+*DI0#%2KM zo6-K=j!hZUspc`o?Ti+=;!H~_31a&5hwYB~P`l&L&Hg2|D^_|hJ%?ZMR$p%X()?0P zWOdyiT8DorYR+m`da*xJGl(Jx>Bg<)^tf!38JC*e!decUO}G6I_kzGo0T~l<@kMe@l2~htAl%M^7&+{fryGyl)@!P0cKf&GZdjfm*+xrWk7$$ykE*KS|MZ zBc^beGFE^d^4Nu406jI6j*yBN`BT@4vT*`;z`{LpS?ck}X7JAvF}5B}srsZ9fjY(Z z;-8Y~!@^t8AI1QrAoeQ_-SwO-_AINDU%Ci1>UQoJJHLBpG1SmcbX))NUuFGxw_kn@ z^-c$WG?5QrIvs=eG{BKH<{XJVnmCySnHPS-!FQQ|g6#YIKU4kXad`u=UIX}veAfi0 z4UvFlUuGcoP1K}#0Gs9@_S8neZQvrjb&`Ve-;48$LA&t{_~%o1h~~W%5`MWrVSGvE zP|NG>^p|@&@K$(0S|BsG=sS}Wv6q(uo~B$%7ODzE}IeCO~X|5hvFPoEcSBZ9FQyTtx-R~k^|xBAQ{w3Pbkka-7h@` zIzV8zA?^E@qxWHwC35%HFg6|%<~*Ul9fSnd%7$Ga(8NO%7FIqVy}${&@_qmv>0dzS z3cbYNyUQYcjp-nPY)b)qny_ty(Va<&?L5ryMb>%_QU_==`vENce(&h!Hn*pis`GKB z*h2CdqU?Oj1%T9VfSCC1|MeHnzr;8!KkeOpO0YtQt)ol6F903ZQfGka0GT?k@;^%y z^J|G7qyVeo_Q4M5WU})|`y)|6%QHOeU5%+rc%f_$W%<0)|NGybhbo`KLq+W<5(!C& zX|C;ZOTI5zc8IZaRnX21-Ejhu9P}*`LpC7$O2+Rsx|q+0nI_5OgLWI=&f+vR#s3r?^PCAFh?Di8;-#@od(*@%2VMrjYbmCsaF+3x+ zI>qP#;-423kL5M}THr=0XI%VtK&14HBoYDEs2~DMo$nhCyc3Y0B5(I_X|*iQWlncQ zd9Q9wT1c0;I)H}&MDp98G32P#GqUUd+elrNZEWq*7yQ$_C5**`n(}b zw!SeI-eRoC%1Fs9eKkU2Wg5!JG2#3sBLVY|owm;;D%LM7%%t&3rmxe^z_2q;Y+XRR}*06jH1GN=74s+}46& zNV)J-JfV7zMI&$!j2MYMNPG>Y$A&N@#DRj&`64Ps6;X~MDteZXG&coNz(^T`#?P;t z)!&j_9kw_F$-|r0J5IK{nLl_k;y7D#xkB1z*}Bs?Dv%w$QEl+Szsoz~>w2w*9T-T} z+vA5V9ZHv)+wXSzbu53MlsTyX6I?i@-CW>1QgT?4fG*t|$by6M2aK{JluRm5Ky}~> z^8`pu$uyBdbxJA-0Iog~N=MF&&jX5^73%8+b4XMw;qa!71U^u7%Pkb2yotlF#0sy{ znOztYS~-c3bVVez9F_7Bs_(JlO0y+w=@}7SAKV%mg0BWXj{dmrinMW-F?luAp+R>O zkDtNwV1<*m00BCPNCdMtt{PP@WjAI3nqaU*3P_-|X@9e(ZJjQS4;%8?VH}<24{sw{ zTi2I<^nj_Qx*qs(4MSj^cM_?|39l911+wteD%^d!EKn3eqd26;6^vdJGuxK8fnHj& zs!kX@%_Y#H=H~&P{(XSUKxYzt?Uc3VR_YDuQD)Xhk&x%1$uicAy6xnOY32)Xi71E) z%yBoxUZ^rnH^|o}$@lHt7z9rG9E^}jImKbfqGkHHsVcR@urp+941}X{)71|NIM0zv zMYw;Mb)5%>zId;fcM~xWd`?GAujY_QL~-{sla$NlU_#`og2>+95-Tx{xQqYj3Q8iS zr+uIy!s3ECU`OB4N|dzndIK7)i)Uj0JK=@VpP-LI-ev=nlBMCdRS$p({|B~GL%_L+S{l-74{d-gdzRCP5zyH z8iZA^@*48ZR6zPuxgp+8omBkd9A$Z$icQzga)HX_RCdL8V^#`6d&iVuG$RKLjHRL)>$bq|=mou*mp^wH=ZY z9a>&n`W60V73fgh#mT0+22ML0)N&J(lwr8?_f41D{wf|?QLEk8IFUM-{|xb{Py|#b zALrXiuchZTc#*GnSag?F-bNQmExa$Kwq&ZV;R1v1J$A}TF*K;`DpoQc#HM3?EVhUn z@XO8)!qt-x{B|o^Efo|!0KGhDipXqA=ZD5XeEx+Wd=qhe=3KAs!jbf@lif_&rTq2b zRLHhxO08Ef7mOJX!pTokv7|wAh2tPHb?gYcxYT=wiHZA*!P37Q7?a*bRU*Q4p&Q|^{V`gQxs0J~9b%8Az}ch~U7xBEVa zW*IS(QMlUkuGtbWfPedVkIhz(=G`|SIaC?9$B88{sWm28aZTB4b|AjG@))&)ksw3~ zllIms0-|`&4Y#EE}m@eBH`K|FQBC=Y(~JxFa@ z7Q-p5GOnd2)Ujt~!fv_-=PYUa3oH0{pQ5ULcf{VN_+aX zp#jx>(3703&mzW9pJ2}8=}S1FU0KufXrkO<1SVWhRobGzyaQ=Pcu8EWI~eIu{V+>& zM8&d&l-?*2UH-mqi-hDVW50Cc%wN}!J$oW?{Y=IJ*}AIzG_`!s?eBZG(jKm{h__=31BZOhCT;y zL~>^Fx+iPk{d#vEr-MOEoBPX<26Zj9x~0!vm%|_DIWjp<&GmnOWg5h;bf!)7@x`JW zfud->%}6vG)0le5N;tt4HV$xLYN6Ao%mNR_Dn#VAqI=*NR>q;R4|M-!fo9Dx}37<2FbQszS=iS5^}#`adB9m7SO1D(&q|ZmNXV_Zp&ov5fFl(YJk zIwfHb7|?z7j+^-7_oS-b(dQ4OF_H7?ioH=+nF4*(+gZvlB^HlF9q+QK4iQxu%|*-;ooR(DTkaB z-w$$Ye)VR}^$K~5ej%|R)@EGOS}k)y)xcTj>d`MQO^9y|c0%W(RB)q%hV2nPZkq$) z)vOXcbqfD;)d;$F@ht@*-k}L4j1QKxAB+YS8tLhU7AeBL7qg$e3aU_QM+f$52Uqqv zO=dv%_!=kE$9;;UsUc^4WvHX!ir+ds8o^Fx<3El@ zrm00Yl7*b~wPif$3@{uTKwnEZ;?<^3fxW5|ptg8gfK<*CxIztT*XCFB-owXb&PCBg z6^`rX{k|3=4NsF0mOeYIF-wRNclxLaCsP4pR6RwBR~qhV{r62pLk`Cz%YbreQP>97he_Y++2*Di2BI7<0s=E#vF z#YdMp3O_C<8qxR-m*EXNvZDO^sSX_7M#WY#rKrRO7$jZXB+o16c~)GF@cvv5i?A@l zRW5!C=6o-;E5kMJz8z%M+%Wjwbl3nn?ZR7gFl9AkC7wwLzh2GiD_to_jm5Bb zd^l zPVal<9lZxz+}bFAF}&SO7cVv>-6Gk1T?u7A*5?qJu4pC{T~Ups_q317DXP115EXrYZtlNQ(MO-T+oNKk1) zS_e>lP0ZnLFQ;~_kx9Fk*S|1+U9!b`LSZ2g+o*!b8x;>;C^xRC>3gNRrxr@g(v4=c zUJKMoD;b~hy~cF<$dl%y5>HVk5`k7RPDhIj2FMgyJa(^iZnIM+YHdii$Oi^sTr(C2 z2Lyr`BhM~(5>-zf+?+bu++(zc)#%k7S@yq9w`bdNeee9S=b2G&zg;e*k$sF7i#7>K z?&MQ(bO@mHCy~C$unJq>9hlKS0FO;gQ>pjaI=KPg75%=xhip8#I%IdNHvTX?h`|ZN z(bZJ&MtfGOr!DR>xag~hMz-fiOq73R8w>x{&gHl2j`K1Tr(2$Dj&Gd^WYYrh#UQz`dyIzbjf+X~*xG861SN$q);puhdlTtj z-)c!^Tzj`tZ`7zPO)&|SabOrk%@xV1pt-1yC7qQivLHS6~+3MqlQ zbL0pO<){)lDsdt}&~~tB{Bo<)>=)|ZJ2_M$L)P7{pVoY@4#FGvqiA!fjy4cXxA6JD+sXxO?f^5s58{3foD#UJ157*vIoWRM8hZ8i%)MSgbI zBT1bu4XIYz%I(>?PEYPA(=L}CNNY&p$f;F_aSw4aW5Darcz2JxDVHCu4k17Gg4@5k zzNugB`6WAizqm)ONuA!+NCI?lHF}2OD3@rHScDguH)l< z8thhtzp|QNjZi4xn!*d8-s*mY&$epmf<^ziR;q1i;5=fFZdCm2#`e%{idx2Tx1861 zhtw)HHJ3vLXKJn@=QRjTAa0F#AGmvpu-?`8GW=`_Ar!B`Q+U16^k%ESxc_9-c&n(3 z;N3nWW`-ng#pl{KNS@@CmKk^Kot_<2Ii(x&DudzcDaD*`!*ds(IT{;vQ0ZbE|O%GTYZ1}dyZ#6_GheCpHWj7aL6RMpOKQB52bAhpc9|HevN4? ztv#}E7ghn+MiU#Uqy9K@3-u)Ri|Gh5W>o~=E2)#5bup^Dv6O+_Q9PR;zSm4FU&6{P zt%9>*FuQ;x(5)o$*pS8AUaI)JiCR=1JWFoVTqIHW^ z*OF9RQCL#`clqJ7DyOBu2daV>o?(cl;X6So%9wzry)pwQcY&TUs;1GLDk>?B5F7+k zgmIItaFQ$2dZ&Ne(QD~(`{g01lgzIoxZIj6J+DYL2ETi7YC&i=IH)1`YIrq`tWst>ZU%n?=(zSOVEwntN_L9e!7<~dJvlFivXNZu^%NrF8?i(}+M_3|u zd4(jM8Mf}Y;^#ukWP9pHI}D6#&}X^2jMg5YI&O~FRaWg@*{Ntkq5(vj@uEFh$-1ZX zxyk_}{M9ITvW@xeAJg}ma2d1S%^~T;;tx@bI_N+hJ7m<})M-Uf`?Uuj_n>S+C{uXL z8HW57;bD#Y%l{x@jYDb{<1ce#F-_`^oPkr)+#qE>`>v_nQb3;SWhFq|8w(FpqYhKR zIo@UVTCOd!NoWg%trtXFRx?*ks?1ZJfC0C@gawOtNZMbnE38%S*V_o_oZTny)0rI< zW|9Y zT`}^IS}TLuZsO0bcXDe4U>w*kYOD&joSj8sjc228HtWj!CMUyg>O?`^Vx{T zMLa3D(=8*C0YjCc<~znn(iC`obNPi%t76i4m6U7CvCw@t*Utz7`eEVKL?Z+_;+-n* zHYu}x#06VKKaHn+)SM(p@G8fu64 ziYo6P=^*;U3_PNH{kOlxuAH0NzOlP?HjP7g+q2iTiC8}C+DxHVddrw$%c`ih8owEd z_}Ecld@8DKFr+$T@D#rqz&MD|sWDRwEz)Zx&&ezsuYceq)^p*q7O1W&@O#hCIfjgvxdTwW}PQa@CFIb zo~Xb3jW6t*rtD1i1RRg+!6)I zA!OL01(EU@DzlDfXZT{*EgUb}u)(_a4T&ee$lT**qJJh%)kuT9Jc}F+TEmRk6R%Uo z1f#As#~^TB^v{&CePsyO*8*VQLzZH!HyAA}Ct*TsuXq}yF8J(`t5%AVp1ikDsFBu_mz%tjJy zR#npiTdi0)F=U1m#Yi~PrV5ig_j!#68{yS%+%5$L@O?fcD8m)#q_F{Rtq79Awn8mC zc>h&b6vgJ*Dw~d#9gpUX-1bIc7E*BFi*TKdkEam3&-rV9AGVDYqe&+nANyB?z%HibvHuX9l3jUqzXrewswV>gJCk> zOA9$p5Y9H)g&)qdp6BQ_`>J>+o8(JJghpr7*LZk$@eI;q_jUL7u&k->!-Mo~PI8s*J>pC|CCKZRQ4BogGXWf|zpVUXNFC~Pn5jwbgrxXWL2;ijWeI7rDpwU&FnjT zt-T4W^77T*<&CS^e9>Xm$SRN1@K)Wel$=&4v#<84nxfp{7|(ccanp<|u0jE~a;Nrj zD3i!IKat)Bkua5j~4_2UyJ~(^iK6_%^fPKaMib-x>$)IcE`{HOz<`Bw@JR4fg5Ek@&f2~4!qJ9x~ z4~AHkocBLq1e{kUnNPJ{#|o_s4NTTCyNAMvahL_OvKbi=jHyQPpB%NJMIuY96p`y#IaW zs5pZXinfklqewq-83J-DEmt!vVFb9o4?MmsUIgZ#S(wnp-dpeI%e=E49-AJzZ!|MU z$$oV%z@x8u>x^L?&+b+ggU?6u%u#X~C!7B92XYia>?3x#kE;pcjEu`Zt+Fq0a+C}8 zBgXAt*dM>4HUp%}8wXf;I%(mVwQNbzn-KOvhZU}7YaM@>EeBJgCgW*Ei*kR7&BJ>2 z7Bd~?sP}Vnl*!GB*ER{8JOgriMP7u+JmG{03!TBe=G2Ecu6n?ZH8r$N?uMGlY4(MiqBJJ#A*Up9L_I`7beSD?i5n_Gp1xKy5rJ;|8 zKs2A7%M~=katx07Y!Dn_`!&Lf6xSQ}JO$rlpihnJ(1a6AKR3w6IKiLizA^VQt{+o( zYdV;Grh8w`@Cj%pU*$|x%m&3MX;Y>=<(7pq;AY0fdz^H&kQm)FiWc7#nqQ3p97*^G zNAk3MY&rxX84w7m&l>GwS3=sCu}IEwQqj?*w46nZ2LmeWM*dF%_^j5bw2$gV^DEUV z0MdfDL?zx1;Ppev56~LX9^j0oZ|SW$$}Sd-`UDxPxDM)X6G_x0ztJoXrRb-)!Dvx8 z9|81o59=2h#LSbHnLsSdM-6#qsUX8+Eibsh3Ehx=Tf9Nm&E_|D|2V3nPp$TywH)U& z!#Rd=>!EYyNq;a!Pdb@eY~3-%2OD17!j1(S`8P~EnGM^gDu{9yU_7~l*~@L%Q5|*w zX9fI&vpg}co`*ya_+}lsuvD*FX4m2_R})~>XM6d=_aj-4ezJ6Ig&!yRg4_;Vg3pPU zktdUn`om|jt|d*GbLXOj1Mh$IGkzUqG8mcO$d_ob`^G4I*q(^J9CQ;ORzjw9wY`D$;X4(9yaT<{>VL6gAm$YtSH8g?d3TWZ zv2&se%ZMEYCBW6^kNgbdr#S6A*A|+Zq=p9T9Vf_4F^ff8p zcDSOA6chb8uZZdli?{|_eiM_<`DpDzH0;&BoFZ`P)rZt4q-xP-*p4gum}0|OXTrbtn>g63hRJdA`w1fQ~BTWo{xoK>u}1e%~RE z%euy}!#`T~&Op}%0Gwj9{>6jIcC5U0A4wqp_y?qN3;~AREHTGu8@JkW6+^7Nv?{m} zB$$Nec7Te5Kca>~e4e$$2(Nu=!v^+)0zuntoH)ko4xiO8!mdIuexS3)03FCb);rP)`@TV)I1^s=MT zB6b6>(Sz~t~T&A5%Zssr8~uaFgO_IL2;LU2jRks zdcZT;?7D&s&O=f~WvveNxf%PuwJVM@1+49# zQ=mMwI7%U+(6~=^eNkvLteRAB(0p}4a{Iwhw(W>n-MLV;=ule9r^ysDc!P@VwS^g! z#TKHV_Pa$B1e!0edrf&xaf#bo#kCFc5XL=k*kJiCdta2|6oIWt`N&g8$w*Na93o@6 z`_8;i4eGu$>dogQS1o^d-;(GV?_@S=LG+m7P82Sj$*?S(s+xkgef|uQ?-1n_tp*Bx zt7$^Eysvpm>26((L35K+GaZaxM(zxL1&8$Ko!Z51$$Wo3C!dfx;GNY-Y;K}^_AnA# z?$?67RN)%1_u=75cIygvTLTXy*@-SmKA&8n8xUW9ffJGf`u&=NkYcR1*q~bV`k>x40;18W8UIM;xSMX#CPKz>PKW zKx8P!rK2krr2EHNNqY6WUoJGu5Ivc71w@C}b*KW_I&{?T>En)OKfc)iq1Jk&VV(EH zU$0qi?Cy=&({ihdqxPMG}o zGA>iqkywj!G7H|iVc>GSZ+!sPp#Ie5ejaKqY5CA zTiO5X#`V?(+Ey%l9()giUIMvekl`jIQCRp!bc@@S9b}Utu69cleXqUU`*9Vp>$Ftv z6G>@|U<~f-Zuad}O_xT6NaY*~RPvC*o7$NrtM0S*16FQuwVJU_PrJyX_GnqD z+BvUvDx;mx&-S9p-lEV*oAKv9&dHY|6RacxRGkT7?Tx*LpA;Tax%=YLl>t(xW?+Wa07pwf0Z55CeCv|xN<=8*qTlGb#;cRnnu>1-dkG?p{ zU*%3Js4`7~@cx;Tg~zFMy$s8Yf{%OwMcG5J**XirmK3?iO_&gB&N|UmK?ZWa*@NG? z|5ll9!+I??E+M$(?AJ=#*H@N&Ph8H5;v;?03vsHOAh2h zP6Gq=Qqm`(qtFjA{O5-V*e(RDt@LM6!y`hmJi>pw3In}5Tl5Q>W<9W{D zd2?T{A$b8{(n5AKlFpGysCaaNt z>S?}N>B0HGCD66^1YUc5R30hr@23k?uYU!Ynpy&D?|;2=;iTi*blc90_iN%7CT_iQyw-w;KlD1&M=dF0vdr~UcR~y^ zWvw0{z*Z!OOtEeGMpKR)4R;K@i-1m9{m^gN5@ScDOEtBTng+;lz|s2S<# zS7c^Y6>~j%XBns>PmU=4efy#PP3*G7`)p4cR)dY+-0`ripPL`ba(PScys_w0kO`Eb z|In1D=AbDLfRPit@{9Zso)|CxXKBEIO~nt8tHwR}_;3|xx?lZcub%I0$~^1CU`D3U zW6|``>e&{uv$b1(B(|1m!^@RaV9zRksZ?Oc!Mw|;hmc)!85})-h~Hrlc6RwJKLFei z@8_Z$-ur`Zv3%jZ6}07jfb;JdRod`2!b7j^`wv-Q}QMhy0TXjA*YW6iGdr&PD#Bw*DYk451Uxf4Q!DQpv4*E@-6rbNQy54izA_uk^L827X+ODSx#AyCatM0`j}V? zitS0QkS4Fd%W@fs?8DwAB==gqWl6-t{7W(aOM`*f2L$gW8jhJ zV9JM7`)?O0AHhN{naxb)KC539luiPv&Z;M#s*)O5^JnXdSmgmKW}={%$nUHb-`;2P zdA=)q9IWv}<$sRYf7aNMH*h7+>kit4trJK;iU9G2#ZTZGy~NSrsO~PzIZaV4AVGQ- z5);9Kz$xxQr08!OksdaLGziUK5v>_Gz8{D_um|4y51dRfpDB1r(n(O_X6t->$|@p} zUxxAlh#C}9;8P!ovBr;9y+z78p&~-M5ocD4N zpV{K+vLT!>d45su9l)6{lK=Cw?RepV`;&_wU56Djqs65e$}k6r0}0+Fm-%t4wQrsk zUDqFx6~jc5yq8o<0sEwg$O=Js*xSpPa=>eBUCRQ4NF}+LkQEAW+<;)52&TB<+j^ z{FKyDX5SoF{Bz)u9t`~A9vjT}w719RdN~Wsvz*MH|2W2}8BVvVTA|%#VYvCnRVX#w zv}hxEU0*x9zSy6e{*g>6Hl4mV97VVo(m@&A>NEx1`NLKyZPsW|<#o6piqe1oa}>)x z;LoE}ssLXijhw|MG;M}1hIvX~IAfyexZ<*))9a>#4&QY~-NCipP?!sGKD8pH^&LYuV8kApX+od_84cc&}FEmL;tE#Gbr1*fKSLw z&vWU#0d9?yC4gL_3*cc8N5ueuvHK#*An^J9vx3Os+(2+=f0>Jl7t6a+wQaFmE(=}b zrxmL_SkL{4RvH(;=zNC(@DT%WD}E<1@r&i#DWQgUtF|Z`_p^kN{fa%x^S;}yMl@il z?N)Be)N|v-Rydi)#{K{Pae37KpKn;sviA~tsbF>vCXi9VO?wB;U4PGaxET1~l;Z>D z)vul;ktC1L-(Id5?b~-Q9TFnwV0a_agz5!bN7=}0`hGQb1x0X|t}_5|>IU3UnKL}3 zyJKB7t4(y%aD?S}ikGx$lr&pXK>tGKR(e2nAuQeXn|-H1iQguA&r-W#%evxw7cy)& zQCegi7(F%`2Cd+bMeZj4Yf0-$WBWm#kdw*}1+`eQnAqupt5z&01xt z^&ZHK$M`?sq&43n-JA(wGW&#NOh>1pNFpXDos_+LzfWG~|M2#n0Zna9+py)R90kOq zf^-q=G(jYE6$J~$3Wh2Y>7n-!Vgpnl2q?V>C{2pAP(naJx-{toh}6(S51nuA2poML z@ArOweLwg|lD*fOHFM21*UVZdY|tYo`OE{XYBX8V&=AjSsHm8{cG-4OGcuECkMuOf z%%(PgYPnZzSndTjyRS(LHdG*;Fe=RTj7c~v=s5^Q|HrB8X+tEPwZX_}0K{B~Yp6>c zDQqJ4-*I-_2ghaRavUQWi3I}7z4s}rVj9-uj0RU5W<|WWlyJ8pq(sQ)MlQ5dsx(s1 z2P6;SQY_nFr&zF;7z)&UN?vx#tqz(m2yK~4lbQD(>^SA!chTHv#`sf82TnB4}<>*Nm=Vj?RbpG*)M+sl8AUi(wYEHo=#e9Z5hZxyiim8a}GQe&fkvfnl~5Z zOlA4pG^buFQM?M}!u`@f&QLXOl^Qmz5fTg5$kch4l0Hd!bm0LOKF)5;vB!Emn0vQ{ zSzD~3+`=OhP|BnFX0{Y|`MA;Goomk%5bMBYT!2Wwv8jG|!F$t#7jiZt%5*+sKsNx} z2B{xdTz02DNpwPa>~n_Dt9i+>p!lepf&C6Msd)U@!#cok zc)F{=_$(Il6bSYl4{pOmX1`tNtsf>5t%&IZ&T{)kWmdiDzYcnR_al@ZTs0m{#G39;90|``A1u2sCc6y zJJE&D_XS9-tmRYk;oSub0~Vz+wF5%xJ_V~Ge|>PC9cD>(9Ghb%!)vNr>KS_~a1-PK zL4A#7bGGvG7Dn}m!2;hhtE1+1>T9R~@J$0Ey84A-nYkSh_J@<7ABDe_c9h0MoCz76P$V zN2ZbxW7D9q|Y;+{@CEE2cJRFOO3PFy&XF( zAm??+nLMi01AtL+B&}|Lt7xNc-=;XbAs;Sjlm|_=;0+_DA zv*$>6O$+OZ8s^EY=_pXBy;vD6reiW@pbq~OVy`U>H0f2G8O%UBvF<9dJZ>3V7(3{q(nWcos z2Dd$`(=4*#M%$sj7!XNs51Iu7%yKWg(!7tcjVm2)gY<0l&Gfj-T(T5Js3K z7*j#$3!aZ})~#^C2lTx`Q-zM40c8#YSDz>7J^K?J>BwOKODo0hA1Ag4B&$K^4sXoC zE#+L8JPTu@CxBs=?DxT%{GT4%it^GhMIgv9Fr_OR6qv66GMNSE+ z5X+U}tDLBB&k%V!QjAIhv(0R%+2Ph+;r2yy5Wn_z#6AeUX9`RIh-0^z{kz8FnF#Pu z<2MP*=KJr5JDVqxLTS~-{7g_?j0VB8n(s-_y7pcS^zbK&eNR*HhdH^Wid;3PVUxj- zy6S#;jS0|O<*#vC@zWCBg1zA86ClWiN&)w_=l~A5BnRtYuw18Y0gBUJ3Cd^1q}IhW zW%-vJfM9qDS!anD+9kL?Lz5d9j?(1DkiQlLgs)j^fZ0lL4TF_tN?_q)oDtCGyn?uD zE{*Km0cFuAj$=#ge#5Bwanf)=GBa3W3jQ5f;u2Tl9hh+D^))h(-45pMRkYu1!!BgZ&`OYM=B`wG+-f^AX?2sKEDGHp38NO=716OmCSnh^W#<-FW* z($LEpL7(|hJS=ouuRFW{utO)(F-{YwK?ign6x_f<8|yqVp!lh`PbgV-NkiL>SE~2H zDWF5W7!F~}VsP^U$O+>=Y$gt{^nCEtjfIQPji7?gizk;Q}N?T7gcFc1`rV%VXi=Ou(xCR znIQ(w0yu7*sl-HnYg@l)`L`h5DQN>_-pBSQn$QD+5bdiZH~dvpiuQo%g!wLOAD`v| z63&(*XS!?sRi6E5gi^+jCDiB{&^u8MWnbGy;sJC%1iG|;%OkQluv$}Xqctj0R2yBP zARKrknAZ%o?yzfjpT+rLgU+P8{v?WB+qwIkSo-R~Q0m&r@UGt3lU=h9MbLC~Zu69v zmi@O`v>PWt6&?8L36S1C!)Yz|VN9Dzy1*^_6;gnCcWN4;b~Ekq;Rsj40B9^#lYaju zEIn*BKWq`#TA*1wmDWKeS{Fav>EW#uD>3WUERa$MN(~5Rtdc3Wan1kRNh>Bd7XhTu z`sjz%u#9H3xs0`Tj0)_<3;L$9R+B>sS~wNYS_5Qgqu1xD&vR{8}`P&ys8dUYWmrS z+e1WPigt{-)a)r%tQIJ(T=jTe>r|VK30Oe~k)brARPWyMcsk0KR)g_?azw_z72SpJ zy8bvvFQ%0wUhyOBllfUX8Hg{yyYt3@A`qhB`FtC`ec+qOp|^wf0p8~bXT!7OFmG*gKb8=Y#Pe!nELfRrM093nrf>})q4~>I7 z;&_R#Xp0UD^`#hqyH+`8UOc@VG_pb|VA*pA(tAx)_k^YAw?E#yJ!{1nRNG(k8p@+&0 z5tez?W~TZKxSFDXWp9Aq%9vXN$UOnCIFC`JRZ{-m^)XkwTFlI&d#C-G2h;-|N}gE! z7$rJmg2YCBc4WsF&_My@URUC}r;T)u4r6+I+-+!>8&+}Hd2k=em&u)BlxcpECY!1! zYA+D)j0f8^`DVm`%KK4`nc~7Lqps834bj91FMD=}FY{chIDxwhPK}@M%?WBMy7Ow{ zBLk&K=jXdJu|5L90|mZnFky_*=ntq{;S#Z40i_)5``0mWLhmwJs_=3IH_Ltx`4?Q= z`2)DXYJ7SQn8m*M^%VKgzhb6k#>Q^;8dvXC3$p@-nmJ?}FJ*Ko;ddI>tC&n^N-fXJo@mH zIEIND+d7nY62kS6q~vBSkfg9)7CSf?u2ydfFF@~R#2T3A=iV=hbc$S8IPcg$^sJke zecJsxqfEQ9j$7;}HHfLQAW}V8lt?kEg+|3wH*rWRsjTq@ zT5{GkP)>PhF8LnHU1w*B?7?}TmBM|5MQ<5{OCppz25Dxr;3c&w?}&9YxWTcuv$tkfgCI~S3ev~~|7Vmfd>Yr@?W z&81MLeo0!5s0ny`Y>FefF}l%>GqHwqVg*Ts$h2VCRy;`^@;?Kj)0yvd;Rb$#&tJ%6zi234;A zvNG4d+lX%zJ}&y%`YZg-qBIqOa>RdGe!lBs;i+tVCH#8$%`%h2bbM3z^ky=cn(2CZ1 z+hU#uEPng|Cw^`BD5-e%Hy#+b-}nFdGjMM#RA}^qE%gd%V3z+n4dHmgf8dC(_goxR z{VxV>S|g#}#jK3~G1B%0znh6j>43NTLL6ChYO@g2YrUmp_ z2+qw}m={vs*r^ULE705l`Oog4Ov47+xaF2t;@#Zq{4WULs)Ck<2-t-ed!VxANAhyF zZj8Qo=MlTnhKwO;YZchq?9g}hwfd-0{3h4=SqtuX%CPXuzaz-*)Slg2Kmt3kpedmi$!FR~ zOY|KQBLKA*)fF?9)znZxeg2R)%ywyh7!P=8p(pzSt^y5&Fq`X-CL<3Wv>yquwv*|o ziJK@iixx%~GNZ~ufT-B!I;di~mGP-|^?U9O{wT&-qMG{~JWb|KNu0~DG!Dh_XMY*thxkC;ku z1n+xlH{K$%Nu#}r%LR#$cWeYc?V+4m%E>}NP@kd8g|wh28nqTyF|X}e#RP)|>2Gs5 zlT9ge3?<^?E-j)xmEv-5>Ge7tkC6FWPLDgeZ__rJ9i&%bQ9L=GcKMiTqJbUT2xj$g;y+xdQy2(_Y`3tkfILm_x5Np zH(vse=ILZ`7^Jjtc8lkr(L*{9h7{GhfW z6#%s$4Ms54=cDJYENjNl^T&hj%Q}R_7FVIprWM)Q53Sz~RYCc@$nxtrfd*_K#iC!M zVVVm3o9HL7snsEc4D;bm)|sH6PF$+6T4!CqNSNpm;d&bnBqKW18-*4d74@yqa4mT= zljrmTnJ2ycVnB#}`ZK0a5M1hOW6(_DECGKU;WPXyhzhj^AFcrH(U>3^HI$uH&&G)y-yWt~%uyd{#< z3_z0_gFm6iu<&eKcAe{FX>`dMir8a?PY~UDR)>`I?-Fa`89=SY9EAe(O{I!bAOs%`26B(XB}DwYSRD2Afuv|R{&4Ct2X}jDoo_lW27C-nuz6Lr)o^#LjziD2yzW~7{hR^>Th|APR&dQS&~<43Y6qeF zO(9izKeY=rk8J_cEx#Fd$*Fq85+F41cP$xYfx~12M4x`fjG)j%`!(QX7IpLD`d4c6 zDT~AaoRB1)LudpzxH^14{Ivkas%%{Z=7&SiB`xH`}c?)!t!&rNRp!hqd`sWL?Z|p z&bA$`h3v`1rQ4a{sCfo-uewNIv09Vme1>e!DS)Tk?U>Pml!uL2AdJof3aXg1-D?!1 zx&4^?w?jV?k`{?a$xsOt@J$z?>d32>)qc5Xpb}#p2L-WyDoubA(XteX=SJj$-Tw(D ze=QO>Z`OC>pWlY14}4am^O_^s8ToJ1(#OvYv2x;j%7#GgI6JY#7oH3r2T}s|VhZJb zUK0gs9@mg|15GOP`1wb+m7ulpsJhIICv#w$*eEGv_2?%%7VHMJ1V@JNup13GCdO{~ zxR@Ad!bZAu0z=?UgCi{(>)$a7AW>wdF0>AXNJ8=TeD53MhN`&kgpoO-Gl+9qQ@x*p5tyh$SON`>KgA$t0y+in{r^PS z#>8}@S1wgfC%H@`siu6R(b;$W#tm}{D$wE{pxXq>XAJ*DP%A1*0Eq>{3CMC}z~?~r z6Kg{I6adNUP`*&B_NO!yJN@2`e7sr|D3rQVp|mPEaV8~KbkY33tPs=7Zvu5a)k1cK zP`ZXlRME7%Kivgn9BQ<6)dcGbM?>}W#A6)rVQYv`-`=FSancpV=oTl`N*E^5HgaNgbEqR{92?&F|0(tpW9|#gXXlYOG#xcfX zlj0ySqZ0v9LO^(sfV$up{vDc;0(q0R=1{r%6Nq>IhbCz zaizqgv9y!+MlcZSh@*-A<_# z=$zp1IA6ts3FnZP3U68AVkdT>5Fg1QE05c#ZT@B~wAkXe={h)v!#-K41{ed~;{-HN z@eD*G_p|8_mW4J$ua*S88gh;cUYV*Tv~RA`c*Q z(l`w*UJSLOWoz-a^g@bRFhGV^PBXB{-k^Z3-Dt0=(7wq5IvZ&3kPO~oY=r>s8`;{n z8(Z%{(`8KzoX+;ri$_uccb?8c2I@F#h6ZptAdw)n1@T$XYs^r&+C#Rs;LN50#h;Kr znjTfn||wpPG+Gp5}0hgRTHPLzhnSLoCFIXXr| zd_wA*mT%XELgbR!2*92IH283PVf+-JinEjhwc~wZpl;o-5v9Jq9pbN3Au5GGc zV>B2_9t{f306mheD)_uUl>QZ2c7U3oHnj21kZYIHrT7YjZ=RYr23w{pMRObS+j_@5 zTt^D9e3g<8rF|AxWR_-crW`1qdj|1gc918sPwD2p`R_N_Z+!!*R4P)TsN(uw$WIP0^ULpG#$%5=hi=Y@F*$TRWAWwUAeDmmLLD!)p}JRpK%_(1fE_}G>kHX@}h6ud6Uu} z4VE6t9@8^`*Bje1fTT?Wko1SRnO)l}>rL;`Dd)9Pn;ngm=!4$F0D z6KF=1L#-&=It>W;W-x-&2IhcvrPNK&PHLgln}GLtwj2(5F)$t8BpwMaZC<(RA)!v<+8-K@;i5ES zF0R;YzL{7P3Q?r&yW!kLHs{^NABI9x2WZ4RLAb`qCVNH_Oo@5{97U3d>S9&NlvCbR zu2fi^kjn&m^P93-P>6GzYkhxnt&>@wy#ZpWy%Xtm3r1xfqtU=ZZ7sl|-;--TstBoG zp$-ER>l8+UtVj2I(?z%4VqgqAWIqKcAG4&*2TR(py!fmCNdQfK1@6+p=rEGIEZ4@n zW7Pd^Y(PF413I6XHqR5Zm2*v~4;x>azV)Tx+M1PRqmIN+uig2c^SnO?037TZxT;8; zo&bd7H{A8o$l5lBnLzB~x%(Kq?C9y~$$`K!!gWYI4?*^%?Cvcyv)X)h!t8^?JKjJN z=!GGH$o5a`PmCxD<)xRrp{<}=XH8dT#{fsh6b25TuPM&uNaV?qMUlUFO7{KDL(l5` zjNh(+LEfbGrs}3S^Mww}+}QvT@U2Y`{cjp(wb1+ECK@R58O@|t0Lk0cogUbi>z_7o zMABwJ8fmZRMGWy+1Nl8|nBj2%h$;a9zXD*`KQ$mYckMX_g(N7UA9P=Eno-@gew-GU z12)l6=Y)G8hI>B)+YbLd0@6Z|Tvhsz1D)gSP@`%axHr0vo?L3_N-vL~00PtHe~69U zz`+Nn4kV+%viwoZm3y@lE8O`Rf?_jlaZ!QiKW8p$AFV*$uC%uf=?;}$1dmu_R@+QP$Wj6sm4?h(uRy|9Dhcdw&CY7dhpKNago}Pd0+i1 z#E-Jo(#a@dAvykKsEG%5C86t@pHf`hAX5;%Uge;($%K^SwUx`oKr3e~3VmnQAHP%P zD)YXp_5hYcgi2@iJ7I8;$8CNd6#?eA^fJmLKNG-BDgSdQZGqYYfEQKshEmvuTm6tk z-T=&wz_1J=-W^xvKj@N&9jz)43nE9@&1;)7y^ejksEp&3$lEEyFf(y}LFBnrdPW(}*It2BY0Nda+8G3w% zzOubOo|+(>iMs_M7gLyOUGCES34$zjMDFNXF74CU&7=L>rXrxxC|5FZBNhI2C2)8EZx1nq!g7BcGY0sj0Zb)q zkmb8>e+RMw7uhS)z_B97Rj0Fp4GeL?G=zQCLod1ZI*Ik~J!r}7OysDhLS7g^+jd48Z@&-plc1#G?lnj@3LW2Du!nfZC2>qWAK!suzYcf4%8v81%)#q-uH-O2a9O_F;SQnv z&5noP-v6eL?_yDfaQ+~Ku#h0`T9quig3g#-+po)9g8({e6J5Od0PyTj@AySYd$FIm zi=e;&QZ!H$tCX~+9TAMY4y7SV{W?+}^)&q9}HtnTJx*FE@R z^sk@)zuElr>;Eg|_kyt-J$qCHhK}EWerZWeYfnG*gbWx4NjrA5*04=U)~|17&ia>dWrVdICm#**qyy=BWq~b746~qzh5EI%rDi#$`5>@DTb->c z!EdVr1N3(>1Bh_<-ACP40?$H?8nme^_x@y_0(U-X}?qsqGg1ZJh(X( zrjb3zI}VNIJ-iwGe%<}o;h=#D!OeEwJkrzeI;1_W6{s(b{soO_wwbFQ%7GuG24Fi>ZJqQ+b=Pf z9-k;P@_KcGr(EouNz)bYhOYwW%FwO+WSKz@n_krPiF4&+p6jjEchfv4f+K>#U-#e) zA%$|h_Fn5fIc;riyVg_+Suzq00f3|>_b4zeP3G4S*~TybfG=xZiRfaN(UPU^gEozX zHJb)TEML9bsyiXZgf*L*8%Wo>>DHSlW2TO*OYP82l`SbpaCrDU$jNUnU-;-C9j*&1 zgqVz4NoEkWGUU`d96HWQj?9WN>|T+wBTB(#mBPC_>(bty)L#0i(3*j0)tB&T@Qn)# zm7Zt{<*r)j`q5`FKtMA{*iR)so6r}v?|hRa_1AIq{B2+eHY4orU^X%p_N&YF*Pa=Mf{FIrs;4YtQ=%Z;yUG6OubKqqDCE)C^M-$c@Dj zsP$?)Y#}G!w%T;0&#b7ZKKESYI9=r5V#@T2?se~?8V42kaEnQdh*=snrO1~{j+&gB z47Pw-uNRf{)uok5_kHpamsFEsl!lSh%ujJh*p(b+Fu%E;R&KD;b*Vh8{>OCtv+x?L z>J08H<5Ko2Yp$@m$wftQ$dr?5*C==P{d%62=i8d4{LzMAlkSER3TB0`;p+A2l$GEZ zcvCErh{(0)l)5@vxXvxGrWKd8Y}@3}pJPOkT~(TcA1}%fHD7h@bQ8>(N?12(A=TJ{ zMlQwNl<(v?_V?`y>{_(FRP5WBt)*G7QWcf)*rvqSn^n>&cD-hfv@Ca()LOiFWrV_= z@d#fh2Zdy7bjd9+UzO|Evu>8IS5+N?sH&sj9AP4V^CuVb_x)wsGv|=KV8bb5r!q~& zk{my_79O@6INMLk;=UiSSfJC)hNb7+CuKiApGt0tRaUt6nGzo}BU|S21Vx97Yq6># zQ|gANPU<-7D+m|F2KQ7T5+~Rx)eB0&xW$oluybj0qbc0?&@hoO)emc~LzBY~uKdR} zw=OwIIo_z{k)p{`Fh!1b;}u{3Q7EeN8LNr*wFC{TP@kD*MXtJwn3K* ze(uB7cSk!NzPwS8vp5T8okZw5i`Uuttanbm1fU?~9__}bobq2oN@)MsO^fUEp}-JX z5aGE%B^G=sV1Sh;u+mgWxpQg7f=x@6F6To)4fB_4tFnLHxr4FzvCt>FreH}9#Rya! zdGW(ADAv9h9vV|rUhB1PUU;tjibtfa#(Cp`T@BYG*Q{-eK4Ie7PdKfrHuMTfAMw^q zzrbkgmJ$)w*8*;R?Oe^UYv?F<4Iqv>SJqV8+}NQ?ape$bpL<}tFxJ?6@%wgp1%((n zJGJwpy+R5^odxZ_OMyF(nk_%zqBwz38|0%O$!T_Cc5+pA?2X#?t)f%Y9x4%>>x8KC zI!}CZ1hqm+g5p8$oNFlheb*T4QVSlpVAkcLUy;qc z8M#oM6RXD8&M)M^8=4r@5Anr!HMM>!K!3bN)Ogv7JMErO+8Ei|L0LQBcZ@nDD&7yo z$z8`xzvo@NFz>3pI!UaY_HWhthvF}`Yp>#N)GX&4ewNs~LV=cuBcFn$EUJ!B^wrEh zjaVWkKeKwyd(C0l!yF)|tf&LJ-sEVAnOnX~v`O!?yBoJ{8Q(kIBIp1)8%9th;eq_!Z!U^{dZ=m5n>t zbJb#1fKjL=dx8;V=go|s=-%CWpxAYob2XjynOW&rRWLG`Nz$|tr`{o14A( zqnPni!e#Kbgay4a$B3!sav*JGmE~UImN*T!Xp5{RtPdmt@qp0ZA8>m8oyTkO5JYcUC{1_RGi4~ua)wP?##z=|Yia3?kRIanoQ-5!6BTcF<_JegrD ze=Aku?n}la;u505Z7Jxc<Df6MBAsq@I!%8m z@p*01ky-h`kWO-dO-*w$IJGo<;(PX4g1+H&hG19pyZ!kcKbESTh$gQ=JR5O+J9@$W zi)A72i4)cHu*n~eg?~44?+<~==qHhN(Wq6umeNlmJ076jeO}2sDTWuEm{@9m9I11B zzoI+xI>sA6+bLv1GEVi1bVDM|*p{>Ecc=Iyvr-mGg0HC57w$ zu%NDcq!a>&LA62q?Bjfj=dKsm5q$AiN!?ynEWNhV-Rc)Agt_ETh@OhBb?!X7Sc=ac zdd|Zh2A{+@at9kC$J)uujF#P3A$OLz8A2)_u^QB$0lgbG+0SWN$lg8uC$({xg9OGz zqh{3U_?XWEHLA$Ya@86-OC)+NTL9?iS$8NU3;^f*_)_^y&WvDf+aS}i&dIMRcqEFB zNoTTyTh!IH;sfi{J-ptHi4LFkg(i%_U(T1?L|Q*Y{U+p3E&E{OfH1?zYs=eYNu;Vr;j)-gkv4mchbaxSt+Frj z?mit4QH|xS6Q2w`@Rhh4!BGCf%txw^RFEB4(m#OT%Z#P3v*;K!1*LqO`Y%RZ)HMQs ziEq&?lEM9SGgwDfdcCnG`xpB786gn1Dza%;+gSQM=kv5GG@A~&*{d;}Xi<3kyCotA za|p+4rrIW$x_^VMY`YRTwq%}O$00KO^;vRu8u06VUb=bb`ua^qma0YLB9lK`_UDyj zxEy+KCQI4gIzkIq&;rIMK%vChNKPD_y%ZW5~98SRJf!ad&KJC4-Mdcj*BmVXR> zLMbb(`hj6+)ncZQjNeLuJXw&H6J8BwiUSOlq*wBGk9Wiy=1hF-hn|YdW~Na(#8|c+ z6=K)7P1Q;k>aNynvX-ant7`{2h<}}}4bodNkuxZ-<}O{8r z*-!`1b1k~_vWvdxnPL63KqQe|dDq}3oO`_4bjdcKHHv+E*eAp)Sx%T+uR#aasa2dF zjKZ9-dV{#hK4Mp?q=sK7Hcj}}$Y9-4eBIg@X+#X567igP$NTAZFWw_=zTjoIrMh+L zo#gkbU7uS2l!3jmPjOy$?4?&iv}W(z4GLXbmOAB`QeT+$*Q8REWU8`6LNqQJ{5EhK z@9t)QwV_~~R2A`EJ_)PKHF7KW6^72(#%nHq`SkcO)-1kJM>xMW;c=XKPV~RaaYXW; z*cR5F>tJ;dsLw zVCxVaeG+JI+&T6P%8$x%D-pxbjr=-z1g6rYAlB`7b|5C#0DSLBf9d^F z%kA4e6%KM($+2cJxCLG2p+^Kg`U?QS^;t=d2YAF>KPzOEwypO?#s%@Vx#Y0y-B>Qf%(+4Oix1Gi7lY)m-x?R~_SMZyS}JU2u8~t^=9J zF)w7*v`*a=KQYRYjnF1k*ARM1BJ;uZPtTLS=mwR^%q{$FXi>S)^~B2GzfazIGW~Q< zMX;1yM3GX*(M*29673qXTZLR6BFvfN#$t_=XI zZqs>Q7u8*`K*uLr=~>cSU?dXQVYW@ykhyL4){P*wtmDPL&rhiMNTs?BXO+B7>**C# zN)5TWkP>^j*f%u7RZd?sRFuJTXyn3rh*b2NqRMOh`{t&Df&#YNrd}ks9t$V?3RpuW~Pf+_MsM10la4_#8N|%_AJ!!GxM4iepRQO@lcXvIw zxn3_FU0z$6&LbUZ@k5AX*+e8ybmX89AskP=*3t-)HKY0$#tjGd)nT#Pc6zo8*We+OWQ4q4-=q$m-iHwWyB#dYY)^5tFW_)ZrlFpZ zc@v|`j0QMlt8B;g*dC`{YnLlT77b?1ORRWTq`hvA7-kiYYsFjk7w+&||K=!jnOZZ0 zSy``=)jdAWuhCkIpV)_HeMSnlem;5cE&2 zR2T+A#syp84t~0eH`JM%=Kp#5_MdN_|k%9*XWliT<|1SIi}i<~t%&6)xAoqvWw`Oi0EDPPN!Q!^efF^pgQAKy z#;GV`Mi1OYK002Xdoy#Pqruy^F3GU%rOpD4iG8I zaB+Kr-FTq}Z?S(v3}jnXzuMMecV1J~Wo_Lb=l;6*{W(m``vtEeKm%~Wzi#iH3k$^b z<$9&)M)j$u_-Ln(;w$^|W;;`h5`6Dg+jXNN!%DPgQgdT^P7^3gMG+6lI@)~~5y#Cm zPnY;YJVR3Uylm#ezWumwD3I2Oc59xUK&6e8_zFxp4`d`?MIq&^Ktk$GN)=NMszMPx zxyvpMHR&tXYWq3-uxOjzWfwcd7|xU-pg9DvfJp3m*VRaT_M>87kSU$&z^fJ}-3{BP z2yx)1DO;fT#xPef<+m3Eowf9GBJjEc`vO}R(R3}KDKZp?jIrmG96W>#OJ7Sz<_`w8fqtmF3*ikS@S3DeTT@+AbL$zV=RWl%HGDFxKPcGxo@()UaZ0 zJrkmndbftfkvLM2zTac{>|FP}&+i&>??gC)DIkAv_R-20fu|7H_9&3M*R7wA5*ETS zEsJov;$-xg;hgMX7)tlrnu6o{i=*0EU~K2eT$Q2bzNwDEk!bdb>uYM15^RN>k|fp3 z3!BCx9IX0-^0tnod$Kc7;KPF<%l^NKviRjTq99z*j8qo4mH`%~$kHqM02We@G{G1F z>B8|P>pcx_3)w>p-s%Q_nZzOsPQ(z^T(pWzEC>Wvu+z3k`Z@=2rq>TI7&o4nhzQa!htPES1?Gtx5>U!sJW9b{keR7= zbS5(4hDBYzMPPmK*$MNR*&u89NUu1E=N`!GW(pd|=|*P0LE?u%3O~k0DewI%Ttfzv5%b`AgYHoK+q5wy`U#hw+v7@u~0!u5JLh^s6 zLC0@_S;T~9M(FJHXd9|O7$a?m10QABg&|d7>F1Szn{p;+0#WKB;lii+p`)0`lp7Y$&(vkzQ zd;A8b|5ntQ9N~_hs=iQqSGV;L3}At-AuK#ifRUjE@pqkVm&5uHAYP(pxSUS*S;e7; zeY@&nFlFh0pY>Fz)&2*huHx4faX?d36_zsZj$&hQa5FdHC5LgT`i8ExF-1U>Z~EGj zSprfDu$tm1;tkLYVJKH+NH|Rf90u&Y8fsN6Qi;eVX^I6&+h}IHo^+#>E4ZFHQm4U- zQ~VJB5ja3@0nUVw^kii;a%MaS^|d%7R9fex89`7V|2=NI#f=}Spn54c_zuZ_$v=xy)Wv8gVfzSEZS zN30vj6W(gF3mTVN*ms=gx%kfx3B8WdvdfOj;U>$Onp{|BmqF8pV4!Q3^KlQ@|1=B0 z`Qwa;M^kSOuo68;j#pT|5@Km6)(ueOlnH?(jO#B80Y<@+od(Yki71Cjs=ku()U>DIP zR^To-z~QGq%2OP){slA~QhN_-o8K3AkBjcL1PB1n6K&Dr|9^qI|6!92TKaihrFPj>#; z+-|Eb-chOFw)+kA0MM~vgB~+%XU>IV@K^uW|H|O}6`Mdq6lWNqNErSbRBr#(`9K2* z!4g7%K;<`_(@}m-n|D)J0}WCH8v-`&P1Y6#a`qz%G5-6yT=%mrxC9X;8o!Y>Eq{4H*Vc>5$0S#NQ@sJvAO=1^>GWM>YRl1rzGE|F#6_s1JYqrPO~{Ded=vsXXIQm8YtRR>XSF zPc#Zi>W$i!z1Uc_Pyc=jtnIQ&cno@p5eS5SHRbdws1{-!CgIxm?oS^q-KV>Lw+yqH z{_Q>c2I>s{AA5)DobUB$@Y5!F8|XUUJP(RzMj&Bsc*FNj1NOf1#<{;3J(P9pe_YkYW5e0B>u3!4otA9uCIg=2Gv2-YK1@*7A%DfU z)$8Y8#BWl4F{+}PcTYw*)4@QhKvd>&zhX)$Xy*+_g>;WXH_RY1d4%dpfYgY zYH_jQ{j0{9kPApZQcdB~yrd6B%33SaA<~s~SEowXJQfo$fmH|B+V;@o9jjX_QnZh> zVABa{qDGKRqNEd;~mLYsU$A5>bfGqDk~&^a*)YY z+N>;kK^86_nXPwb;vi0^^$bNXfhKEwa6i_;eqZT9{mW_vnvv_sGPi0#!6xE6@!X1J zG`VXxsLg~WS4u*BEmRY#SXezBSt!S-)8g_^SW@Z&TX9gr97o~Qjno6}dp%VX^e?vR z5WN5XmGQe>V~(0CF#?cpB;4(|%akLqJ}V|`K=GII+-L;?b>`T+HgrnvpAqQr5P4-O z7al!O7lo#Gf}3b>WE!p)0dl86Okb&@it43V7@42C|A@7te@j|VrS8}8<0X>C+2qSC zm1fm|=dX&G@NMnn;kYhh`t-CN{ZNC$lXH;9EPvBiC+6No;BFy;ri?)`wNFsJ82Dgj zvW{6v=YEqW1-#wai?{gx@c|8q~bsv<4mIuNe{phYJo4_1@M8W70o9WjG zPCd5qr2r`!jJZq)wSpi^7O##Rsb8R$sgK!CF)BixFz zc&__>JZJkVEUnMo(PTV?Kb()OZKp}dNPxQX!P|@2jP>5Hloeh6uIcqRe3v#rMrC&s2lNCeLEpc?edp&UAgYUUNFrUW>FG%6V$g+9 zZ!9*vyyC~!;bNt|S))efNo`!?jsv`{V2**>%N`pk7uRgS;`E8ixYVjQ8s>%2L%O&7 z10x>YRSWi>7V&<~1H-y&Dov=ip}b3F7m(2j>?svXL1I2@=k?nm0*z7D#9C#-agi6i zHEXOx>4T}7!2hxA3FhE}hoSek`$SW$oEbPqmV)>y_ZAj%$<{T>kxB?Tlev(79*8EZ zCpA9-XnS)$^xggf1FecPv%u`R8D#AZ!rwqSU+7#;J>apPxdp%At!x<$QN;M=uM-`{ zI3T{k8=5q}#kSv0D0&sKy2nt9M-KN~^Py9T$G zAP5TH-K>M2sTrWI!1PbJF@@2!R-`~GaX}WK_UJtF{sc0%42VFIH{P)lxS_x?agUk@ z2&D=W%CW`fa#2CEbhIaO;oDt55~#Bg9`;luj0#cN-XvG}+5|eTL-VIIHV^U{xo(w#kZq2s^fkjE|Vp$HMl6*;kirkY-`A)N68ZB8YxvZb=5fP)FK65+jT=D5$iF zY+~V**1g79<@9f$zTGx!*%a33Kj)>LU$x+${FO7+<*ifF;^56P=sKFM3jFQsoV<+=a{Lm*~gKbZcEVf%+HpVg#p zQlt%KU*$4EyIiFK!08aXT%fy93K+$$KW)gR7Iyw1LF9nJ>f+nEz~iIC?UXkVlAo|U zrumfTUbr*GVZ50LB;DX~Hgl}orZw#c?{j0Kr{fFmL42k;+ zs~_N$iS`W*hUPB=#+>;(K$Y(*QFjTQIYP8h0M6zln;6Ep=_A<{-kLF%Vkjc`LE)PQ z2aCIq^Qc9G`$)}=g^A1*AO8euCfwsLeL~*M_WQ%7rQ+tqX4^$w22aBSEn1^u zTD_7ko2n*o){1&TW`BMYuf~Kih#sGnv%aGcc&Z3Y+tW<#kv>WYwWa9A^o8U?tq#eV zmS3i)z8ui^UnK*|oAqG&WrjurpD-I|X>X)*z{N*7M?-;ER(S3^Tnm^*2!2FgKoVQv zx(o2g9{pa%%sH90XX@)r-nzJi+CDel$`RYa+E9_bax}LevWY%#*J5=(^S2KI=%Q$d z9`{HYz2;{&;69w$$WHfSW*3ySXc+fA8DK@Ut%ErM;yT{@;O!}Z9Ds<~2XQM%69Xi8pMn2B7r%bdl=ImoT042`AAu|xT=&dKz> z3{NZAbaNna_Kr=&{PxpKN}fR9(qo|Z(Q5SNt8B9r;&-t+W)~q0f(+EZVuW}s{8lO~aLqf#7kZu_8>tW0 zTJ&4q+k)h?1&e;B65!FBoA(pmog>WWe=?_ypXmVi4TMejJ_8a-5tfq0%S$Z$w%-3A zb#EP4W%h-SqK+{l;EYO#3W`BVhk(i;A_6KZ(jrGex;rdDr6i<7K|oYMT3SK6rSs4Y zhdwlS?SluMxijD2{oMQ4{qXPMefPWf+AE&*thG=ec42Fu%$_`g9HbQkR4LK%hH~C0 zU$fdQkx-GumqNzj#3WEaj~}uskUgrAfVOz+Uv)Un`LOU&5o+;{LWBN&^4SBL^}v`f zJ1$FV3P=DA;(VUCO|(jxpC^hacxXwVzJ99*v2c)E3TN&yA=lw#`9z%`j?h&&lUx3v zEB(ghb9a$@h+L*cCo(B%v>_@ce<_S-Ul_mmdQcK_b+*>w=LVb>AAJoVxv6dVV8S^- zm~@I4#7Os7{!CF+R6(8XK|k-K=Op}!7Px6y|IwTFrSZuE}V5Suvza5_KdTaWnK_8I?-&Dje4mM5Q8|sCopqY zjA0P)J}=og~fX}pq{kA6Vw-9wqt(<|%9_v)|=F+?P7q6Mz;cmW2N16yN zyC9sh4k-{`7)?rS_S|loO}4Fn4&VG`TA}YgZ`5EIO@2*VssRjB-a8?xZ_Z5#c##~s z4!S4lKbewIrH)V)^@KcueJpF5DBrE&2GN**D6_lzr^?UBu(~z;h;;p)?DnJ%(Qi+! zQp{MylJ+DA+ZO1hO?)@Y*8zTkn*6Oe=ME|a3SEQ1$5gqwhc&FJyWx`*hdRwXtsu*o z7PLe^jOUbiC^T;$`w=Fx;4<>(Rwyaj?ItQ}XhaMz6(9ZW7@_phr(oOZ=GtnJH99uU z@=9drT3)iWUM3sbrnWHhs_u*yp!Bqe)2-u8yl&UCA!@?#?r)i!TahID#sKU9Uj60A zI;9Pn*ML5AQFMi(IKxJ5jm8{YLG?^VIMKpm1@TJ|)$qg@}nMWR?;6+D5hMgJ~ zoLXnx@0_@CQjaSIT-oiW&#CffYurat-KJZ6(h~PcK=*kD5!Svxs(A<{cT=!ttZ@M& zN3z0-BCx3l!%jlK2%%vosapphCu%ugjmf@PDV#R^=(GO$jQt4sgB%5^ep%)maATlvmR=E95@U98oqEIS=3uZEx3 znWb145$~FGKVX8WhM1anH_?wWWO)Y1uDW)eIV>nhW1f~n*$|!xtDhy8m7Hf=&LG-y9Rf*;%T{}m} zzDtK=r|A;s+J+toMqKic8gBUjp4d5OD)QT+9Qi{fG*q=&l2Bk`8}nTbM@>_`+rMi% zm7q{46Mx`*C!*=XtvQ3z1yxBkz|*WawVz6OA=<0mlGX$ zL-h_h(3e`MK0%U*FrJ7;IYO6+kdp*TFJ& zk^77sc|KLuYNObBUmsj}Zsfu@B*|pB!#o>mR83#>aZ4tmsMuskV>)kG_LNR=ZWtBw zH9&~ceuw%VXnPNGT0XJ9GxM@THYkI%Lq4s#YQg+M`v<*LM3Xu6v~9Xv%48}!&%#CN z^eypK%O_(n>~i!osfxqcyCs%qylbm9{b>e8j3IX?Nz-B*#qN~$c(_!T3(>d!xpIF| zX-|0CgLaNFVTqUez+HTo5-usw;hS`Yqg~u!wy{j>g7t@E#qVm{8?WQCg%c+x9rzr= zAXD<-$yht&4l%9u`Kw`+SR>PSLA6z zMsxpA<-pQ}^->h2&E~#I?6IlQ%lZo`^ULh?pKQsn+?ONNd8qT)DLGW#DWrW~87!WS zFkbM-jDEUv!rqy~r`Q!P^a~}Tt8-bxm?cfNDCc-J-+n8^bo}gsn2w`lQBOI~Eiedi zENy_tc`*#%#i}QG{I`h<8OaUFh*D1eLJqjbygI#e?_y*_Q0M+U(O6@-;ail#Poj;C zY=P~jt(GNun#nq?&cY>Fa#&RWJmxweyGZS3bi7e)>5NTWZW_xpQ2D($re);lXg2t0=5QbLg@bpcLX5rTD!Yd}{T_d7Z?Cd18tG7wX zmswxwP_n{Xx=d+oFtgtK?FR5J#G}R@yzw;gplLdgE-q@^8Q0!r5w5YPFyotDf?rAB zg^;es3@Pk3g0a`_dDu9CVu)q-s0->>eObzSowgla8SwCrAtd!QL$X`=mUx!{E6-mzf$3np(qsOpw~*9X?vNjU{C zI>+9!x}AyZNBZ!w_Ur3!+ZFdjH3;yJIEf#s{C(R?E_S{55}0=a^oZcNUuHPx7Pf_+ z`@zMt7Ndhqt5#uH1N%|&zL#>kqFR(;z6!?g4r(ckI~*CW8L96E;OwRFawVC`mv`3* z+a0t0LC>0)V{42~Jx~6XVhhONa~HFzXxAsXDIUwGV4$RHTjw#d<5uFoV$k7J;{9`* z7gqSK7dpk;>T^Gt1zZe>$Qkr;@3s!4&0XLg%fsX9)}OetRyg0evnQQ$hC1NGkAFLGtOb&o78lIY$m#=Q zV$8|jcq~6Qdt;`mn~N9&bzE0ILDD=D1usqa3U4HjR3t$5D#pSf1QPI4!#9FtuEuU| z8+qjVuv0JRm!`ak1H$QHb0eJ1bjhcHoGmjMa>P9y>O?I3ky5h~j|eX_J#zb&T@XSc zmK=tQGiE*V8&>GS<;ji2zMisj8|wT%2)*8rEupL$I&+qVSojG1=b%(!QteGGBzI;qA4f^EuG*%k_a46Pc#_=A$2_Nz)M1;2xc)ew+i3d2J=- z_scf5!@rj$*Yj)mS_I7{gu01Y88zKY7uyJ7scbaZ*kP3~x1lqwC7qQ10UFxhb!L{C z&Z`mtzK=nSKUvrjIu-oWlnl(3M74KXs!0Xj&ek=rMlIM=M;IguMJ-S~d+MX{mnQAc zhnWC84I>?`jd6eo5+XGgrTgLbeGbz@<`XrOQ#N^%(-CxNgx3ihqGuj=CBi4YMT7AQ z#Wy~k5dJzMyHStV-A8Y@_u-o;+KHA!XYuO+z5@kX!GAt|-=1q|k`hZVM=|2Oi#+o; zi_2&Di@K^o%(tl9jgzEOh0I?XZOcH9~tAl{KlFl z>--8~?3ka-)&?NtGFepf#e^xTlneQzBXiz*)W-sh?*`rydTOovz2F8BV#Qo(Re6># z-t)1F27kab><=yEhcdd=8`=m4r_MZn{4`bBR{upVCx#(AW1X`3nXtu#I;&2QQQ-Tc zLhoZ80<;Ny`{0%H-nqGJ3Mr zt?*-wF(n+Gv|-0ZI+0_f73vSnph2d-7t}z6v`cuJsP~3!h>EXj_4>ojl5#e01R^X# zgn20$6<`5NwwTpkQ>YJSrd2p`xYl$+Qbm}gVO^hG;X~-B`7CSQV||DZJ3y>>xpsI7II^fej9LZy$$>=H&q{QJrDx^uB?P1nex3yo-17WtyL?yclgK03(w|_gH`#1p6@oieSNwW`ANYr&9xk~)6kj91hR?yYlSM-^O=x1kJc~nj_wdJ z`(0{Rz4k5A71N7XC&y~;=Xe&K4L_)x{bD-rw7FpN4bT_Bo`f-{?)lk(wwOWBQaQV0 zUJ$sY1s8fp+pCcp2;nn&4RCZhDESVpZUMYSis=cmM*u z`Z&nAZKsJTBCj{42L;n~4)gxDP34OTrF=d)bSYf7)NE@M?jgpG|LnASS%Ei?m1ADn zSeXF*fyb9d5+(MWXRvSR4~1)8Awr)yky17T(ME(t5V9Ae0HY_XW|K4YO*JFBW9)BY zt8eR-S?HC930lH!BuwN9l-;QD_mp0r41ppdD42(IYe_op3la`eD6G-l|x)y$q`U%3r8n(-7Q)^=zVYH zdYYWRI_xw`HgbrY@S!Ef{YAJ{X5@(oS>V_#1(W?&?kDt=A|S0HX)L_&qVD@y@bbih zwhOu&1y<(-miP`DDxSewIg?BIk2-_^5ZNIvi~D9XT1CN^H5q2K&gaNZYdhIU@5weW z*5;E|YfQ*Mo^yr+U(WBr`wm03Uf+Qpt|Cj>11b^VpL9$BM7%oiWJ+k<{wegtJrzw1 z>gW?>U#w-w9P)H$;<2`#2?RI%gsz||I8VL1T!MN4r@o!U5-@RkPAL;VUMm$F!pK0a~%oSj4B#{utD!^jqQY_QU&W zl<|04!5g;$Vg`Zjp%$`|R;B;*85F=hyi82$@AqT_CJ;jIOAxE^T~8?>cq|q2SW|;y z+=WY=^Vthw3oo+c4~ft#l_s5RHtvTavzc&67OM3b`V9Q($<~+`Brj-+7@6)8!&A*r z&a?2eC2ytPhrT8_ORdNe+ej{zVBg&sy3iQB3+}5mc9703xB;8v_EFj}T&U3=JT=`Z{*;Y%>vlbRJc&LYp(~oI1EOSVC z*;6XhwIg~xudV>uIAAic>D$Dqq7{xc^*auaN+4gtkT%wGGS(P#vMU2> z3gCunU)*B>q16N9CBUxa{F%;-H9ThMn=yfi&v)K6%RC8d7HtcYQ8xSbrbm8xF@2cO z18n5Sg(8O*pinRf&`{9XpVY((4Jb>bTU$YV*+DfMy`}-noYiX$MwMsEk^#)Ut{v1! zksn6$bh$jr!vA-*!3!zQa|8Th^BVVr_=`HIE_`7(@6{i#NYz~ZzC#<}iCedTFV!YM zO6%D%(a#q!-nzTKK!sFnHtix4-S#-BE4>7ETyZbIrEF`$^&A}3k0gKPcyUCBVWA#H zJrly_`n>c?FYpE+y!+Kah-fx$1 zF!96YMAoelI|o1hJhsK2Qe?MAQKBQspe^0aQ_M^P02M8h;Rh=+`ChjiR;qOB$nbwf z4RXe3M5!)g<^M)b)T!`VXGI8QB-AyJj|jtnv(?$GH~voF>gQwp^{`21yrz>hCR0X} zhc+l(pBGrV)G7|24N~U#tsq&JOl>sjCeRl>Pszt1nJ5BaL;%yw)(|J6LR?DDMxO5BlhbB<-wb|QlQD8SMeY{kB`dLQ(4Sn2BYP~!-GJtdo=GaWY9%Eez~GNO z0WMEY0_y9HTH8Rs5<*YUPrrzkEAx{hFU_D-$fDrJd}|9f0^AWD>^2EnRjFaIbN~t) zvSr`ssY!TIgcTA`)gj5WA=hDmKv0(r=Rn?WCRzi?c#o=K5fnHy6mAND z;!ZoKgSJ>Ub3yJ&5}}0_cLTv?_jw`F1mNDub|&1-$64mgTw85%Ssx@)E7=xS(t*5Z zoi)`Sp*xpZf@}8->pf>C5w>3ist)MIX8mlvP8ZqM99pqB1jC3?%P8V(y~o6Kz#b|8 zL+aM2uI}UUk?)QClgomRBgLUmN_<1mw0h(kI0W}TvYLm|0pBonehJH) zC5l)Bs2H1vkxBTFXJ|Hy&1$v4`kxG3<~NGD-olsU7p^c7xkYzqyTTd?NI}Af}lxmjGKOin%76N;)>Q)j+5_eR76h@cdUH7MO*APjf8x5RbiP2qAf zJC!3<%tST6tW{h|%t4o0t-vg+u2&fsON_Ekg*#dzLKLc;n68l+PD&dOsl-OY$e%UA z@ED<|N2s7kbuqB6Z6Sn9bUseNNrdqUN}hg|^NyZd9dcw~&+QxO)Ur{eFRnf|JZXIx zwT!=s8ch8d{iH+WwYdu49#D3#zQ-b+g+o&iP=nv=*8<^We}COe%vLvi1(J;qO#DDD zOET&`r}kr@fDkdWHF^gmcsvG*+BElBMgzarwF@~b!l^Ctl7`q0Z!oxVGxBMVGzatZx^92 zgzP4-*2;Vmg8zyPRD_JgH-~Tx{QF_J>kHw<&HqY{a2id~Nc?PYdT4?b=vXi=kYp;h$pi^jH877=3(qM$~ z9N?jqfA|5^g2bS?xIvRIuu4CSG0pRb?h9;?)60v?L+xRDwLCNatoJX7b}M24X=nkCiFsfxMF~9vX!%>U~hi_$(a~eK`>-dqjZRp42t(;&7Vn0Auz* zD@7z^r|xN_%Z8v7q8oQYryWy6_wBbG(=$?@e{5>St$-hTC3T%wFqgp^=5tr(qk(yksWDoBvPkrRK;i-mNmh!!PdDy z&)oerCG#~_pzf1M|8@Sxrd|Z)LGXbeamI?$p|heIz#+b z+HAKC)<$6Hi|Q$Ns>fgZ0t{ZDk{9_Hg>`M-kq!nLr^GzN=RnVF;4YLuE0opUD2`cO zhjO0?^XPqF%Um9pM3YO!TyRH}-B>d@(V<$&=|x$^d%uZFP<>N{vRto(rMEo2sBS3c zWTL3Y95~&W-*(IAF11@UWl!2|FcRons(Yecn$HGI42v(cEauzIw+IAVH5y2}mhLy+ zcceWy)mT4pS!7k@DNjw#L>VSRaIFGcwug_=p?EpcLvPP8pkzQr_Wb?hZA36tp8A~e z0~7r@OLWV0Msq(6xZYlWTZ%uqCER2T@4Ghp@Q5oF%f8#Q()*3d5=xTgdU6%L5M) z@w0P@XO*2|tDzpqO75fdSb5->86oGlhF_Nt8$hK>7FmMiqK@k3U-g{yx!wvw1*9aM zV$Y>pZeSG3!sW6Zb|V(j)d$EVAbX9tR$DxtQ@dpY{q<{rMs1N>oIHbS$j2izZ3kQm zEHhoU6&|c!j1R@OjUJ`=)i@rWGSWL7Rq(a$Ss6<6pD1dfA<%rwtImvwjW zyU-bjup_)#2oXZXL0gd2 z>K_KYq|ggl&Wwb$_pBaGbJ#GaV}$T?gK^uLYWtNew3FK{Xg_h3oVK{V*P@ zu7+XZ`q(t``YQtItM83+!>`G-qP8=go~R%Ww_GsSG%|*6!8}KHcU$(tZ$egy`M3K{ zLHl_V1eZG4%sswGz)O{X@wc}Os$cnokVLt3ZNw*PzHKQdsApEpXC9J15%~vyLrTr2a`l5z;-WD|YjaOf345MBkb?;Gxc)-~f#BT~K55x$_w77y zvp$=Y{Kkw`WLM$EW-`X~2fh}|WBz-j5^UyTX`HeF^Nd6!24B=u#O(eOIlgB+fg5#QuDufqoXWJ2kuIl@;^&5d;3H){Hajy9yV-Me`)NWfjj*0mMBnqo zJ;l7a5d%fB#b7;t|1|B68kGLpcf?M0u|IW$UI@tUWiwDKXt*HE z36}mEsBYf@P)ctuW@w_y&nKVaN}hhwkA?v^guD0z?xJ)uQwE^+jvF7)b=3UV>v&n> z1Z$cs$YFo5$Dtk+pNv8`0t|MdB~8T~jDl{RF(xPBYoRZ;ro}|!!yYLFA0)31%ZJ^3 zX@R=AV3tsiou~>U#D!Ka2iM@%bWdq<@l8RW#%`!1zGvQk6HO_&K>BlH?@xZAUpU~^ zm=N-iq*6Y*)3I*-icB@1^AZwg9~>$4F4PY9S#<=dh=*;+9+TDd$2lYf!O&?ASkgF~TW^_%I8Iiq-6rs@U;^vyX(b6lko|TG z5Y0lYk(eA**OAbEn+7gGaq1MRtOabp0(h;(bJdWpx+CezJfvYJ^`s))qM5?yo(S|p z5Qg$MDhwUC!$aYHaRET!K*tA6z5)0+sk2r2 zsMVKsfA6a@?#=~qE{GWe=v0RQolVg%^d{m?3wP=(m?YPV>3!KmfLOM3ESUOn{K%sc zt|D`X&coUornBLPHHSC|?cAV-8&(RHB|i5c7yY(t`bb6Nen$C;LN!o39~}PI7K%8I zTvX6Y8AtV^pJn=>(ag8=Df|8ReN86tVd=*JCc@-1fEs`N8{YJHDMRop;adGaIwpZQV(F=AN~TD>Lbtgo;Vq<63IW_t`z0MAv757`#qtU_C?S`Nzk11dc6% z%M*$w7w{k1?oW$1r)3 zGcYjUzNVn-I=hdM{6p~(6d@5h6mQYO%fIfBa+gh?0H$rGrB)e{Y0ID|>;Ld}fP<|h z^zy5{!<7suH=!W&UGtYCGz|Ood^~*&`ZylF;n9QaMB(xUfoiU5D6D^#w8pS7N=p`! zceo9V&WyUYSbGY)i}a&I5qt#eC%HxTX`b{x!Zt$dd9XLi7JCZ7k2?x^Vg3qAv@1ABioD*yR5Z(__^UWL-1 zeOdP)J7vl)b?bT0S}vTHmcZHR@H1x;Fez%##phbP<%I973v7}+frp9abo_uZUvA}L zg=|~gCCkzmXa#vEPmI`tILFvQxtCYXf$Ky2Bx0+)oCuROPyd2})^726g}|euh=g0t z(k^0Hrrc}>B;!J810!91r~q-E2|TM;zk*golsYOj_PK1takDLMHh@7tIIO6vZ*AKz za>~1vBn8(d=Tz(9{)e~WqN_Cnhp$|1sax+FWNUrQo>1JD~_KAHXg0aO98#5ZWu~Q%i1BJLmg;hwrU$0uubBnUnrK_#z0M#S23&tgs ztHRs^w5i;A2d~93Y+Vy%2|;fh%p}HteDwGVV^;3TTyy;+ocTxw=P2%hJY zcrSy;7cy(g&Y{bYW7t`mLi%3MgZ#+ST z0;3SeyN`t>hsq4+O9hor0~-evQ3Q7vQ!_ zHt<%g8wPmjQPAv;9U?1CkPW!HMG^IB;@O2mOVAfB0WeyE68YhA%MwYa@AxJ5CtKp< zx`}mjZIJs(AcJnm-YVg1hl3#)Lh@@N_Cca~sFo}%IKTGwCYwom@5jZDgn@1+t`ql# z&$fro$uqX0n$kzVJ;8zZZc`kgGB&_045}80tc3PFE$D??1$^g2Vc_TKfcvvqkoQwk zG>J;*eJc>mh$()q-*{c*LYQ`+M9y(s1}yTWrt&yY(qDk5ctY=R@}RGrH!41}^8L}g z>SwBfr~y;`J#QW%vFU!6q*O?AQp5`P2Lr%Sg73~ieMT>b;s++%(}*_o*cUpOn*y_> zB*M3677Z|<`tt%cxA|lJ;aUDGah=M-l1OJDHG`xZQ3|dRcR|mrDoXshr&=yg8!9?E z*v?1xQ~tKm6FltP|Xf1S`O<{zGZh1(Puxk#H?V*bNjT9P)=g)8`h3 zMGn(KW|&v2ge+ccKkDX2fZX9YQMvhV#EaF@mrf<_9=nU|Q5n$NBte&MY>anOJoCec zEl!(sws~ZArrC8VD~ug)HN?o9@?ZM+`{1e8i(0{3n%Hoh)`lXfudau^PR zDva33wZ#0f&jtFFBu{ooU+1x$Qq2G0R^3=Q8bZar? z|FsyIt;M{<{MTaUw-)2`UyJeETFmADTFmvW#hm)D#kl=kO!2>+axf0Y`)GTpF&{(6 z#5edKXK;7xP4D@zQ#VK+>e2gPOy05tRc(Lx^$|5g{?O=-2IO?g^q6><*k3adb)Xb{g|z9N(=svZ!!}n z3c0S(e{AreBk{8vO#fps?oL}jvHgGllS<)}$(y(7-SmIRjF8fgL;Cj*dc~N%D9vkX ze>Q8SmZz?~N3+?^oNW^v<(7LFdkdLtN3T6%D86+0#fll!yP@)|!f_+w)`@V2pIn zYehcZ>8-%0J-OPD;DcQo(F->sym#i`zA>`hvR7X>pftU8!k0sLTsen#J|BC=_C%X~ zKZe(K`9eefVED(xk$j+htW^G$I?$>Rr^dRw*}#L6E%QOSvyY}g+0=Zv6X6Bp|Mr5% z&h6TXEvXLQCA~!*cGR`u)()rbpGk6yP@T=qc61ce-LRKx$hCej8qtGgT@fkRUiu~} zHp+SJN%Ja04^Az&udbnQ%Jve{oEQF0?q(=0twWpZ?W*n;sZ4Ij>9UsHU3Y(yzpU0I zPMS8`klA36);?s8S=hc($o$EV!9Vuv@hdXA;a6A5alOPMQGD>$VzDhV~1UAyPdsv2N#`>bC zSF9nH!Rf4wV#0IsPzUVTF?5UxLH}}$=2eCs8niilV}IQTt5w&c!c?^==dW2(y4a`O zA|7a)qb`7Uy4!(-gnoyhz^|$a4#Qj1wRBOt5Jb+xf^=-&)$4xeeUY>AizWYc6-KEJZWRb^nr4is$v#$FTtzM_QI5GM+f z^pSz3^R5aU!oKb=_Ju3Z^9M|Jy^w-N%F6V+KGM#*goucUx+3rF^$Eqel0O*btyRJ1 z{?IU&H!hAWRn(DvXu8ktzK?Xj%$ivNxo^8%s4Ur?T_8%f%ex{MgcyRv1y+Zqu+AIo z_En|R(+ya)YOVDJdB>o%bEYHZeD^k#2v#j~OLyyb&X73;*lc7jCFF;}%X@J08#EO- zhK1!zM1z=xWTNT0Oq|F?mv$2**rVexdgr%ycV=yEqi#}6a*j2%Xl~P9rEGT*15K+< zvU`xOYd696274A5dOuf6NyyoKY(ohd`#djaHRcb~U~_-?GxdikFBDTzlY5A&&EZ{C zl(78C0(!ekOi8mZC$yxBrqw3-v_PfIH^Tk6)b z7^Ty`ipjQN3vZ%ZQp;>)PhB-JS=MHArh_)SMUAcxs}f&up`uDk&VSBq4r?PnxFRB) zeOdhu!Dk58BPznUYnCv1)1eZ)fFG^{ucT&d@tpR#=HBSIA|K~GR<`gQi;9HzoG&Wb zJ4RPPHA$|~YZ*EC*{+V@ay1*36BChPVn0i~B@HKFkuzfV!S4My)8MxTtkw5BrW|y(bZ(o5#i7`K4{;Iw_Oek_||`wu8~4RbmQyQv8;#M^Ex!`P-8s7mt=qMT{9} zVveStOKxFc>GP_Y1pka=cj_cjqg;;~hry65fndLXnBoUMmN|>}?>CoD)zsBf?RBg% z@3<`DJw(}Fw5m#xJ7d{o7>IPAx)Hi;%ErHL4%^V*H|Mk~-Y<2EtHV^}j07ojy@8l% z^1BEFxPVI8a<;jIGt1pNvx}{w$)Wf&;LQDyvF|LRGsUjgq_h^wAV0>fifGXJ$|t>}^SoNYUm*IzI<2)al`HFN z*o|vliDcOvE(~-BERqG29pt3uras^fuF@1fE}g@JBzZNfA^l1jLR3k*ex1xRHcTmC z9e?=bvUOTi;$>Nq3&SI%Hu>wGbrKdSaNh5CK#Ov7 z_;pbOBa;#}t2m=q)GnfW0*KG)%^6Zw&h$L*O>sLXglu`ya zQmk)ZH^~oU$k*}D-|*e0ZynBPOouoIB&=!6eMg5GYy0bAzPgI8kf_tf7;f-yJ23yH z70;u=xi$en5N7(xe~k+GFuC7gkSr%zsE$<=;g7)wSFEgB)vc`Lp3U8Y?YD@{!eD zV`GMz{W;-X$fw-t)TELzUT$9l*WCNx#LVn(y5-(MOVum+Lm*DU$|RtwaMYqVtlXFt zML*}ii%5$#Iy@^{Sfc(zPX6|FnAN}S(S6M`{T-9xpkD|I!4bO{tyA5x1WMtje%aIu z@^GxzL}UrE@8FixgU-M2Z~L`ZnLjn|ZM!Vk&(?#APUZHHG1P!i4dg>q7qEW$1ZIy*qNQ|)) zK^_BB;lmZDZw-aHI*lY6dKh*lpPsMSz^<2ZMm-tgv|}WiueiX1sbgzhP8Dm|lcRP8 zhmRxEBY0EotQxo^erd#1_j-rry@e^bZs}LJA;IUvm+m+;iD-PC!N;RY7&Wi zAbYcgoqMed%bzW3JNzocZMmw6%U=4*Y(eRim1pk!wQJ&vEyvL54BF+d)HmmJ5%!{+ zxEJ5ARAY_kT0@j;Z@UHAeAc?&Lj7e`Wy_kJSWVZB{1!%2xV>x=|fS7f>$VCcC*hKe>@*2;Un>&2x`PQrqpIJr( zJxf1pcPeeHAGCGd<6{B?VQ*X$@vAaK_w6J2uB>{OcSL?Dx*}f-Jl*GdN$s ze!jq{%74a;{;ZRb-ig%FuWRZW1p8o36we33dqvJxkB#KsPrAD}u<^+kb8U7)V~t}h z!nqB+fYJ1}2{Ym3^)9YNPK$I7HW~?1!oDm&leU`bTL?Hv`DIOkuy7?`?z?3Z!kkVbcg|p@z z`*w^ikZq{u_k0gp!$ZmU@qKl0-f@qvtTr+Bh`VlZtQz&`71SPIbuq~F64@8hn}3MT zk-2H?B)B+o(-3cLf_B&AE%jEvcgHK4JsZH2OM$=2+b5z_jQeyDVx!wlVZlG$a*MtR zY^6Qp)19t7^C}5N3lkBm++&tqJp!7Yr~dj!6qBY*O=J1&N`J@mxbVU6J#sSBWIGG` z*zpN4OP8ONfcnH4?)+{y%dSMqQqg%nxyji%WZK!gN8nE9(SJT{aAJuP$$d?wnj~19CDwx0-sW*84;R z{Z(3Snu3*!bM}w!dVX?!NZ)>RXW|E9xVcw^Z*cvhe(xxU4|qLS+By7@D@GP^LGyJ# zKgV%@{^pQY&QD5Qci*PF4LJZr&`c7hu(pj+5oY?MwgNIy;7D@seTHqC1f6tt04pJWUqI@#|xL#VnFn<3PvxO0)k5Ppz-%;ij* zN(zk7?q9TS!n-)(g^@la9La4I(kO8FTv1({XysbX)SA1hTT<4keLQl9HnwJ&ry$>T zLu{Wf|5+2Zd6iVnM*}yU2F<&QRR~^i$<{?WRzxM_vY~23%6uScr%%!3VHziUOE2U` zB5{|tan!R!(NDgRN>#x`YGGvAC+hlHcBJHfBGacb7&!BSf*f3(C}%5H>P=2h{1vXE zPi2RXS-gT>RYP_I&~=u9ljGYnA)aY4inTPiyvh6JcPx|T^L-gjR>h1B3M$dz_6m6S{N znSVxV#0??*y9M`_rj_fFlODnQftUVR!>PTri$;Swh(rJ4)ykUBpPaa6MKx1)BxV!E z91^<_^uOGaWK-~SPR@q^Ice*M(<@AH(<~|eD~!!kKcfB*(bZ9roleD{4s)-G5=?8r z-&Wx9a|OD{=@_GIC4>vhU|t)m3QEmCFm`B64Rtu&KRP?#L)p8#Mgu&#AF>14LvX+^ zZb{#%G-N~Zz6nJ#3U0?{+24+j=jKgPN`c*C*G&c!QteEuJ6;M&>+T`MNr z#@ggsH)j(LGy91N%K{ zX@arVhi{#ljm{Ta?SQ!AharcZh9HY%OEtc#q`Vv|u^CeR0FGco;4+QgA?j$z;XrQb z2ePrb?6|FE>t+fj*BN~?Wa*9%-F#(j(s2@Z}G z)=d246v=-1E>iyvKO1oxQHLYAX7Yq~W#a!%it%_aErWRcj}4u0xv9s4V+Gf)awSdA zQe2(*&tk@N(Ur}dOKm84{@cFn+1i)rbW>~j!L@#f;UVM&r?Ck_ZxBidX~^X1E9}=^ z$o{XxWM_MJB|ie;U|oq0`Vc+s4zv z(4fuaSzJSbr`yQpEg(HS>#)WU9;M*4C-{XFoEg{( z<@}3Q-APw=^I)kcFWYt^;i?@MlXbf4Jkjf5Edy`Y?cUZA3;tEX9!SBa4xV{v#w`76 z0n!lnJ5Sk_xEWEdhVS;w;{_B8S=ok~3_#P9DQ{ec)nNR!>9 z?k{mM!U+}aAZ3OeQ*CewNwpWt&8Sy}cHFqr866v8k$FQ+?AiDAH8DwEXYeL28{_l- z7!wwf`0fkKPju(zb~1IrgM4V;8#5lD%aaxS=aW9EV3r-C4J_^EYEK(ct%e(0he|Fkn5ED1NNho+Ftu-^;_|GNQ)J!z_YJQ9IDp3TbQBo&u4!C`0{dB&>6Ou z?oJw!o|G2{C!e)C4T-92OQWZ7hs!u!jTg6XaLs@PzID+pJW$eGm@yRE`^fnZ$mQx( zX^{*``Mhr|Ow99b8yNgHjQ9p=p?7*$IXf}6x@Zpwh3dB2QucFOM^${JRc;6_( zIN!q#n-}*+88C*$DT73Xv!A#Mz}bzr+1I^#={jFF*!RJ;Xuaw0K9tPpO1+Cp`7r8s z6rqX;rF( z+d`S7-{1Gjnbzb5mui;L3=&nx95z6Dq%u6lW!ZJE-1vL~1&X>-<-~~N(uR=c*ZYf^ zIeCz_{_XWEbJi8D<%fd$_{klrXltVm=3n*J_x{Hhq_xkC$9c@!wp3jdOh;Dxs<9S4)DKg{f8^9D^>cJzE$be&zu5#QiVfD zPg9pcN;{8}W6SyPV<$oPk|;OMj!=BarV#Dh{2GbWp66QAU)yU!+u(?IO_S7Sfjq-R zj`ws%8}|oukFyExBc&Kyns!`a&9BS~!+(FJ*CD!jxT$csA3!pfNCH4w8umlfevm1L z!T29*|G;R|SNIM;sFF+xyviq-cv4b4ZhNsMYaTDd~%;Rh{-X*CRCq)&K8`Uk0pmJ z-BY=)BMF|$cMM$rLaUn5==vF5i7bxLjBhT6;+B_x9FQK<4ncVzUIu69myq@GB_|yO0ocDpa`e8!r8wM^qT_gI`8GJyZt5?YK5s`15lbbrQ?!}QM-@D?w&~sw zz9kW>aNz*ugF-0vm7fxoavB=>lB!c7b#RW+uAWI*b7j7S!?CxJApD*40UB!Su`OQ= zD&y$y?57~{+!lITIyf#{z<)pzq`j2M=cLp{lq+qG+ zF(-CWNxx-5E7thjoVjPSp$r-9W`0(Pa^7509u|{9~C*aLK_xqa^G*&M=ty;GA zoQ>`rp?z5hd#fW$^}U3oC*Xak1l(9z9A{d|;F$yH^}G&cVscJ_@$_ANJJiwAQ`5l& zOmAz)`Ob^n+;LnJu2pIb&xqE;9xYB0SNKJ6aly2rKI1H@YYYi*mws>_H_{j#=fmEO$!I+1bYFEyJ|tK4 z@F-zV#+pa^9)`tM3uU0CxF8s_=5CkSrM>4;7HyNoS;h~aMB25SlsW&Cj`ZrSww|0m zI=Qb8k1C-Z9b1|+`O@hcZsG{WnU~DKy7#s{-|SmY$%4j;nussT*vv(0ni?zp@{Cztu~Pr_P0fO#o2Ikyt(iE;_mY4B^^ z+k#ztOVpB-uH;KxCkd{b!Q?;Jcz7Ff8MfeLlkY(f9AFO>=m4$4`@vvAJIU+?g-^Wk z`<;GYk-Qol7}0u!ByI?n|6a4l`ZT}mQkujylHk@z%up}Y5tQu*=wReEP@bi~zx4>u z+t03^H&Y|z7PQXOBjEmMhOo2=S9lJ@kzrQw!p2X=Ifp_DS6kkkAgM|aZJiaOIvNQM z6hS>8$inAs<;1O~amTY(8KuLcOMhi3oPNEXAbl$SVw5@|os4kt`suI0vFw_FFiB@2 zw5DVzyMq43_S#eFtSf?!=kKDx0g^Qxy2w}5?I~FLlCeIm5y{D>?31n1kMlJ!KehA5 zBT&*`oad&$0FmWOW*}%fGFn+xmc)x|UHQW`E zgc$}m8tUFYcP}lG=KEzUV9e*wYRV*A#>$>Mgf`9mTcXTUGP=+R z*s`060G<>NapueNV~?C5i5Gj;5)z2<#(-$(7QyH&=X~BP2qq{`4bb(OVVOkcetUR2E0LTf zL5YP%7tjj=aFtRCZreVne)D;|Yvhe$mnXuau#Ydf9ep%%7c|n#JjUtvIg|6BC%Zdj z;WTENn8au!a_vLME67E+9agbrEhBwi#u*#~smvG1hpiiB@QM+;Q#gr0LKIJVI{PBQ z;mttI9N;94em=|gGzXYZqX8knoBC_XbIezkh3&;}Fo$ zGSl~F%d@YMyWqoSNJ|uic<$tbp+7b(lg`>YTjm({={8btx_;{~$Ez?KFFz+APA(iF zsQ(s@Oh>}Jx=Q>gk)@{FG07w0sf0ujf!K$ zN9>W~BqZn3S+%y2oMT5i?#g|;RY6UNbJ)z$FC$krMl_<73=Et+8Du6*bbcoxF=nTF z4`ias-$^R{hU!ax2ah@mVtC~#h;030K|4xDj0MtZP%q_3T!!NBvdpVwBoDRZNbba> zvWf(V-5Q4TWwaeIAZ3CrKYo&)Rc%Y>yZXVZea+s`l8}^yl6<+M>^Cm(f3f$LaZzr2 z!04E$2#SJ)go=Pl2}q{}0wO9%hmz9WF&KbKgLI10CEbjIbhqS44mBVGLku%>*E7i8 zp7(g}`{{nW{`j!>%slH^|L(Qsr@TSnK-A1FCQz~QYv_4Nzjif=GFN(V2lN+8t@NX? zFFb6p>%9>`oITpQik&l#gaVS}dxvQ2?#Q`610tMbeGF_pIFYm;1{0b+3|sg*7>2v} zj6@cYC0o-3wM0W37+EvXMFE2)UEhbV&yT2p%ydsJK#EDd#qD?wR2dsRNxRd%V=&l5#(%I-iEfq%WKwMdPT8^q zxLL(Q9)!X*-WcEj- z`3AshRAeo7CQ!b1wHX8$i9p*0g$1z0t^jd{B~|>hhxCdt@n}e6rh`cM#%D~;97t5% z0UnOsq6IMAoZ{;(BjCo4z`LzJ0x5wqtfCKOwT7<#YHU6y{0Ur&mrk~ixf>Ph4??NW zgmFvU>+c?-8gs@9euQin(0nn&^^n&%2mHf)YoI^E`v9OBQ*W%rD9+u=9l|-A607W2 zkgN9!-oB2%1a7-a_1Okx z1+We4Qa0T05yl%E72NGb7*9w4fS|9>O@KSut);1Mq) zd+qqRRxMNtU^iHl=e`nzJ!c(jPPmUjHd{td*hM31c7zhDcFKr9V*TSsZ2G7R1c^En zFM$!u=Q*1KF?y85A3u0j+SHkw@X9^n3LK1!bQO$rYhPi&VxF*oc1|}gFc1O0@VZu(Tf34s;JvU|MG1rTZ9&49q#O=f zH#_zpz6N5jW&=Wex_Q~-0MdTA$A*oV%Z3f`JBouKd2e|F8f|Cxx0iH_?d%Nl#N}K% z>ddLSghUq;pjf{GD-V+@ZvlfkeRi~!(vXv*e3Pa0;M=VATgA_S7B7|nwjGwPEDSd1 z`p@RBZmL|c3D-#%SULbp8UUUJxJ%-iaovl@9fszY!T-P>-t7m&y`iN2KERmt?GSgb zAvb27^xls4JcLJ>vU&<=gth%J{FwyirNIQOHcVMQ<2*SfKmidqUUcd9n@zUd%I7g) zy+z>ffGbPb4eMU$b?(1}8N$c1w`m8&EC-Y~#@fGLm2M zt=}PP!=A>31BSUuok`{fPBrue&NfU+{94h(7iAQ$0K{Cdr~@g0ahCRAZ7~GyKkQ-N zFAJgT{rj*Q-Mb1VYTWh^Y750Mu)Zw!^W^s(_hF?~27QP1T684wdh3BmGc4*v8x*tl@jGI)zyX1^+`ekwO~2 zxVpE5;E>Ou)qQmJh3Gj3wK?tW)ATchuIGo#&y(L#+O6E9+Je-FG3GVxy?xRV(M5N2 z`OhVyZ&k`XaQHBs3%0EcX5aw2J~oZ<@CxqnR$qwwe}DhRN+>w?_Y3aVj4`uSKD2;j zEfdPS!IDDm7rTA>{dJczc--;#@?pf~nWN1&@BLmqBLe_X{rl;5;?v#J%Zw&_Y%3x# zv>Z}Sor$Ic2Ll!p>2M?Fv&|Q#&}yfR#64=J>xZEkX%Tx%m_ormEQvxpa!nDU!U8l6 z*G);VB<`*r`jYt1^crB*EpJmuOdpaG$p?M@(5_rmdKUDP?}M`UW3C!E14~H%fFt7r z4JsViG!xAg3s9l)vW^#r+?pj6rU{1NE%V39V;Ko>J&+{A zIwIZ!(WdWZeMnzzfq`Tkzu7=N2zm%%*YEv)tZ%FGKHjb%?>yn4)QqiDP>~tn>Efq0 zm;29H@)Zh#lH@e)CD7<_S8yEP{(K`)<|9ano+V>)6Q%eJ|ix%O4!>6 z7%78Nf@n}|jd=v_msGO{sdi}QryFFZZjrLEg#y>qisK|~=6K~DABz}d<&NS$E+1zs z8z^>|nqd)dWsiD;n)KsC^`B4MqB88dK_fPq4pjUBfBg>6x((E>L*YHtqPguDR&?(S zti@itLlP)Lfap(J8S$4!j7kXtD1ywRUkE=il%arYD6S9Q!*nQJd48$HJE&C;c}v#s zGSLVG*N42Qo@ zn;=5-bxz)s>yBJ1jw2xNfIJ-~ILOs|4$K761Vi~d@Mro~fJrzyCV(|p`?3q`(4{E@ z@R(OLP$Bih5+F%wyG!5$6C6qi7K=wviUs_AQsHQm9t7D02aHZ)rPQy@W&t|(!5|P@ zhoNOLT9Yj&21uL7L1;ZWOqEM~U`e9dm7G6hiCVQY2csjty>b4f8olht6Qy1*5}V>y zfO<-$!91|vq@Q*iVM;Md1#zxj9)mdCL7TBRn|mnNpwYOv7^kW?kS$pr4CVb~`8he_ zc8B_pgy9~@=L>}%{rud~4GaH9fcJnFA++PNq%DtJ~5Y6A;_@V zQ^;%}+plnV7~kkEi-Tj9j}B*6bTA<{ZSPLsRDMi(=^;f3>=t;;mriMmBq>dv+z+5%owV&Qyk?kiLFNH0@0SiU2Ax571)16LFlnri9or- zm%u#A8fhaA^>}k<4F6qV+5kz&BZd>omnM7EFT<}r8Lci-%na4l!)G>t?=W!TSERE>oI?~ zq^uR*W0RK37j^75Fh=WfG-37MIU1g$53>+@?}tLGo#m50ca+&TfIeR9=TGh`E67KK z^<6Q|t_&E;yK%wfXfxe#XhcK=^1Y7oi2m*;gN~TRo|&<#AK+&(t;1}(4`y=^S7}|o z^kIxb#oQ_dZtFlqu#VL#dyo0~NdE{?X~PyS*t$Kk8~fn=7X2zbh23nb#4UOKlE&o+ ziaT?vq3j9pF+ULaBvA`(&*p`Xi$|T+uUYj$KpRXdQC;+6(B;tw+6$PWse_>`gI=Bt z#p*Njfg?klIXQV$I&Cz(dIq*j4Vtf^DADx;O)I!_dEiEz@)<3^%44eMkDAqnXvAxd zc$JhSPV11o@*$)4KMXDR+$+7BeB9yAGi`i5+UJ^*F=cKk)^^_fl5bv_m^#8CmKwN) zQry(~l{8buj3WIczZ)XxU?EqwpAk>ZRHp6Xz$A|c}JMpOBwc-TpLv7+^gAeFMd zZs=v_biUB=Sl%j_Oh~Kp0`J?23g48B4BVExWzMZ(dJ|eG|B~#4*^ezV0T(1l4uLIw zzB`C~BqHn+UN>$Yrb)82CHHK?wIQ^>*~eIStroyH_fanc9o@>s#c+k-TKS4BjDO-@ zPJ=*hO7TWXCbW##vd#BsGt$L1_^72joLd9&(Lrj2i8NBgRz?zlM5qY+Z1E$h z=j$&~!>SwLc^}N3iFcPRtB8A;8-L3qr$X)*W1$J>RO>V|vA_{*<9VKc|2dsqS>pTw ztiR5O8sEIn>pV!|{c46#I(FPv2T)7puI6LsW!2HO_nWH3U09aBb^fKHoKO;DBh2UIXMj43plA zXuGhzNF(3kX#zM+)M9X;4;D;HekQyV7_h)q+_3I~^Oqqy)g40H=II|^pjp1bjy#h%& zXtr`T@#o*Izd|o>`KHF>^kP?m8&k?c4N-Cu^I>#5@TtRV&kFYY${E@i*Q`y)=f9pB z$eWqrtuSxG&wDe+ej-GgyQa?x8Ru1GzQjEt(14Yac=+FhHea_~TC88-MkSa7H8$-p zn)ve;`0hgQK6hJp?HbZv2QtoX@=8NP6CNvyWb;^OAERSE6Zm?ZJHnQ$>Z1O7UtMT` zB<`cN!PyOhKMVCVobh7I<~T+z4VyE=1J;wm#k;Q!o-jL&SZO``EKXa^To@mtpaZ^v z*+1{zaQY-TNafF_+WHd0=gmqXr`$~%$&6=((k0ZarssvOXg5^yvFU8yU77Ftbnz=s zuh9%4)pw~zhHhYStrO=h7#b$&sTeZjr7-&buUIqf=BQn<02C2W-jZfe)* zgLio~&;ZRt!AvDvG%~s>r(yGcgIgbkc} z;7VBQWC9dk$@D%D7L11Xr&UmrbD)FNQ8nCzwJ zB4xrg8q5~>_2SS%&#ilgOY{o{Uy!8XsxVkWg5_B(hZrWqFG6tIMLLSxbFj}TF@#Hz z>0+@^W4^`f!O5fErQAZC!oZ+sF0Xhq?YiSpepVG(b7Bo^jH3FEzs5&uluGi{W`%cH zRc|m=ExtixMJ39Agdp-pkn1+8o&|F&+f8eE<_jp5yfx)!v(z4R2ezTGdD>f^V9Q}8 zvGOR)_!FFaV~G&wj6Ns9nqbAerxtbl1W6m_1To>4Hukh>!grueoeE5@HR={#jdt3W zSvyxn;1jo{w^4PNuz79jw*d1nH2Q2Y|L%Dojm*J*R%`fN1Btg9W9(BDI)w}W58*Db8WJbaFwh}<=5^ly0)B2u?{UySrIoA*;Sy&X%BR0o!&yPDVjNr97E=~|JbhB zRahw}jQC-IJ1J>8j8f@b>+3d4jX@^|(tQ}m1U|!LW-Sa5wx?W{6-^{(7|*^yI%w+T zV2OHT$B)kPCg%@TkCX=%63$k$=}6hIJ$Y6ev9I*6+D8B9rW{s z1ga!pygEXC<A6Gx8=DbmNuP=cHI>vOI;JvTwgQm4-9l9$X6wF5@tIW zdI;WfkY&2Gm1C~$tm@TB~yx~ zN`p0dL+slhPfP-sBM^ZzpY^xVt%>;CwoUU{EidKGYBuu#hC)d0x1V&WUYk6{(z>!` zX*RD~Q;TSjlLM{MReBD_)gH*U~) zB=T1pyX$sv!ri;|5%-O;9Am6I5*@NCO_H0{l~+y+x_MSm+R|IKebaHxH9Zby?!|h$ z#xQulpK2VsjC_={MpOYPK`WesAvQ4f!!_~1F{FS5fxt{j*BWf>?RRP*qpEsMEu^J!^-5IKDF{0hN(8(e&MF*`)zFrFlw1jF!ie(1!A8 zGC>Wd5J(vuzGD3tD?3HU`-2-Hv%Ep=@a-kfPQ|#+C;Y?Z<|P3m1Q&I7=GE!xJ0V86 z-tcyn^7XYKgJu0MfrqMvyqS-rz~F0SR(B)g#x(7S^uzT6CIT1X`$z67RyUs(>hUXBaUN3R`4Zpw{M24A6&km>N71b> z8&8I%-0U)~1*boCrpGtfE-}O>);`sJ!1YCQ-samc6tyJ2bKViMj6+zouYDQ)S_RXt zOoau#=D^Y$igQaXW|j-dGk3AE`34T{dELv-mK$P<+Te)gJ74TJN(syDZ%OcR^e*^t z!;w2tg^W1exlci!DIA}M-|QjVX_r6tMB|*(=IlYB#RmqEvkCVpnJS8}Yd`IlS6{nVo}F@h%dF}ZHklO2sgYW%Ex{o@XAKG5Lpsy6F=bD}8$O`w(Mx)MV%Q(Y=P zFyWas#+anRqyP9Tc5bEg{53X6GV)4rq79O$4x86At{n90FOJDO6d~1g1k8?>3!CN2 zFFr0O1gg*5^3_wlQ@<#0e9U|WYiQzp^`&~sh`Bok(L3YXYHB`+>_&T>|Jsy|E{s?Y zsJVtt#9+=}#0GY>`XF$5JuIG&(VP_YU(0$}dZrL|7t0W@8}V$CcKRO-b=|949kMhM zjZ*?Ee}&CVjO5|UCZ~jcMuoNBN|DiB|Jr6zc(5{zn(OKaS3FfQX{X7O|Im}MzW(zG znklFZMsV$m2H)R@ubKH8lwekVs+Nz zbse0=D9SiJM$@nQI&MX&oh#$ma>mZ?cIwYhWzUo@J}S-Ja8X$p6Z9-khUpI2_{WGb zlZ{4Lo)>%=Zi&SlNi+1t=Wg8ruf4Y1Vn-)oYTk_x9J03S&+9gFvkXs2%k^Q_mmbA5 z1io?{DmFO2Tsi>sM7-TfuVEu4U-AH!sM7T*AB-1{=~S;R0TJp4znEa^}7dLYpOV6W9K{ixc-;KWgYK?!3H}?{4=D(XI&(^E8>n2hqyNMG~@5 z7+C+i&77B;(bR_ZHzt}q`)5%dE5PQ@55&sLH7-+hY3_K-h$=U?%~4?dV0vyF8BweG z)s05&$uxxp3X%?n(b+KF`7<>st(`u=3GG39jHqi*b7JWqVxst#-IKXCBC>;rfKMgr zet%+VUN}F_LFPrd2YGDoXKMpahZJXqhHGLxe#ozEdG{JR6B3WYoEXG&XRW8(W+Ij8 zrL?!cb{bp8Zp18^3KiHl|2iw_?gsFc;A*KY4vD+t`tUW6_7dvA>=FX0_Rl6{Bt!3z z6Cr&$2!y{dI{nG2dT;&pFjxH-u6oPI?}U6@4@65-D;7pvG|k(3Z}+A0Tt6p0?U9w% z#2t^igq59~kqY-TPw^n0h{G)vw<{R+q&r>P@m=FKmbU*RDB+5BXqL)6QpFqY+n=zw zj32e?E6*$@G`71NuhyePYg7l(2Qn%6^20e?L>}qfKO49tXyIVYciBaP<9B7?;rD0TL&i#f;o)BTlw-~pfKpp5GYbD2Y_Ctf~>!XD`Nri*M zar{hNZubwf+DYpE#CN{OxwpJ+jk!cmyD@TXXGZ0A`W>rNG7W9pcW(}4Sy}8@8&r2F z@x5lwLKAMGJf_kB!^yi2{${vuWQj-g*Zth|U+mPutFw0dEV=Km6bwcch@v-z-7T>b zUTL0*Cuz!*Ji(dO#XVl~uer~`mzE6{Dm(8*o(g(;GxrU{i&qp=te@ml@7&BT{4tJ~ z;pX679Nna%v`SD|d7!vSn9V+HBlt5Tu>z6obx%An|6$ve)2-t5kK=4Oax6qy-58v$ zHGXPiad5@bw@CFZ_f#$oo$hidl{jyH_|cY?2}5u~Y{=PDa(?w`@LA0#)dG`3r$qG? zpjhQdqcEDgaeJEG;gn3x)RKHJN<$@SbR6mJ5%T2zN_N-x@Ifi&os!V&rXO{Bh4axx zn{i<^H!j*Vr%j=+>OY%(MKW4!Qki=v9y*#~ZoTFy2m zs|rq3@d%;WC{9#$sYjYQ$idmK>vBCj+v~UjUtgWSe`ahoTBCg%Vwe(w-K2O{Xv%~s z(ZI}dI473><`(o?@nO>#ad3|ZaFhrVn$I`$v5}k}+9F)@azeZ{Ow`NVrdLx&?tCp6 z0(briP8tN{n~{-8!*a4uspx9A`!{5~dLY71SaZt3-W%%FH}CG9Xi{Soj@YzZ*`Uym z&mJ@cydrIpY7K{sMJl<>z?v98xWjK4&rR9dANe4{y50_+x#zYw2!Skv_Y^o>wSlD= zp5S&+UO>E$d7|kU86{q`?P>Wk2_a;A>&pF^62FIr9Cshf3jHF+6j4t!o(Eo#=RESG zEKBT`2O3@aanc@$p>cDn6&s`u$2{(Qx%_S+Kl=&)hq@=HYSaYQG@>ISrr)dyDBoaL zp{%mK84?&+m@v`Qt#m3YJ&`%MS3B>8^ty#Ax2gTccDBnTGW5`FO=WV;_{tmoFu$6$ zEK85GRx9O=2$|Exg`|Q3u7Mk)#;Q7t{h25mCwt4umrrD{fr-ZLeUHs_`)nsNMRy<) zhF`0u{ZKfQJzRO3ifT+xN2nA(*cg4M|?|jJnDST9o6eTFHeuE z@-gdBKR(OM0?5>f? zG-SU{K`?V|of@%IuJm3yq6)9b)KgZmsZ>5J3B@IJp8gZB&8%9rO2nM#Q=Yw-yY0(k z_G}=&{Se8i_FWGiJ`I_?w^99BOU@$4+Hcqi6=dbTaNYb(xj2Wx2**frIw6DS7=#r( zS03^6d5|wNvwMt#d&)$Uv{<9-N?~Pf$cDtSV`qCy0F`*+p&$>%AaCZ%Eba<$jzUIR zmy&C?&HZAnH}BNXii*yDhjY*}6yA0uhE?m|QJzlmSsFWtkF>6ON8?-uIgEL@np~HNUb2MIqr45Zj08Y%=$hX zJ^2sUAI&RR6#D>We8KYYGN6s%odnFh)hwJ*@Nzg_%;;d%g16vse0To3@Bp|;5IFYl z#kp=7q>OCTTN{`}@z=Vx(*(p+VHm(lKKcJ{f z=0q<=U|WToSl08ih1OI@zfC?E$pm+!bIucA;xGf$;-U)cA=f>v?g@TRl zJH|}+9pNKe1ycd=&gP1!?l*%{)!33OYW|8HcRfsg>5^!^JLa9Y{F?kk!=mfXRg|HQ z`5XLPhM%F0pzHjSrOkny8}vhOP~YEpIL;L7*hmT_bBhQI^05CHNo9)eD2k!|JdXFI zo4~rR-+eMsX1Ub|UeE#f14O_NYwDk7)WGpKV-O+$?RbOLGmY-cCNPQtaNtu5HO zioD?E%K-dn9xMG&zugmg0=3A(%S~!=&qSxHtlW`9%4U!gvBI}#&;U6|-8#+j$Stmc zk-88bHMRHf6@>x5LZiED@pb;t0D_0dn&1Oks3#Js)tjdd+8U)w8?r4iA z=npujbNet;Bkfh6@EylY|0}e}?(8rgB}Y6)`n{2>D8M^+eWie531$p|rf`q$c z+;~pQ$8W>!X0yw=aO9Lo-1gZVQ9=xQH299_B-(s3hMS~an=n_4GKJWRLYBq`4!BYyc{ z{+*W(9;|QdW=Vu=Z8b^mvLsdG#IGK#3~&z&SSkf>Zn)_;NO@mUD+3X(j{Qabre(MH z7St1dfGzl`sVgeED}I$LWq`CIHQEZ)e6)8)-Whgsd+sJ8tKMwc?$jV|lgKONVZXvZ zjWie=s3b|e3?9Rk>w?5w7Ai9WzcM$e{aSgkTwJOcs#8v2+s1hHp#b|iydxfIYV^et z_=%$@`E4g}-WB}y&G|AotzO!n1M9&vqA}o^8gFa4?bJ3ellq}reX393}6(XTQT>1=giQf=2|$ZH~M(<6KAx_qvehKW$YnMQ4JQH}L5NSxXHylC|0 z8rg<6sCl-m_`??^$iy42d_ozOvllJ-1*vKsYrQt!(B_>|IA5%)#ZKmaCyFIYD8V7p zb5wRPd}^uL+8`(IMa8B?{K1#S5{YDRtZsDuOH2eNAXwStCqG`4`pv>y>uF1UjQnj) z^!U|bFVy!rPcvnqf=7*GxVK=ypm%Ykd! zd@ZgpGb5|VV4*Mn|r z3_ei7w0LbKenn6n**=MNeVuTPf?eZ%KyxWvhI14t%3WS^!Fn^GExH5T+A`lpCqED% z$wO+$f!5j@<5>{1x!twOv}Mja5zqE%BD)7y-|ntnoD^04e47EuNv>^4u%t%18OLL5 zZY-&H=C21+xTO|eo2ij(z!w^|2gQzDQd8@+HpmuI8YZETR@=?5^ege3DFCjj+tA`A zCuXJYg+opjCW3RPJ3m;n?xx#B_%!wymMzi*#ud)i83v6I=BCyz7CV#kC_NciWdvDc z9R^@C@`WtRo&&!9hcV*T5F59Ku2BRypOg}>cZycC$YX!e6!pr-In!TW~BS3F7Kx3 z^GI!WF5dnr8hzSS2Hpr$^m9b`Yx2&TMPI5;ug^bUC9;nQ+`64|cQN~tt4!f#$RS`S zIt1ceruH-222|lP3c^Ko`b{wb7qg^J!`FDG?i7#L{3v>t=vGC}z0;8=A~p{E0%?pU zb6rS)$a1#b*~GJG@1n`t;lNi%BgI+GW<#Zce^AI>v1rHk?MQ!eEVaO>Rxh?Cy_t_U zlFHw3Uar()#Y(`eVM2quz+uJ?6v_=$JD+gkbgytVL^3MPFO6ysF(#dR<;3u4OQJAx zGzv-=4UMrMQP%slnnsQ0KIrYuZdJAMqpsDmp(Tcg%gDM-qnSCr`m=!xdNO~$>4ucL z>+L6QA9B>Tld3)LzTsARHsrB{Zw?eawQVLoF*HcmQ!082$r*p#?#GW0(UMjxq86&P zA?Ps}l?VNY-m-4fyhCZ>ISFSbeR52VX4-69*a)fFmQ?JI`_^0%>{bSfxMDWwp~2j`b&zY56OAA`crZVtIG@V9=zcv zVQXB`>AbrIyoN6gxgQ(*#VFotHZ|LuL;91o59S@woKO0rF`#HweW4rp08O4|29Ts{x0buK zN|3x4XU+Q3mu_uPxPF&2QIz3owX^f2uT|c>M@kx3fddNV$=m_a?#AsIX1K27eICsR z)j*{0%63g(F6RN2R-uBSx)2*By~AU+l73yf1EB?xk{j5zC%k%8Z?g6MS6ehO@oN1x z#hco~95wT~>plp%%_l$*{Rg1{*cZY55}bBb-^WKEz4%J*;Pdj+#>0sWZSNTy-}76t zSG{$^_m`%QG=z@a72Hw~O9yq7&wK;+TXA|U{-9(VUtnYPpzZRoW?jfdqo*9BEAxpS zpRYE40{P568r6X&kgG8coC{^@g7+OacwpL8f`h8Ae0P|?ko5(^@=t%mK8pAdGh*tUn4RZfk|P30wf)6pn0Fo zpsi&CsJ{;BU;6xA8$g^eKkeA%F-ahjV1p6plJJN^=We1lVcUkrA`K&z85t35K zB+XzxgX?tIs^Z2?ScO7m#166O;=BWgoa7Eg=ihM>kL>U8SP2+9FCUo`2z%y_iuA;X zR1B~U7h1MvnQ&&WSFV#EVVC~aIp|41vX7%6vuWEUYs})dEGevAe8Dta>4CEqzDim* zA^~B;7nF-#^QTgU8U==0j;|u2YAE6|wmyiUG)wkOUcjSL6#%S)t^H}1JrG=cLSe5Y zV{}4BWtcG0l|p^4n&b{mQQ?{i;Yq*Tj#NPRsce&_8#gDa+wHE0jHvAtwOCg3mKg_={P7x zdRRpgp%b+{cgeYUa*+qElo>7>4fvxdklcfk)j5qjH(rLeB8r63uV_T? zB;J_Z%y#{WGW0mZ?sa3qMH|1))Pp)J$dm|*Zl6$>%_`L_ra?lVUma85n04ZnK;c&9 z6|M2@&wPUd=zL85nzAfGCaNrE_+C!Xfw>l^=(6ZfX}3cR2Y;R8R0QStS^5L83-sz~ zm>;?;cRbQT@>u<1$f^uy6M^v7PVw4sO{ld2M;fiuAhjj+i#Jg@2K}$NQ{|ac_-Ktd ze1`$QyE5ui_Q;ijl$?Ggy-1tJj_~qqfT#~UMQ8pi(&UV&;v`8Q=Ebp6abRC#s*4JL zm<=pN+i_QakTE)wahVv%?7J)4d4|QRaO_G2C;bqI$DR>mIw~$&HP?K^votNhN*@r>JTM#V!eg3In)d7<=%@M$|+;_uE)7)N6o$ zlK9KjB$&Bl!Fxct9C092tr>=O;#@_gerl|R=MpsO&9-ejzRyiN&&*IjCSzC2$Em;IEnt0Ia zQYBouM4>Igp`X;MNL1hO*=k00*RzR}3BvlueL7n@AbZ@3q2}|(Gy?wuTas260<6lN zAv^{c6W_+ut?J8L4GpuUql zKGDXkXrAjV>jaw^IH|7(8S_?P7i;&q$4~@QV=5kVs zlgo7}vKchm#R||wBT`FoG*fEvd@$H+=E?z`W(IpF&#%iIpxP;bYij%YCFxmR?~HdQ znG7RT-t!APL}JMGtS5}fFdWqH`{9qiagHH@LYI~HA3>OpWOqHIbZb3PJrYznFsRrz ztKt|pvI+kR%+w>bk2*k^iyjt@eVac{^nVn6nSt)h1NiJrtM)ti=wU!~vm8_JxY-9< zuHV=*b;(gp28Iz`E{q-^X(>TEtd~`+-%V-k*<-EA*yT)D)~^XCWiZpf%_6e9EsTfH zM!b|H-61vbK${MagI*mV}?l6%e{fd*Mv{F46_PUD~{h z);wIR8YWe00fvq7zQ<$)9ud-RHiD!agK>_T6YXl7wLy5$fpkOq;qxy;4u-;D$7BZb zaKcVqW9ruFm+5KcI}FGU>$$}ASg;?LF=}sdzzf1vJlVD~vsy}8HEgRWzWTZ{P1O|6 zhLarM{4N^*;kqZ|#iS^2yP(xDUTj5m*F=#LsPQiM2Hig-@dR-$0jtDo@GZd*>o;jT zZ^mnuG3@HiEPwlgiO_5=C+MHbc0yw8g$mXuZ+67-4;n77fQU-B#DXKScZu2_Ir-c*N(;A(V8`KKn3<-pPlq`A8+v|47%>ng8_%;(n3byyp;)d)M6mQteE zYGv>rOzJ|!x66@li1`CL&@9=lFB;2J1uC%%*Msqed;Z~D;Gtw14z(Bg40W8~>O*cL zT`#%}4li!p4O@qUR=OSInkW4dpesnK7^xlOautpF#$OesRVREH^1-O7QURKBL1=oJ zGv`pt(F3hDTh5?iLD)<}t0WH>Bq71X@rL#!)EzYYWeVg)?d5-d7;mJxn20&5blVZh ztUa9elm5LA7l;V>5?W^z2^VQgQ0c!8411EKwtlHuVI!nHmo9>ua;CRVxeG-9>^R#a zB|ne9RQBG%A4(HVYcEQK(tC81gn>+Z3wMwx=qLg?bt7+mz2n`15fY}~%#y}EMnL+Q zUvXDc{Mb=3# zMRR~2iEUB^ilPM17MJK12Xy;Ub&Ef6F63Tsco!=Ma?A?n1DBeCS&Gjx#Ug%QdeXh< zKAa5{Ko=894+zp&>17EgWEz}S<&2}>t#qbLorNW#7^=3Gbg2E?qAQ-4+Z_YLRL0+4`nGy zYzrDT3h9l$c1%bG4|LX(V>QQy?#)JDbYFapN)|=0mGFFY1H1#%-=tQE>2W6NLv-G zU@|Yz(~^Uli|--7v4*8moRd4-kXz4sTOv1Ns*>!KMBf^XU8Asm^AYqi_eX$w3fcbOCPKknoV54sjFxQwc!SR*KgP(RBVmIZ6;8mm_H9ngLn zI&1;Ue#-#oQ6Bl$h%`9nYwB-B*!hGX$21_ZEhlo`WWsp1!I)5KIdbTj3}{e@u?CIN z?MtEU+$s|zTznfox26ub_M&1?DxV@R#pO^^oMqCVJiE{!qhb>a9uC9q-SfOd$7HNGd>rW2_T|iL&G#D|exu<<_NEpy!x_ z?Lo|==o3J%jiJ|bEIsCLZ~QPLfhdljfd@RFeImbYl^o3xMlY!g3TZ1Ca5gXJkpUow z!Jb*aigo;48JuKLtVTv0+Myx`krWBp&LyGOc9IA7ILwE6(0xVM?_eU-W7!ObaJ?RJIB!tHgOLGRcFDJSW>hCXuHolB|ZD?-JOoBFj(&V zmHSQ$ztRZ7K3DXjo9qzyup8fki^sf!@cOnrGKd%s?BvuKVNZ zLeD7U*c>NtEt`{rMx%Y?^e~;Rp1YNqn6s_sjrT+SauLiPI{gwgtvAa-FDh3UWg}DP zRGeF42MM2>T=hyQxPb$T|AkCGLaq|GIYe`x$dI(h;;-(n0JbDoJ1Dy7CLzri=_a<9>bQKUd z-rMA$)mlDKjL?!yn|=%QW3ol!e+urLJ{@>jiDO30q5IcM7VU_INY(`csK|&A3a=b= z5;$uF9QQr8rUPS{?dJ2;jA*;BO>w=J9$$pPsR{fHpwSev`jUB%^oht(?pWp3aqWD|Nn>&wgk3M?EbuJm_SE%~i&_^*IDh9S_vwmxJ%{aTn!1T>43 zrGC7wkZ$Oa(gB9Rysp(-esmHtEUe=eXghA8IYC@t_#nd)MM7KY zwQ-sM+`H*mglbsHi&s15LIn;|nmhFIW_#FQ-XzzxQRj8<`~L2zl74EtT*q$9=EnI8 zV4{%b9+*^!fk3bBfzsZE0Cdn*Y?}+ovdpuXxPBzQ(%>srGK{`v@|OW9numHAGlbn2 zS?)6!C|{93=lRpFSzQjYb65HH+4g8sjHqd( z=R~)`a*E((qBoFmL!1`s6VfiR5j5Q$X*!h38Wt$ZA6+epjFAM_y4*uW7=n4TXwF-e?Ou{wNL^Xo$ZPzpu=y}vjY;b}I7_jReonDtkBe=P9 z7&e?8oPXm#iGk-fB(MUXq$s_kzi&cwB4)r51&V!-{~XVvIF}12n$i)Xzh#Mctw zqnz>ErQAyj9PJ(r@rrY9e?B7cC~`S#;@;V_;4}szM;zfA+I<`}epS?EBGdpK#w|(> zaRw{>{H`nE5G+a49(CuynDE6HcBH@gyJ{X}Qsj@Wh$J`q34r>s0w}|Tf!S-KPOA+8 zgI(6fW5p~c3|&S8V0zpDmkD4*i(i4g2&=2Mvs-C z3!;G1^zvLuZuE>k$;4kW?%1s179|`> z6xh!FrS5$HEO_`bG*$*_L^?0Q6-NfpJ+H$QNDmy(0!(vcyb^I$R2AcE@T;T`{2SG5 z3RVj#MgKm8W(6hbK@w&=kjkBmgSN^lhT4EMFpSKhel3qpiJH@@g3g7$caIcAt9kTk zbE@yo{p-BOL+DswO7}F;1R&${GN^5u_J+B$Qg-$Y!h&Wz;2_A*9=%|^{yy4+3*^e8 zg-U;G9wNFK1}t3og+c3%xXRf?`_YW~$H)$lDJ7!wXKISBb5Z9JX1fQK8wXG{u#=y_ zh?fEp_w8WnZ+_tTalK?1`_%)#*_5^c^e}e%FoQySH?WdKH4XVUUX0OEPeFMY8a#B! z^C%^MF29Ie6X|ucE-LpE`EBb?4k~2AONxH&a(Ag$Mrxuouj?XcQRq-fkY1x4H)!q7t~?iUXTh z&;{x1FwjMy3I* zW$dreVQ=|>vX9`F(|_;-{qi@zUx-+qTLkt~&Gwrx$-g)Od{k*}FGNs5F~e_)Zwk$WOmcq&e!^Y4!Xr3ZN9U&9Dw2qbXt=?)xlJ=JP@=nty? zyX{2C|9}jVfNc@5zJG&E_cvt1AZq)+pvM+4+5h|rp#K~&!l0KJ_!9pTR0`r}qL9oj zMu1^70KOu`?(}~pXN_fDVIGUcA(D;lrv_j$%>c0H|9B(r>v!5hthYEg+C78740Bp1eDa8>u*l|Es$Qe(A*~EQRE$$ zZphbJ|IQsR3Kl)*)BBp)8vyz*AW0q+0!w5En!)H67tL{iuv%;2X#A(_Dzh2|j{>&~ zv;>xr(*$Rip{}Ax0qVRbi21`mfkO>^m*Dk7>zZD`%HpW6AIGr!lg$!v2^`B<) zUx9pBzOVCxd@qrZGsd)mkz@OkCg5HDB1kwkn4^yWk9R$2>u~-#S?I<=BRpTG)SFUc z*J$^vU6*}ld+CX)up%V>COW4eQT^j>)u1dA>Yu<{IC2Y$xe_=kJ?v)l-}~?bkL(fZ z7?C6Xi#F*Bhbh=PG_{JV9IA_e@`tQm@8>BHl*`wJl{bQ^C0F^F_(4k!OLl5J5qE7*&CY)phxwc#2qk}+OqvS-hd3* zzoOzbjs{hfa~{D7>)m;C)PI$@xiKhxkLNQ1rRnBO65T%TzpB(OH|>J$6oaNWA={lP zz;9XTu^s!v*$06h6aa|4g{_x?wt@#5Bt5*WRv<|eg+AH&SFVb%*pe@B7|}Qqv31=V3+65|CYmlNCs@gTs0UIR_+l= z;v@_S*bV(RcA?$5mX=43KV1Ld4yZr>UxbHN*^}ip3rLoaoFd%%b5~N);N*zvtFUh1X{&0tQxJ&a4@bDO08{gm{jD`SjfM9BG~` zFpvG)zbz_kt}Log!1^KH&Jqa4!k@dlr=U}InZV$%`-s%_2EDM&xL&dOZ)e7y_uw8Rq=+;wpuK}$Gk1c{+~g^>jURqM1@HO(Qm9F;kx^r9$|yZ) z+5h12v$Jtggai@Ch9$=1GUpiUBz)U#z`#5aYS^_x&&3jhQXcG#m=e+6d@|CQqAdN0gP}{xAyIBVETT}lJVQ(G?<^H~pt4?Vp zNn|}8l{RD_#I(FKZK#CoiAeT6#+X(rj1aO{ie%rjPT7XY$Tk>E3wlp-|OM% z)Omm2-`_v|C7$QC-1l`~*LB~|iM2o1E)&%%4m$RiZAnlO0my?6mA_;A3ZG;3E+3Zl zk&+e=AW5!c8Kc3d&Q*dd2I@$b2QA*q6cSjt^JgNKHvMzi@3HMcIji(l+^EsJugXZ0 zOdm(DZD%QLn4d1t7l{NjUw#b`_xvZIj;{T8NC9VfU3vNcWEjxf=Kta-0;Ma|er5q$d z1bZ!V21h#&HGNtSaKn@0fw%o&I+o?V#69i+%-i~kZB_?Jp6M}9*GiCkr9oA01AU*a zEVup=-Y?&2e{m)P%h9eSXkVACtC1e{?yj%#B<_lN^Ws+Sq-4J#( z`NPg6$Euz)}0*Z6QU3}9LFIg}S@ zDKT8`vZJX=aX#w7J<);0x=Ue@_r0~Xr^o3~Ui99a>T%P#`Lt4C zQ;O&KH2s-ov9__kO@JL6flClK@wiFJ{*z)ngfOC&bYeKbb{$HhdznNaL!HIi78g&& zL7k7*VEV>>X!wvSH64BqY5&fA&Ip~xPLn!7lQ;9d zocA0c=2l}-srK$fL~z^>LfIrD_!5Yy`lNqg)kzzeJml6d4UkL)cH?hsI+za;xUR{4 z3Z(|=y>D>GIIT96ZKb!tK7pYgP$!i>Ouk43nqIb237^!1hAPZ>&jkR+^d|xYndi2O z=-zy#L{}Vrd>2qPMc~@T#@s{2>J!0A4UurBdn(g>wg!6usq-=%-3z!%gE`nMvau^7 zA5la%D|YE@xbgU}wOgMe2UwgS&F>U*--o}%wR?WBymy64E5Xv;2{bZEi6o*j8wcuv zAxp+MkNJ#Zk-gXzMVjt=L+inzzvnma^|;b|g490|Ho0;V+@MT?So9M4@u>3L3ENF#(&k*9Ksr`jbT1;pb z@#q6}>nz%Env-7@1`T_00POziA&xa3$U8hxU?R~X``a>QEq8PFBgJ6SoEViGxcdzZ z(z22MKs^ZCS5J`1?^N3Tf*<4Lq4ICX_;-kLwYYW2Ca3~T7C4K}pC*+g;lPZ83jYnO zEEU(N0JM>u2~ofu8c%@O^UIb5fC%HT=gdpf(j18T> zS3+y1*^Y`M)txU(y~{`JVSnAjrUNx=RCeu*^;-enT2T7@?u}DB@RcdftF$sik?+J@ zT5%hZJSk@EZ_ld3Xcd#{XG2kV94+%A%&q>3MuN(Fs6u(!yfr3HEboVN(GL<7j@j$i zp59D{QG+@wv8)i4(fQl6rzo@MLL0=HVlO!pMAw$@Lk|$_$~P|7W4kKeeg3l2{Ob?5 zN|6{SKP46kCPN+Z&q`Wbdf#^|5waS-J_01%pDAge-USTmxBzAj%_gDAHsT4U^Hm}V zpeH$Qv)+imCP0`<5@c{8>S>f$5zQX`uP`!q7X@$SYwc+k-wP+`t{u;cP5=NJ&=?-k z6N+X!PzYXAHUBmUeDm(#NaI|h4Af69#2-JvnY}Jt7DXohn6N*KMK;Isg0;2<@<+pV zgpS(OH5M2Uy&`S3lx3o3hF8nU*1u`+e=WE2@+A5I7_27C+4~XXjqr<=Oj+;-yeCG6 zmhs-*)XWA@9-7ZjO9My3SyC~{y^#R6Am5#aJZNVpc6krR)D^F{1W3?Tpg~s$;@h(* zUC1y3g47B@57OvK*o^GHTF~R1{JaICGbYu~q7+lbg!;6oBX@xcHc|NHey8%vEhoa^)MN=#PUjxYxs z(O}LkzD(%2u%Lb%wB>|OLbDh~>Clu6Ra@|ZLBJun8#&HfuANHF15-fJbIL;&SrxI#O z9RLd|aI(lGf^%QW&ttR{0BK7>UrX>E!0!=lxZ?>WtJ0)91GD5Q_^A*XV0epw z%piH7G2mjtOapdhnv3s-d+c?8?^0kqlB95UW6smrJp`6_Jb+B$(C~>EK>Aljb1icw z`n*40>v#>HlBfuJaPQueLuWrc+x%?(o9kSsPMzF+Dy=nc^P60eZM~PQ(f4PC?n@H!wPju(oM#mI(vYU*B zTc5eSeZ#wzEA|{rURZfPUJXpxnOwXz+KE1A!+3~D+No1E*O@c=t+?s{jWZc>%U__m zl00_Yzc%%BU{;?(BPPD0J@>(`Cj=XRxXVO#2paA*7B%PWsP3r~m5)8d?YebQ2F3l> zrhoZdLL!>|F#9b&B$*#aOIpSucfi&1*{9=usvkz0+t#X}cW=7%^6GHt7PnJFiDyDD ztdGDP<@%VKY$eR)^>B>P7oE2IQjdq#6@mofZBwRtfZU`zm*QK2fpcdic5^9)xC{jl z*!frQ<)*k;7fh>TdAUOqFMFOFiXdc-)1-|Hd89H*dR!mudYb%kB&(Rm4Ea{?HV(9T z%6QZSZ<~<)a{7b{xg=Iyg|7Naw`;i%E-=?C^k_o!#`UFM*fT3n(o;`4MjkPrZlH-m z-~LvreF`t8=7S+`<(e8BeYxpg->t6pk{Ap5x-s!*g;V}k2UDntK5f+tDqO#<@iUgH z=N80B%~)<3uaL3T^|$)Oh4VM|W6FnxPT6JnvT-q2BvVauGkYZPxXOWd7D&8*^09dT zj)WLm@bpnx*-;LF&dAc~cDq>G z3_JY}_0N-X-D{2W#xGn_FDi{eHJ8kmG`Y>v(B16hV>Rw_oZgH{@#=e9^t>L66VRnS z!@|2T!E|loBBwY_((UxW7vuI{HmIp->+u)8-j2&>(Ps!Tq})B|`wsAkv2(t(>;}at z1!w>L@m^z@4d-@E8x}MsvF@`r+&*`-D(smi;G%BdTfQR66jd#%lc?s6he?|$Yi0|< z;{$IB`F$}e>*@a*dw|u@(MLL$`eh3Kw$Az*2nHC`s~*adrLt=$MZ1{0ciDU{xYx2$tU*XOHr zAbW_M;mwSDEc}pK*l6(-j#CvC74H1fJw2NIWzVOy9N0j%A8p#F6 z%(>H56_5E1?Z9p2>TUZbw}VUjY`pRTv~Z-{w$2WunPf^*>Y2=^k0q0nn=5nP57bNA zN;hYqKRrrQ+H_n{W67qqAu{I8Q2!)G@YTM|&4?pQfZ2N`O!Zop=XVkH9(d>J>(Abd z0+E!B`cxo9T|J7^C*;S2Ex)4Z^65X2}1j4j+kyLY($6QHz z)mdkDF?r+PH!1y1IZ@whzD{*%nW1JMGY66ARhbr!`V zoV*k4B_*#X%8H^sKSsC294@2EYcqZ56))00>Xa;R!|eTKL2q79uX-OAq1<;pd;Su3 zs?tNu)$6rBp3}vCckI~WOz}}pJv=d0+T`&q-ARY88|ylr+;1B17)5qidISXP+S#@d8)7=IXNccaFO%i6nPy(H|dPTkAX@}}8 zNZ_ETQfDo`X3*L%Y8p}|sqRBvW|Yg(PALc1{Y-pZ*NzXhciV}1VKoCg$GE=;%!|s) zn-Ox-+$Sx*)U~vYT-*AWc-fCPzVm?`YT{XX4rgDWzI}aK{v9*YGSh;GNf)_hS2j2r z)s|I4blt!OzVUl$!%5Yk9n7vLcoesU9QlEo1{`xj2yGdU^mmlx%R_>uv(nJz<2U1Z zkl&J>!5{!tkD2&OIk}oR&V=lVh_rG8mD30Q2|+iUC#%2G9)={tm90^;Q{9Pn8$cWq zW5(p=EY&7Gj&kgoj7@uQNOGB0M`w7$W@RaxRreU(<%r$Z$6Ecf2$ zPgNQU6NB$WBQ<f1kNNQ%^y!mzJLH&-m%#Uwki z0);g4_^QIbg-i8ov!jUgioj4F6K{6%cbB1MW@V(Rmx3lU($|>`inViuwpU=j z@5KBJ)6AsENu<+(lk=WxQB010?U>p;W*?t7ya#%q^&#z6K9c;$89FXUa$g zZv4W<8sJ?jpKk<-~+ zyqG@NJM;JwEu0fH1dF7XBa5Uyf9WOZfP_Zw**s7``XJj+3gqq+eRP1TcgnE7ClvxJ zU0&{zQLsg}_h_rM8GgW4#-;b4g#O9=sE&8vOVm3?n>Vhq2a1@kH?p@Qn)?>!hg7G9 zGwe!gLo39L3!EYs{BWC~EmQ+~4i`V!g-?V~g!DuhAY!mXkQl)i|V) zE}|f3rtI}+`#X1Mke9--62%@DM+hy2o+mHIyI9X$oMYH42-L$4oXZ@j*Y%Kqoj{$? z2{9ubcVgS?nj$mFoBn}r3&tSJMt2%oNjRq2c9#sXu#Z_wqNPWlFEmiqc_y|D)K@0g zJ+=}wzxG_)*l#D(usMM0@_c z2p3#EaL?NGB$Vy69%_Z3pfpqDsp_{Hr8{Jhpy+5F)+w7P5+=mK4_xx6m@hk1%u#K) zK{YWVbPU*2N%CT^9Mz`yp}=EY9rjQ+F-EfzzmEH$Sej>F_3-)93roW>| z-Kb)aW&H=?$-rQZl77kaBZ1;psivL@H=zq8qjG0z<_GcH@_`>ESYNN?mc1}2e6xGeJ2hynEq8{xZTk^Eagrh?qYQ~q&&uW1Q z?W;M;Dh|zQJde|7X9vxuo+N86LV<%hj$hevuBtWPC)F~l5P z-&TFl5^h3Q2rYV;iU7<5g$nm(kMaI=FhwB#!qC0Xh_{U%>K-mL#ixrM8~90$<^5aI zv)!70J=J4PB9-xWah-H-+Kw@kW||=eRf*Y#OcwGj|Nfd#HD=hiSLeFBCv2%#-*Wkx z?qh{4^q&l5{L=>i^{dbQ$!T|L8wRZM>2TNod@8*ZvowI?fx#IPFm zZh9IsYcpGh_WJdK`vvQKInE8C4es;p`%;_xrHOpZ7i|)!=@OvSCIT9GHDvD@ENFL~ zt9`bwVUd%YoZe!WZgoQrEyizPe#I^(DwCKJYAE2=D4~>x53{nLxGn;&VyS~)qRvNf zRJCl;12G_vBv*rm#r%nv8>yhC*>DiM?5;aY=R#^latvz1XN0%YAo6MU+p74Yf!7sp+ZZul{|+m8-Mi^z$V3>0!Q zcHhW2EV|cmxtUh|Ia%tO>bSMvD8-1!vRcyML)Gv945c_cM-7W2N51Dscqn=6F;biW_+79kV1zh zpEVE_lMgs7(pn;jj*Le-Ef?k;HjTwZ;#tU-zQfVsV_k@^W_)!rJ-ZJ&mdZ8tEo59d zx$d8;FiA+s+s9ZX1bzX}+KKWGVtF(4P=abA;0ukb%+ME|cpY_&kP&$MTypv#Sc4x? z*h`|fek=!?Yjd#lAKx0>toCFyUaB@DxL8d*qJp^a?$3i<|7?8h5-(vEeO+_-nd7ZO zRK6ztZc3(U2k+S0L2P+@I$U47Sd0T_YiK5#czv(2iy6y{)?k?1e27$%Wu0g%5k&0B zz$Wfc%TCnX>6C)YoBEuFL@^hYeK)9K5gk8?!26^;8QA(AHs z0dXJJGT*Uvz$Us1ZG>_+zdB4+zY`xOx$gM*QOKT>qkaqo_W^+AK8T*rqd$>TQf>$2 z(v=sOiWQ10nB!&2^%I^Ao22H!x$YD>;bhMM{-O>4HAY3l)PN|6&Pk;5t^nkG)*0N6 zlVT#PVJC<3Oi~#G!tmJkM$VKI_!Lj%=lU)mFHjK4ezC{R4+SbfT!qzoz{RgJQ!eB^ zuNuBcB;-;*Z>S#e=9umw3ZN(YGda&ah?j=9zQXKSWw^TRYb>@HD)o7tb&a`M>11l* z)R%yq-vKy|u4zc>SbgJ z5rFprmUo4Orx#*?_tEWV36e@_ie+~epNqY-9r#j+C-Ajgj^-!Y| zZybr0AF=7xB~Z8aA0K-ovJ22T&bP{%Z^GzVl(xxdoPK@`354rb+KjT8TI8{U>#iSS z7E7}v{(c|Wu1_H*_fp28yJSmw$}wABR4==wzDILL%O>g-$WY#XTwoI(NRd05#kk)_b2c&F-5PuoNVxjY>} zG8HbfQd8bkIw$u0$>%4rQD#3rVVas@cjq2iA6gnnO%n0t(KrG?>uK1otq$8MS!Jrl z@L>%}&>{9aV7l{dmP(rBcVAW$CT0v|+Ux1s<>ObYT6`9b$Ie$;&OsJz$i@v5+%$iSd=u zi?lkwNdR2mW%oHZ{fEE@!U16U{}SB-{q~5$>G{yppnCD{+t%k{m0a!=pD9a^1qV;K z6T4)B+pu!p6Wjn*a@@MK+2$+6&w9H(7sd|iy(Z*bu}s>)vt7#ZV?Q(d7Q=nYPo}Ay z5mqxUh%PdmNUoUH*apTrbgqytdeabo4_R6QgsiHJ% zSzS^7QFV4j7d5z=Qi?U3|B$EGF>ScUy8t3pEO8my$XgL5L-^o`l-jg+!@*1E@uB<% z7Q-xcsh!}3GXh~97vg&k&@}_%)sV#wIA~jmJ43yDWeEJgy|rEk-~i`lJ%%z496)7) z++>?FgRwl1<63=Nd0vDJ;Bp>I^6|{E`JknI-6m5ejpB8ks}mqC4mfpVKmh||Z1i+8 z0W5S7b<6MP^qIoY5WT{Dv55|~SbkxLJkHlC8HP%^`{W>-YBQN!*WaZJgLGqBr3)2~60t9p$~0y6+gCtZ{us6#&NAM-Q?7bsSNagJs zjye!Y(BO-RmxKFchL9MjZzQxQh2`W!J6qmAKHH=JRI;Ov-VKNoYf_zs2M?gVgJaA7 ziZ5rRgqy~>O4K<95iI<^-j|9Ougfk!aSVBf;sj1AmYMpNY~9{Fe4eWq_lhqm!}bQu zdZMAB@(JZX6%T^vPmri07>D}GuY##I5`e-?D(9T%^o)#A4iL*hML)qeP`_x_QesG& z(*T#msn|)kmr&wp2hej4IMvs-t^I3P)Qn6=w7A;EV}W^}o0&SpdE_Ctfr?7Q0sJvJ#NP+Y$}e5YG! z(N4EWburpPLVn9C_BE#p)b1R6#h*%8)Fk^Ky7T8`1@_>n>T&aI{W2cQI$Lb(DARLj z;$6d`3Z=;)p=)qgR;tLPUpAFt5{!y7(e*!xeREeVk@NkiHt3jhom3iIz*+3USqRaZ zCymy)5M{AqkDv?temnmWg^SbP;a4QxlhVO$EO}22eJD1Bc9I43^V+hw@gjKOtlk_@ zUDt5H8S--V0*7f(MR!ws#BKc->{P7I>wJ1&zznm{$hG+xDnX@ucql-a}S$ z@7pN#xiKx@G`Z&v-<_+xxv3__!rNk0$>G`(=WDDAuOq#?7)-3%O-sE_4JJy2qS?FG zO~-$@>tA!y07W;-C80-z{Fd0(*Rad8>7Id@$SOlu-)=w=m=(}1Zhy>pL94h4wMh6WS0^1e0TiAa1^qMK|O=D(z&$YJ(X)m z=Br{KJl{8n*4(6p#tD!E~dC&lzpkaaTkdEz1TydKmY=!upDy{l40I0=9R)NE~~$ zkDe_LpUFP1&;k;74tCv2uC&`aP#?e1g1wOSt+J;`_WbqZg6o4UlfF?hx7eF6`Q$Z$ z+6j`|zKA}F)lzOu+N!t-4Mddxyt`%KH;Z^peEqO(_~sKSObg*9(2)`xv!<2Eb%CvE zUPpE8O`g&9COqq289J4KFsa{;GMI4u3g1-Xa>pU3ZWiusUdz`8Ri_6(2_T5+P9oGL z_O=~}sF?~us_#()m^|i9EGKq$%0G9;SJTI$F_Hc1HpL)*Mvd+Z$cMc${!HE&9KMwC z&0`KHG!>K}5>jYEZvW*sOUjwlrb@><1NF;1B|w7Rop~nf^&tJKe_;P}J==7l^}lC_T=)r2;P^E6VC{9< zi=#!69Ze^p^tTxiWeJlPE5Y2nqcEM2K(3dfdo0rV1 z2YZf0Kb3qx9Q8DLtYcwmrP4Xy3l2utW#eM9p^}URI1$f0qmGCgJ%dg{pmr=@Q8^Rd zktK`qik4_rTZ)ei*@HPYkCd&OHvqPZcw*8Qzq<#yAyLP0#Gq-MJczK z0PV@BTXsb1%ea5~F6s5Sz0=f;N|j}ddn<6?t+vP77r0pOJ2U_5hHgt}RkH=sM(Z$H zwd?vo{Z%aerl~WC4Ou9L;A@{ogBUyTg^mTUhOAm3P6;YLAiqJ7dIegTL#iRuss>M% z!<5O2O*>Qx=wD1A+4B5g z@K%QVoX}Aqf;6h8?%&<{=8wo{EdL9I%~!zypxjJPjZJ{*?^Aj}mclz`xC~AC(;kD@ zsqCDk&ttVL9ryt1Df>ci{Sydh4AI7lW(X<-XltZic&HPfC`0f{LWvB!XOvpxWwAQZ z`|nq&7HjOSld1f;f1v(!GhLWqRD&YEzF4egwn5u-sGhG4f3dg>u>V?^M_RA$Z&)Gd zR#78YF1)Dd^ZGjyE;qbV&;e zB-X%#K=Y$tN(yb5f%81=HEF3L_E?AwttzmmZ9!o~<1P`*`jiC}M2+eh=51==2$He0 z66&C&p?3i*`Yl&bdNwXZ*G|u-`UFKa6xFtPov1q!I6CpOsyS)0=~WuU9@>#?cXJ{GHHl^b&gV*taseRtm*OK-NH2UGW>Tll`OoVcy4ExVRFbZi zCtc0RzXpz*qkTg4%_Pyr-WjH7OX`)Xu;Cy5-e5pFWkNlXM`KgSd(l_m+o*?#K=9*4 z898s4s7o{0mOJ(}ROA*m5lPq<^T{;GAT#2Moz)HI#{+TIEe-A$_%X-6`(@iD)bLsGX?fAsstCQXgN z;7dvB4&$aw{?&38Oe6yixtIIV9);b-{+XQw(o6+*|NZn{_nU{(Ur6bh^*bN#*G*fv z0-7k^^>mg7)M8Z8s7$@Tc7yTGJT#Oy(8D0Nh0CaG>b0%s4Fol_E`C26u!AbB=@^X9 z?akIVDWpE%blOVDt*;nuW=DGQ*FW23Sn(sGNiLM;t;>UO@}-hnfCy|xsrz#D%gwSB z(_CryL`P703!M4a`{14^4A<;+cS|bF)h&2VN${UH8*?9=HPql({qkCY&(!EA4w>1^ z+$tuBe`37N4aa6j!I=;9wjiR$S7JX%A9qZszS{$m{GCddpD2u|T!7_?_9ImvNxIvh z*y*qJ=;mc=!fGCuQsSLj7DUzV5^PB+B8}tj4jli7t+zk{;9mIo+to*s+f+&RCbn`5 zlb}SxU$T{Fl_Ke*F4p=9c7S#PEF#r{<>=-#3>E$t_Nl4=4EHTj>$=)5nIg59j6`fl zKTIM9r>B=I+ZO$pd~4gIwMAfFeWb=CrW$_&+ev`W25`3xTkTAhsUB9*I++1r)NX1M zFZUkzn*6H{_GY1{2oJg6HYR=Z$=$7pgO;CU{Uv8D%K-osF3@f1_l5@MORo&+G9Z4C1SN z0ctPvL}FgLp0fEsyNZTCXy#cZen2-)!7VPYKv=%+_Om0J&N#EXb|H;8+}DpAR>=-9 z@OTTN?py85!?PmhOtTQ`gwpb;2LrItGK_|6gjZL=Q9InJ>hPs|Odg=S!#(UHwM8Qm z4*_wdM_w8s(KF2`s4|}OE}23!?DN@I?X-%t$6%)1_oSFK={=guz7LBiz_ihD>5L{Q zxuR<+UA>MLr1@TQA#HfOkxbNIc& zhco~YQ1q7cu_rOp*d0685e(ybG|)rMfZ{OR_a9sCpRlAyo(q`)OYrj5P4Oh&VcJ0Q zYz$JsrWeXyfFuUvUBRHGlaUg;g7j((RC+q>qWfcgbRn0B*Fb%EdD5;7_vJ5*ZNm%d zKb{YU95;9XWo008Z%wuEwC%v|_M0U`z%!*0W0aHCGnqkU%8s5mG>w!kcCp@W)uEWl z+GxShSz6wcNqi(tVqSb$d>Ab}0^BA6AT$_}XCNhYi0L^NL9?y&Xl7R_L`E4ccM)F$ z3MFRP0K1s4rB2%BgRSi<4iZNlofQuR>7rH1WtxaSSM{l6_Dx!#N%B2+zk zh-}h{PmzDp%(KdwfnG$g*9&)nXsZLh(j)<9YZrsScAU(!mg_=9F~R#j1e$LHpkFt7 z5;?c%0xF0=K)>%*_NUM-`}<@Mw(X|Sl7*b?gCo*3lPQsdtlh{2N+12IO*c3bTaQ*w zSGxciZAZHK;`xUQM!CgG9HAjm-{rIcpuLDfYFN$`5zCYB%rXXLDqoq_2(?|6fz0hk zzowizOhT4CmXyk>IJnpGcqLBgdyr*=P?yQV9Crh9{3B=G*lg&_lAJ>XtKL8c)v>eu ztUPMA*AaivvO1`LF*|4IDeduI70ulNx^ae+=P)60x4;Q>IQTdNJ%%mgObnIX@2XaIK_WX8zeInrfQf%3nD*P zRvZ(2^L7S^PLZci3Dn;BdR_#sH~GY67@(#O=HUf3?j$#Z4!m1Sr|Mc9F5-Rp>g-*J2E}{3U8bgNVAE>rQa5)02FTp8C@!0 z%vJF-;D1vn*1dw@JMPQ32G0d|I1-@};>B!57RC9@g5wklQid)NMUzD6woV?M8iz$o z)+jd=9PKuxQb$b$xhuxriItAk=lgef33;Z#Yy!dzdcK>qV4afPAFRH*BBL*5j>?@- zV0KDX85N({10^*rk;8e1E0S(zDs0Lb>C4xE3`#lQ?~82=+$LgglD^HW)`C-em~W62 zmAhOo=7Q4ogH;1*s zQE2(nk;Hz6A|TR3db(GPDfgQqlufhQ_txSFFjCxZ`C}68)0}hC7Si=Uuy9`|&XMXg162uG5 z76Z&Th9&bhsbHD5|NJ`8klV78p;uVL^AWb|_F;1=%!TeePvTr5@P4{7B@)DbDhwbw zx2Tw$il4@@{|@RnMZnDN{tTGsR(uAKJ))MC02l3mO=A0j4DihwnzsO0_1o%14z@R>rZL9ZQ zE#(w!R~I!Tw(JC}w(fSpwhf z^FuC0MGV-=B>(KRBXzEnDuNb|a8oRykS7NOUqe7FeibE;J0{NNEJ$BRXwj1bYq$ApiHD zxKTU`Y^zJGevr6)Gp#@&*ydR?-<=J@?3%UeUJ>|YH=qy}9ooUGOejOtw4(Djc@`$g zofzTi%Ld2+f6ZZVX~GaJ>6%3WoUoMz@KYXtxrxgw9jcVDWaM^XJ{cd5^G0|v$gX4V zf!Yc7=>O~C@~?o7<}MbnEFCX!BFV85liX^H9wd4%b$GwSKgC->JEHr4{<*E7>wDO8 zu*bfY#(*LfFmk@H8zz&*N*B&0@h3UM|L31OBm&uax11fRq^{vH_r|*C){d4JTDsT$ z)R!E=B)e7Q0<4oQqkzyVp)CRSI-oWbt2gYnV*gd_b@g>*@`5X}W)BBfgbR{jz`?$k z*A7g!bIeN4VgsnuyWZ{{lLvrcb96aJg~{_j{?E*AL{M$$Y6Y6=N&NlfNENM3%d zf1QYq+;z|zq(}lMD-?aouq)9=eSTC-c_sV^_#$~G zc0jMAD9vcQO^I`>Rc3PkKYmIZAg$(Wrb~avlvn@zAr9I>A?An-IMUtz>k`C%yHe0@ z0i1p^na5P{*GRXrjVpE1WQ{w?n}5H_yjYG7Rc?b@&Wztv(1{NQg# z^wkyatZl!R9sdN2mH+kY(P=4&M-pZ&ThFTOAH+`buWE+C+`9UvYaRnoDW8n+8p^00 zvqdf!qt^cnSiijU$^+gzKG}mj9bLKMs-WMn`ocD(BPelybEB%d3hy|&0|f zQIg)>|3iG;ig@~eEd(+Rre;m$5#xB8DcbMp@#vMR(DK~@@6o&ojC;_^{3$y2=lYeu z_}jL=+7jnGEZAoMhW3qIEl0`5n@U~8E+n!Zft&cho)VF5ncQkW7>qx$GYZWj$rBnt z!FgninhjA^ZQh|VSY=V)-ovkfST*oT60_rs6n=}9poJ*p_J+!p_pV}~5#tohlS+xW z+-s+q67Q1No!fBgUS0Jmd5byCC6W7PM@Jr_Vy zR?ktVwgGf6IlBy`RPpBWfzOb=cSSH`ei~>%!f5@Iw^%*jMriEAkb~9|l)w#8Z_RWA zb;l)hXW-v$U}w^h*BQOoKr5N9ojk%mely}c8tnGtfVhO%nXERSU8(oPAt}qD?d{Ma z=B2;6TN4306BiCXTZx40mjKgPIAKD?=B68a0XVm}10}878?+y!?I(N%7%gcc^dr1% zUSd~(c7ljb#gMxt0FBz>N$yO&u?2j|WP=(O*Ild`rm5^r%-`tPR_e@AL+O;Kq?^c? zN4Um7mb(SQCw?7XvZ1+nlt!U@agyySu+VH-cQUz|%|-af1m(E5Yr`=>u(nZOn^9ye z8_PHm%Pe3p(Pz-#EPYS11e{7BFbe29P_ONJsN0cA2DZm7(#FMU(~RnrM1C1xGWJey zqR{b1-luh+27os<-HZanE~&=-uXDt(O^+@q#42rrToy&y8g2`%Ex>FfOt+Yg%B*@y zg`1_)cXIYrr+tkre(#nbS5q?nIH}z?(R8NYq8fNh-+K|&Kv-=?|A>4OD4FgH7jOhd z*>I~XZIwY38@cQ_P${|AEyvPvXR`Mc!0-5mDmeKaa?jY>T?BP&B=J{c^u-#5gfg9o zfSTHAkwnPg*EAZGD#T0 zl_6C6Oj34)jRmG&w%_#!|2$_XT}G<2sja8dzw+fcj=ib1;%ie7}w~ z*o!OK8VULK#J7}CPI>l7C{^I@hSa&s(ib7#A=8r5YhQ=T1=MV}6$8@SN=G^ci>#f1h6m@q$vyXm8UyC8$6tlfmpjGO4z_U_n%Y49f~8_=FrfS7-+Yo@)S{mhhI^N6 z1C>@|heG76g{p5ePGzvkQc@hu=O%ZW@4mjNeA->L?ko@A8Fzy{yBF_F5HM}maEG6f z=SBo1Ojv`u3Y2r(v-Zr0yS?rZdLR6n2-&;(igJULZ(&%iQlxCJ1XttvWqKJv?nk8E zm-M|2gi!@@RbhbE!Z+DBmoaOPY~KQ%sHS*od9#M*;!w=MU@_;p&vHhbgf;>l{JG&`KgT3F;qRLYvh2y) zvtnGo#oQabyAZY)H~1hhnR9oyw-1MYxjxz6=~*x+0&lwXPz-S>_|(_Z3`w1cIJjDG zx5eF*o?GP6hm3Vt*by7Y*Xi#;T(ull;aI#I)~Q^~kJNG%y<0V=zX?Wu;#qQwM`P;6 zg9mp*SUrV%H66`M6F~>$Yudg51&R~0sMQS!eqIUmi_t-CDu#uXLYhsycUPpY>ZaX5;o#H-52ChPB#(e2=x5WN^pL*?^fmP&Av>6blV)zaMr9ZgMJyr7MRK9c9 z%oOJuGxm&5LV}Em+KTUif za8=igJ#G8+-IH$MdqU?_0=h!9*xDU((b*j(mq6ZM(1Skx=-L`n@d<}O@}aYO-5g+o{M7?o2vYdkbB0_tSj~H1JmH! z!UMM0tJ=@!z3mort%?)JZl{jTtGQd2VqhU&`zXeqdX|FBUoOml0f18=a4RVMW$G!Z zvLLRhW|pphK0Nj!(+KKL69)3hU)KgE%(<`s7a0_UYJ}wyC+d-AC{nm>CVrR|H5@P=&I= zhXAU=fIs}~?fyLd(k9Tk&F?Hklo3x9&fFP-d%SKJM+mG!nC#l9%98NBVY!*>!G zQH%?zIY$dTJKq2~&69~K)QL!NCVTrQ`AAUUix(;$+|=K=o6HeZ5bf^DHv0yelch5t zv#}aQ16UrsLfZC{cRTwJ^hvDO6|H!9X~UR zfoKZ5w6HOrLKX?m zm4hy*cla2uuYF)f1*OKDvpdBMsXGc9z7#hbM%Habm@h9#$Y&#`%<$2-VDg*J&!*nR z6KF5_tARnv;Dx=ic@Tq|2*?E><_0f?#JrU81{#|}s5DTZM>GgtUkPVV@II0}wPw8h z1)qWfrX}kBgLqfghIyW&O3vT%>Q0(Fu3$2%`eYt)yd1N9_;d1#3O3tABPyYq8{(XI zVV2>P{`u3liD~Yo4v=bfyccBYb1CP<)qHe7qB$x~28^_R6fiqLQFl&A@y(1}mg@MnJi>C@3bneFtD2?3aBsSD_*S#!PHk{Zls-qE)Epmzuu^^#K*)sAfqH$}<^8joWM$ygl1E#J0q7Z-6$4B_DW{0L5DQIk^oj#; z2iS;ai8BBr&sKeKK8VJShHx&VHeuRcSpb}pUOr;=y(r6aqz;Dv-{l4p=*%J}#WbN5 zQ}*NIfFvvI!IECh`IzyHlU_O2TNt8J$EHA+s)tyFY*|I;Fc7%NO@&wxL^mT0V0!=? zThjB%!YXj3nM?kHol^|pb%^_`!c-yJt|bkbZALH-#GL<>yN?L^r|=#qsH+L+65oK< zmD-2_OcH|#=@RV8m$L*ztSqlsxjj*(?~v%0->>QlOMuCy8G#z?P!{Z})zmWl=1A3p zB=7M9NsXrJl)kcxexeIh^ZO3IcZVWH0^u7tlx?1({v(V+8T7~wUYnFnp~>BolLPhh z*~`)cf;LjXXk;mNuSY7cpl1ChMx-?5X zP|Td1=W5+9KQG@P1rYoV z$ul4hCdj}+d*vw7bNf|~LqZDk!7k;_A@A#MYlOwS886X5KQ zu~=DaW0!$*{~cK<@zCVY+l?nr+4L@6{w#^t2lEEp5oX-TYM;S zPj$nNzLb8+x``es;1_$1%XjiQwo-Rb3(UoM0E<`lMFbe{o*g2&QKVyIG>%Z4P! zr>`qvO3v&hK#>SSP{tB8uZI(2y(Tpp-iJfo&$fNbw}*dppUFP(`O6#w5vrTQkD+2L zzxa4#UtTIn;0S}#$lPFEZ6Bj&Me8}JzM~vW2>4?s`AN85_VU$TFc35xI*%3HA?!1g z*)%lhE+Sc=3@XJY<|Gh%6X!0?i9IYNnl9g*v{P?oA>{5j-7oB`( z$vI#aL-=e4na$m9zm*vaRap@?EFTx$&?-MTn2YC?gnD$}Jd!l@pXKQLR=_^kdg|p- zf(X`Z&8NVEC4-tOvW@sOdDeN^5a=xQ@SWZ#qB=rsj{N)1u9-Ff(fJngi;bOgmK*i@ z7RNEmo`|b{<80J zmV4se99_8=61+!fu1UBszKddD%uXx*4E{Bu<70?esTc3X#Jei|n;d`{XC1|fHjr!| zzpH%e^Pt6J(7SChSy^v(RPK6wzyor9#@WpXEtHmcw9nUMypd7rWe<*Psz3qh0~50c z^T+?eNvx`3SE0!hcqU{gq0PsGzTYOLYsB`Cg(X83*Z?a*rwlK}a$r|{Tz&BC=ElSx zqe(U8@`WVJt{3?cdKFhytXM*&Aj_`*zICxw;^;YW`bhqC3E()4j*PJ z2>JVOC%|Xy*{&KuyR@7u@2Cppcb~5;L22kw$z;le&j$;bHw&9 zUn}RIx^zm1J_etEdQ}(pSHq^AU@CyYE@hL&AJl%txZ8{gYJESw13)vzl5wdbE z-(O?~AEMk8c-r&2(bJ}oX(l4)W-nas<4cKay<&sc$R)H=*pjVkqPHM+7PsG8m`=>V zqm>xm@#aLOf8_^o)&~8+BvyzXm%o|w5#l~y%#=wsZ3R&n;y71s@v7LjDv?}PTxrgy zVAPnWnScCulv|mv0GP+ii4e_md@z{Nu)AMhd#^;Qu*7l83rk{xh>&BcW4M1&SUiXP{|!pHz7T-z=E%af zYiWQ4g1kui|BqbGHSFB64ZfuRuaX-Gc#ywzg)ae7MhH>~76kr#mse&s zK-A|?uyF5L5Nq8U!@0UxSGZE zm;^9$Xzssf1jYZmzJ@QU?8SksjP#&7*xBr&;wyP(#z1SOcWNf%ERV z2XmGYR$wlb!q5o5RJ()6lwSu3LrOV*hxs8tA?AmrpHriY76S6L3hfYo*c_Oe_Rv+|(ED2d0#p9d?rXytl&}!0^t?X67rtJy9x(v$c6`f=+_87W z^!-W`!ZhUYO3-R-R-J{YKwmvi=?wW}`Qu2uEgTSI*G~umQW$R#9?pg?uJ9sqouOZ& z)hn>x36B7WRmDMx@SgzeVf7PVA35a;K<<-t6=3Lym9R59Y>!>M7*M$G91fDf*IsYm z{`$ffkaf5dLCZQd=*fB^74zi$pAYS|VZfbi_LObtWcq9N3%-N)_JXCkpd(-#`yEby zN!41P29t0!`~pVz>;i=!Cb<4jWyjh2M;+-}E#U!)m_L0O4E5!IX0_NGZyl+x8w)j4 zw_5xtua;v3_$ytyzpG7Pde^V2>|sl%cUAv$POl2(i`DS^R)=(vHL z{(LwAblEWhV4MqhD~|61uLn8tsR<3w8+c5n86^N51=zSdc3%H1vpQR2kNv+?Qfr-A zNK#LNw!EXD)_G_x4=2|B2FC%C_dkx{ztGjctkNOu`j5&oD0%)rRhIi=xT3G%FQWR- zCmrT_e=a)ztPuaBiv7Q2ghN;OqZ)eHLkgyf{rP=YqSpbX=0EGoAQGBa6*mHRF8l#3 z`@viK<#PU2dtEswaGh~bKIb~z$k1={OmF!_xXLZVva@e>a;C&J;8WreSpDU@=QwYU z5lOvCyC`|<%P~nMRn_C?&VK$P%Kb`K?#(Ok&&TndidfwF$kFA2vQ*O)vuTywKJ3-y z&5d@|Ehh~PXa%@)Z?GRy`<@hVWFX!F!rtf;Ao@E8{(zvotpKM3;?2(w;Yzs+SRIhD zkECNBN9-@lUlx^C!$(f`cr}1@G!Q@>AElDb^M4Mn;Y}^Ps9hF zhP;{U07MzcY05ze1V!vk47!(OP5}|s76Bs7;WF?l2(ecpT&aT8`rY)iXYvC>@y4{l z&qD0;*yB9WulZdH(Z?VcyAuFz58<*u3O-r-HsuUFsRImtD@+$`0GH`q`eswU5<^}7 zD5AwCHup7IjJ!FG$LHYn40nAaKKmV)qUkD$Jm{}iG8{Yp>y;Y!@eBB|oHNyMqZBQh z3H4)AR|^A2TxO43(Je{KnPMS^a{gfKA>_;rdO`?S{7JkpXk{;hs84s|Ngx?m>N_o$ zJzh0##%@angy){|ox%QsIM1O~@o-w~yQO2^+;n)V!!0gRQvB5p|Ni=RxB*wYC4<1i zsKjL(YpjQPXQubk(O+M?_LLTX=fc>X4|fDZKsz#|v|)yt0X%iZYa$4Wl!}z+iM6pt z53nYdojvtaP~L@g6NeXAPgQ@o|*GwJHdavtvqwUSPh8xn81~0FBAUer-gZxVqTpN6H29C;1-+1eeo`A z{Ex@oG8Z^fM9p=B!^S%Dde?fn6_(UUc@bg6^PzC<*CF!JB2b&fwArg^+!UO{+l z%6QNW?H_DLz568sZ(`0_&(qQWmIL0X%1A$eL+49BH;pzFAL!cN`&f-%9NtTnp8U7A z0>cRLbzuzQ{BeGOorPSIH4Xp6n}ZK}XNJ=qWDREpZw@d{ZS_!q)#F)%5X$fWR!#76 z$bm3CavGE|JezHdiycQ2LGG<3geh8aSU1k#mtiZ!5$~P*fhg?)Ph-_Ok4dXGr*qQHX#9^#?9PHsvSy%z3}yn67K<4PTOhfszJHmq z+}NzjX!UiwQQ}sOsL%&*w4F5095fU{Ff=(L?enRrk2beu)KQ*WqO9SvUO=^IWiF2qJ-!C_S+)Y%+m~>55%6oy^wJF zr|}wZx_Jk@KLor(p$5=E^C1fOP2-VBJJo}$0_pQ^fzV}I#|TB(XTcG3J^RT@+m$sF za5X@iUQw4}Xv2q^3d<*s>rOLDK)mU^AdnLO8NB&2s$7IRf!I!(@K7M}Hj08>D|%wp z)Su4t@~C0YhB~)|zhH$xR?CLe+bbORF})8%Mf6G^(D^c^ll`^0o)|ZOaba**bK zd2|%B&|1`P$0+Vt*CMTY_0MNj-&MTbLJ96e{_?g$^@VMJa_Z)$GfQj#(AH}IS)jH* zUA4XOsrVpp1rykD{9c0%B9f-g2Rof1nfu(4rrf1FyxgHxk`@A4=2;!}*%e)aE{Cu0 z!LGG;5TmJV>a;Dg^S6- zE8Q&yx?3LS4>fmO<}O|LTH8iLjJxoSD?n>+h&zSH&_cYKie`5Lc0Fw+YG#V&vJluF zGGHez;X_XFHz)o-KVu|JAd+HI?(XKmJ8X%d1)3=`# z#T)~t7P#5Nzw)dnVgKACGr7ixjT^(q(CI+=knYCyfuq$CF;o!mb1J1qH7#u!k7L#| zRddr##bF`kM*xlhqW!}^J@0@0kYVG-hO_}|NpRAmR#FnkEz6J!wM9D3F4Fh;GbiQ= zfVBZyclalF34fg9gW%%AKUEI#9{w3_Vex5@CXc6T2JB_t#8JrG?~|T(UK_6p2}?zQ zvi<$_VG_}w(ttX}SAm-=Zw~|N zfaH&ir!IK)?hobYlqUSCWK`YU{oHzv^ADu8!zw(0u|W}haE-b(NYr!sw{4*Ez&{x1 z=C9p6+=dd*wJOWOqFl!0`-~SL-Wyk!AlR51Hyh!@Q~Zwyb02CYP^_P4m^a0!)TsQ) zIGfeZYpO`g%}~1nBk<+k?bC#J?{<ewUgLT{o+O=kojf0-#2VFM%CT=!+(&4?X&u-ZY%S z8wjxDfA7{feC|TksjMl-sF_S)_l;P9*CEvr-_b9j5Vaw&kZ3}r(foA|>fDede|qqQ ztN7Hm{a63?{A0j^#$5mj26t77=p8@zzf~>TEKwT2SN{;%CnN3U>GasXe(e;+Rd*L~ zr`MUcg_NQ;{?WstMdLnp>6E`coBz~5MFzbxw0WHhTwJsR;{ap&ZfPb}8KO_pA0q1XbZUM0C=`u>z=mVs+*PrI!Nh-*k@qbOTz&sxs*Cn;u=sG&Zw1fp$%Lj1Wn_ZdJT|*BQ#U55H z#Kxn+$B_Pp0&=zLA@sqjr~C3f)XKEvX+>1~2hbCDpTkdjZB7hQvQ2Kd>IqR!ttm7 zhfz!asGqrs6!(}2g58HEJ%xU%N@tl5gC6>5abTj#pCAxZ#AnbVp5axy#J%og=IHxH zs%=fGr$uyg@3J*lcJt5o-0ihMmPePf52jg_V^o%;&!xxmYGgRLil%UK)aeDKp~@3; zT9>=S(}8M-+UgMOTJOI>?G(anB3^xcRKtI!Y@IzE>usHAuRmnBs=iRf%izJ7)W;^e z>o5o7(^AV(uSfHzKapqcwd=f4v_Fg@U(l{-$1a zarU6+xWR3MZkx3$Ri3u%o)ehm=?S^|&5;xgZz!pao!q$m ze(j*+m%3MVL(Rdd*Krm$UK;5k`gLrZH>b8KU)PA*bk7eyOD{Qmx%{hIB547C315aP;3~HVoqKDih7$FI*1cIxzGhXS@WHOic5Qj)7zZn_uD@tCkV6)c?}a ztnGUQhgImZm-@&j`_Srw%b-Tiv#uTW*)IcA%bn5eT;*IUGmom^7WG_*Ud~N*n9{nGpQZ5W8$NHpGoV;)!#?EtxuHs zXAU0GEfBEPTwSUUew9Ub)S!prr1TX&VEHKEm5(}27tGeSN1oc&TIHbaa7zH6>E-p` z(Qz5?BzA}laj(sfQcHx7s09+pzfqL7v?IZuVr(X5KYbo+?ZwkQu+|5oLb@}ZWa1qi zC@B$5;ioE2#uc3A76 zM+Oae7hZ+R>XCIWO0Nl;VX@kdi)OHhFlZC@$s`#yjXjS1W#PQrK@@kkP6?gab3eu< zI@W}?I;~~Fp6ocxpc|nA%Z4sR>l0a?x0}AH?bvg5JMlN1H>sR6ljs8Y|jY+3j=WALhL->8q#7JfDOeKo{}DnlNYx^ zw>o6rax2Ud8z={XSx$d~HW{tnrey6oTggZ`$z13R-2YZm@Y4$91qM;jRt02M936LJmqYg z?Qg!t7+KV@zI#@OVWVQWRD^zg=jqz5g>Y$$R>!a>84GBIO0bQh?Z=6wUxT<&yVWU@ zi*piz&wtz*)?%G`lx99?#y$vnR>;zFr(ox%CLXLlbR9rHZh!pgdm&3|fG#J~5WEpO zwnj|>`6#Ztx)WmY+nWKf-p!2*i! z71BpOAE}Pj)JuCm96m=5f2W1b&(9R1zf7AodWYx)KU%0`HErI$&Xp%1p$aC2TC?v$ z-Yvu`m3;I=E)0=UpssMLqF*%7c^X)x~TN&#KiaV@k)j`%eB?~{G9y< zCF$xo>G@A#qSNYiJZl#bEBrm{iYNOwKfX9Kaw@3n`1?;n0oT|vuG?x<#PmUK1A zrf|4L)krma_f>FDM}hKOaRq7>2J*gu8|O4P#-6}2f&FW@`q8--ebsQPGktMbovvP= zS2*)JF@$Drgmd!=zuYO&#(;2~RN9BY4_djwR9B(w63gw4*(OZK-#6JCUxD)`_%imz z;WAsYbbGaP>>KyrikCPq<~;no`f^1x*6OhvN3eHxoAw|$Y?h9Cc4{@w(s(0OCDFLc z`~Gp9n$zqHy_?#-~oJ@NEInN1eG5&&OT+Q(Vh2g@XL8<*%?P)tIs>XRSyX^859f`1^$|8C* z+S2dHv^$Nja>x)c&5hc#z0g5rx~`A`Qxlg0V5C@a13WdMt=l~4S_?5L*LIXEHo_4@N z5dh86;J7B*n)MW?L3CQ0`MV&+eZejdgYbceKKhr$)~kyu7a!z__Z=t4lqGFoFAZH` z%yg{n1F*3kq3p=8U?}m6{4J3{0@hy5pMYjjE^qh2!tjaLaU9BY+s-TL)6E_agkGZd2L0km z;hhh?*-DMeyO*rUI%VEU!%SHMeKh^UP0?PhN}Rl#F)z)a8x>HU6g5HR zWr*93S^Jnej0IZvlIh$v*S4oHl>6BGm!ol_b%GBKIjH78_rRE3Cyr+jMqch*#|lY^ zC8H--_q?jYmpn($PPiF3E(SJAmJESo3T`8n*wr5JU=?#|oe(|>onA=gAQEIuZGIxp z)fxRDY54=@;@I}$ZhK|dlgOJ_u5Me@Y^Qa`r=u#)j?{`o(ksR=45Y-ZweQCC%~)oZhwq-@+)03f|JB z>SmLxqQ~6Uy%0uqkkONNzQ8_dk6kQuEaC0k3PHD~(C+B@^Q z;LTOGV7-c*2@6Y&#;4LO&d^z0yu4Yj?KYE`c;Bab3>^9ZRvMbq_6Rr|HY?iaw4Ba2>_9FEVdlKs|O^6U}J+0~TMA^F43HZwAy{^Ke5ppcF zve!CbThDKXUx5a7rEO$M@0;fL`lRF1@D&5$N!#maRBLrMx}Vj?xXCZYiJ+e*XH=!F zbpsuXYAvUrg3I+dFoSTfQo>@`BRuSS$*~dWceh+e?nx_4uh5wf4<#Kr=4vLH8~tVg z=Ge+!u-I!byOM1tWMR1Lu~cI`151>&GSIQJc*$Q^C}H)?|mkEV_608h(q^+Ckleb2lsSBeRrSF|)F ze6$vihZ=-wEi6T%1dFeB@0;ybeGo;|irHY3$fOkj;EO?npMB8(g4Jy%XgB^lbn98t zTMUWeW!ip|d3D6i`h3Q1;tHA9BloYMc1joOfF=y z?%da(Y=3E-K^Te+&KiOVyxVHlT2>7~={1zzN{TJZ4s+s}~=WLFVkWBE&7fRT%8(s>d>$85D1iQ8A9oC~kl2 zyOeL*8Vs)7T(kkCvji%M-%B7&xWk0m)k&&Ov0FcY-fX)Wh$I$*~$nH`V#gUaTF#f}Q z;{6Sc+(eDrZKhHIUyBR9iVY`y-vQ(zZ)NsGBZ+6eUR4P+{$czUV+hOey4)AE(oxe` zjA~{dSNioSE zV4Bu|djbq*bwtuFdJo|h_4jLP#1;4NHu!t41#NDhYi&p!mOVe4w>awl?Ye_p0vg#6 ziG!DnN1;*_Cg7JSz0=o!V0LSC?=-6*6@ed0AWLjf50p{N^`ksalEyodvtTxbQn$ zKM2PmHaz&;VxLtEZps1{rg~w=*>_I$Qqj1{A>pSJBV6w;Da4z#_aV^dls{@y2OviX zl5=H^1$p96op%~D`{v>G`l*;>oy;Vicd#u;W?P%HbLaJkkhz{qoJ&XpaLTviXRP=D;^`PyWno0lS8AJ)5cJ0c=| za0#uq$t}R&4&ufIbJq^T6L|D^{F*N#k@QDVfz3nN-~LVZ4dS8{_Oq!re6~3ZW$cO# zYjQ1@4;akpm>av+2lZ#3GCiqW&|p5XD)*h+aEG0n=vlMNDjN#GCXC}vh6TPYsJsRy zjo}YYn6q!7>P-L$jBCw;VYlG2PLr>Eh+}bF8TQ&B?)b88__2{d-jDI_Kye-^-ZiBF z*OdRuHEA5WrkxWLv_btYtuKZhS0yY#;GE&8fN{J{AD7mXZdDJDI4jYJv`E@5six!hIm^_jz^DXy01e=-U>f<$0B`nPLDuJO*Q}@K+o9FiK2Rw%1_e5o0 zFgktZ>P1U0)RQ<^Usxco$6LWJVpD*^{3=rL^p+JJ#)brkv7y7bjEYeVD{8yQsA@BB z6~xu2_uNB`=JInggpfQurj+R2m`ZFKW(%K8hn~^Q9ms4o-C%`gzp^*}R1+m(Zhi0a z^^zX{T&`h|4yQIUrY^dDrq(%qE`EJqCpNEtlabk`I1jh( z^!TJ;&}w97GOsDS>p|#sM+>p?ZA(jnQwT%Yh&G-UHVA5UUMQB^vQK)y)rLiq_cczIW&|w__U9*xTSr}2 z6AE_0WlWE>jL_YsdQKHff)uub%Fk0bU(CMO@%p|Edgh>@aC~xR`&=e4LqwD`N7`g4mmzR(}g zNUV#HKDK8Y@z7(YKSslWNPLMCtM0pZ(zKXm#3U3XYn-y0}P&ouEtKK<12 z6J*BPP=d4c%!qq3W%648ap?^am*_KFu_+c(ufVq#$yo+GN!(o?%4zt?yv+(Gr zs02q49OV*i3Ii=(+qT7)f8T%aEH)iZxk>T0j`Ua#Hn_+WKwTp=a3>{bTmM#hhH{nZ zKoW0QzG{H}3HK|pG#6}@LB30Loz}wdnb%$jDefJyidx#4LRiS<=;;@EpC2wXe<^nM z5bT=FW2dVRPWfAVE!@R|V9tpkbg^$Uo`DKHuXOczdcB9jKmFK?p*s&gF1=kvqOW>h zu!;F%r9%#9t60BNr>`!imYHByLVV$rwSe`<>_>x4AJLdBoSpEzj46#=u{&24gPZBA zb3E+Zi!3NoO$o=<@f~Qzc<2U+@2Y2|cT^B>urFiPRx_w`cS|sQS_E((F2XhdFUJ{j zqN_vb{IwE;q2`I1CD)g`6RLEyIQg0FFE;ZdVoYX$*7-~lT5yN4NK z(W)2jW#pR06K`naEdmD>#adQoUvx+*(q{ED@7cfrUmAi%G1tHeB1_xT(&fqG#*01f zR(Wquxg(vm>hSxC0mP6%Yv=$)m1MpdQ zBztM5O&nm<8qX&!15daL>#M|utv?vb*V7s^tXVbEu?FJX zGq|+)Diq!zpLrzl`HQ0_^VZlI*5TEA{b)tg)&d5Zsk1H3>SQTfiTe+1^O3!2Dr9^B zu{Ob?J-lv|c#gwyNOa~5AF?r6(_cPxN{~Vpyh)MTCCYK?I7_+8CP=Z56<1)aU zLgQ8h_^B)eyAo$V&(LC_>I!^foeDhu-Q;5Y7w?Nj4i=BUU|bp!rXQCHZ7g;ok^Uf# zsMWLK#Wyhobz>?ugvvYwR*YTv5onzadh11RZu_0hBog*lueRu&tS2}qrmuc2W}=;w zNHeiJzD;sMzxpF};lg8fMwUxET4`t-029!8A)EvSZ83&VCGruvnhB3zSau}`?U&qq z>&afTS7abOYPZDPr;p15l}ub&O|qOIPsoJaJ>VLzI_|K;wUlP|Hr`H4l2kHQtBW3h2tu_gRt!gBEB5<1}oYqsS3E*+7q@-0>#BfVo?@p;_DtgnWr zvwdvu3ivXPJY?YMd^zJ98J4+w+Cqv3-m~y@vUK8U;aHQKhJW|-Kr&``Yc5T($l>DA z@um|9*u}1=HlpA_{}v-$qK&NPl^VMU~F?c;`1QO<1~8XL92FAvlkJ5{nVGS^tO z?mqa4d)eGB&4hC8#{es79C>=C+F6duW`^_JEbioYyjPur+K3*INgvAsb%;kJk0!yn zE@NmuH`O(^zCZMgKA8Qq1bS*}b$GRU)@8_nxyydCMF6%W*f2z6$!Ir7S2Cf(hPcYp zorybY1Ol~V9GnI3-NPenZcUIF9vuHw^Y3ClG6r+RaYC9@Y#Ll{REUv*@Yp)OdM zWV2@VY~-7}4Q-+|p^c|>hEkj&Zv{>93573L<=mPuVa^ub@xur-4)4l*d6W!_WAyd| z16Y)!T+%rDy3s3A{P9j%f)4Cfi8{2StF4JU)Y6q$^KoNq=W&yF7dop55v3f_7upX4 zE}!1eIU6gK%l^@zkeQ~YjOe%aN$Ey9`HNmDsLbYdl9SRYs)EX-DP5P?gfJ$xQ%roe z5|9>>$JOBr+J&{+DcV&pEceHs9OY1Z^ z*_kC*$7NE}$ry-P&!wR)FY=7$S?3B}g>7wRel9=>nns_aSaxGhU--NM>-ng0yR3#i z2tn#h^TnOH-B_so9yR>jHxJSq8mS=nzJIVEH{qW1%DA}oZTr<^N~g^LYPWmOYWid@ z^}uFAbRpe>$ND9X{NfZ8%0fyFN((j~GI)v~p8GD~%OPwKCFAP-Bq?t4+7}hcanTD&$gM1x*&X{ZEfBz+;YqhB6L^Xs5Bepq+x8! z$YLpV&=F+MTK#-H=rlnlOX!gLP4hm!F}XzlzXW%=d@i#2S!{{@e&T zVDt=E6f37ghswn#*~p>tXlDWnxwsc*U~plWux1vG5>VBBZ+a>KSH34V%*?W?%S5cPxG8 zhf;o?l$15VTXKMQaBh_xqa&krUBCtPKySQYtOpwjW}sItG&?$fFyP`?{sGZMx{ejv zn(JU~gO2Qa+(20fHGcD4JPpk=G_WhYtRUQ8`}G)>NuL0^gR@!nD;>?8UT-DjX4G0o04N{oc zFgB%_P%&dDphqOL>|Fy$ihEn9c;uT(yPYzf`e3m4_-H~DfSH-E>AS<4A2bZ_QqXOO zLgnv7^Qz70m0OgXX^5e77ouVatxfU0I^~hKo!sg!+E#tw5~;b^5{az?aKU81 z;U{;VG8;+M4h?Nw;(A~K#@+b&Wsll?Lre@j^?m~{t;Kgd5F0nQWw|B_$VAsE;TvCL zk8h=cYI@P`5{j_OCq?Zb7}iHKKVvK48G_mhvrb6POvtx@Be=c_kGv6K`*+l|8vHd^cnqP7U^N|1ajn1cMDZ z6Ul&%zJ8(-5qaoaMshs75x8c}XY|RI zmTY=59S!0OdY3w1Fbc#T_>-DSQj-+KgoC54kp#aM$He(-uO3LzlGZypTw$6D2U-+cvH|R1Q>gADH-`B^n|9{WSU*UjSa=e z6>JUjxewg)W0a>I3b8l{P^<0faRWRl70~n2JP#_fxjd{Ir?*Ys-rRkeP4pl?=( zUcKy_j)?N+=A7LWhd&@m?Akr_+;;5+F|}i^BGNud!8{`N{bJnR6hW5>ygMKI;z9P} zJbdGAqfs9yY#5F-_YC1nH?8_O$(BQ*FWcr3t_#CssaK#aH0q9`fN9};_ZVJTyVvm z*oO11c}`?hDsw88?cCy%7d_Hd6ajPfHal!pS=AX39F(kLh~d#e^U;;lBe@&azC5H8 zVlGStDA}l|z!L^W&lsH#aWsN9kxcWHy}@As<8Bub% z_7g(gJVFmhdE^u8EO1oy7Qt`Gm>*kn^|4g6S)`Dn7AB1weY&NHL6{VOG8cX{$#f%VoMLMW*=9DYyq@-qtHzdkEs+_BH?Kvwb z{&i*h+_$oO%L*X@x@DI%LB%xmaf-}u+78kl8}d>+LzsOt={(bmJ9P1INln|`#N6~( zTXbEMN+y6(^3y=w-fQTpG9!)xggm;o=sdJD?wW=Qx&Y8;4?Oa9LSO207SOl&(vL2M zfF_(=FXov!KLm7gU8&Y~61n@YYgmz-&yeVe$rg)h7jZj2Yb}jj9 z<~EVh%#qaw!Emy22kVZ>;;=~jsqIT~ip=h>nZ{@o^F)iw91fnW=57_QVNwQ6KV9^$6N_gMqq0sx(xS$LO--D)jrnE1r zJ<|M5rGuQ`ppG&vCx(QBbN!P!dk$?3C&vZ15?BY04VpJXRRf8 z>Kk$C9>~n*O>{5}>GLBwKw*@ehSyxALLX+yIJ+}jqIj_*jB9-#@K^rtBly%{$4r7ldZz~Ql8Asv}yn% zvifd;$?mFe0xT8~C^B;-i4U{eILrR(s20wPseQcG-BoA(7>z)?%F^ji2ba_^I)##G zkFbns`y4|g^x2=w;`Jl`OaehnfU?S-Z+T{U(< zz^a|P$~CQ3jov#Aix>iM8r-C+*%0mP5lgfL1v!S4jfad{dpdm~ndBXd2EsH-yVGvo zgCcAtfX3&{)sDhuj}#_rZ`84zJ+bnfoe_J_?=_Y9f$hizo1WKwUSaPrmxCg*RIiGR z!5(rKgiu#b=Xfs+?5)Yu%c3u%VWv#u2gs$@%)AO2@;@_e+SUF-TfF%2 pMKl+JwU(J`r>zF4unK7h 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∓geM|N? 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 g==gtBP#<>aJN!vOV diff --git a/legacy/doc/algorithm3.jpg b/legacy/doc/algorithm3.jpg deleted file mode 100644 index b5cbb8459039305fb16eaaee99a697361b4b773a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246402 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 G*?hcH$T)20j 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 H$K1aGj8$ED diff --git a/legacy/doc/assumerole1.png b/legacy/doc/assumerole1.png deleted file mode 100644 index 3fadd4022d4bd51b3fe8fdc6a6f79c9d01229aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17832 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 OK;Y@>=d#Wzp$P!-en>L_ diff --git a/legacy/doc/assumerole1111.png b/legacy/doc/assumerole1111.png deleted file mode 100644 index d1d2cd31f61c5d0b1f21609542b6c3d9d2618e1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17537 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 diff --git a/legacy/doc/assumerole11111.png b/legacy/doc/assumerole11111.png deleted file mode 100644 index 656a0b8df5c797db29b2c231269e7b09df65cf7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19540 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 diff --git a/legacy/doc/calculations.jpg b/legacy/doc/calculations.jpg deleted file mode 100644 index f187bb167ddf9c384b91cdfc59bd65cbf117b780..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197131 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 z z9O1L@yj($fZ!9lxr@BskRL?2x@@zs#o(l1CopCAOf$NWY6JjCA6*hPv5Qym-;Z9wye6s znsoF0=X+kqK?WM?@RtMA)OZ{byAgpfI)T92k=eB>+h=W1Fd?e--*haAtWY>C8b->d zJY6yz0o@xSVg^x(KUTO`uXP1Tdib~&j!m-E*~Xa2Y09;2{7_o;i3}A498ZyWmmyug zLGghNTX7F7d1BfKL1C`PYi5nLKkT#nJ;U+P_?J-kxM4 z;;dJ8YQFF(4A9U%;Q9re3)C5N@;U6hz7mJXJF0Hko4iR?vS8#rUVC4q)l!q+Nm@gUJUGx)J~pPB(*i zV%mJANf^Z-JKAOPpu zG5KGFkNLD`|LiU?t^?i<>7OJYz<|#ITd8F}INAZG{rl!fBlO&-PgC9|bbs=PrmM&SpoWjvi4|g4e!z5gYZqSdZVISh_E0O zhTG(M_JP$b$U86ET%wFFB%UWF2U2StqpG0MQp?jsSgA#$G+zCbA*3<&nFuDjS}|Cm z|2}5t*-6~+AoT3yvvNORb<`zj|NL@yJ9Rv%P_QQvFG#CHXqx(sMrMu&0{r zM*YLvu#HBtTpRct%vIzf^%m)D#mU=p4>$Ak;Mdu5I59UICc)pX}hEZN4BFZ7E@S3)CfMTO8ShnBbe`izw5Tp`<(@3oW&CFhHNS->V+n%WU8k zVdNR|k#?7^OoMzvV>s`8bqUH){#vo~f+H6S+aDgLX#?s)EUBp3-MT5bJ*wWvFUK?e z!6bflf6eXdc>Mj{F@mhBiozct6yWY@`a0QpIlvg(@TV3vO*?a8YXmPhQCQN;r`5Pp znNCZQIT*)fCwgg@7@oY>b9d0QC9|O;&^eSq{UH>Lcg)nIXf?R3E$h2E(m>Yk`k<0{ zs%o#I2}26Hejo+osR)RxsivfN4w+Uba4h|}N2eI&wTE;`85lI7vhqf-~M`H?2fHHhBOryD5~d@OO3V@YcNb7u-Z zsP!7RQg(g(aS*+m@yRz`sa32bMT@LrM;hLGPh})4LkJ?ryyUX-a)*Knfwau;EnZ25 z*6E$u)9dSpF0#k;GZrR0kHW!ca*qQLGSkw##{)55UXEs+_d!K!JD%FKDyz}?%vVN* zROypse~}Mi*ME@9K9WWePg5>y2ENZb@dtrd@8HSU5oallz^`%rW^x;tSP-Sgoz)8lKmLN1fhg$BT9U-OQ7l(cnE4W6yH-qpJ|8fvVanc9{oaom0Nl-P0FGT z=*jdJP!$GZDrmeT=)NM6tqGeJ4xcnq!1}3Oga1sc_&>NV^8aBx5&e?VJ1>AQwbSY- zPGJf>u5*yb{v`g{ea*H1(2)RJYg&M_)pRzE%%7|tsn@&BDZSmBKEHx@iwiybP1|Rt z1AlDHg-hk>3mErv(s~uKd8y5WD9PCs{*-4tRENA3iIs-lZEw@%Pl6BZ1ZzJm@7O38 z^SiJ=SY)#pZs|UMyR$awrclA(Zb}fW4g4N^i84o8dqi=W?aHh(Q?d-Pl}c-!OCXvR zv;V+lxtn!GYp&Ti3NtQ5tO~#I8h$(oE;;Uf zhoCX-k$^q7Bf^0!5*uoP{4}`Ntzm9+v?jU~%!tgK^;-M2$cNjJEGWX@2ra zGqJt@IO#X?S#FG=k1rR1EckoCH@nKLNP;RNVu~4fK9tFIcop1o=Ded}s$F{PHiIek zVYi(8OJv{^tqbpXcqoSer63u6VQrKfA~2tn^&6i`-jRwItbYM0QWB}#(Q>^T z(us4J*2`$EKyC^>5xpMHXLU05eb$EM&ib|HiIo}`#yp2)qweQSN1p#WVd1|ZFzEgJ zGq3)yauAtOAL3L-M*vkP^MC#5ZDiyKSRNscSXUfi5ne8!p&Vsd@V{$q4!9; zVbY|4g9!zG_!WzOVs%xPE|u@R(^%D@&t1`64)s;{(}Xti6YV_i;5i7P;{^#ll}_NLv~=2p?uefS%m-lD`6>RAIE z+`raF2T@u<0zgp3n>g(&m}t@d=J0fDAO=pl? z?lECqr66v#?q;nFDSY@$}<$VlXf6Znvg^CB(HNxcu_Cp-L!=ZPa%cq!T9RchPZ z=8cUMe555ECq@^Mq5sb~qJM$(@Q+l7|EdG{AO8-?Pi}841Aw?|(49v77aA+M`cBm9 zzHGT-ZtP|w3@~5R)V=pVeN$2&A#2>x9in#O)J`(hnQYzMyK9~pCZy?58VYMN%9F&@ zN+fRCi?aDSO$27gGiRS^wys;YqkRApfuQelumk8<_5I6yJs2nj+YieLEBHfl(1PwDt1L%U{13tNXz^$PYmI z%1Vb7A&;ca9zR~;i$dWlr>Znv5AH#q2vdF>TwDeNqpRr+#=_9r(WW|`J4ma3Z3CWP zJ}=Z*ytLzvoaYM7?dSk5E#U8_@o}`|AG%QZXBT~Jko8wP4zX3h;7cfv#v9pYI-PDx zQTdLqSPn3IW{d&1j89G>I?U)^pE3wN0`KRO89T*DiQ(ctbIM?7!V}!)`hW$9#<0q9 z5NXr3}e4*L(r10<FzCak_v>kpzy!C>`W#hT{v%_~Re_1}Dqhmc~<(~WI29gh|)kM?oDD~g`D-;!bnJY3X%jO0%2<6?S_=tLY>`Uht4V6 z?lax3sl#PW-@(d)nYQ9^<;SUB<);`K)v|1E7Ynch^W8Vm!mS-09}DXovqO)8 z$XA@J-Z?0u9bQ`79`*Az|X zYOc~cz7Ghtidc_Nr-~muyfLVh!)2mNRPjj@Y?e$2>$9ac!9p+6H4lUdQf*0FEzUKA zvoWvvTHsHC9HQ8;T)AUu@3XrMk#UF`d6&GG{dMf{!H1cUBkEst8mlfB$3aIlVEQ-Y zo*VP~-_hm&qbvKLf7k2XS`a9i#%Wg10gCTh%g0r_brG29fJCPCP>MF&h!vAg(|q{Z z2X2ggBchc4IR_98ShK$mlg37!OvLM>PQ*FdwCd1xA{4g0-5ib_cO(Mn{uECN%EKT^ z5n)1a&Glc;cFe+BK+6Xb+s}-sQZUq{h}vkg59>W_TDD>>0AfF-9!UqFIY0dU3qlQ3 z3N;=GBAYjEycQP;el5FYIy4KW(A7mO;AXC>*$?V@=)DVszZX!fD93yV0Huxdq(_x` ztI9=#%YUa>Bye1xOIqM#@MXHx$5`8MW@Y_g`L-Nu_zebufPaf(>+i}h>rWKqTwt>v z1EqYh(NS_ZA2aOT`dv;aYq*8C>FAk{r}w5)^bCrR`$_`$OUb83XCA#|u>K64-fy8u z%yetD@Ik&guJP##ab<{B4*Iwp8)Iq`2Ij}R=YuqE;XQa11(<}Kp7K6?KbzWQC--yJ zPOcf12uuk%imJ$xcpB2JP%lDaXv@2)OEp$Fv(Uc7N1-KNlGCZLJv#TnqKufSx@D%G z?MYGCc@K_KyTZJ{kbu0#5D6)4229egyQpb!5)Ya@$I9(+C#ua9N+?W(_!!{F9>Oh_ zLhJxhF^=GN!1w#GCU|OEx4lno0T8KkQ9@>A#sjS2uen?BcGZIcb*Ck;KNUKdTR0`} zg;ABy#c!sEVC`1yDXtq!gnXs2q)EmfczmYJqxb_=u^f;s>&+9_&$T0sKNc5i< z-?gjDT+F`vHf;I82^R;y6$ra;IMd9Z#q?nnpplIN-I%vwI=9&~1AQMV=(VWN6ebmG zy^!!~$u!NIy29S3x0;1rK2pZQMrg{^v*aK$U-K5{RAHWrm(MrFoOB>ze9$fNKEt#T z&(O!$X$u=aLYIk2Q|b@-Z(nIEYBU!Ll_2vb>U{{iunIt5r$mgI!gs-?D_*`VAT!RP zH*k=xCFnO?xv%=6#M29JIjx6-({`tiXyu8|bL-{id^VV7INsI@=LOAbrBx4?`Iiu^ zgmlk&O9w{usC(@+)T^-A*#3$$ziM;vF(>WNb1LchCRK4*+XON*GHf?(TP=7F0{ZHV zG4a~3@j9F1#OvjEi9a=mJLu~v-?#c=2HzbCdNVYuQH({WIvOBM0G?;HwZZQjkF8Uw z*D0f<-r1qi5!&hDi3jQC34)QffLRcTu99lud+@sWa{aMwoX>*&Z7jcfR>BKUJ(19t z6fmj%@jF9uRpoQLz2|cT+r->gS`i zyJNYpB`QC;EM2%dDwLfaNYyy5MclWr5#|G+SX4-kEd>Ck^{;9=9HmDGR;savx#80ZZVs|B74`_Me3><<^)B0Oq1;cIpkkSscG7Q{hTlon`(D z+ia7I065BymgqLrJ>%)9(mLHP!aGIzfm6sIL%|KhGidZ4K4S2Npm~R0&208o@rJ+X z%m>$1GX-C(m{!H~^bGS}e)56$dS3il9*YZf#f)^P-dZiw(>FU_AmQGrenW{cF7F5P zW-uPrfmom$Pwr34zm)w(J>%2=e~N8+5XCE+R&_<)`D?FUtnzBeRoN&?*gj2q&3}nU zVl1XF_l+(zWgps4RRz#2*7jJ6kM9kT=~+Gj36V`~itd{8qsa-DAP$lG8Ov9c*4gO@ zT=hwg>U9)B?K*Izt)><2 z*bUtcIwhZgQughGD=KJz@H%n71wLC1moyjLHuTEC5ORwqJJXYKcC)fl zUcV8F{@W!b(np!&hetDw$1~Vf*y^9i`3Bc5{?e|Th>~j?=ewH%Ny{BK;19Q-3||@Cx9~2AH!-L} zXWJ5zyPC*`j4eVjk*m3N(OZv)L_T}vd`CHCrr*SGp5T{WIaDmz+bSm4VAdseTigGk ztJH1d&1@G{jA~EA%QUOuWvOh{4Zh13^-*n{4vZB+>+!}p<}6xDznmj4S*x^m7_(;+ z02NJ)Czy@MG9X6DKJM+*5g+yK)4Xr)_EJSN$evBL=nIRX6#6h^Y#|+oG8*>)|=M2E$=oXmw6_TT@)&@=odC7ly`wFS^v==(y z`V?wTks(EWg%0+zwfT=_UBdkNmV}JPM9d2=-gpjx-&L1qIWd2mN0ZA zw+_X~G$q`+;7obqm71!m;SCt7bbd&prnb`hY@qF8V{*_J^wp0go#)SM)jdj+?*J5p zIh#a`j0Zw`TyDPv%=mkLlUtFM659_o+k_O1z;FxswfxN5mG%xi%~{N8vfrDv9k_Fn9_Cu+zn$HPZL(~`!c=r?-q%UXDmU541 zv~VW%)1s}}!GK9+q?ByQe7xE-8q=&c;(+CrncFN8y;uc zFz(yzH2cWAU}f8xVf>)MGv^r(!$44=H`YH#vUFSX8;<){ijQVUg#NA3WFXl*wtX51 zsST@5+dr{F?$0{z>)e{qb%Cp5S?u61Da9cFicp>bwidgyz1~C-TUEHjk95}B%8uf$ z*D?+Z-z2Ti)l;vY+#~z{2%Jykr)(RKYCZJ}(tg~R3)DaDeYT!>h%{B(!4(#Ix^js8 zNoL}Y?v=)W*Qz>H<>j!w-8{R08ZyPVgfl*($$Sl#qJ;3b%+f)!nL(e+C97`sYLS3^ znDVsagTsqjudX~3{2~ea)`(HU7>oI!^M>>-^QRiG$O7MKk8kA0?qY>c>?u&v7>Yo~ zMsMsjHV#k@ssq*W4%zUqaqW>ma4mxm@NXRVb1^~Scqc{jc_spIgmQX()SYP>8yDli z&F#&I?4l?Gr-5GseiM-g<+x0%qx6TQfXLJaS;sZOku%%TDg@*scI|bPTCq*5GJ3FA8gF}OQMv21%^;T}$k@Fv>fw#yVknwCZJ^(#4id$L& zr4HzH-t-uG>7j)*z5XuA2FtJoAVA72DH1q0M?dpDpMfi>OQrgMr$I5*c6a33na&$?LI(hE?g$Fmj1}1~{n*W=?+J88?xaqp{%EjMaASuRz zS^OH~J$2)d=NF&ki!Mx4=@2?#-(CWeo4(Mgq6lR(~o(r7NBH{~=DaaB##qw<%rKeH5I zp60HxPd;nCHkf~1S-GJ6^EQJp*Bw6K9{3+n=>Oy2WlU|lycmACi9uXDLTRYl#;gh5 z5Yb#AW-d`C8|H;8IRG1L6;XcAErxC(IU$oLO~-VH4YGYIit)NkTIS;I1f`-tzr_Y!NR^q*=d-&mR{I=bEvbmN1li{2jhvaLLv6W!U+- zup7{&G?G~Yg0V}H#;qq4qs93SH{UXBOiOXO*@#F|i4ro@T}c)x%6|~G2%I)|gw5V! zu24Wkr||46q==P<_nOi%W4U#;pF>tWue_3swbD|)#Sn744A*4XiDZf_N1@vkqwIjy ziqq``Ma9jbLMn8@$y&rlr-IWrv>_dZ%LKy10rlsNKvic5J;)9Dy`;6a;=~alB;oa`^l@| zOqZitMRL#7^AA1}-e_^Izn=IA_&oIeHzg;ibZ1R_e ztN6#Z(nWpAyVnTJTTx=nO}9y_3VxRgkoIJS!tbiu0p_lmkFhSROGdm_;@~4U29u8+ zx9&T+(}#iCf;}lY)NLV;P69S+VKv{~M-tccV>O`oY5wi4G>UPDS$Tk9vh(D*mIuw zHcF%G;$KAS)7JCCO0}a=7l44a0p&dH!asBmD9l9WrVHd9l_+a0X`_xtU(~e*`$W3w zDvz!6jKn9AE7$LgZE8u7TMb27#LpPx77H5T5Eb zgS_del{bnpzH!a;ZPuI~8LlTV-geX|Nadoz%wwZzURUkkm%g!?$S!u520K$Vf%29MySaq7~%dxdP5@(k9BYv^VfZ#hfUGo-4^; z`&iJ98mkU_@*?(bs;^(ynj-i~cu8WBpC@SVAHxy~W1Nl_(Z{ zv)e`C`K`28P=wx^O>vOQt0W%7>fL*9UNpzG9-jmJrYsLhol$c0BYP-myetUh9{HCL z#>gyqb5V1y(DbOD8*yiYo(rF%z1)ex>v*|`g-zO!uOo2tAN$%Og39Ytu6AAG$ zkz0kenca;sJbZPUqqiR!XnkYXBNmYL;GITwlsFQ&eZt%c?14LM2|W+bw60-C3q~~W ze==X=(CS?BRuk0z!}IAihl9=fa+u#h1WktQ_Mt|Rz7?X@T!7clTb~%T3w&+t2jNVT zUuf7FbrAB+yu?lvZ)YE$uK5%EoFYpa>BOHS`(@Vv77~|%GO6axrIP%q;B&{`6Iml(dT$bOmj3wZlI}^v@zs(e z|9TSR#HKOXt5vK<1;ITQe3vn*wSydv;27Dg?v)3Q%2&_Kd7J+XK2(*}*6TaE&~Slb6gdJM!kNmq@Y7{lh}xtergMXN(NV=phCAI5pJQ{7jcmqQxx z&dsl)8~Mf5`@jV{^d!ZNf9S|(sugi8Ei~c5nm*@$6){h=wSv&5_Xw`xS3mz5lIvR3 zv1W@j|8)6jEFl;|z`jLiYf=12ukCZbg|^6)*smRjMpjRqLywdJ>kn*wrSj)*JNMcT zKqaaAexffu2D(4!>R*2y_Ce6o+`DndR2`@jn?eT>ZX1}qj*Kbt%18#))PVg4biHtj z?RZr(;M8U*Lp8~qLzd3;=4*`~*H#{`^7Ie#8%Yi()8AmaA~n8>YW)6gs;c{-vdp%iR{7L6d{t+s^XQAO@Q^u51+6cMLj1o zsBw0dnt7KD_yEfVXe9TX_&G}myIRM)m|Fv8HP&O$(0-i%c>j#m-c~0|(dwbCHo_j0 zFcGvmNgKpVlA|IJ7uPb7Zx!V?g7xGM)M~x7Y6q*dXQm&i_;0?kp4faWQHhHg_%!ml zH7x%4O`wD;)ptOCeu4m&}1LN?1%kr9yrlazR7UTj2;wN03o&_u)TuAzN6Ma@pG2Q4@YslrOdZ<$lBg~A zge*L+zO#zp8H4#LUVO4LB%gjTj%G({bwl!}yU}Jhx|~#+K01_*H0T{h4QjZ()dG=I z+H_PXuJh$0-9#?Z&OU6j#<#jQc1?d=PU6dE*)aYV>}3799zC~$voE{)Vqz8G|Na;I z#;g@eh-dn(Arpz}n@MepFI=^LCGfl&TZ>J`-4Soqdv%bM-(w(fXNxEC!LXJlX?6}B zE>la&eg^@pxwxAT4*>srrS=Y|z&Ng7`OhEk6XNb9R5vW|SAwkSEyF7yUDPy>(55^o3_aIacJ43xJcD<GWM=NzGRBpQqp9LGU9HsLFOliS_Kn-l^Dh2#3C^ zt)pHJYpL@21y0E5`Ty~@n_D*^dU6Nwu9>l$5|NkirwKi3Px34cGlF6kh_~eDqE)I) zuMouJZU64^oSB@6g(K(D;d}9(^S?0{YnsTNv6~Mkt5NK#bwO_0jElWMWFn-lE<^3| zqE*Q!;Id^#8P%Une9=G>3tQ049enAwQxiw|>^r9T>^UqoN*XuRnvm=uT1;{B`|)I>PxY>VW~)|eND?VDWfUfTFIt#@LxbNnftbI;!WEL-`U7F!CCUv z@O0a;d)eW$P93#LwHn_lKc9ssz3ny8ec=`PCVgAW|F}G%&GjuCzcA* zr}MVkZuN?Cx(YN|s7F+z9L2Wf7eDaRo!*ZgTY^z<1PfP6gU_u7=rDbL9Z$%lqIh|z zQ4}cm~||6?Lh1Z!5v6ca-t)8Hg^a>4+}FR8Be1&&H7PiRj#iM~ug^OGOmt`NVLSHL){W5w!5n zyTMnA9n>dzndDDX{i*p?K*JrYg3~Ce_~+~S5t{IcISJdg&eFZ7TW#y1VTpAct!|{m z*X9&W`|WH!eQvTve|637Hve+`%=zbMR!08^Dg$o^e3x(-j*)Wbrg(Mm$p(5XXn8Ux z1O?iB%3%H&6>F(glEbPEtpb{2FJPhn&`lM!A*(uy{zaSfO4v9FD5gN$`1p5brn+?g zs!+|ZPp`fyF%-JDV`TCpS(+O*vm~y=f*66*cZ!NozRYED5IMrjbjI>1k^Mqbwi@c` z%8_THNDa%-Yl}}f19|P+XIT+K!FLk7$;;t;NN&Rs&jM%0xsyVJ5)3fkzNZOM{5j53 zSPW|ieL*&hV6$b~dvlw0ut~b4T zZ)D+liQo4J0_lNH)|Z@Zvi*fimFk7(gpe0#!nVOmB=mt?z-y0&ti7GtwT4gs(5>&Y z87#clZp-ptcw6yJ(>eaJYK!>WGZk~XXDIfBqKJ(XvAK06*CN}k%X|>2G}}u}Ri?7Z zJAJ^9(Lz;)Tw97`#D9dW|9d|f_!=eZ-l(oyD3?>P5y_H6y%lBWR!>%oyO2if%g}2u zecqzl&GNNozv08JKje4UyQGgR!_Hh%Ib+vzFkoKw{?W*C!rJ(nYMMaqQ-FjS-?P&D zvFBIV`CAf6*3czg1_SI_+GRabg2f_5rrpcihY%D~Zj#+PXuQDn z9!>O0R7JAE`R3cbvp|L#`jxeq@w5YFwH&@2EyOF^rMPXq&)s?npbIr7Zt7~B4q_8917vs8-WzHjsAb=SAbtf+$&BDga& zLYHalWhw0nH19z+?Y0893c9YreKY5J<;+9*yidPj0hzXg2#quoYE}a5r2{~%c)Ogm2uOWTJAk%>^;;&f=q|v==s1 z?ctxYE-HSvc)FJ{|KLaQd0zQ!; z_3L)_f_CHtdBdRfp4lrre55J+{1h|Ew;v_q1)}@UohdM;URtRcT0iMwXCc4wuUzBB z{kUdeGBw-qFnBWrr$dWcO8@1>apE?HU|T%|78zwVR54aOly<#-Wa9p)3g{~0w@!s7 zE?L!4XFtm}K*fve{#8S!%M)WdN)+&X2MiwQ}MzCka+5|fz^T~eA&G-o3y@|&IJS5xAk#k;6ncWih5ZnaKiBCWz_j1hH zkI+o9YMYHo-#D_tu8lpYSw3%w4?3fEJYpV4eUd+9k3zLKIKFIDTNz3coit&Ki2h-v z`Z{H3=9K)(Yl7agKfJ^0H7TJ^_$WUJN3<*MNsxwuw}HuPOKX4h zRJd^`RfYi~e;_K{?P&It>kZCJXY1t^56VuFeu^AxcC<|5y8||%jd!2^;yYEk5lgb_ zm1uW9XxEmb$y9T(NebtE*XRQ9VX~*4wiq#EwlBCh93^U1TS9`+LZuPb6x~)N4{F0t zjH0h~rQH1|JgVhYmgfkFG+v)KZR*4R!`b@>&H)TIlf$L`IL-DX+7Djd{Stepf5TdL zL~)Wp>0r~7geXlR9e#ml~n_eE7%|KwOj z?}HR6cW9C;8Q|E``JZIb^ia=qK6QjcfRZu8oO08{yFyQ%lI?Coaw{juDe2SYuA%KI zSJwl^X17dq5gFLjBohCoQtk>~mhz5>GHjy>j5om;m%~x8CMKOYXu$X1&cv(B%~ZX1 z)z9wL)V@uZ-T=+}XRn-n^qrVrNpU5&aKsFqDA$D@m@@r|>)i1;lJ2hgG=k~CfiqjS zG`>56Jk?UWfRg!TW6Bgs*Nj|>WUdae!?yypuuHm9^3v!Eb+w_RLr%lMMfuEWeNmS* zhEF}k0$=E?CHk98sjy)B!6r5oW!q$|%#RwvSjt*E?r$UOqaqmJgZu3V6CUb3h_iX^ z4|qKIarZRU&ivL_b#I;^_>VX?uWRlv>i2aw_7D#zrwyaP<9 za(eL*CF=)Vw>2ZSJKw!QI*ZUAQMPd303x`7D_i1zFnJboZuu8oQa|DwpmjhJ-yL^; zcuoTLd_y%~%7q?sHP?(jirX{0xdHQ$1f8A!bd+}Pqe&05)n&oHiqleEHIr7Mfq~4t1OKDNuv)*(TdV!dnqj zHu%}a!&=NlLfP8Z$S`t=mos4kXIX=z-JCM#UZqf~MB;jNL}F)heJaVfIhv zV!(%r_5OJR^xjCuZ{sxfl{d3(UNM5Ajo%@HGViwX$Q?)s!PL++^YN%u@{DWHRI`Nz zyvF|TnCGP#T!;7$Yec@KdotG8<@7s-=`Nuz*utC0{H&&K)ZPdbsItB{`Y`|J={MUf zZB+YQo%^d*u5isCkKb-N>{bT*0o;ucXe(Zbgn!2$-*knT^Gtm0{&tOZ>h@&#M-X#c z+Aw5Rqu$#1(z)|%^e!odC=ub(+R3`fH_|mB8#N%qv1`}k`|ZB3o$}NpGa-$N*&l$; z1lLo5@kS9NG@9DkN{=>aRIR8d-e?;(%N>w<54yZDe00|7mgdea@#bTUDqxOKZ^K{p zN(5Rwc!@#f=b$!%eTArek2Kfd-rI_MQ@78!x;`Zv2Qbh)=A}f!QeWOU`Fr~5B!v1L zAN+`X4>7ExPPT*l5XuTfBCDVUID3b>IxoD0BP_m5r;Yr>S-#2B_WaY8{M$pg<4f(D z9tg_N6VXd#aAXrScZw3%qES#=QRv9p=?%T!E9Cvv)%dr-f~euWoA!H=|FyHmVLPtL z<{L$*RRbA!V&*Hi*DTFcmwk`<%A=4m^IlEi>*8U5+5lmT=S**~IVC4ISbp%^sMlPk z<(R7Rc(3s=iViyS@c532{jdCYU$43OUlEVDGZrv^lAue#0%i?P5eVYiiF19F4f#*k zI*fs#HtX9|j}FvP+u^K38N=ZNhN`cmBv{OIiq+hv7kFHk01tlj6ROMSQM)9f`QTFt z5Y^Hx=+a}+|1Ep)<7auGIP%M{7~=#aZwGDRuY7!Lu%+cwi^Ay z1a)|Ge|FqFT146hlHnkzzzX7bV3uC`8CW(nX=D zxTiL4n5)B@|C7nd2XQ4yIwQITjELe1KpluVKI~vA$FJbUph$MOyQp~@^VzlZwcA2P z^@$rRfD5h|J>6t7d8|<%%0MwRByqgo12e!wSl{?ZxG{b@Q|~N%p7W;Y#@}A0g@4iS zzW+Za{9^E|-D;Y;VCr7BRZYH^O4;2jk8ju}oHL_yi$y!26XdrPPI!qdAfpV((#Y2E zts#(RtsvKeb-VysD!Z|WvTQ-& z%Cm=r;kX+XOc^Gweb;BO;b5t0F_kox3>rEzuYd9bC2M@oB5r)*L_&Qv)DPwd^FpPm zG%pGSpnG=0sLkse&)9q#P&s+u+lM)_#y=WtT3 zq}8l&^y_5lh35i#p4RjvfQxhibKUVoj_mf%7kO@dTu?2C7|NjRw2DKZzxB$6da(S^ zfJ`JC9SrLUDEj$%T1&r}Hl9k_&!?Rk(^8^7fTMpQt9sT1U6BzOVYm+{Ri$LgvLW(W zv6)oqi)E|G1Nn9LO1FLk|M_O-t2rQONrpW@VSGSw+Tmqs!=d6(5_V4G^1$QEo$(*2;? zr`L)Q9&N`L6a*q6QQc`b#ZtWG^LE9re>G)|`K=ouv3MEDK(Qrtc3{M7$5plyhoBmp z+58*E<=|ER;>e(&Ob}8M!lx#s{#(<41__QlQu}Cpd{d949^Rz-1HW#^_k}m>Aor4k z$(NbSK`~{Sw`EEvxUpjcFU?imgaT*x(Cf$iem&IH)ny87$xO4*r4V)B?rn2}?c#N< zE#$L*xUeHSe@u3bAAa=dw)}EQLaZqhoOfX_<7oE2#he&U!j42a1tddRGr^hSJ`87GUiGf?x}T3jO74%r_;(?{zOkDTk*#JQ*vN_&l=q|r?XyQG z=7jGj>OrDdIdVZvZC$pz0x?!7aD3CK;S&gUC0u8;?HgY?*VsRFFA@`MfcIGi%ZJB9 zaA{fJ;AL#DnHMMapE##Hw7hYeCVxRTbYm*;TYR_eu58bvYwm|tMJr>x7x-!#V28Vi z(D$`C-p3BBMH8Wo={q9}*~iGQVpVQoG$mWO#N5OOnuPnCkhCZgwe_5)5bUbM0Lsa< zSdYO-0eBSOZ$zHg3tXw}aY65~;5QY|LtYFVJSF$X2l?f$@@p88$XF8Nep8tJ=fV$g1L$2Jrb*mwjIDU> zA309}^bNx~0gjlvR5;+WjA{W#;gu;dg{|f5vwY9Tf{h_;O9gH@t2ob8;n)LQuzK=6 zZrgFZQHxw1M9e$Tl9zWYqiFNW{6BQjc%{s_@|JBT4-M;*?{JS^+srnDZ8P{D;~1(a z$SsXoYh_Ck6rH41chdIC_7Dcnn76Y;T|NCG37Gj?Lq=hdt|K zS10XUn~As0VJ^fF#IW8nUWjyw1P1wAKXa7e@yqBCaS?L)XH^acgT*>sNWXI!i8 zO{E3&+sqy8QyY>grpqT?VhTks-5Xj`;;mRt_6cdu z=B}eosBU&A5|olq0#*nv)^P)JkP_@wM`rA3R7;mTv_2L$D*##tSOQj3tk}LS>6Wj@Rr{hPA;rcMmfjj_=l>iYsf9 zh%_dOHdQZJh=L^C($dad(ZJ`=cM4`Js=}#c3jNalv}bpM0hkk4n8IFk)59nR9x?Z~bK z*>@?v%o&xBfxE@K>V+{|3q>(y-(3aMtzgl!QCnIUiC$t*nn-oki0>1W9Z$_fX_>(zsikTlgN zm&0D%0|{KZsy7AqIp`v*w}Cm~y85JZF*&n0DQGHvo3bsmVl7QnZDIHc~I*%F^ez6{!TK>ikD}(%Uc8e{K4=T z`NjHOUX*Uo$6!(N~rE`gelu2>dj zrhv&BfhMDl2ZpdZadqc-y^6RsuOe|{u2k^SxWSHnhu zwaXMX>O(yekO{Pa1Q4>WPyM!&PlzdWvUPMc3@vGe1h@}Zr-PljA)+B!KjI_m>s>SM zir3x9(MchO;>?KZZ-ZrhzMmLS0*WXWma(+qA?eW*Qy7FW&o-_6KqkZq>g%fX`Hvzu zPV=brot^>y>9UI0lu(j#(5Nf6RpeJK@-_qwiMmu!5+ zzxGzVlmkEfT~~tZ1&@qL+kmlq6Nryyrm0!`by?HXv(~e)<>MY>aKLaEIY{^YY&Azq zxe(m`(NHy;kX7^8Nq}^-7vn&*U%aV!{E4Dp(R6E2F@Dm)q2y|WR%WD)O&|lp;VQ5F z7V<5YqXsb3(da^C+beOsWorO@6a_}b_*cg++h8*G3GebP0}>R~d)a#m4z{k><1}aK z0Zb7kY7Rx;i5GSYk!?%kYe>yW^2a6xaQBKXE(1sk1Gturl_T%hl*QyR1#ogDdJf|v zou6XwwL1ZBKcz(t(0EQeH`U3~V~7p>B~tw4KXeEX>NR)hRsNlFw@T7hL=jXlJ^H2G z74&G$JG$n&__N*K2d>w+J|#Ap8$UABe0B3J9Xav*KXm!D;n|CdHmN{7lBYuEw617e z;rvONB~5jY@u@ihAa<~Qn_2gPj}Vsfyyp~o`}IH}1ra-n=dXK*xcoy`SI?lJt{g*0 zt(1Q*1L)_Mf>ozn$%p#(Af8{M(nG_bc&VQ{`=el$gZtUcugLWO(8)tr1)#N&tACb?BNT?^i}%e?LzP9B(#-+sSE9HeQjwEmvpu8S3M zy2jT3&iBuh4GhmSbrVq6tab17jlTu%ZMl)|p3f49c>T0%mKqwIJw2_L!){$ph%ESz ziDe9QR6!Ym2J6?6cqLt6wN6uxuIeQzb}h3kr^WHf1z%PETt?L?AL zIwI>%N|95W6SYbC)_nDyxP6u%eE6QfqPMe`jON9*%}K~#dW7<~zSs+WJ_o1wRDalz`*|Y5fd}jGT55T@oRgM+JWRfk@12Alu-PKWYDokj+(m)AfzB5>1hnS4L0}AanJCtcO!BzhoB!15%}L^VX_Zw zexiDf55iu^Wy+i}7!%k7f;+yXfSMqV*!w$<{^WIKr2VDPz)h zT(DUYeB|M1x$nB8*Tbg3D+xj~Y6l&J)Q(A5Yh?WVOATeC3zg#ozXtwV1`Cpz-Ztq2 z_nw^5Py)+nlj)C;NZE5?Z9vYO_0efYhkE@Nl>Fui>Nm*5F)Kzkqg32f#%k(5&EE!0 z;aA2&eeH_7WwruoP1q>eP@Tp%{BLzV23R2DqVmI7cQa1+Y}Scj5u$zHS=;3-U#jfb zd9=U99rR62da17!>GwADqB?tHS2;SN+XB#I)5G7_e6fNQabp-^)Gvrxf5CbLVKNd%n> z>nr0@=O6u| z+jqWry%}SF@RO7QA(c=-ZK0&3zA|j& zK-BO!&eT*@|0ivjODSOyrB+iWxvT#>=I+tVjj7-@ugRN4$HP`0ivEuii-b^C_Y7EC zO75gWf^)>?OHb6Y{B`Y9^C{iSy=pLIsURF z@?)c=s7w*LBG?-R;BZg*2 zEltCDl`ql|$RCGpt%@XF$ByB;R*eks;0*;H5O~y?v@t0 zc&SREKc}WyTAxXOVTy5|giKU!FT*x>_WW`mJJoJ4E+YP+(?*+;bvMxj77lvK`}S-B zQf&=l&|M=9OIT_^CybA@S!X;2Ye0=3d{}2iJU8lapHIq>ev+5!{dGqDpm98pk~q&M z(?(+-Q#qB;H@(nmGQ!<)%`e`yuB7{iH}C|-70OUJ)Vb~0nVqwt)nYy#4XH5Ll7u{r&s zW%hmTB4wOIV9K5{=_k)&Thm1AdGQlqUm1_gntnBY;d$7^|ETxsUm2UYSF#ek44Eq9 zjsCbz^>tVX%=7!hYb8!oG~>?xiG~muW~slNYD0k=((OPH?wl!X}Ej>dS@@8f!HGc+@){xf7m{FVZ z6!+(b>GP2X!*U;zgV`w!3p13w z-|AKFf=zvgMRipdo;N)EJA-Rde=;xXspK?q_wIkUhz06|$7V0u5Dw~d;W>LFC|vN( zp&G2PgDo?rziPmZ8&Yeok|{Zb-5lx4&!ZdM>R7a+dSJLISkjaOWwRJDh+rZu9E=}l z0ofH_FsrRGygzN|A@SfC*tbc(y5!hiSFF@h&YO0ncd|DnNb^m`pt(Wl=`SSDPbHp;`>rB%EbBXA9r) z;VnH5zDI;U*_ZxcbYP5lnlQ8MK<0A&RL1Gt%R`U+eOto`6 zRfK|2jA15oaJi$3bHe`(tPp^z0WJHsnw#B@Bggs zsaS$beC*=Vt9;pN(~FTmO$U63@%HwS8?){W!;p0RrO^$0s+ZN^-b%vzgWJ-Tg1o6s zwUVaZUb3A&N?Al>UWU-ddktXbCPs3U4Vc3Naeb(IQ}=iF88Z5Vma)gdu%mIA2b=0v zi5J7U_RZ(9mrbX7mr8d6zf0iq0-serLaS$jCRLU8s_k1}o zWPIMZHpQuGWU=nOS#yfzxZmx)zn*GpU(>Lj>YVM=+UT~e7_R5MmJ#bZa#QO_fhJKc zMS{HauF3e`jG@Vd9MY~jZPqMfULPBFB)^=hS1H#a5;1n^J5b@EhCDZcU_^`{Bu4#^ zmz?4+v@CJ;{Yn22kb1}<=>7+dIza-1eXG`W`$ zLCP-rv6i8_9aYw!6Y?E!IbHMsM4^HWsC?=0jCbgDGpN?v`gmqQQiE>lQXb^-&646k zgj4q{>~m=J-tfoJ0SWQB%_qPb)A?6kT z@Na5)pZ>mLB?Y4>^B{U!yLHOZ5T@PGUpt^((ArYr_*=ODhg|J|q<5OoppCEKJuS69OLQ+lN4%_^YOl{TmXWsZ`gomf zdK6nJ({8NAMlgl83DzKEbfh4NEA!wBE`r7vYy zYM-ZIB;sSw+nV%ZA@Px75aQ3$P!F&7xYV!s>(ykDs1pE>=h6_jHf*e7-_#hr`72i7 zGFVk)!OF%^YC%>|;$qUW7z_4AC>KS@RD7}eub0Bf?Xo8ie$LF|1K&iVzpL&h`5<1@ ze^LGgx>*qND83WtqrZJRr?R@2yuizKgN09F>9zo~XUL6DeCSdjIK#Cat$C0QdAF;?Jyb zuy;8a5b#woaS-A~V*dE%UWiQFo7zkv+tBCI2}8ALH;7jNTTAM$x+H4?wgK=nARPg- zi~TPwlO#ppS>Y3%c%m2^e8POf6NR+EK;`WgGBYI@PfyB*D>D4?yJBi?7T4Pax6l7* z-vpk(IY(Lpsy3ug)>!t|=EOGoDCE#Fai~W&gX9(sv}|$=Hd%0)iKZEtkkywb&0Y~IGUS1do@|3%4w8fuJK}{b{izz0Mazm8)!0O>ioL`V#DUg z8kYG)m(<#stvKduKKE&~T2r7J^j!))rXsMQ`vT}7pxQ?>wzS;i{!uSrY>2xf+W8I9 zZ)f-$Sg~nr|K`aEDU;z6q!Uxdp`~M*4nNIr6%Hs78eF zR9D?fxMm3up(S=$f~S)M%U#LoEsD&PUIK6=yFjyKA5>8<{xx+~m?{z2n{>|Zhf97k zV*Lo>);Nk?Yk#%YW2BR(4||;V=_}GEH2YATs}fWj)m@3`Zh)?hivr_nL<}*9*b7m; z=!5!FebCq#Wod6&_qJnP8i&_TdnNZ`_>zcPGOGSd;^$Rtg$ilit~^qPyc`W{I-?j- z4Q3T`SCC`Cp(4T$x1|cmRQ5e1LS4f7MKrv?{m;AU3I)Vpa%bcfGCFJ@uwpnksOH71#g_~gvE`|~S1cKUq>gVR4geIKOR_tTF+&&c$n z!%VuWNIEmVc}lSrWM7lHGq#HAb0rmKqt=h`r`ts{lRRwLcBwil&yAIs{HUE#*%`T( zsatf)1_NN>mAB+JAoJ{=*B_-3w8ZeV8eTfG9jLKr?yw?c%| zFB*D7=}Xatgv9j7u0Z6s z8g1=XjoNM1t{PP<$hS2kM(rSIslAG#rKs97MnVx%yY`5gScz3TF@wnWe17M??{odG z`<(Ni>k6(UpHJR-zhBSs06gIjMz?}FDei6ax6oSUu!Pl@q&}zUq8`8VHKRh!+VP8! z-B#C2%W2wQo(b&;zW5;OY9qEIDgp{o+pS+>n(O)ZoaOwUs#eokvI~j<&(8*?>XPk; z;=E@ye0YL_Exe~CbMf}VA3~KJtK_b7rii7~jVUC>h4*>cfZv|p+-Q_ae4)xsNg}$k zwRuoHk6xZyH!sI!W*i>UrPs1YzSymfNTD`w75L38~4WNOZZ2g_z zXlnLSwJ|vjW?ccQ*A~3%_#@y7d4QKO!0Z!R$xTA0f_0REN83zD!`<~(g3zVC-O`Vs zFQ#-cRJ{V&<2JyqCc6fYfBd}m7p5`g^s{Bx=%1Mr(UezSo^Hl|E`yJZbR-gafr@_= z8cO!+;(do9ORpVn0l8b5c-7I-XE{(*1MST|6KrVnh|mmb=cj|qLy1q&@qWe;`e2h+ zO|lX;j+kbv?`(BMKdw8DymY#U&dL9g@-LLxSm2yFYNqCYr^{hWbOch>^UB`80YJ^b z5Lm{LZk0Kb9N2xL4(lUg63}Lg3TWAdGjOM;zAYs0Z^%?)(On~6zjL7$aL-X^1(MIgKs}?c{2Y~7Kou#lux|IZ(xU9FZRF>lWt{mN#yTg z|Gd9>k!|3+*{EC&GnL(u5Cm#9S~Jqgh1RS;23x+ggjMpGW?1a_MeEr+Btx!(8!x&V z-aPjtgduoH?HXF30J){QySp%JVG~qlJT7&hgn6t#bK_L(Z+$|GZvn6VOk-)Jz zcfBi2#9ckYLMQyLz2t;sN8Fc4M3;>wQ{H7CPEG=m@KF3%Mw(Y9NWQ4(fTo2U(YX0P zLr~Nb;GqoIjyVz>j$uJ6$RZQmZ$M7!e!>+*B2At0nqo%h=EhTpkB^v?E9ma{f4-po z8=*k@k7|I+Tqp=Xt{Of#GicA2BUgqK=IL-$BebCTr*)1=3HT9P8&>zO-lxRg*_Gg( zyXtb#ZEH2cP*|`u+<_8}pv)W4uwkty-4UDKGkxOEc?PacIg|Sf??3k)D81h68TT3* z!SE4tY7jg)0Y;_)AasWHqiFX6SV+eN_w2s@s+cw2GXKvZx$jbv4%@GEF@ZXhm{L}c z#&ip*FYXK*^E!St0q(Xso+^RB5O~2f74zf}Z?oEcn1l4|9EzbSlC*vs@MyUcq;7!V z&znb;)x8LP)3m-o$PY-n*$sSu=lvL^G^fSXt20Ix=JA_hN;+pPG_g)%A{WHwG3hXo zaO{1?-+@a@%>#qheFLIhFDTf>avGP^j@f3}&dobGWytiLZ%YB2*#!ULJ4YIfU)TVL zjv&GgSgydn!qT{wAA?bwlcK}USN$bA5@ib4aaxJ}5Qe+-TD?vB1CI~yo_*bq#W(dy z(N*b{xf%~h3*j6nzX< z4O#A(>c;)V_>gOBM&^gBdBN0BT+${`Jdc*eBq+KeNcHV4ykl^#Qdp#ZOFeSp3WjhT z|9xe)-?Mbh5;d@J_d~k|m)NA}`L};h5WwFRIsQ=C(PRQ^~DXB%Mn32Tdx-(Epi~3 zf&_9_y*(feRr=S1M?%T;t?Ru^dmrz6DWD{_m)Q=1rZIXC&L<1JvbW{=xXt&N^7>Q_ z?nc;PkIgW20Lb)?=7VDgvn%U4mjRp=fLqsZVIGQ`Z^_!ikv4+?9mvTI) zXv41-BvA*FP+a%k?K;G}_fZe__J{X&K4N%Pr6~1a(q%-)mb`kR0VS7U0oN-GvCaG_ zne7_>EqQLa$j_o9Iv}A&Q*f#^PjrzL*dI>=IztO<3J_hSc)1s0qLuy1>d@QU?Asd*c*o2M}#rm$gd}>r# zj-Pq<#lYRqUfO`?i|=!zNzwiy(GI>i1Hnuq+|G7WT~o7oo&L%CTitcV9rrH$*~x*8 zHA@VzMR(eX3uYo^uI|Lqr!a#esdw8YyKv*^qG_&Z2_rWVDDUr8;gD=Psz*R!ql zCURRc#7?h#yQ7hGsF_e&@a+SmPOi1ARC~*bKNO1cvzy2=K_!Zw0wdcaD82v}fHz2` z>Yu)aYp1`i8AbEv;$LKpW#4JRR^qiLd`9F_e$HtXwKh&_>D)JM`Pw63^T*(%UCb zPVU>BWvMd3a$W!y*zf}E{pvcBPvW6z&RJ>+a4X531a?JD#CzB)KSr|(L0S}eQ+vy< zYhP)MqA|iBMQV=0m7qU5T?^Lh(&X6iPj}mIps;54<=WMaQ4_)o^oL761FCQO`Y1>9 zX4CkzGfBkwyuzM*f6Gn-e)PzCleUw7U=SO^MO9lQkmg32_<(TP&r@wI$BI9qV0iNz z5`U&iw5x@fYBI3rYG}`~J+5-}xhD38$G-~tNGNfSqpqiqBI{mwEgC~2d& zWU|1UpQl0iH67tGk3UwT`jUe6Z>||lMQ!Y;aRZP-$HilWl(JUgz~O0MtWsVeB*@R+ zpQ$rc*>@K|1Jb))w_PG0Wy$gU&nBWlhkX?o?$uy6kMbz0_?H=NJ1<7j%Ccf9K^)Dc z7S=+Fv6=BNtei!B)1{v&B}&_+ImCUwmH6exm(={#n%XmoH3!7RnOjzTE=e?SJ%^SW z0xC?`N3;|vklMTCf&Y9HEwuuv#@OWh{$PS|L96~U$n_s%*=x7j=c}eKjDopR*Ocyr5O9weMnRp z2H0}^92;gpCcN@kNu6+xjPTrJ!)ik zyLTjM;zi)^fFh!Uxf;e$uB-;k zP)q%@iPVy{U0q2IhCX>5&4gg6&k%~ZnR&hDq43RRtpr&8VP0Z;2)_i49`x5VMF(SG zk>51ox_|cEdrbXZkaQb?4o|4Z(~^4>72k$x2})w;VCsbW*x;LgF{A|8g>Aff#5!@+ z5Hlt_ZH;0W&^&a^AVTz!I-LFHmrY*0F=RJ+aG@cGHFz+GR7HK}PGsSw)V=}vyL)fF zI%+>m#t-E6`RDg0TlQUTtV`aVa(EC|=B_Mu*VvqO(BdGm_YC0*-wH%c+OIf{f|Y_! zzy(_vy&U7`7=&44%-HnGXhALAVcABYL3|>FJ&Zd7wU3AAPy&_o@@@fU~jW z>Dc8jzcAv#*BR){O0+DLqZzzO}!lIB&{WTW<5>hJjp% zgSP6pcpLkZxQn5}DTgK`Z=90F3@jFuZmP$7VH9t+=W2X7VZfy4AsgOrV_nm_D$?Nd zSy}&fbhy(Wi6&j?nD}L!3Ig3gMf8q0+RVm__E;AqR_bXweXG!-;5s+__xl}ExW3L1 zMrB#sV%W}aoL~5XS&mW6n(PppMFMOhdK>n6?ei=2qwz?-+bH#9F+P_9e*zfRE30f zS**oQJoZvPvU$^L$T%V(`h0V6@vh-x#3$I!AvTe)QcdXNXNMWjKi4;%*G=0UGMyCP zJovLTes7o2RM9xvu34_4f2)NZ-><3uSp{TGp(}+|9>bp%Q|8TwsTu|A8ChLPC2PhY z*@5iL5>cTHf6g>)s}R$2-j%jLJ-J7o$1~do%J*SO@Ly1BBy5p|if21lZ zwq2H?4g202$i|G7^-*YH(o3ho?DsL6R%jQ7D}y=H?mZYi*OP$FO$C?HxdHeNW+0f) zp(X58kCOO??22jzZ1~5U%3S`$AoaF~8({YY2*|iP8|w3ATHFGpVD~YP^_yQgMkLlj zSap&dMpUV98HDQ6U787mwoJfdK+t!3*7ak058({ zV0lb0UMU{61=5?v&}RNU$7}=6Ix#;kGd^nsCdI8dj-q07iW{$cM?mUUYHWR+I9a0=O$lqTo0U&Dty#$wFs(4Fn+veC)odX?N zztN>odHus(O(E;j_0wDD1sY7-PJN0tBMBP}Da1e)9_V4VLXhs_>y(bF%5>iSL>~y# zmtj;@6>aDtT8o6Q-)Hp zz4OV}s6U0L?6pwRGx7JBbgoC?y=IfyqT_kPaH(==a#l%^#f(+;{`IawgS8iHT_cbU zdrFr)fR{xSAn&n40MmMf&Ab?&!KtLRPT;9DRS^AUd6g9LQIH?tAKgEmY%)s>9^y91 z;QY-J5pX*Xx;A%f#C0m*mdnrQYPyHqp8+V*{~`jZ{X20+{r`tsR>2o@C}#hj<59LI z?JgV#xW~1UP2;mUht6i}5N_EU@+sb0LYYM>ob3B=VBK9i^cxvFkuGqvg|D9g|N9%< z`iU;bl%$P})3$h4lkjp=&()!8o5_5JW`PSKTu$KYRKa`-zFivG=vM8PetpL{`Hp+@ z?P7l&!GDZjDCdP1eRjII8qaXJbe5*9wTPm)7Esn7AzJe8eNLJ&pU3?^`DCz+s+l!# z=WWskg&W-!*T#R3JG1F8E|>{_!v&<+cn5-?0U>-qos+t~<|nUq6K-1$3u(n^b?6&( zm}cKd(W*y6R%*w%1EFDo(m}zYqC=OUXwLH zk}u3##Um@6KKcuPUwsvG`lj()Zi}yIj$_)bg?Js4=SvIrTzb=cO5oJK?a*ZGz^vO= z!GW)wNlNh|Z^M_6U5CtLp`2IE>_hWA=V3=}Ic#V#$3^!`Hd%Tv#uzaUjl22L_s#R2 zV!MP*BzUBg6Ru2JDRLNJ1@po7+U6P2B0-CZJT|;)FR+(feLU}`*@p`y+3xYaHM5V` zyRfY}X4UlhM-s(=T;Do(m+TixV}z9vCL${-Df(C%59HCBoGH$T$!h)#B|uAVmV zi(H}wQ#e~gP(oma7XH>eFsyOp4yiKi=4bQu7G7k8Qq(@h)Z~$~<(t{jU+?|W0a@qH zgSJG^vme2nkck}Tf0{?A3Vy(erF6}mxZx@*^lMCNA6(bt7sQ$F9+_ncjZB06d~P4r z$DKRFk$o>S+y-=7YE?3dDW#G>5e7zp#1+X-cRh0X>0S%If=GXC}ryKPgt>0HTc+sX(z#!$QGy}I5r z6)U5AlNl#|R!vH7IdA+_c$-n31YOKt#^*jSFDyBHP)Z0bvwd>yaIIfk;C- z!!YAf`(H+7Hkm;KfgVLK5k7qHgtp^uFP1l$r8Ud8RP5{GFtX$MYuz(|-86FTsM*`5 znGJe~HJn6R-#gXE`Y26RxS_sf&-IGj7Msz(Ev1zI&)JIkPro}M*Q)|$y)9IqJ@vAFL&wBKx+kfIJRefo zxL+e&ZdcS0iQ;ay^i8oE-XWsCW&zY{p+2G83 z{D@cY1%hI)7Mv=N;6eCfjvr-8T>|3xoEo|?WievYPK088I9#w2(ilR$L(*GRs<7#$ z4bGcP)s>9B~6$RhM1jN=3`RMIOiH;Y&JI!CrOYX z8aVePg^px2uVL1=cV0{l!^s0~X4VPW^<;v9>K!|J&bhM~1VFCQEBR z|K6pq%#JyC%+OT>>prw3nMJh-LTCb+ovPlZ)$=R+o}LiYCKuedjF z-g?%2(G*AQeo_QT@0jj*E#kmjQxP;HJ#xnmtJ?84=5r^6^?q2#iA}eN!Ief^B;a!7`|bK}{;n=)9b4HiDeA}`&WvBI5B@Rv^5mae>`z)R zvDpab(FRy4DQ1)K*W^?48ggYrnI&X`V|T3)o*{1f5aO^*NMp3N8cf$0p6SPm_kDOS zP)z3)Ub%A?V(EJjkULQM#uWe%Vf6kzX9`_k7hCzyR6HT%s(DMwdteSimEbd&cAHZQ zxsJcz-=Xo|_gTQX-waZzBLAMtPJm*mm&xE({u`YGm`HbB=Kz0vVBu`nL}PrWx0p(K zuH7pbQ+yG{JOM&a0@JT&OJG&6!5zr;AGTU%iIEdjh(}?2?Z9K3wRE;A{Jo*YK1+e{ zozWJpF;y`Nzc$4m2+OmyNJD9oH4~8$i{m>8<);%FLE&4QDd?3&n`DI?ozv%9%QGOn zX1x1XbTI*P9?_!aFqHmVaq0d}_o5mPAoPEvq#GrLkSEx8B5vtQ-!v}w)Vy+4^=E{v+*D2M+M5Ya!`x6Ms0#aeB zW3C2oXGaZGQz=6I680I78I5P)&nh*n`pvO5uolvfj5 z@Hc{g>pA4F$UcmY#4(=J<1&rQ`}{j>Y$7R@U_aVJZEV?^wLZ?@$rFGSB7k4V2l(m^ zz#Gkvp&j5`%0Yzr#9+zTwic0`F24Kn*#fB1eLY?`4;9R`cTW)#3G^cPxCthV-wS_f znTpI@aflTk={H4l0Fjk!0ZKe6tgF$te(`V;t-u%dV?%MInyi{z*#j-9L^u!0906w7 zM{6(Nv2h{yQ(T_Q`o!Fc+d8GIgjmsNK!25F0b4I=nd4}A&pBc@7u z4ff7^2H?jFspEKew1vG59Q;bK#1TdFD6GY z_i_i<3({bY&)Xa0%D)e*X7um!dFp0wrwL<%7Qo+NP+3`PH{RrSFT*py14{0Ex zDBorS2Uuf%joJP}H$IwsmIt!b_DPo`75{>ECD0S!e2F^xvv?4wMOh{7bzsm z1|3mZ`m^X3Z*$jo@~kP#lWqPzXGRHCy$_f|37^LL>pWo&ke~8Tuw6!5qksB5>p$wm z4-5Rc@)tiEtOU0r`8F;3{33I9^1g26yXt;Tu80uW%(@MdANT2K%HRo)XM;Mk;YC4F zYK0y`Xv4dTqRG6rm9>ZJly5)|2ME-1^Z_`J z=#%hKa1^QQRg$nQ#_oPz0zz=CjFvm_HMm&z% zS`CvOPyz$;HnJhzpdn)I-LKfl7|rOf;?dbAgvf&TidpHc24Vl6WAf&YoRgSvQI;nJ zI=SozvTRxFxH8V$Yk**;{`p$T`o&KeEvf?cH01kuRQ9PAM_{nriHe3;Pm?Q6ACsLh zxoZ;z+)S91`HOR?W z5XzVo=6^d>$2O}6e=<_kPO|-NBUVcqQ!LCWq$JvWr1cfetb-~m7mT^$(IANRfP5hP-C7F8es3J-<&+;w9ts0{zb>`3nyoJdtiQ)J7bd{;-&fkX+# zzSlHtq$%kP-S`ElvY5r^3EUFgW3Mz3?|yJm%eJno-R3l-p?O^ zXh;?0GmF!|S27F}^ZiNoF zN}z{l6dD?vzo`yMeXVxcO$Akvz%iSu!jwrpk}IO)4Ae0vOje5l5*+jF6jzj>vYZW9 z)VhaeSN96&*;PI8y^U+zqsR8Mx?PxJ8!qzD2egL-h2$P3GZ1Y3Xo6v=%DUZmV!J({ zTmDPGVbUMdR>6$));Y#u<*Rvhk%TErG1JCow5lyKab=y;c+Ox??iC|efnns?@81^? zxcfXhKJIP_IN#d3I?GucZpOG4?f36Fq0!*dBkK(7)RrL1&O!wP@R{4}CbLR0ca1zN z0xpwabNvkuM!>=G^4TUkcA59XMO2UlSd}*6R&pu<|7XSn)5ZK z7jsBeo3df0;GHxD$%!Al`@W_>nUxGLlaUu!Eh)x}oLoCIM0^baZg6HwaNy8+Sa+wQ zeI+6na?ftJxPCO@GE$(^cd34aBhT615qWYhGR#sb_$I<;(V@3kK04Ge_N%?=PV8JS0r@<4}Hb+LGQd^N`PXEMpyLHK$ z+FLK{+3RI&m#d1w!4ymhMQ_2q>-3ioFLOvVcTmi_d?M1uBrc6-6l{Oiz8 zWrI^$U_b|FDTMK~o>=i+3VS}jjwpl3KnRc44=gD~9a3z# zjX800QM7ouKum9^_uqwK)RyeP_?N=Rg0C*s^>`2VefrE>T3V{LR*=}L78c+bvxD|4 zf^j}ak?$4OR7@0bWV)oMM0W|Zz7(9B`-iX_>~>rpZ?NDPdLYF?q3gKHKP7{SD0%Pg z$}#w43-H=IMuGBaFP*P!0EfzJaRUBv9$EQbgdO(F5|+zU9?ydn+!=BTSCN@6Ih1K2 zSHVxE3+WDGN!tv542wOC1kH!q+^;7UWT!6bF>ERNBb&|4(dhVlsFal$hGynLx;qK# zgJE3j?+fNc+&SS2WK9ey?>FXpMaylc7WNTY1Kyru8w>o5@KzV13~bfI)QwY5twt)p z`Un5`s%=O0KXhmG2zm-l&2gTY@)T}zmWy;1J$ga%>Xz}trKQQrS0@wAiKgKkTm{CX zw_0~6i!YHHxOK~rwt-?BM=~ud*gaItCpR1lk7_wMu24n<86+2-<RC;_RdXvm$-0nu!58sR@hBb{xotj|9cK|r*m1-7NJ2gBC4eLJ6x+@{_$}xMg$PRI`iqN$-ahed zS_V(IOj@wVN%4*L_RI<}QGl)dO$K2W-a{v_xLO6^Cjk zuLr(f3i|%CocxWQXW&lRXA`@(^s*ur>sauK9#w&7&j4h(lFIEYInM;(UwYCP2a~s4 zr2_fIVXqf=faIYnUp*N$-=Qx?SPJGQ)qg@|W``1}(C<-+Y2-w9$U{_B!ab+hSG2c}KJF!-c|xN}I|;!z z!LU9p(p(Oi#d^#~U(*`|Rp@LDCB)2Y3;IIe=ofh7n_Ito@IRU7qs5SYOcwP)#Ng~Yd%_5g?se{Y9t?H&G{6n zr{oTlU2;q$vd<(+EdF_!e9Rcj{i8qn1@^S!USV1@>dQ>TSl z!RUV1`<{enO-9O0{}?ZShm{fxd}1N#a)(&}^-Y(keO>R4IsQQt{+ydaWJd^dFh8tq z$QX;ZAY?tZKux@>4?R)pd*Y~9?8=*8pYT>7NuX_e;FilL2jTZR6~d-+5DDDrm&(Zj z2;gdZ0?FH)%&XBko}S%kI1aZbYc1Z7glpVyLtKW+H*Os^5Y=wk%x`3{S4JPM{d=xj zKThYShch7N23+1F`yi1yjc>WN(qN|sY(Rwp|8+ITkEc&5iLVnTyZ9atS0LwW&1Kl8 zdDTI6uGhHkWNaO6*jD))$sveFMr zt+#~`Uorr4f1WE4L4Q-o<7dK!(hui0FFTv{fVouf!(WhH2P;VFhi-M;iBaWp_ZrHt z8uJ8ki#)WXzn5fle{AmY*Po(&^c}Sy7$IT?C$wgB9zI!rRV5e>fSGtkqc0QIjHqVb z<-T*XU8d$T=6`P4pVrL(v!GRTF-82NY8K)PoDCQV0wzVOSP|v1CB>DPcm>RQ4fETJ$T^Dm?GA=G|pV6(2 z%7)z0LD(r-oP*iTv0E>iK!i-<+zQ6;sAl}kD6h;NjxgoAAJyn2CX5S)c3}@#@PD4*?X_vyb@dCPgJWa*pAGns2Njq`05v<0gaPQ zrxF(L!~4A3Z~~>3jNPoV63^K5oYFn~ajrxr#Jd`ta|L7mx8%JQy2bCb!F&J6?BLz9 z91f^}qNO4bXdn_fPu?N8w@F>6ULZ^TR*~<@Q2z_Sic%IOF7PM~Xz~cYa0N->7NaHpE-|Gd>;;8$K*4(Y;!T z&Nx=0sqRr_=GLWwsf0HTf@qx%R@`#$2Xjz`M$Hy6ZSKHCf_^_xha9crDg`Qb#nyO*`{}ovcy^)oqs!i@h?m0{CPlk1+x#8QJOaEeWjdjO@KIW zSVzX-J&Si~a@V2q=^X1O-AMvJlC*iuFHE0|NNg=;=zS%=Ni)oydBE5jylwD0?z>}w zKB%!`y7_<#3JKrZm5!H57sVU23LlqIhe9P=*eSK@loH~s>LfuUCwf!aj2KU6g*`Z~ zl(<_xT8_-rd%~f>HUL`A9@Vqp!#%kR``Uj|QRE9t9Q8G+XwmUg3l}A&!$zKDlWY67 zh$>I^jSb?FkCgBZQU$m)JCBN53#F}PKP9^Tt+DEn?OJ)hc56>a?UxTRTbxYS(LqTq zgqi7*w(4>hHb(5~C%s;58@{YxS#pHEyr1N9#c)rO*^j9KTS|C<#}=9I&aSyOBB|R* zMUGPAEyT=D(ZJRb-(6BECn>T6a}#bsjtos~vt}_LLGoU}zRcPzNLyLelTX%Bu$I(| zGL=d24rLuemph8aB5$kVlysXZ4gNo1iG+ywGT7HOQ_HSQiHQiDQV-{041OEggrz<& zfqFQ4R?`kfCd_*uSe4bO9{wyW_umg0Kbkw6r#`xwzp!18CFw}ijR@}Y(70k3Q-@-T zs>z!1@Oe_QHAT%ZIp{*rg~_Mb!C0vM?O}9%9d_gTS#lu62B)Olu^~|G)c10HB&1E2 z2tG%JknAIhNHGTN*5=k!!!Ze$iq%ngPdQ58xCs(f+{D~cXS(Na0^z{rWhWP_ydzDxidFsz>IhL3|gO141MPBkhbLPbsR(P z^F8w7WPLQva1eXw@J-xkh^Jlps^DjK`?sHelb+EP%frvWvPIDeSDV|f$_Ez_qzuktgiW@z6@$^FRt#iyDSagGYh+?NYHWQXKiM~CTE;wU!f73lyS*VLw0F^^wc@6^1?u(~Zc%r_1g zL&4K#3yz!9WUuyYhB{Khx6-MN3>V|SCtU@$0O{>n<=RzRvgz6w+TG_W=e6psH?aIE zpr$~VYWwv;kx{ z1Hv?6!rK^jh4%Y6sSBnizR^OrKuwnQ%H(U;@U*!|PD>#(v}Q=f?@I@FR#M z_FEy{=r1YCz4^$+NMBj^zkDG7?FqTI1P@sl5F<*3%I;i%+NX7cYqERI)T0I2a-Rv= zc~*Xk(7bg0_w{G&lSWVZv`Fe*8Ab8I{5TzAPzf=f*}^->Q+7eJq^LgSeXo*G$JL() zF)x%?nmt=w$+kJ4_&Ft71pnzKsPW5IrXu9EH&G@Xif*}gRaoDf_P##bsbvc{mEBK0 z_aECWJ9%{rSi;$1*h3R?Vg#D)tzXH8S@N2iV?@{V_V#1GBInJGYgZh1$MveZE|lE= z0Nqr404ka;I#No#y4#euYr8nVi6@J-f|=nE^2Lte2a^DNqP;6*Du8LJt`TZ}miQv{ zs6Qz_B7E7(>ZgC)X#T76wbr|S+@zfkG+r_$Oc_EdWQocMF3O{rVu>y23=_q=9RGr+ z)nKPvqwy65)LQfnnK`Ez!N*^cV(NF~&!1MC^9hj<5!AOul1aoYIVRJA`=QJ4e#L2* zsUTy;rHfVg6xc1y{|P;RCF>q>u2HT!uFukl@`SYMRW!ue|7^G${MU>{x8u+G4M#7r&?WJ=yG7XluiE5feGj5-h*LCtQyWmNFp5ziyj+)LWm1Ybhi2 zmB}kzO@s&drb0ZmKZ_WrNZz_IZ54KKFP(${7Mo(6^NDHXWz=$5^qnMm2RVLd>+MAv zxH4pCBhYsEL8(^|;};h^aI^jZyx9-VA+mxQ_$jY|pdf#OG5j!KvnS8VZda`u>6dz` z@2@06=+~Er7vZWp3g?|yyLkgm$B5Wq28uLci>kAjD{ef~ruD7h@5lmpo$j>2sN*{S zF(vKsAJcA>Q^36xLIs-vX(h}#&C(&&oxPv}ZF`mR`kjO)V*#Qc=&Ar5=zqDW{`2Wk z`*-+%-}wVi@}iR2$UZ>1^$Xx@a%9dc0(T70fUGoY+GSon{PXvBnaJ(ynoMw`1t~VF zF$F}NkHTHavh`YYk5IifDS^yXx+OnD3Dc=h*Tx>OzLV4gn%*=?oYvY{~EzETNP0))rGwS{8?_Np?@M-ZpOB2 z3GngBpC2au<`XML+#-jx0v?6Nr4~6-#ld_i`t1Y5le*76JTsq8O9I^mnwyEtUo+%< zZfpMauY3<%Ty$)wf~e}GC~|ftKR;fTogaf!OIXxyNEv*+F5%E9lzl_<{rUYj>`Oo~ z=>{pW+cNQxKN4=_9|6PU<^5pt1{%{Pl zFmM*6iD36Ldngg37Gra-wEvj9e)(4LPJw~@QTLM{EZXJqAsyVD;WE&n8+lcE(D)n8E9ZGFmclzQSswHk0Hoqm!wHP=-I@nubjw=c|n*wv1#`BubR*nRW- zpdJ8U#qe6VDqolc8iRP`BxUhYmQ0{G;gPeWKfbutMR%!T?;9?8U9u|Q*rwe8Slr5& z38!ENnA)pYz0u9qT|yK;y4$O%mKDgfiEl480Ys@}eQ%`UdGL2N6mT(OLfDi6k{mNt z4GVu(WJx*I!tR%4z1A7`{)7DX$xFB9-*YY?u%Pu%kj7p6Q@SDVxVK5^*V^|3VmOkG zw;o$)VzaOt_abp=vtYw7TBY?T_JxTMx~3+)3}0*T`iS|TrpSv zJ*OEIq5(f9O5s2Rw=6>70QBjkiw^^({2;bi!c8b+#4A@mH9+$FGcjB~D^Y<@yT$a* z<#$h2)Y_%u0K8U31q}b3v?QNo1!FT)R3S8?(q@IeKD*sXkS^Uem}5Us^82`qc00IL zSJ?z!_QuG4EE7A%uLLXu(D^(6S&&vk5`io?{SQ)N7mQ+X!MPY0&A)$n3@Be%#!Q9v zCy*P~+~;#o1ZsV<1YeSwlY)LgP1pR3oDKC{y)K1`h(8w5xe=Ksa%VCYesRJ_NuSdg zU}R^eH;_5oOH%aHAg}D2vETe4^&Ll#@gHh#0B_~uw~&YrD%&wsz-Ap94J+!H<4;`J z{+8=(BZ;h?RDN>^Gyz?j)qz%kL1$^EyLTV;@NHIIiumW;rKRiiWH3F|_pCsb9*)s1RK%+gf5*1EV4gqn0^c=WVa1wg#K_s|U~{c{D=7;kz<;cKh1Mwa^fSfC2- zUjVqUG@z1+HeN^kd#)g4S1m@()(O!w6q$pH?BGvm5ho!MWX>dsgZ#{JnQ^!iT*=X2 z=*Bt@Yduid?k?z)#(rJf*3=AW=zAy`9T&p#@442ev`0gv`YzSG<5Z;|eTx#8sZU(@ z9U@L30gEAZ46D?xKdlG6n(x7<(tyZ2&`L1opEic5#- zSc6WHU}Lb-q03p|PmDrEuq4%rqIddiT~V#W={3lmmBP((W6tTs?Z?mFzBg54YzChp zN8IR%VRgn~eID%^W!+Iti)Vg!n;%g<7Qr|zoyKA18|*vnnOnDelxAA03#>E48*0#X z(T{#Qb0+*$ii~-^@`=vDFx}?imz?`D>_=3dSnBHon?h0{0>G>6=~T$Crz3I?UD?T9 z@nq;C`%d(M*np_SdGvXLgb(~t&{=_U-3h84-xj)I2ulC_^y9stGMC}n-WWRz&1Llk zj-0y5PV;?z&jV!Eeaps_XR+3!e7y4Jqe#-Ivs{{*18CrxiL=qWt=l#@0Zoq_DMnO& z&`u<%jN0Iza@_sq$UQgK*XA%w)o&R(uBUahRdN!q0i$b6jN-rUBgF^nCV)HXkqtf= zMi3<9i&>+z0aHO|TDhC449tzsEWybRl>|D96S7V|ml-2<@$?mtX-pwS8jf^-LY_X6 z(W+@~#*82EDjAP${!E_!dBbAR8{P9yN|_SRTC(;#dOyt$QbC>$V3`;D_nb|DSQ96G zgH7KF4Kt8qGXl<<1lRE=B53!lA*yVo;W4Uw;YNl-n2c|uW^J*K$5}3KSzob68LrLy zPi~$3(__{gY4hP0O6<@2c&RR_#70(_7tySP{{{})=ocogdLNn|5d1$lJM(y`!}i~+ zluD9)3uR5VvS&@Q4A~+(Q(4DgtRZ7Y$-adUvSiINgc-6<_K;+qj4U&^Lx&Dz0M!=kAE27?|t9beSJRH`}09sZhS1eGb`(tZM(=oLVV3(_Osm-^M`%@ z=_a)dg8GJjw#Jm}v*{I^Gb`8Z@VZD!z#$58l7w>?Ctx{_T>;lCw_CO2{G_Tt(?nT7 zad*k@74lIri5{LI?Q?m#9;J4&KJk~vwVyLrIEVflJeeN#EJ&9eOW7ys<2qi7h5^%$ z2DktyKbzgmP$hnq>0vbiWg&U@fmP}aVQ4=Es>kt+qe!nl!)!mWetnU?VD${) zR+cST_hcwwlC*RB=~y;8LeWpKV#>nq}7`ch|&@NCR}X2A$r+?86lnvtn@ZvW&rQf`!= z5Uc1l&Hz#5u_cXt}r0z{|TiMG*vH-Hj+OVXIzZ^$s$a+cE0^NCmH%kXy3{Kg#s-*eU?crQNdzh!=v4 z&x@GubNnmayNe_pxd()1BTcufW7Z4D{BvwBNmikXxj@f=4)6!RZ)%#f0kqsC7?5a) zI~GG}eBFv^*a)fmr7LtKQYuYnHzIIDB7T}-XsD4+A98y>MYbDtxM$aj&2h}KL86haWo0E#n3(Uy9GieM;6@5~9qbCwAc)kz7%!+*mahxh% zw|sP~;BBID_srRCjV=Zas%S5QZ?r|%`NxehPl4um*DCfWPsRJA)`z$8oq3n+)@E3G zr;~JX7!?EOBkQxXpZ@v9OBSsF{ zkw&VVmHbQ7gXNkQ4VWZQ;Q(I|g$~Nz0XX8UXLd;^*)1%{zchj_4MZf%xd}C`E}ORv zu!9ZHrN~L_oGJGn_&i*a0^KHx32f6v_zzu;sauqf_+YUmCMxue^vP9d$AB612N$gU zZ@2&daq#wViU6AgjF!x#nHu6f1k3RqlIlV3?J>+0?Aod#i&QhKVpI6^S6_cf?2uR0 zSx)&srjLP>1|#C*kDW?FmF*d5~+b!b*SfLhFx+7oF6SAZ{`{?7W{Z7?~^>~fz4fz$g@8psrt;(wX8v) z*VJVcW(=c{TdiDncR|J5`4Ckj8Z~VFT@*0%KVH+2vYUboW%d%pT)tVg;xpQ$- z@E(x3dcSk8niDpeN-zu$p1JfIc-p(JHzT4gX9N8CL2+AhfqR!l!bbrqld;j`Dvi=Z@w zUa{nj%kflXfu2h&Q7D(rS|C|VTXpjAYeq_v69TbqWeDtF@E+KLGY(nu%21c^<$p?Q1 zkpmsf_V)t?;A%EmA?V=Vl=f$UJxTfZulDPszgvzFHbie0xHLtDfaRfnwo zr8$osY*?LSiOuN3R@m-<;2DlzpHjG-%K;pTVh`i>L0DBuaUp)0+aX8z^PS0+VFPkS z@~z|?mlWa>H2v2{3ptZZw0YJ);avalV}s;oIDb~k#YoXu+x(ai_ay|MiFa>2C(2co z9{X-R#a?3&_-(tlftP$AD%~g8i9t?w&doH>XHcRlmL>hl2fQ0IN!vz~IOi%5x2a{wCb|4} zV@_7vUz)1FG(iQ2o}P?Z&rXutF4(Rt{*Y8Oqnb3!F^nwXk71!w2lju_xLt-oUmXWj* z&Y@azJ=@?7!H*&W(;a~uf;h-85c^{le=xdZ|8}bwi{kwr%A@=9SUBI>O<5SN?2=Sy ztLq7)eX7gQifN*KXgd6a={{eWWf)vRW4p1%4|s`YmX@~bGgv1au0G0XxHcHkG7glO zqd$h(%2p*i^^_WKxU4k|_HM8dZMPy%IbQHHpdneaT}_o9PXeIPKZJ%Wr@d`%=u92H zo4Yb~Q_A^nsII3c%oXU@6@h542^9GhL_E~yeDdTv4IRzZcMBrZlVY|H4YgSxbM^@) zy5YIrDJ$Iu5+TCdY5DSTKW5MHoL*~AVusT-d+^i#s9m`kJ+Q2}P*giLDlq*fz4Y9< zez47vOq&m7BI;|K=yqwZ?c>J`7hvl-fwTm)z2Pvo1Rl5517(0tgV&o+cCG&sfv0a)dHQ(c%a2I~w zAYh_39#V4roF%BR!~48mi@htXiO9Bmp~l&(F^RuB&@1xXL6LzEZlxUPI_gcxC0&E0 z<7dJ{FBF$LgDukrYrYL zp{6H)qAKiHQV@j6Mo9_vN9!*K%yC4~9whDQ645ve@VeftGt$7o1x4|i{Il7Qn%p)E zwsve=2`fXQH2e=u9mMiahx2G#G~rnf9i-|; z3<&=FG30h;4Cwf?T3(vxkJVsM=hI!J>~_DjjMD76@G*p;?ylO|%EaQBbsC{unrb-> z{@xf_x(?&>Yi+VG2wsDQ5N;EV8O5fz;e$yh6;_+~=B{3)QID)dg< z?g1BMx2P?-wR^NLChjdCrL8cqWgT3cD)l)n=MukmtVF?(SY3%*v8h@kPShjD2;r=0 zC$n*>00?bhN?9NO@``Kj;bLoE2jc2>^(#3&RmHhMktywwjh)9c6T&fyiZi~f3_p6) z9n&5Agm&-qxy~Wq;3FEMqq>q}vuY`&Jt|fI{7If#GF7oN;pYZYuu}aDt&d0U7?<7U3=$gwq9*h!0&Rd zI=NZ}yA;Kzy!mI=*#NDqBUfD#4&`gwOh@iSlqRj*=f7{N%}VqC^RX13&pQi%g)Aeg zk6GrS{2OX4W+oXHB_ILN+dH0#&z+vXNy_w#1e)900caDtJc22|OiQHs%zt**SwW9X#9DZ$^X4t!<< zyy|x|8f$nF-x|};bbkpVT@HPsP4krE*v-dFDhYQbA}_7pamO3w=Q?pHYzigdKDP6= zf4i}B@kW>?TdM;j5gg8913f^fQPe7ce+3sYWJQ(wXQyqrXm#gI66L+M*L^3YUi=NW z(q*n`oz6VE-qg86GXu&&fkxP-3{wE?&NSr(A?Zx2=@V1fmpy~7SJ>tj-}^wuOojD~ z^{PS*7_!^z=jr`%K3(K$V!RBOwJ&hsv;Ajt8!)wqaiy^~zb!8W-r=(?^yVk|aE(v1 zLxkBkHh`kaEdPzO_x8%8a6`=70FErc99Ym{nKN7g(xCH@2+C*l!(sug-Ai8W@uG@~ ziXPs&B(uv$oBK*#bIqA2_xptAE+57&S&^hS#JrAN!@Z>8cenc=Jl?V~A!j8vaw@s` zf8R)%8SZ6x`JyEjIUM#_6t$)iZnKrRHAiCHI9H}gWbs;&ua5Fa8@*qbuJAiWS&z11 zSBxe`>V7;^lainpbh(_SdwVHLj{oAa1s}(D>lU?gWDr@8iZn)9Cj zSj7L3?vjWA^^s&0{)qy$3$usdQ7!cicNKLboo=ln$_+gL<&cr8zLwRJd##CrB$nZk zOvf5cp3G!j>H*V(@`*rKfQ+0JXA%3rCt)FM89F1r#CTm605p#S$)YugEp1XkF9GFx z{kHu=(MXl;Ta5|1^sc$o#UAC$N9zBxs`=man!A{xs}y7xS+bat@dz_snYX1Gc-ffg zsOZ(Z(YU4XQ`shcth%ip zfuhv^7=03FJtog7K+20AcR`O5VukG(bpMVW&FpMP426(a_T zY6|(Dt*n%(EPZ`Z^_n(Fn^fmiMLZKD9eH4r)CoPDEDBbY_m$Yl)ww4FD%DGc zj5Mldq)fg~@eRHg?}kMWMV{JAcLC0{;@Xq3@k-YbsUhmY3uB*4LsSJ&lGe{qI&B)@ zb_x_2jPpG?J8K#jC-$Sv3Mj8fR*b17r)o-h-P(Q@dFYIoYPcnGF2wltjC7vu$OfUY zIaVc)0qw2ptrrKMow~`E2f6)b>$alj)L`hDd0wrqmzELxl3E?ymgE`C6$y{^?`3BP z?-I`S3EnP0>)U$|fAyy=%?|jI`gLH7Y1|%|TD7Dv3re!e!7#u~FPqP-vYc5|q7%{y zyGR5R63k!zq!R@GNb&iAzcd3y$9#=-jz3qA7PCFVPv)Ht{va+xN=C^aNgM-yNP_XX z4xq-f=?*6HgsCw@5;K__sD|f~$k656KuTpv^ZD63{u}MS;=~l@a#fHkxjRwv-?MZ*R)mz33S>IP1x@5ovj-Fr>@6! zjjn21Yq;LFNW)y*3ODVzCthh0jHO+RiUhL3+{K+we=ya> z&M1{#dH)QbQR(wV`ZSt|L+i07pMII-cDB{=xhyZhO2a?@qfjC9nd%HTCBj8&(>YS$ z=j58QZ>9EvGiSX0l*gIuiuU-0$oqh50AOSPA0NgTRVel003i>b-H~_kn2umzyQXms ztXl#AWX?ax4q5#CrS)@-#RHVY8thy@A^c)t&=J@9&<1cG9=x8gjU>*LZXb|ixA(g@ zlRvq0=QPCc%ZHne2{nvWc~x5LG0~$Vrw>}3bCvqUxZYItJOk&;m4TD}V8~$vM=RPG z>s@xNJFq=zyM-*y`va`CJO78B;=gS?|1K1dootND+skT=O6{Y(c6c?6KgVoJd3gz0 zeT?LMSJx+$_@LnSYwH-AGpTlruMzUc+?0$@gN4WUNSm*S6;!wQov9V&V$|Mn2d7wa z$|c^{UQZR7;@_%F@NWnft-d^1-zBL$9F|xdljqgy%7S&p*hQbo4oiI+j6)X4mf?zI0WGjdK?_`PU5ibmZ!Xl;-mm(ZF0!(Lz znQV?w$2b4d?B$Uh)LmC1Gs{=9rsHi&5(3%wKOEj2JXe|g<*|8MfY9}8x))G}stTmc zDj};vhsv&7T=OZ=T@C9oxNga@KE(sUlE<{l$3kU{xH;_M|7l;`UO-Jom)_62!NOB%S zXSk_1pmx42nI->6F-ZP(iozo-=1Fvn4oxCr=%I>3J zM5F97%KVc^#^|G{BoD?IzW$*{24D6>haKzQuh6qN*bbIvNAhV}M2c0PPFOqZya93U z8jANIWJjbt;A+IUEq={8ltEWLzdWimcGfh*I74eJYgNg$H38#l8se2Cnzqp5P7AyZ zY%kugrf#NEkJKmD7PD}EffuqJu!qtxaNV@rQ65UUt**$8o!K3~zsKzvFMMvu?{+71 zCa1uKz?(XYPYXp;?qAOmo$!yde>|$y*!G%N=k#82eSPo~*Ibp*T)$o}l^n-imSB?y zn|AX8ZR`Mbq$|gjEIQ_hL!UrxCM?zsT|Lz*N7wuy>_>CyUw_+{2X6$N*Kzd|_7AcsW6ws=?tt<o8U6HAEf?N z3Ihxcx7Zd@5J%*LE`|#MjEoWWU*5W#Xdz)Ra(yz}KBHXGtMq$#!OKa3vBr#WJyunnR<8#9kof41U-<3B5q6XA2SXsi|;bp zM3LjwnMe)^L`marZs*d@Q3zqpQ>TAo=V%EWIsYUvIDkE|N3YsNdz5|Vl9wmXP%KEA zTUeTtZR%Kq#J|C-(b;<0n9&U(x?{e2OMQ|o-kcsQzLGwfYl!faHN|gx+@+7c(&jL$ zteYw|UYI0v+6*4|XqZ-!b5`1^Zv$&c8&!KY7w)kGN%g~U5J}XM(k`5a+KNw#m-|b@ zzTyp{oxnME-d&a~u{J2zmHjF-68CzPO~6sv?wwW4o17Ef-a$*EQ6>-w=L@^q5L>-I z=5}`qa^$33T%VH}z{P(0q6M9}WSGrPMT}l3yAmQ`GBGNYXysN`pZ}L8Yc|$Uei{lh zr*bvI9l(ndt@YSK`*olVtqmARg$Cwk&z@8hEu*U=vDIMkj3IxtboOA(`R~b{*RTCB z*Sg&CiOuxBMsS=gyM`>>kW|{0sjg8~K?oo{%yP-D3JQ=c8XdJ7ldC{6yENDvSrI=s z*h>$X36+WB9ah(6RCI2}-?Uqyj=n)=7Ox<8*8XHKn^Byl`cJXjCyXOm`A1cme5LHs z2i{eMsxo%E9!{pRoh$+%f!>^MrX05SSI+h`3Rx~bmEJXHRqf-!$J`fd}4 zLFW?i{T--h#jmQEKX!x6Q+7nPKcLo)?#8$MGnSc&bzcKDnDVSC4`-Q2O~EmaJ>2Wc z2e~Qquo|S3J$iPsl+SuZQ8Mb?H@#hW&0VSm$x{FN1PlX!tB~yo!@!>q{3%vkd>wF_nAYe*3h! zJV{4GRSe*Au4UI@8#&@^f)%I*AKVz zHfehL+_g;L7%*LAw&KtL!7q*O!7js}Q_6rTj<0oW+lYj#uTu&s>~j{vl(_Syd`X2j{c+JuKy`9DqrcJ4q8r%?}cxsml?g$qyfH|~EA7R)a+ zAxXs)LzRuAwl?7vCq5;%O5}UHhAjw>aPRY$?pKbxT0@ek#Or` z{F<^(ey;ss&L1%!n2f86Q{sJ~k$0VGq6C6*f?Rl)>e`9mIVn_^r8Ju)5sKfuY{*q*L&21vxQdikOa7)N_#KGVcM5erS8N z^Re5OoFao0UM;g;*0%Rg_szKeU-p8BY&CDOx0Hy@dTo4^3k(5pQ^rX2xBav`OfT!b zREf3_@R(>vl>g>qh`#&!HgR) zB9?E3UAekb9Lgge>Ps~ouH+_n96WAPu7K37W>wNdpc3>q(b|a@nC+&Dd?nk14Ib8L zX9y{&P>LX6W8r z65Z(!g!=G41b%a_m3#gXCi}_u$#5uxXYR++t zJ>w}&(ywg`QITs-ShU`h(x^*2{+c4$HMlU>==p|wy8?_)nwKl+{K{gr(lP~o>o|B2&q4S4szewkm*#{U-c+fcgKf`uCR5xu7hocz93V8i zuidB1b*g+0J#T4fd}Zipi0_)FYQgf&J3!0+b?r?xjtXk-z{08LG=7$Q8E_+H^iXpQ zEJzWAVE_WZr$LLVPf~EIufyU3s3-vaWrDSk%pL&SAI5T59fPZn zMe6f9UIs?PS+fRbN~_(O>^ln_rXUta0bi}2Q7tpw^v2S>oP(Ea9a(r&>CPZxaO#Wz z=ow4+Vu8~cky^h2wZAh2b%or3s?k3N<>@~sDW9ZydB#7Uns+CJUH;1CXF<`RYS^r( zb5erKj#Y<6hKVg{=p0oyA7e*|zhDXx^o03B;aZH@1(gZ z=fz8*eu&!$&fqx35Wc=Y?S*OFU5MHM&By(viOteUg}{nuDY`b})qAWV2DUvrTM}|* z`aUPOALO;^QHk0R zZG$@fs{M^=@rk*<)0I5_K1{}~P|0S)(|NZJTT&&n2lALqdm=Pq4_xj0(pvqE)T#rU z)Qn<##xWy~X`>xf9WE~HP*KjV0N zX=C6MHU-5EQ0DgNgh(gPe3cvMoxmjehx%=Q;{IIHCi-ZjSJq4)Nz zF~yCe{kGqvNLPg3UCC>nzV*D#W?;2Vm_pjF?(oCpmQ|t;vL);#JtUoZi5sw(IH$Le2vkc>p<7@%!&Mz-XzE+@ka-}|j-)JGppT23>?RI>YZ$pW} zfFz{^YoO4I42)j7PQ1(f;QiOvVXh+bW&(N@E5OyS2G|+89XQ60olD$1X7zu5A1G5h zmW7P0Y`{3Pp0vCs-OTz``KXpj=H@Rz$?|{gf(Mr#^B~+i76MIIHz-B8xluLdmVtT8 zSe|w;T?>r3{HrocJ?@jeZlcuyTQmBpW8+hr1NkmZsu`TAX(Z3QegY;O&=@)FVWvCI zW1eLY?LcI?nk9*tlJnKNo>ElPF^qQGGLPI1=yT;XH$+>T1 z0?W!z(!$Q=Qzb63Ymo38Pz{T5bSs^H3ofAfOQqa~I+v7`m#fe9JDtoKDInhH%jNkg zps(jd+MGxJ(m(-+f^un$e5<5WOPnDv9~MK%L7zMXJ50Op%u2kdKXSC8Z?qk#+kM-W z5}e$&&%;`yz0>UHe~KO2S1&JUVX-(VMbNpuv`9s*stbv`R%%IhdGev+e* zXPCs0=ouwG!aQhFFD5r9XZ_NwigKV)NpvWh)3b#$yDyQVMR58x}B2~lxyN546>b2e0?8V@gX zvHCBuGla?y+Wz$!k9Fz~3_WjNQl9F&8PR5aHdlPSZ10P_s|(P+`rj4bzs)s_|5w}i zoQD30e=EIl6lmB};B##QtuF0F!I(3`(dH&JTz~@cvmln4rgCkXUw^C$O`U%5Lp(d- zw#yfE%EK$h$)KuhO8ufOoO3}4Pe1JuiFlv2ZOmrUZLRs82Sw!QK>(=9F` z(dWlrq!`MHv05gaVGd2vwGI35{%aN3^rQ~yGAOkeqLRmv@g-`Ao|XH>NAF!s1v*gN zN^z2ZjD0IkNb&G&DMq&7V@*X2;3u`2{WF)+fcM7u=M4QVZN2B*F|U z+nxQc3~Q^BecH>XJ8FuPW&YwHj6I(y4>>YQxG?j-L}0P zg7mPBOutuHYb{5KKX@Cr6mKI(9zMJKpf*#`qkFb z4Sy;kItK zJ$oqfYf}ui9^IJoV?pRO)F9jTleYtX9Q0jmkg!R=zJBbKwJqn3tUoVT8jcxv!7pzb zs%6fYI%v)hC23qb<${tCT%?{Rxv90TNVC%fKRNbcJA*%3k_%mTRTYv4Zr$w_?(C^* zPXpcd$qS_F9&^@`oB<@_9};(4UCGHu;aG8KrXw^?&#;SJV|?B43eKmi7(XEj>4<;7 zrYMx5XozGu-7HCzKH8nyQfrH)AUlu^#+@+EpzuyInOy6JzwnX3K|+*%TBG-KJjsSG zau&ux>fM~5FV8jPMn4E=%Jybk6C{^Y*k`VTSwvdBht)`<=iiQC1S>*oo>4WUs1mlJ zSnsfyq|Lhvh+P$R_eK#6a-vEj%Pm5@S$a)dy03I$$Mxr)<&g5$hCNlC;v?4=V9cqx zu!{HRZegJ1P`oWSkl{8$cBD1BiLrcKYb^DRsKhMe8G*3u7Y(z2X=p_b%~F@M4~0Wc zdayG{R0Ut*Tj?e%=OQOIWo&h}ADEyZ(94NM^#hn$Kzs8a>rA|FrG3aL?xVZ@bgfd+eWLk3ar=6+-gq>CR-{}S$$7(7eo9FK5ZHc>O)h&t|On)aWzHWQGeAPjcbba1< zSR#%_xcM#1V&88~udo5x7uvm#Wh=Iu3Hzm;;EU~qy{1%CY!*mbUi>i8r49Q{cP@1C5rnb%iC+y%X5NwKYC*ATB3Zw zne;#x>J+<7;$g3S3jh-w6yDrA0Xxpzs?I|JA;Do8o>l84Cm(IXfHkaYDGR?!|Dvwp zou+&@dZ(+#zLT{`sMc04hUeP#_*gRkWlE_QsUfNoZb`@v4=i3aJ*?m5{1f#(N$A3* z+l661J?2inN;iJy?1ORpPhYBNtQ|G}{7>(QWj{X#Aom*1xAJ!=8>P(+&xdkLT9=G_ zyte+`)J?Wd;W}SZ91L+(uKZDSc_z zOF$G7XW2^92-C8l@w_La3d>shU!Gv4cEIB0LklNGJpO)uJVLUSE@~B<{1?@)1})vE zj1qVQ?I{6%rK?R6xq<+0;7-bEzm_rtfUJ3Ez6o%(Ey-nJU%-jaryN2@4UMscO>I=ua}gACL zoRLU8L%!b;!sK6q^_{*A_I%mUKg z*vj0{2SI`Z*2YV5o?@Ufaj)sqlNX05$#HNfQcP8YDovRPy#$j+aQ&V_x~}HZw`3T! zX6Tv)hZL{Awzqs7s{$=62%Z_97HZC2aBTu7&mU@rhVW0ub+xg_uQXM6$de*7d;^9H ze@(6`yo7VJm-6PM?QJVB$R&XAh>{Tv4{#KID4alwXbVT_ zUM=;3zzRE7o+ImRj>KHU@b<#<*3z5#X@3mjqMgE|w?@=fng?5as2&czge2BA>=jjx zkn+w#itZEKjpjzGMjBsn@l5um^`!`@v|pMsHED$&G9T}t!z%b1Yy!;>LpNQHHwop3 z+78paEy?f9%>#!&RZGYA9ZzA7Dh_j*h)I!H4pl{>1|J+W4rfvi=c*(1yJvNyo7`eo z`!{D6_6B04a!*6`7X|;n){9Tk!3w?2H2<2xJPl>2a4 zh{2>H55*DCjPxOgm3`y+AgoIs&$7)`6d@$(jWOz%0e>_KE_=RsCI<$~ch9gHJQ=L| zOmE-w^OB@!-6bC{RDhRcCcAKdXI+v|Mntz&y`HzojO?Q(I>Ocq^a4yIKHD*k1$`3vJy^>+F9ks(S| zqLE6EbeJ%XNUUlI^+Av&VJJ}!dp;;!Z(PAWP&qVnY(&MsCUV|9Z=GCodK9!NDlK+- zae`|?BK&SbaJ53yNnHz%M}rw7Ev4KR8e*vXIMJyNJ>^sChU0e`s}^8*!QYSZEe^lk zce^RuKU;|o{Isro10Oyd5&xF~6I2@?h;$U}E1%uB(hc=S*=VcT)mGJqfn< zpepHE%Z8thZR03UV*Thw0OK`HnB+TYPqk6N14Vux%~ag+K*&_CV!+}(!mUS29Omk& z{He|S7#|2Vs7E!v!@si)u>t#~qh6}9thXe+gBwznjtxl{UJ*}NI>1*pTf~VxpHzK# zPisU9OXbvs8z!8Z0W9nDreN#9LDp5N!f2aAXQs9n)5}L3>n9|BGYa9;45j%&t5vl; z@|r;?Q9I)iRgL_rOf!Hj{lgEZtfPgSAcCo@8rp)SDx#fSpPw<>0;RgU;W@%pwTT*x z6drI((YkQ#k5_ zlkK`irb+2sx2Nc(7M8ucTt5Q5F{02rQU1CRI3BjMNA17}-%>W4{7aLD1>5fbr064m z9rQ{E5@XP_(IhvMwYxt)YZb2GUOLGds25+zA9eS}uYzbtYC9%&3?RJkQgl_jv;7$A zk0q(1aII~H^3yxpQHf|MBTFdOq$y@7$~9D3DIml^CFGlSH97xno=gwd$G1aiDifMg zJDr>5;^|DLb`_X5OYG8#6)tDyH1H5Vo4iw!N0nbSq2N2aj&N~0br49Im3y6*PpN>N zy`9anqB85LM~(j5h#VJCeR0zpXMdWC>Wp@)(_Up0JEwruj0pAhvmH=``?|ZyIBu(>~Y?E@&8d za&$rtDTclFL_TjdV!VI^hH>II942@LMvcNs5{GXa7OhEELTYR2e{&9h==NcLCsTC= zMyJ0I0}?>%NykD!lcdv_bG81!>{!nhJyzwP&A7f?V4E#h0~WaF(wrHq%bjz;^1ZuO zM(`4MsHXO#=P5q+FiJDF_tU-RvH*)?wv4$-xDOEwJev8yc$ELju_;N*u(fS;s~}^& zEdRHyTb+$AR1%vZU&LKtXDAl@XsWn5Nb7b)n4@S9pqNaC^fsxE9@7I*f?b1}?H_e> zo{Aj@j8Z9B&vE}LdX%1>O2z$D7hr9rWGzY zw`VthQwUexC#V)oct$sFPU`AP;mab6c< z&UQmSI#{iw+PHO^ba8yvs=TzxZi$s;aWo;%EB(`#0xbnhD-EUHps9CB$!n-z&mP*g9;U@hZi=_bY;n5&;3?-H`Nl zYnS{A)VdeOaS;>!@=#F39>kOP`-?kKy0N}de&X<7{2{~oW?n|dfz{JMT@2xp%K?JM zz=D5}5qY(1$BLA2x|lx`l^6y=-E50I{a5}yNu~+=!CBUb;Sk~P--vew3r=!pet#DH zE}e+@QV^R~Yad;YIshd0R}ueh0)YR2h~@e>^8(<@4FgH&XxL=nxpl z0511@r;?0TEvm>Jn`b~*boswj`~S2bl4cVCGf_ZNOfJg^nt>S_Bw9;ijKV;;7jjJ6 zi&oQdb+>+18KAvC-@ku8`usbmr03Q0lvdKEHg>rBxT<&homGa?!~42^p%=0}+Wadx zGJS%*;a_efy*PBb8Jn+SI(6AnL;Ugj=wWF9B|+yPDWtlELhdCSkXn7JO6V#5n zpuyv(UYl_3s!SGmo;!O*zODcy(rwdQunBUJDa?l5$Dx>D9HuS_kcVkj137GhqdJ<5 z<2<}96f^vWs%LENrdsZIow;12m}OOVMd#0nN+MFAIsDX|1{4I9P)_X{t?P)aX#%{(*rTQH^ILG*=sx0BseiHjK zf~AebjtQ0=FRmsV=gA){m})b=BhA=7obYloEaTGao7wD8_n{xqxGbeA9zmYxMFLgORw9Cl;#dx68{Je@3H(Ue(%wGJsdD$7 zo-Urql*%cYf&|V!uV*ioO4suYw^bSN>JwyMy??fOmJQL%jg13BWK5+nYa!svLCw13 z8+-K5Iw|(D<|GLw?FzeZZ*JGtO$jA$gmw*iU!DG%=S@kT$Fc<>K@{VFqM2xCl4A5; zHpBh*g-CV$Djp*INak&JChNi-9VMl2mB>U5-i*247>0%ER&puCnP3mL3E}afd2Qwz zQfeC`oLmSg+&LXjS)H-zat_qJ{eG?NWlC21!3S{vW#a{?EeiL&KR(-JVS`Kh_)<4~ z6SLyF_#=?)OW~O3k2;kYKlYm+5I2z2S<|l_5wL;-D92paL_A11d2ph(?@z~%`TmAP z{?tWDarTa#yzL^STaK(IFgX{b1Dp-Y4sT%aCl!#F>jk#0W*at#Em?R4z%JR>pfEbq zkm;S;?-X-3I^+9OGzYnk5>?3~ zt=OW|!>Qw6#DJhIK|UOdv_>FtHVIF+PAx^?6la)Chq^Kl?1swU+zd-*ZtG9n z(fiDM-{86oJmbPbgML0bgtLcD-z;YoKe4yyS>0MfbvvOu-=AvJ(2$dc6_?y9M?k-~ zXm4}OFNMvuk?gCIOB@`a4X0;c&)}E3@Jlhmi3bmH6VA}=3aU<;r?5d(Ft@OF{iU>+ z1G(^Za3mfX-^SzaAVW&(^1L=weXKR!Q!1Pn#SWa&9Xtl&wilm6GoRN73ps^*g+fjm|M6dX*ABVL!{Q86q|r#2<}H3+Zia=w$fGsy1BH z*{Ks+XH8K>U!g<8l__ z%UStEFd)IfSoD}KCP}6|sCcIqa0oIR?c3Nf!n^Ng>l>{N0IR^)@|ZstH~uSQ-nauC z3p6}bt#a>CoL%Xnq^i)r{C@>NbIiOL>ueGi;^XlttG#PIcpLPy3K;o5yF0++G%+#y~5BLOQrb zBA^S#em)R2VDMw#X-tyu`2UYuI%68450VNZHmZI%^(i_0?flYF)BV9%DML7R2 z(#|`msdjDmC?YB#(wh*KCWN9?={A}OL6F`=L3pO|yG_>bVi!bQS!xStsEsbd$Gj&` zsqB-$jmHp&+>J{(ruj)$oj)5JU)2(B2z-70jYI1>aj7$v1F@t}$%x*M;nJgEBIITv zO+$TK15nvvTiqb9pH4FOY|nnk)ybLDzf-5=B(JD-X{z?#<|cArX;W6U+HwP?Drt7? zfZxfr*s7Xs2>eCW_&Uo76q1b7Fr70^8pTwPLpN$r2{m~80luz<7rK{hWV=-Xe_Qrj zRp#Y45z>&JdHww9$J%a3C7rWpc7=@q#vQAs*83UV1uC=65XLnmy=T~Vd2H)us|uL? zIxgZw+wOu@mp1Ql1zl(ImmPJ!!|{9#L8%cH6ReZ88)9dCTj+)?;{ejj3$Rd%K%drQ zqeV2HUQxPUrSvstb2XT-K0C)IN&*zLfM3@}h$Ym?_-BP!woPrM^^w=-FZ_kr!P)(N zUZ3nYW6<_bW)};6uPCzd92|rZ6i_$%CKrFq0CB&%$?lVHd%Y}M%%aQ>wu(?j2hDLU z%*cmiX{0*E>c#s({QTH;P62M-mu)AMYlDt#W~hYr;1nGBs6B9xE*#n3pw~39IU#H2e)>z}`g;19 z`){jvOwJO%acWbBCxHkHgV_Q+sSpodo&C|D11W7*b?3t^euhs|*>8O(!w|zLXH0xR3tuz&BF+|x z4%Uk%IVc*AY|!*ED{THgWwsDEnAFgc_m|~t(VUi{pXFWKd9tR0yD-$m07*55cAbuwPy?v~_bX6x6ZLYa9xPipLx^n`pGM#1+CCn_-|qeqS2tUJk49+> zR%)v88wF&s=XRPmyl=nGm*n5%+u!Qzh8zVQPX5@SivnS(9LmklA5i3@mWFJJe%?&B zHj~o>njFou(Y5u;HtALgGv*f+3Zz9pH=gb{Wl&ryKT<^^>!`KGh*gXFVSj^~RIZh* z4^#GtS61V4*`Hd2pck+GA^ln&du7w=R}c(tZr2Mm;(N39sQDNtOS@c#_&_jk8unfo zrQO4}2&LMOtRvM*CZX}~mxGh~o`=eK>2J#Qw=VXAHS=#I8%YkLK{W%>{yO6`1A8%F zhP}LGFk=94>rY{XVG%xy45dsIuKb>koK6$$7u!n6Qw->L|72q6i=MW6w=U5*Tb%3O z^Ln&^e|NG^*Eh@v^JzOE_UJk?n1JLXIeYYPr7QA6i`ld*3O9oDCZJU9o$W8Xf1 z=30eQ`IcsV)q2oXX2a0c;v5p!j;h-DH1C~Cm|<;7Q-&}gK%M(Dk|W+Jjits+(_S%ZY;KzY6qCYQba zlO5UEaDBT8e+m4N~wW{0gd6~Uq+kL{Yt*v8GlVxQL3JuPiX;k?9 zGGDW=Z}DjQo{7|73_E)bY@^Y~ShD21^*I4`xBB7rHGUgca?wYoN5ob`=hd$F?5^(uO$CnVZ> zMqGmF&CPC^LA0A}L|&zLc%gycG^Ddd6#uiPT<*wV(C?E(l@VNUY|mX1^aSBKL@dOG zxEnVPC>5P#2z;Jb`LPHtyGqUI-$Vhkd#X!2jg71dA%8%0(u_%Pr*5k-b?btWrLp8U zvaBk<$DI>2SYQSPslAeyB#bya7SfUZM|-yhl^ujkhIUbLB9bG;Kjl0n2RGzF#tjb2 zO1}V4C8-A8T2`d(@FTpq4u=l7q5?J26>!2_%`f*}ro#9Ac0;F^ikeZvbb3o-m9}K; z-p%y>B|68kB#Aw4XMh!({mI5&C}@polmz1&a&(yNYiP}I`H{S6%-b8cUuVOhymMEb zJ!K9HId7+(;rd=LVn_+gciq18DKq+m6i?T8UQH(F!5H1(Xl|u~TDji_1f>b~aJDahA(rYMJl==G$73SO>bFvchk4N8}wkQ*O}F zUSB5Da@$~KUiNho#wGAbiYf<`2$>@MEtJzZEo}aKk6e+Kz^q@rf#=J0CM0vdV>^7y zqMM4M^iO$A^2#P8;30#ydW8kzV!O6!L-Y=>1dmfcksCO~# zPAVy&9w4Sn6k$tBJ=)l$)jUbn!`^FG&=X?>LzQ1TuoS7Z{H-YIA>j&v*`4#%yKpds z;8!}$Wf|_}>3`-4t}ec1E$x1hFr-@Q(nzn71f@5 zy^3;$`pUXxs3ync$Zog>98*K@s~+{geyyP~sS_^TtC*b~!|`3CEm@H}*@xc*Hj zX|<h1jX!;n6i(<3SDB zT^24;S9c^odErfYzKsj6E=J(C^StyB^Wjj!kn)on$Y+%Dha+@i&vaUPgst4z0m=yz zfSe{l#zVe}TqQqoWNyZfkSb#h2{r!dQqEjKBA5L`GR5;Dk@UeaC4# z-U?UR^cTDSS!sxg{qlo|H4Y0#RrA`L12>s@o+d=CmD&Ai1Q-wo|6zXxKubnIG6E_A z#7DCl(^=0J7UY`hEQXG4>CDN=6+3-Y-eE%?A1R`WY4YAYcm)K;hM@dz@4DlPD!X^8 zv-jfFLsRCTN`M(0c>Vo9KdApK$K-Ff42FTs4g%3-*zLT}=h4D_b&5ic5zOH?041e# zsvU?ej}{xCQ^XK*{14r%zd066L8#8zXj`CWIonALwR+GrBr;%HIVvmfsrkwW9#mqI zsj?+K)u}1R_Mr8A`Es36JHm{#kEC~CqL7sRLGyww2l^D%_Ek0?*Q;|CF@V(!$o z{6rCj#w2U&D?`fNAe<2C#Ckc;;*%C3pMZsYvg3!?qmCq(b-}B_rCRvA<=#eqzqp{& z-hVNi-rsG(X@-#8TFd1D?1dkQRlE5!)fd9%Wb2`#dT2f=yI{p@@Lizq2Or0UJ2_uF zp6|?&x9LCj4uN#B5R!bNvazoa%e3~Sb^1!r1bqzLn+>jd4Aam+Y+uB3@URPk!3ODN zag+MPN*1@h6nr68f!iK^w6WZ%!m>=5e0reK(8f})y8K!ZFxHsYa1lyg5;A z#{M6_WqEp|eEqhIw3<6EjO%;IE>yd4#pS2m+3yIad-M;Zp0J;@wu82CWp-(cwon5L z9Cbt7h%AZOZbKhn&{Jb%CHzyqp^4V3Rw*+^#Yu1r=?Aw7V>=J}H}c>ucA;a#)uSH2 z4($%kSQN8a8 z^FLXHNWbRi9RN?=VX9huHpX#zJwxEGmlyGx&YN@T&q}}%O}pPn4HMFqX%GIS8x4Zx zznWQj0S#8t?C(kK=XraMRJXv7Ko3%0a4#e^W#F za?z6nmG2Y2>+*Zghdf)vp|c$R5Z=`+lDld{OhMstRunpY61uORWpwekRA<$!rn6** zON?D+g7PDt)8F=vd2~4fY5@g}@LvpHfyBNx3GgPguaD54`;dg)3`S~& zjHS7cPN6@dalzsvxB%6k2iUC}xe~b#rTc#x3RQjQdZzC~ZYNsikOv@RrXB?Pl`%~t z%@Iqe|`e!5-9%HC@R)n{M|Oj{H*-XS?=Q^tzp1i>D!Cu(Sbd z!S(Fv)IcfxNa>GyV3JUWtxlryv7%x9h^%tR^!W+Wj0VfJUeDG1l%OZP07Uvk6o-Iw z3i0ym_p?H$pUoN!-jnNJMNw60ySoIxgin(4iHC#o-^KqR_B$XEVO-R=r4_Xp`^Tiys*wQ=`9L)v{CY=#W+3& zy6mYF@Tc(8{5l?>dz@Vc5|z~@J3xHUhLAsb6=q*k$|vX4g1?Qw017!p?-gn?4_t?UA?ZDP1Hnn!QeSj|K&dEd$e!Ae~nE z@#xygk74Sx$D{tqcHOqcC9b8m5R~}mX9J`B z#&)2uAH%MZ)Q~O}2#<+*AliPj+;6NZYv{0l?UR4jtZ8jyoI#_3VZp<+JJ+To!#8#w z`hsnzz4uFXn%$2+j2cQkmn<*e*TB>_R&>9iDN~J!sAzpBCl;;mi5;ph9eXcs$s}^w zS=%lT7T%S{wz3sI*_7!_6#jLI-Q+{U&~x9wR|-+w79VPWAxYu;|F;PgU~90)70Uzt zd_JTs#o_w-43ds~+u{5(Zh=DiB73#@4g2bwhFWsWMWG=3zzz@-6vct$Do229WYAfC zW$5)QoFWp=TlbC^?OAhEQF57J5Kr#Bc*i~yxE9_kdcPvEqsX&dX4gr_{e>Bp26j>txSYPA|U-FxPj zh{|{061Dlr7wqo=(V%{^j(hU+97bYs&il66PLgn_8Ik$;*|02T-er9+Lu6-jZD1mI z8!(|qrM707pkj~s9*p<^VY&3->Ve~}tBeBx6J%fl-#%N-gast0XEUNlg1r+wYj2d* z+W9MV!am!!iOjIXeVr=xY2^6U_@yWCs(l^qNSNk8b)|ra+G)U@R8>`P$((agH6Gkh z7KJJCn$6tuOq4M-RL_4qe4^0RtiU&?`x!>|xEPqRV3Kue<=dkGxg;}*Ifl1?W>5I` z*)mP}P^b@2hxDIwO%2mM#B_bj(~7OTC!4u|=~CDY8Ur=t15$|$iK2;?xr=~a+~REg z?6_>D0BRO1!?*?t^@7tk?#Hok`l_2U|MIgMfK%ol0KOmE>w#EpaqK5!6Z(j=BFOR0x<|93?Ax{S zjVISym3#89>x(6nx#)X>Z&*s755QhSiD&~ZxYk<)lK#4I2$B6XO?~7&g^+@;^eb)F zrawuU)eDtek2TMNzTmu%U6xpQzzvreGhcjn^2E`d|6|SlT?CZ|CrAcL$db?Qbh7Tu-;* z&l!-Zm}*K_lUoaVDwcJyz4w^H9u+30TY;&-7%H?5QNtLGT5{)=GZ|Li(=E0$!nMx=<^AD4&%jrA}AmB_Mzc{Wk2yza5w z%V5?9;dl3d0oE_g-%iSd_eJjATGYNJ!xw#R-fX;wcC(XIxohBu@Fpe_K85cB zHFjQxb6Mnqj&fcki08P@){WHwU2l2p0KdcJNfZ%4&*s>!hhUaa1YQ=H78;^*lufuI1G-l zg-rwEQ)`1g!7|3AGn?=%wKlRsbk9YG9(|sb*QU(iBca)05s(^qsP2p>|)LIB3EYd4o`w*25PK)}WqxT$%_=qgwY&#L9$ewOvp1 zdkHJK zT*R-;RSz5`=hzb!S6Z%Q5>q>1+~lQH&pB0)tChUlr-}S?ga*$aC(suRwnZ-)FvWDzBE>=0asB$6ED@f z52@6j?{xOP{qnSNa5RE>9biI>tr`GHp95d>4l|&B45&8!BXiWCCfSY7Yn%EPgQDL* zUGd-CF=c-7PnZAgFZypSz0h&fNkX0fi@|+XBy31fwH<#NzdR>g! zf1&aVdGiOsvr=R6mZg*Mz#H<+RV+yqn!T^&W^(A4cDTof?5K{>9d}hB35r}Ro7;50i)AN>%!ol;IBGQ zHV=U31GOiC2>FY__@^l|e(>LcG&(u}Eto_gbSESbnm?1B?9`E!rG!=&dCNCZt5IWK zn{)ZpsdxyRQu#$Gnh7}C={(Ypnt8Oz4+E14cU~1|=Bqn+Y{?h(mq_#H5BSx_`Yx>3 zYYH;#dJEDFsG(%icV!TW`pSg7-c;fVNBQ&MvpVKv9_umvN@uV*_3FiG*pJwCwqlRJ z7`84UBs;^dF>ic_6=HL|=*!Q`w4%=A*F~$22+nhP5qT^vA~Px&B8L5I!;beT({j9MxvQjm(@ zdw={|Ta`YhtwL65q$sxK3PRWravHPL*EWcTLp5)SCIo+GJ)ChN)$@c6PoRpg*lqCc z?F5DcW@2Y%k~TB-Dd-FWJjYa=_TlRtArvc2g-a=gTPm&ZaQU~*8B^ADwWnXFMyK;8 zblTJ*pbJXu90*ZRu!EgJPC3`{(duRYCwXM4ZtOGIAN8w@*l`?$KmNFw7?`gy&hQoR(z zhoA#DDMY`4>!p`LPn}YoSn!A{`Oehyy89VXf~fdQNr7f97ReNb&>?IEs%a_W#EvV^ zR|F#|Fj8B>X4;-=M*Z$n{OuCHDpwWT^5tFfjPZ0?zH2n)+xdcLi-z`sn}7aY1PXBK zJ)H@hs@gkH>_sAu@$-eRI5hi?b;oNm`DHCeLH9S98mgvkBhxzjs*QLRPX9IwwkiWMe{J;>fl)D{^yWJUXhU<2 zRlv}vZwR-We-OK;Oixb(%_0Dvm(XPX9wFME6`QE}0D%^?%w#e4QCx_&SY!D9)Fs-& z)aFgJso}|{zw;%+k@~>O=bl8usqIh4aM;O#m?j;$bMBTyQcg7{?=wP8{3QFr?w&!$ z4IC2CELUI6cXtez_akQ+Xg5X#ly)t(Ez3zlkIi7Q!Xj+S+uS!7gz`mqBP1{-|C-&~ z*K!pp|1(VL&vj_lyK3kJI_Fx`P_3N;=h6L^n|A|M`fr_hA#P*MoyPLt(-fApxd3`^ zhi%#Z?D;TBU8cNL!Jw1 zkOKwnsZqK9VlXS0Yo<3b?xFu;NcS&9{aTuX9N(*HVAwwd^L1#8lJ}$h?C_k3>W8(1 zeu<}MeS$*N?d)#9W%Nt$vEY6Zo(^QE3reoDlNmcc+#wFc=kkx(&ok5P z%zM49MNg%w3u%$P*C*;V%}h4Fi6pG;34%G>0np>9ax$cS;^`+?;Ai(34iuF2yVza~ zQS;kf$|qUSn>+sQJ& z84;)T?M9lEOIFZ0^_G+`TI=u3MW<}bzda2vj^m`n->$s<^)$o$4JD@J2C$;VSPlH# zwA^m*QK+niD$`` zvK4t82XdQyFV~(kHKNM4FY?0_yVUdITGSAwrd0E}?D3jZrawbMC~g?KioZh6jeoje zd8^`_Hv6G#+q*XQ3;`}hC7rv}!1f0AC_gYeE5Zp9d2dLm4qzUSjh`}Y=XN<4m-vE# z`$P{?i)sgO;bYJ^BjRe1#E7ygFyF~pNPhkifL^95{9fGJ&?jTgL@p*<+l#|xB$e%yykTi02!8_;1mat@@o# z1FUffFBLZj{|d0c6j5;Zn@iBaT{VHEtH4nz(=K1e`g_Myxwkw!aO5&&3q-y9guK)Z z6Vvt%_u}_(y*Vur8H&{)hoqest!ETHHr##B{$aHg#%`cSE@(PML7#!}ljmUc$bcpb#01SwED;?`0hSM*tZ9pi_5Zce zr0ZR%``K>tt%xvoD7479LG#x^pm2xOgnHU}+F-&es!f&-J9LHiN@=5MwoadRGo$eC z?2$8?f?~Ps6u|Z-a%H%p)(#x!@@7&i=XD}ad(+~n2TCTbwrT=TPJuEPJp*P=Q3hhd z#Hn|TC`*xEj{A4UhcGa<_h2b!O@AOK^DoSyKT6=Zs5)1-CAp@y0Iv=_VU^Ty=Lg)PjrE?x*w3U#SL;hfm-!-Ft>pYkZ zIkSN^0AN#0bmOYB>v3&*2vOrkBStO4Pgzw@P<8f7>0Lk5yUi(n;PYuk`d6%1W(2U< z?fI%`H-P+^s@3z`^r-1OKl(fWsjCe}Z((@gxgm?~9N3|>Y8uT#>|ozfbFyK9G|hpJ zg~!EVXFA1!ILxH32|I&Kp)$y3uQUhjOg2fd#Wddtkn-tKkj57W#RX(Y^eJQ_o zs2@_!q@Q^x=JV0w!B2*33?GbUGO$Cl<@AvA#>yg2dCT7Dh1Y;g;J8pf0Y zB>v?z-1_{>0He{){+s*Pc*@=t)$QISUx{pu(}*~k>S1IPTDoRNX-6BRE# zjc;X$O^(+)b&~&r`+wRmV*E#*^S`-QZ?jXcKAJw_r2+XEe&F=02T zYUIZIqq~!N=Xyg*5%^X#&`KU))BT|S_3+(e_a$xr?sr1LYe$V|#C-L1ZqXHJmgLQ^ z!0R43S9AiPhUw{L?TarUK0FCxnQ~>T{2XPef?Q}}2R#i!E=~2g&~HK*Fn?bY;5$@O4rw9H@yLDyyzQ}D<)I3)4fziF>&eaWkdLRw%a<5|Nwe9eXQ?L;k znA)cu#FJ9_sio~G##-SJ2qm1HTTX%`hKVJ1R6{;G0Q4*m-l2h0DyT^n@(<6G?QC_) z*^e)T2ZnFqQmEZ~$y7=yLW9`rK)X4H6nL)_hvDqf}xK- z40mydqt7IFJW&hn{(T&Yr{KP#qHG;86z?`pOq_nlafnIPkxG0Z&suOXPR;0QXAN9o zQl^Moxt;lbq3*1B(7qiAgwzZ`cy8Kr3Xy^?EkWKLrSZ*a z-P`_-dv(^;XQ91pMP*EJvQwcvLNO>L&6Zu|W{=QDptcHiz&oFMZnB+zg1SUX7&2rJRYlHow;5v%vOjAnO)*lq=$hvQpwFcGB zb|;`$Wv9G*nwxZS1|^j@b)oXXE9xHjog#3sjRthIx#sepgFIO1;G*}~o_BH2G^AaY zWiN&TiVFkLq%!9NyZ&O}pz@iFXeyEp(pkQv*x$d zO(E8Lu+xYBFqTyv{(*SD4nhBclqTiEY3M7P;sP#Xn9Fk+RmGsa{C)WWR(SKsqw{sj zovR|(sGzx3K)pr(=_r(=2_+e;-oe5xg#{1UZqv0SzG+g5fOz#!oE)NkFUH3 z`b<;GhgiM$F~UAIe!m|Uc$_k*5t4C}%dVa(7pQLcc7>F7Cig?O=>f1G+VYQQ`lOa+!gxFc!x47sIc&#LZ*XTX*N?B?Y_^N*+SzE+WD>i}VaIst>|AG~q?_N}N{m8j5qJ6z*;1)500j#$S78u8s z`@HXw#}YpxQXT4zWEJn>&>Jg3Hw@l~v!-i=NJl`vVECvU?>z#8!%8TTony%`5-Luf zXTJTa2s|c}-+OIZb3Q+UPyQ-siz3sV&wXN5gq@5IpVMK5wy=|%KUNRze6-|uIaT>} zp}KN$`WHIzvCS{w%p=io4}5Sqig&}u%?fJE(V$J#2jsmm9qtLF{u>+G9n=M_=>C{T zyj6zhe(4o0IbFr|<=!t@>|wl@*=(zXHFjv3*|DNehmK88$UUf4HLu3a&0K8 z@~h2cx){VK|4RclS8VNYK@7 zL$NdFNVm{e%u~We%0I=@GA+vI^=69>f{VD{=EPwQb*jE%gW$3yXo{2G*1l=dx%fcu zP&YSI293k145muuY7C#dqY-|2Tg<{&)%me`k-$9%`4R`wzI{6k#^oM&XyN>sT^wm0 zm>7KBELn-WloXj}REoAQBq76OJ0J>6KM z(v6;OIcdyWFh3F%`YyK9oV}LOys2CkW@e|wWNC8E*T^xk(PIy9oYyZua+pX8Z12+` zc>{b;<)G(s*#Q-q>R|y8hA4bcv-?aDSPUbBc_KK}s_F#2AeP^{8`M=K!g|GT=qq_JBL`oJ0=(dKxW3MchqRdrazL-gw2q;LHp>F7Y}9~(-l%r-tx zzn`WJBe64u0q?9ZKB`lPU|2jk4pA}NE@+HPL0WxOjk`R&aS3Q=mkx|BJ*>?dZyLi| zrkyOCiW}tvUBy)CKsV1W2jJOgq4POP-(e)Sz;<7RU0?E-imap=-A0A^%mkyD>p1wD z1|f45^d+^OJua_?FIig(`ItPDNpfH|t^8T;C-fA(VElB#PeI>TJXy1@M`r_@JoH5B zn`5lnCpG#KU3w-SAFh@?-sUtEMrG z%XU`RSU-QRjqQyYP@T>6)aUN44IO60>RuR?K#`xx%#owO}lheH&b ze{l&L?s?@Tg5)|*4O65Vb>*?p94I;+>H&E62xSznhwQ2SK*8j`qL%to*KO?DgR~m7 zCff!Z4VBtdgxZSdK9rEX*C@{^L#w2~4t6fSidAH*8lgi;T(y(Y9 zZ&n1yi5y~})j8q$Ul3O56B3dj-ZEO`bUj0{{lL2^9u zTZq{UDs}%nl->y-ddZO;;MOhZob|&;t7L`=43#(WeE9Vz z%XKkhbR_VwNhLEN8EojkcU>ZFX?)_%FS~5CO(7>Z@*HQ;jgKEEy&6{i0Cjt&>xU-H z!i{|tfu@ricc|_?5jp1>CYacMf?QpL0Ef@0N`ms;~GF_DFaY!TM_3zJ=%gl$plFU1mufu&s*HWwADBF=#F zcu~xFcTlvW3K^SU;4Y|A8d6H#Fbv>TGxIe9CdrN_?Necl4&PN&4K+;GpMXwS5=}*v* zc!JI4n3b(VrW(cm%jg-YVMKk5fX$O<*{>gYi@YkN|D0v^$MXZME(nEF*sODd6p%hc z5>m~CoSM;RTC0>T+p=?RT1c>R$70EicAy(TqiwcpfWyO4s+Me#8>1;jVeg=WC>Epr zl|Ij*p8+}3c&v$CqD6Je5Mt5ILCaQ35V4o(3e5Gjtt#lITmD(GM$Hu`i@XP50{q$+SRRP&6bxBG-C*53S+#uOMmTJ-uv~-$XOJ<8EN5SQ6 z>&%4DN411qoZfEzermf;iW5uNwO$l+dmrq`#6j(H*2553wjL}bc}DlgmETvB#)bhd zB1x8_JzU$*W=GASq!I~jH)O;qGavWTSCX&RU;$X+h`ih>mX@apWBpPke(?rSVbiil z5ep~5y)7Vo7lawV*WKC2VhBE+<5FmAN41bsR-0arN>=_cJit_w)-Lf--;1Z?3Fi~v zsRtDFTZ(E&-UXTl@Q3uG;VK31p$!$$KE;S!qhw+6$cO3ubM~!1Y|Zmt2}Zh>cX)*z zTKuI|VahyU-DS+GHy&cNT7A6)g)KjZVbCquVZY!g9T7UagS#z0zFgA+>Qm%yIc60Y z$ibVggd2IO^)Ai=@}@fC)Kjg=Y-#OBy5=>ShB7P>Cw!u-vi#t4WQdflm5s zXsJ7$rxvs6%{#>Wc96c#HYEF}Rv>MV7IWN_&UpWXZoe;#5g>ilZnkZnwOK~9g`O@T z<=i=9Rmt|)?mZ=2VSLI*bf&yM`eOI>tgDM#3t7rjAGy&E!Wwfi_0Gqyd5uod`^YQ^ z;{ZM(x$K^USNkp(!q%RUr`TT&x49m_)7EsKFa}%^0RAnN&5;_?(EwPb`tF!EH8sR+ z4H=)8RS+sg$fox^d}p9E>Mjm_ENvfi^QOnNxz%g$iCHT5tDPpZjNNH);8KYh1Z`$( z=hVPX_Igl-CDiX$BvMw1pg3fZYP&J0ofVHN5pEqgE8fJ(HCvKISz{=NWJ4~GFheTi;>i{}a`##_MTpoP zPw2Q-l)M`o=?_d-V-1_~94I^oxvQo|-PmNL76-3oMa()HdTD#cm6cOGDBj793jT~( zaY`6F%O2w{usKZBx>_3B>lCH_S+-9j1;(l5c*|0rK!5?U8 zhZ_GbmxR~idg;O_gQL?4SBo$GUxg;)UnBp)x&@?G|JL}c;u-lI#0l2A`{#(UD*w!btr=T2U(UCcgk(}B#`vRS%AGuQszzX|F?7Y<5 zQZ+!7V^d4S!TiVrOTrI4+CN-k`3$2=dKa;P zw&6lP*SjsTR(;WJo$<&S5l9LsB`>w2&XwUj!jved3yN0uvW~O6RnolQ-1 zki*s(UYPmD8s0xwbUrT%<&6ptlN|yKV_b!TGnoJwpl#FK!E4{xZx{pje0uF3yePTQ zTd|MHQou~j`gr70gyGOVzF@EpjTwE8?lCyC7rb2bEmk2@$;x6FqqK9hFxr&)eA@|l zyuNsMh2W#LRR=3HPxzFq&XOa?|EN%$R%}mBtN?*r3#uCB@SRD6)`=_6c@}pE@{Ycy zHp;B-FmWuN7Kc+$>W~Nq}d6}iHnE0y@&X5-iE#*W@Gh`yt(=lFZ?Gg z&bD9s-N0j`Rx$=SAMmQAg<4C3@g(G2ysypLtH8A^++4wjK+Ca7<%8u9VSONwQeLv9 z4i^nFCt3hKlq;Htt($F3IGoecZ2fFKtqaxqJejwyMr&Pso3)|$?1xGhLnttbc5`A} zaXd%%j=;M+poqoUWJ0U>u0rqu57MH-MPmxH|&J+1W{Px5uD}+hhH~HL`nA>M;RDP=n@O=A3 zUv5Q7TdkGfz|xHyq2y+z;m`hRpXJ~q*hxqCp57(bZ9D%tZGL($inkc(k&pGS7t}Nk zH(f89w7=y;f^b32?WSQE=Y1RnjwDgv%VH=WUm35}?-h#(Rj1@YV#w^I^7!PDHm(OstL|?Xvg$Ky<^J_NAX24h42`ck*qx zgbLEtEP%+@ORxPc86uN7oU%b8NH$8~JZL?WsKY^%8pXO)T#%SwPs^>tFbSC5-s@B|q$P}WK^fYHa)UK;xGeIw& zr^9NZXnnCLKk!K8^F#m$&tNULw*evJ=P3|;He&)5c~h+2+c^!X$&x~|(3@wFN{)=@4Putxez2|>qHwy)S@TJX+m}Ww53bI#0eR^$=^l=1qfKnYW9j*h zq2i3tp!10=1Hls=%U+M(wXNeY>1uabBqPhAyThv(22rW~549yMW}+$|o4 zZ-j}0d+x;M(&;!9L8&C|JPh{-o3dU!A_k8I^1 zICcDif^W@>1olpO_^y1s2-8obRS;AlMxYk1Fm`BAAn9{AXx_Ip-Q+}9(C6UUuXz!U zVn0dbfjDi@AHkH=Q-f3bZrYhJ@djgVDbI8nxPa;EDd>eq3ZfRbwqAgLqsChZZ6ZPd zsmLMZYp~p>Ij30F!>5Vo>|kS=SvTt`CzU6iAUxPY(Tt*N$_-N{d|U?g@}gj6<0HLJ zqC6)}m#kMgp96YG!M7*tK*r2q@Y6Hfme&6JAu7W_eBpggqh@Ejv{OGCozudnQhG*T z6QmbY?dW`=@{P8E@IY>mV&fLgjD~TW7^vLIi=wHKpLf~9V>@)tQBn6ABCQ5r-N&^E z`uP}1B$+H$A1}ZzVF$GDFuVXx){wc)h&<*nk^e^8n}@UY|Lfk`>O>7S*4&zFEG=4N zCu54D#vrYkG*T2nNK4IAQG83$nw3ZmNz74WOI6Lp7>b$`V@T*(zx_P>Is2Tm_c`af zoK2B6tXFs&FE}qCP{^s3Tjutno{y05?6H-o=G9 zNJ5xAIl3dA>PnJV7KuLU%Z#DloRdFK3;tu%DR`a0B6F;}&u@>*OWa*#*~k z$@u9N1N_~_heD19cgMZ=)JLmCZ^lKS_bQg0JDRp4=1 z{ZX~kaGR!3m396DliGh)&VXJ&jePE+6qKUaBXX+6nxXQB(%Jw*@$0YSyzjp%#Argh z#6kg>ld$D+_xoiBN#4a=Q&r>b1PwSct!^2Z0ed#?QLNhpHpJSjIiX(g-B^FH5Raea zC%^m$rIRgXz^O3fms!J6X3!F7Zgx-Z)FG4NC2Bz{u3@=rc4DWMI2Fc6j*cN^x6kl^ z1#;BEYqH0;ZC1;n#Z!gmlatx?qV-Gz9~I%^aj&%Z`@V0__QM+?*&%zL`$Fldgx$2E zQ6jj;p?@&cnv~og>UV#nNxp(=Vbn5!U5jcOeqLM^4hrebbPdQwyl47;-Nj0w757B& zH`53?FM=*HCx33TZRY&I^Cq1F+s*CgwKT*AtYD^ds=`dBRIa0j{f>CrcT6`tj&Qm~ zh6**ulM~m0G+zjeom&H9=CbDr}ek9HD0l<{>faNb8{jhYputb2N?HF=9@#YOa1_diQb5y+==; z)E{SUL3gPIXAk@w_QCc&Xx%G*TETxAepi}qVVfq7IE&VT!>Y&1pSnny)Q1>0eRGXI zsEU-Y`C+-kd+EkXJ=;~Ks|&ow!%f#H7Og8N7YiHmSZu{VY|3g6>#+6r6ZpiL=G0R! zJY|*L$?KdsS2K8W?IDmr(CAQKZlke)I?6qt6_0z_z42Mq(~|SFhzD^88C57bNYv6E z`55^M36@*`I3O@!@4r0$C`;L6r}*rX9C7p-h8lwX*k#){~jvH`(weh6KDdNUypfr-`TMw(QO=y(wX z5q2y(kB18Dzc^@9XD5rA0@Vr8n$ZA+Ube-2soxSW13sI|aDUF_7;mz&n)3_0TG94@ zp{cXw0q1yfHYq)^o`%UCmYj*o{uf`aA=oiNnb;N@sd7GNw`60hknAK6@o zt*vX}hZP27`F44`=lleyPKG!fuB&7`~;*K7ok01b!Gzx4q5#EeD8`8_e+FxJ=c}%#4E@n&#_?F&?qj ziF^iP@6(S^kg>%jd->tR*=`i>1By*0nbn3`-j;F1;e|VTg3k!X)w{b_>PwcXy>+S@ zdV~!M)r6;G8T{D#ALoFAYE6+D%mJYLOb)MO%$M3O^#wEd8`<%+r4e29;HM zqa_us1xEVT!qW!loiaQAA8bqvzD*hAU=?vZ#P{vZ(M z>PwS1UlYAJG9z-kqlU--{;bj<%XI}<<;faa3lGAjkIe-8eVH$U*xWVCh=K({y=w)nacE5z?mshWvx@vs}WLAn3qD1f*Jsa{4xB{vpSa&ifZ{YQihV)L!| zq&%Ho)9$0H9i1c{m`MDIBsnjR4kr8Et%|rCPwMNA*-+SoJ3$+@jF>0mHKHA=roi_4 zry>)cy4{H@W2-jJTp^rC`cUITD!!5?;iqR1$#;LjVe~r{)K^|S{RkBoyk5gUw(YP> z=93R(FD&Qq3mOt!>k6q-Hry&97DJGY|ImHE-2`r)SJn(Sy< zHe&tb%3tWVw!zYr0{IWSCWd+gkiNeRMIjAa-g;Z3^k&Xl{L2%_(S1{6%uft)>Std~ z>pBYFrwZ2LQt6Le$M|b8KQgux0{S#qaxs33&AX~1E`)6}=jvt-`)fC%-)ob1!Ym+W zbR}vPn%dZrD@B${YEssenny8ry9UWOS(leinm#K%oOR2UjZES&ga$dM@T*AwdEvm+ zh%8&!8aMw#S4nGcxj;FH@dskd4{_w5**ryl&)_gvp~PY#O-!{Rm@A7L$0j((=kiwi z{q+6FBhGu&i)B>slQhUslV1fi_u7cRgX*&N@Sd&w!vlV|Y{6KbT+wPQ{>?qwn8y8U zvtr+VcK`PDN!DM)P-_Dm3fvCBMFEd6TROnh>XaRFdT?SR^wu2~HlX$0yNVPt8!JUB z>Y?(l88wgWY8k6&zz$vzm18=0{bHQH(2UfwnQv_;%PD2{_*B<>KOD#{{c2$LbnPN;tR&C!rw}>>QU4>du zv+q-QUISXXHGfWj%sMv5*{Uwj6!eWXr*M_$v9UW>!0B-wXpCs;8Q!-8*ALZrmEDCC zH%cmx4jpIWDNw^(_2}a*(`Zwz6V&V7*)|=(6wg7w=~w1O6wehLt<9#PWi5t&zq6O) z&46R+Wo;j`c+WasSH0%))aZIovLFS%p)V43q7A0A0|On&w6NS7!@!Ekm7_N+rBNM6 zu90nQ_;xt{SR(c1%XY>jJ%^Gea&$YKhkktkFj$h$PUEUrMmm3fLX|?R8@+h564(1x zItH^nQWgLC!c-db`J+tfRB*=Y^Zk$20}bH(SDrnuo9&vus2VTs2vKGff5r z6_@viNi2SmlujszYsy|Tx8e9{yO-Q^jDaCHLa<}5OYWf(JNVh6Bge_z`W^pnI+r4d zqLmzjZV~is(B0eXO2IfHo)AsWjCrKN)&<8hT~PAj`matNE_&Bi0`5q|M2= zuyz&sq@WTJPpZpm|EjK+_!&`oGG>_|-(;7QKW(&sL-SgtaRaA#Oh51D$$|!nt?Z9Z zb@ZFv+raZS2GB%5`tmX66U@x~}E4HNuGgxnf$3Zq3|6<;bF7IY)hM2ulBSz>_T z%wo6P8KzW4u})T5CYw~jNXMGv?LN;Ey?YI@Hq$B+JWK<;&lc}s5eZ-Dm7asR*uM+` ze;JS%R9bTT5wBGrtubUaSpt0k@-O+Z$0D+yLEC^O(!81AMs?P47 zTLm{W_Zwz`t}}YF)DD3S89BAO9%XBOThM25bSLFariyU3x;c$ zvLWJzY;fvyT7yss(C>w)N1yAb<7sLM^drE6J{ z-BI$Jm6eM_@;`X&STRC$3t~~rhZJ2O7+-eJ<6QfMJ2=832wDWJneX^eG$D| zBl)?>wU^NRm*EWgaMn0bJw!3)FN3hQlo#GkE$Y@dlCOfQXr}HSv!2-5Qs6xZQg|N- zS3wWI?HYV|gdDqclgmVK!{yTD@s`6|$ZWFMig@K}qFB_Gg@;MvkIR2miEr~~9=UIr zl3D@BrwjF_-SozBLFr01N~a3HXuDm60m~juf{{JG4OP2<+4a%e|3w!6?-g+Wx3c)e z@u#rMsJ27u&H21H5aR4Oikv!GM3_V-*B)xP8ma|3x`20TuFR+})tM4?_MefrHqMaO z9+A!J@dK5$TISt0wHcrbnCHLit1gubEoQ$1#|LrfTPHO97OwlI^LW5~o}k$7Y%r3F z%^jm#=FKGcX)*8XQq;bRa3iHDV{cl%&ujFtb?|rZ{|;77dq$#)exXRz2B789=#~+s z@mlsOj_Johu%{lII%VsxB zM#q#Vs}r;3Ntc4)M#pCPpToAj?EZ{>FIPD{oNf-lK|$c6ygrSRLuAS!K<#J^#>M}u zD^gexODT>of)b~fUi-U;6d>+*gKBEEMe5@=#Uv^?V!a(bo#n4(EPKdrizY;E(Pe3p z0Ex{#dCvjTuESG#EBQPkvqOF!?QBpz#35UbHbI=W@5=1c_-8{Z-AXUM$Bjw#{E0d( zH?GnhlSgOUhTMAXQ9&q2wG)~TbcFqNs8ZH(CqjrbUBP3~njqJC3_EBp?=m%57HoV@ zgL%Wz!3;TG($uWxt9g*?MJmjc>A7o}5aqV6qB8+n@Xu^VaUzB~97Rzvd7PT2b0A3c zk!AJxy@IbrHnY|7@4dfe`KOcIl?_D~uJM^&bY(t5>l#f|9wD38j_G}n5G}dOFhe5+ z0P&5Z)mx{n`7Lc|?EBz`Y7-R=YA9QAwQHfuT|c{S%cXf@oUFZ|Fin|Z{ei>IaYJe{eKspJhj6H zY+pI4A#H%pjwQskC=Op6-0cI|QiK}=gIPnyek>DJM48=( zjIl;jz!vp1Z#0QEiB^2XQn0F6X*WF$zNqjl-k7GgA6_$gHsvpaPqGvTz&WnG`4z&t zhl(S7DQWL#MT9LeJ2)M*pYV^Oh1ZpEA(K|v5wWC&rwXDOHf;t^c$hj~8JsQ!v?QGk z#f6D=`h#-)Pqv1V1)6v}$>ez!i-#g^sy^V!riP8k4}oKBg7IRt_odBJMzy+o&lYcw z0#^(O**armyir#6@B}he`E55(AnaFOb%gG+uG-pq4sd1B z(gWt>tf|wKUd>3c1l0-KK!&hSaW*BfQm;EwzMYZ1-cz0O_MRZSZrEdlz+B*l&>R3y zBJoDQoMnML0W{WG zj_jCNf{>iOI|di~g(eLRlAiOWT4L|9zrAt$TKKXU)^l@WvL!bddnmm&dh+O}_n=|G z*k(L^D!l>xW1fD8(!KAR*{OYlBAHk*ZtJzbuLB*~yR+d|148Q<1-$Cx{!P*6UTiL} z(hCU^H<%zBxbyuO)p?Ey4-UkInqI*ue;&Pw~c0aob&+t30`?jWxN_n@$N` zpN4CLUOxT9r`*0IkT*WIpxXEe5&yNX)U)OCfcLulMQHI_L+4C3s!X8(UTW9R9oZ)9 zks@+!)MLF;ygz&UFGKkQho#pvCA!6zdf{78n9L9a!udzNw7Q-mS&!iz+KnlRUC6c` z9<)t(Gi^i>wJY>s(37)i_r^FL{GXs?Oqs`uG(8@Rxr0h1eThrIOX_!(6U^=7)F+pHbPRdNPge z6+|#h$gw0YOi(S_AML$5+o_HuLwVI66T$81wM_ozoF6dm+CDKo$%}s8=1K}&7hl~q zWt(T4h}eHKtm*GsVTdY(s;Vo-)Czg^SdXbVC=A=K7kM``V+ zC&Ud)*`MMOWaXGSEV@R6#9kr$R87CMp|yrnW>Nk0eI9{R$^s* z#i}B#ff;%S8I!w5&xYVk8I8}@*x#NwPZYi>%Tl$eY2Afl&^$v~qLF6XA?#~MlF5ZY zoPY&zhZl4guMV1`5ygytww_{u-H zFrj!uYMS3iucINaRAc$2G(TrJ3?2kKoAp(k*N8Hym?k#$&?)8px3@A8?>Grtz^9-M549nGHLFq0+SM`uDS`LZQGS`EWGg*m%Au;$crJ8S78x;Wwow&DEux671gOgi z;7Lt`zAEQe7a1X{E>06gMn8K(fr0FIf+aU>kD%{vH{iH*5U^{aQ;^m&v(Zp6g7jI? zi4Zv>Rx{dU$jGmGuw;YIG#y-OY<}-#s_ZPt!w%9A_fRwVs`~M((^>NolxOm5JJpi> z73&s7tUKjwbIx?dufj2&cz7wU_l~#1Cw)8)lyUgf^LK*Ll%5U6(GrlgTjZ%TNUbu2 zTH9}Xgcms9q^xW;mt)uoS{E)(3@aG(OYzUD{Q=>|WmKVU*Ks0xw?8>Szh; zK3_1u#&Vh^;A9yx_Ok9--H`k|wn=CF$oT=ZO#haTcZ{j{Sr@n2cZXhOvfr<7_#dF` zX1%kUxi)&H0&8en$DZ}OEr~P_B<}ggx;jV3f{T@>rvokxU)P&FQ zxqN^fzS31-(0IqL>rWipu%zjD@YqR~pcZ5SO8D7)FP@=EU9BlYr|qEon~NI@DKHrQ zN0(cjQkNjN9G`*6b?7YXi3SkG+#|{M10BkWF=1o#I#<@LF#drdFmE|5$c9 zAB7J$!U?OgOZ;;F)rE%2j3~`lZ6GsO`wYO%;K$(U6i%$ z$*;WgTXY|__HrHeiiRmpd%L&tm0>+&0V%aL#O`1xnp~!mUd8s^)c2N8GVY%0=Jcf5 zA|)u6ZxYD_Gr(V3V}9NwL*QZD{I6--+1Up!V*%Bsr_miZZp}6$0zcp0o=!;?(V7nX zi4uNB&3i^UV_7$}mmPYhBdfBarf*)}=HhOj-puys?WY4)|H2Uy!BeGEuV+YaH?wq< z#&`3oOWIKhyjkvTYyxyMU|GV{-FkA?Si}VXC3gurSv*`&<(9fF5D$LlF`(-a_v?D* z0T7e9&2;LsnMJh927YEZZz&bq&@v_&wmt?!ovR({1p`(bp_Zbu3CB*d#{5XqYmq4N zQBA%6P>;CJ<72gx-}3sNrevgS8aLJ`M>#bmjE!S={xWP_qhZb>e2>G9F$r`&U~WE! zVz-%8JJGn#y?fT3+vV-=%}Ib(^-uW!L9b+!rf!g+{Q`7u%IurkspCe=0hJ5#M%%r< zzjWTVPrDHH>ndwnb7g8MW3TBN3!$13(0L*CA+vb6SZ`ybn|;W$NPqvGvGw03kt8&V zWdD~z4!E`ZH*Uy?uOzCw@eMvSMeRfQ}c2 z$Z1TLYNMI*Afj}rdIf+Qq1{5%Y~gPRRaT9gmo@|SM?L<1UF5|jRUb%`C1o}N1y!6l zGuPdz$bkTN+HI6XYr2bP1+S$QCkLx(Rw<4rZqQZH7f(w)PLvzhU62hw#Z^z=D4A(N z`M)o88FqDDJ2;*Vi|%BhJqa5+vhKb^m*6RIJ&q)a@OaFyHB>e8TLM`d5SP=^N+m{- z1cY8f`{b+dJ*RwOKyK7oaYuJz5`e*!#z$%|X{K1N=^4eZt3|en!uSPfTE^7cJsASu zW6gnhN ziQ{7+c3fxq_2C8dEBzE1=*Xb>As>>TsH*0w{{ose{et|9z4kB9jC=Br3@h~pv8460 z{@v*)fu{N(6203nK-Wb55WViRY>^U0jAg1(l0f(#2&nLF~zrvIA z_)wmCF%Y&Uu_6S)7VE8l`` zvkGik|G{>@qMs$Ph^|?ae@45KCeb(b(v0yAW==JaR1 z^ACT2D4eUn67p^pF8pP9Rpin%-H;-Ye+XXW$}5LWw=_UL&9l?FYL4@pbo?m19mEP% z3o5}BSjkO3@`THoxd4_Ykgoi6^N0TJZ-UXUwOwU*6s{cW0;$DdczZHyFR5APfqYX# zMtPZQ)P+#1qmX6Ck~f|`5xIA{Bj&e~beNki29!%iy*0jL*tv}XloHwZ_jEnS_SAtN&li<{tLiyC`07sc+mE4UVv@6j&YS$w)NF}; z5${*lPpu8ypV&X$ydN}&4F{FK=ehFCd~@^u=g$clP5_F@P-QN!=7}2bEX(XX%Pvf4 zwnIzrprcSd-3L}`n4@(?_<{b@i~(FwPwx4|iwzv17eyZi@ zL53A?L*Bl7Y}2(;W7a%(t>dwY=bE}D4)))Lu%AJ+! zLj4l!LQ(G{0JmHEOH?}u2}DLe>I0Wi@*9fvUj~^!K!rPo;a}tcs{dbxyUBb&pV7s6 z%!wrs`eczOubsRWz6s1fIXfZr@{eq&{H8M}{9w}9@o7zW;Qk;LM>w>$C7+DsUG!Gb z$l+i%<@sJZp?hg)QZZc9#4S!Xe2ufo`O#GQwYa-)5|s410zNQ=is%9apj-HM%n>63 zAl6+lheJ=p|N5y; zZSBp8R0qJH?=@(ANU_4 z-(0T11#^R<#8#J=Pc745T@Am`#}E?vpL}8e{w0d&ob*7X)`!S#-;Osl+8bc;Z2Hx& zVdG)vlx6=g9n$u_b)J%~>gNvTAxzY4Aj2`c*?RP5EFeN;Z^egg2lLV6%uf9N5_MsL z?ahe}6-3&Qnum1*DRk;bXo=-8?B#9jO1$j@@BJQJKio%ZHh?id>7slqBVslRHJ5)P zLG>dO+5qzyS8X~467T=4V!AyvL>}|zS=UfPA>i|VE}P7O$b!er@Po%&1gMInjxe?1UFxUTTYCbD zkf0jui=HJV7p@PTJhU^*JsRv)iIR=3pNoEH zO}>eAPG^J(QZmfMZ+7xrAvwH~(*iv?&a8x;NEFRRs|eK5#pZQ@sys3D4;9%MY_?y? zx51Tz(SwH?y?1t84ej)%a}sx0dOSQJU!vQEl>9YvARWQ`jpbg%q=?cfFJ5z-?ib7L zz_sqDC~ovc$Kw{{n9_R}#uKvOWfZiR0?LJiELK~uEIr-oU8X`(b!dTV{og*#Z4srq zTlfGxNZtjc+W__o$4)zdgq3@lsNIKcJeJz95Yj#{5t+E5F)eO=p}OMJMW(F`=>j-x zK_o_pLt6n6Y@_2IJxZ4^U&$v=8CFsQ){JZ~9l5Sf1VJWMQz{x2BO7nWYupunHg1GX zrn+OO#wTh3IRf4Z4hd-%vmCnB&*m}u*jW0l=e{y_eaKXlOL}|yd)u{EgLhRDUs{Id zbl%Leo$zU`=bj%V)PT({$M)xGPIiECsLH@DHMK|nOV|Q4T|HwcCeIr7m!T1^v4!r* z>)62Mr4klGP$}~bIvczTLeR&GO(Yiv8_!F4NAIj9-giXPYo8LxDw4obsramgE;$;_m6Wh z+RB~21a_ot*-AigXTIlAS7ITEvBC1VLfK$tdzRQQ-&9eptT~Fglu#$I9b@Hm{6`I! zNyF~U9z7Twq-z5_G0jTFNle>ONylM}AR^FY2;&$Ec}!jm$2EIpRb*kqjnn*!WHk3j zl|g47WUUoOlre8@4SDJzy?)5WeBV;9zmf4g=NCKAzoA~w{-D-u!L&!jhsw-Vhx>S0FT zH$*GcI9ZxYOGQabMfZMCpntEcxuv&y9WDhojobp7u;btv(au}N{{Cq% zE_2`CTgcGCFJ;T;#qlq8c6GSOxZf9{k8d z1QD)dUS#f@ldb9E9MdaDC-ub$w)xzQzUdx2I;iR+k_+&tdD3}S@b-m*P+K#h$fZY3a%=iv<0 zg?6#F-0S3y0Bhe#-Qb4A+I{}a5AyDDBM07{-2wX+$89MA2Y~3uCIL*;BGs+dGwSD8XW@gGntW+{2-_sL*HL)MC zczA5hB0z0NPRF!aKI#LHJ(>dEJzzGq)j0GNL%V0uu zeE;$kU7=FG9>5kr?hbSPSC-fR_&)azCeD;Di%I4`pV+^-3yD#s0KOtE4lSeMUZ0{z z)6rQNzvq1kHQ0uiH3WixCGWT7ncuMwu)bXcXU|vy9rnPFzLD-0n`aFqnO}jn({?j-gcu>Hb zPw^}Qw-`6v+I<-?BX-h;4zpMS_rb<+k!qR&U4j}xKA4Xz*|05Ho#7&9#-iDxkWf;{ z1;uAW{@JrP+f`#PS=cL-rd8%~XGh7(R|Ne09TjAA7U=@bWgSCW(p0H8+l#v`M!au9 zgs1~ZV;C%d8hYfsdU|`Mz`?Dj%>$#iL8;~FN)m%r^wd9qw5Yr;q*}KJvjWXoN0QlR z6PKFRr)GOEJ>y?}ndoHeDkktjFRn59_T!tar9QslZ>EoC(OYco)6I=7L~g!Pf)HrX8|t02}hW(&A`Qq#63!ICS~`bfG+6ZKUq<+u59B{qf#N}dgUcE zHRTFRiSyEt7v_HRA3q&_Ns|Wy>}#yF)%@VLRFuaDSC=GRnN|Hyj1iW*#+>@((L`s` z7MtyZ;+0^R%aeA*$&X1_uEpL5=&Y}}E$=d%dL^5Wb_}{>Hwiey27Lo}2NWeLzxDKt zLZ%O;yVE78g!l8p%v7~}s5U3Ak%}(p`;5rlo(T!PzwjiBIKOSPXo$x3D&(=CYusim zL^esLZ(sSg`-cQ1=X*K=J;*Hl6EN8C-1(IhzX+A7exIA$riyY2%TuFhZslxPoKp1{ zGhObpXStqO^q;NZaIpXOrJX4=(3jitiAxPdAzPn(r0{j4j5b1!4o zpQt2k|7E2G8(BE*Go}k3=O{*~&YB_q{sZ)rg9JqFbv@nO++zP>SgoE`=cqr`uJ~9t zBr@zi-G@3rNnP&DyNo#z>c{jI(KUw>yC+}9H-bZT9yCSRj)*nnS>QedWxa75B&y!% zsNsJ2ltazust;b-n7DvT#H^La_&>gPxYkxkHQkS=;G;x-V<|1!&huc$$<1}km(BXg`=Z9Tm+QlPUgv#+ zF6R-M?jTiMN&SgdMqQ@S)=S&;tG$Mwra$3_hm+=|-+PmlGH_^XAxMw3z{iwvbMD9-BWxW%`We{r$0k^+(>^aW}r6N>6`nWpyh3 zHRI_E`Re7EwWFGg9_v55;ue7Ncm(K#lR|D*Z0hG^(V*FGaNH5;sop_GX4rB+^4Ut0 zt-(iQKvRXjZkk9=GoBCa8|FIE9!4dx!!_cLEcDE&vi65Y! z+WW!hL|t!X-V8?lGYk#@=S(B|lE0#rd*>HtJHM9xI0)1uC00EaweW#DL&xqMTJ^qI zNW0cQ&AmQsCM^a1)CF_=s>@}`!DS(laoZ`V=xOW~xsF{1U*n+76pC}J@KuUx4oUuu zC4cUx&nuUqqd-M{F&?H&iu?LvOgf6uHU=(z>vbVh=P9Ofo<Xir41Tl8*wyVj!K4?LOoa51?^s~5S>xK1T> z+9|$nk}aq9ccdL>gMMvDHr1z<*?hde@p@|RDeE%BlQttW^Y{kmclIvxyHLOGTgpfW znh`b4PDCrO{g`9&L1e?i<533{=HL61FxK3e64cXkVUd_C)Qcn-ygiTY+AtE#mNJjx znwnZ8Ho0fS?U3Qy-+0FiMaJISts$jWOkrffq7A9FsT_o@K zVc_f6z^3dgZxvSj6NQz3YNmf<33B-{IC+p_XQTeD2>2hhC4M1YNyj>!j=U}L=7atQ z=JUiQ&U%T&u6sh=b+@nnX1^ecmtBMdl-v#!16{wAu1obV=?8HAb~%-FUDBkkvc2t; zfuBNIQO6yp?xn_BN7p-9mzUv&t=eVzU+60Ha5if1y()@+r2hqfV=40(W0;>eX(3&p zPV5(1|M5NGWJdS=e|+ix_*<1-G8LYhLcX8?n(DbGEmh>TLZgDN!1$b+vd1g=_veyx zUsz%;{AIBAe(272`?^|E%T+`Pu$XM3YLShW*T-<^MMOl$Cms;&;)Syx@zd|}Ec|uE zZLTwDKL?QRTrItGI;RotBuu0nQh+320WBVvh0ScpReu-b&G0Ppb+iQ@hJqP^691$E zSnsGSuun-dGb#YqTSoL1fc0izxXr*CUie=y&;Lsv{hJexuznFHZ8-#ohzO$pQGI<2 zh2;dVHI5&KKi|L#Xe9a`9bHh|Ko=(oe6#4+Fn{S!?DVO98#XbDz5UXG|1X1W-CqXF zXK;BSVAsgOtMd^few_94`z~r?nN$=xt0qgDmS4Wz<(@&jBcT&tV+ONW*Vxs0n+8V@E?!zfAu^Z$W-kU!5ZIELxKi?v=EoF`i*wk>))8 zd_L)KSg$;AWPO;en`Lf`(bTxfT?5-V_+5LIXgvEnNw50@cGnUB(kq^Z0=B*(r28Bv z7f=@I*Xv(UyXhSM+vt<`a|N3-@ga4?VuB(H_XJycVosmhMgg1%{DN9C3Yr%gjA=uM z0ZJ&v^F(OOxq-snlEPC4_jW-9Od9T|tNz(>UYrVKFY#E_@64<1UmuwVbR?p71Ucj@ zzhaE0gJ(X%89WTsTklSTETMq+XU0&YkcViG+aKk26T# zNM@d-W*gYbkJo$+bbq1hU^8<+z~0VYiVR{7uTU4}Gc>OViR+(`)eUHA_J{pBvTdAn z8*Ffkt3)5*=TZ-+C9!{|liQW@kq;J<8;W)FiRWmwcGD>6X{@jL zpzYO+yZGxbGL>Y@aV`$oNdh-pA?E-K=}?VV;je1oanw2_gP5PlL<$ z)YP|*n3ln!4Cov4HXdV))YjQ&(6B4ygII_$;9&hYETG?*bn@fJ>%QhGqn?W56tYULl?}-Tc*CA@(ArCmdQAlg}qA5w|f+Hes z6UF3d*9Iz?vio!L=yHls(b9MH#tcQlC0tT>LO@}}l31{eB1#!HjG#Ombh>5)2HAdf}+*PDmB8`Tn0 zRfuRGM&Ig6zgPAg=Rz#kSTsxr(dOMCT-;Bh=0+Ts&491(i_Z*vQj)dH2cHxd@pEWQ z_H@hfMNi+KI>0i0c2h@$&P-05Ki5nNhMEf6INEz11ee6=$1+o$&2)!fLf}cS`UT^O|NE6kG!*+joL%In}AYa&RifEsoe8< zVGStuQ9n$6B}v*P$=33TNrh%lhzi9tS^=rGpm-6{4n#|#r>?w2z+%BJ5W(d10TScIh2iNmZqF!~jHx?oH;meSvz$A~l<5*uuS73!9CdY{0W-qZ&24DM$T=S9=* zUEL5jsnqf~gUfI67v`Z-$ZN@rP{3r%{?g{ivqk(ZancnM#i@Z`)3n5zXf_)n?%%pFWK-{@X&Z~z)6EH^7Rp2L0vo(=iA81EqQr!fV? zRjp^%?(#@uE)D|;8hAJ^FxAseCuXSAu0kJbgYf0UPGbEAT;fd(e>g4~$DNnEyHo@2 zM2R2~NB}5oHQCDV@ zFgNvtuN?J)8U(xj&kW0Sc@l&bA$GThOn9?Pec3GYRrLX!X~UB7ciQy(Sh*h^HA-?F zsm3q=cQYKIg5v>jpDM}NdO+SU_(WBo-#_SR5Q)UbL#-MOaQHayzQV`f7Fh?p^$sEM z>7OIwPW3Dn`)JB&$@#b@0g@s^Id$!8K=6l?t2p%vCt|DJL-d&md#!pJ)IQeSz{=pG z!>5iuPE1CK!-M@>)Y~mWfP2S#@W3Q$K9mc%YvRg%)NMR6p@C3O&zmzrxRkcm!_(8h z9-2JyKmT!r;F9+`cr=>zHLA!<+ekN*ai_D=>zCu~gRgwXbu5K)6$JR^8>f7C> zgTDtb9KELa)ZTB&Hp2^XOI?P!3+vXUnO7a{Dj|d{e7|{eS8^D$zCQYs&|257De<7oQG^_o;!08c>O-WqTMp7S{7b}x|H&HM!veIB z>3;5yv}>^&uAUjv?x&c79Gz7=X#$;jtW9DIAvrQz9Ra?k3UOoShC6+<>dgGlOg^f( zn!*@E(YUTZRo{N9{+?iFjP@y{3`M0vm6)3%qlM0ijKp@L_ZEvrD)_-o8F}t?;Vv0` zqMjlgUAc=KWl%4R1eQL-P+G$y9|Y%I1K*MH;Yk@z7O9 zrQ*Br#3(FVlwN^n8Idq95t4IXNaJqm^wZp#!5=|xFx~F~iQ1lm>6a^fN{Berg%go+ zpus_#Q@6O0>TZQ^!ZnA3vt!*F9Q1=4gDP|N>QZeJlKN#0T;w|O?pf`l1ozp9lWX-O z7?or;`3~Zwee#eOIkV!X z+IN>2JVV!dd91(;U24G?2ynIqcXw*tEj&6`P)vmKTjrZW??iDrrS|a>&xGo zH|~UOpo9qb9)ofPY5p{T1byV*I|jh;l5790@1iY8F%cazSK|#D23}IodIR=$t2+Yz zG>7hqR$SHu**($Rg?KN@_8)F`yReZ|gg2baQ&@apOA#yJi8WofOr4(+GTEQBJ^6m} z<5fH3Jw`uMkE-ui-945r{jR=KiBpU~F@`Zv!Jtv8L4Ot_8!Q{k$`?b)Pa&ly_|w}O z^6DBW-1MEO(Tkh$F_+&M6vf=Xdwz6N`#fE?Y51js<5oMxG>A0qw$s7Gp_y70@r1CW zJ#f2sZcDjpd_osi@tNtG!$^VIo^@tMraf-Q=wNfB+8c0g4vj!J30dY#j)@ZrJ+#{F zL#u`T!V$U{E;{fG-HRWDaP#{0= zhVeXv+hLq)+U|HtE%%1o@b5-!+T#$|ZCg*#AN_vrAu9QXzT#@X3K=FJ^3gj}@-NuX z&V8b3(XS1!Z&g(8a#%cuz88Pl*pT!jW9zYcMQXc@kuaa`%FaTnq;+iT_Qd^Hn$hz* z>v_-0|77W ztc&v6rSH)LGL%$zYip7=gUm;#O$|OiF#&ofKECX`XI%8T5np1uhC6TzL^jBW&Ynze zouG%7MMT0zwUvjE0u|J>yJVyl(Ge{YE7zo0_PtcL&!^0T2cK3mJrVk$g55~Y9dX52 z>BVOW1JGPBDke-8F-y{K1t$K~WbmL!r?%MeVB6@CXNi9eE(;ov0d8DtWV!RhYV~nh zh6Y3S^cgu15azLtTXF=7c!aBxO!m1x>OAb6F|sGS^d*{Re}j-Z`mKK-YU}-g@Luk6 zw;0^7aT&QErb4xx>lgWB=N`RBRmhLfeXk%V^`)h82qQ0b+^xsowlp({f)1*S^1X`L2V@mx@7f$*x;>6A#2OA zN{MhH^D&5~e)ISJp_W;hneA0;V%?MQQH!)p>GxiveJh)XT+M zJpa$KeK_@=MiEU`Rq>b+&p)ytLaXNCGBPR=9c$*g#`Smd>Q77fcd=H9@1 zaC~&eyvABV$ejlFl*C?aJHSQXdZ|F;dr+q)#p*UVxQ$O8${a)QPkU{+zk5>80e4WL z1H~ad2aZ*`TvmFo|C4UT^FKu{YjV$TouyX86Z0;}n|vz$5tDn3d{o_)wNWePWqits zLrZV^+_ivfZl+T`cP|_ARwB-KpKw#NN%3%Ag!;}#0Poq92r=DToO%JhXFC*l4BTR? ztMyj-uCU*&{MjViMPS0#sT`h&Bl!t<@>YDMCIR2>n?SU}3nETy{8>26ur$NT)^%rJ zX?-T=+;dfUO&78JTKlF)%k@#Va3si8?Tsd!3nrc=ng7K2mJfMn!lSRUj~b&XX)WH%6Fvz zPzQIC_&Gy9GZ3pqCyK9q4G&>!;aF+!a=d|q%d9x3xxFvcxD+*_$aUk*>mBBoY%dlz zySOs>^H^KB@KJkwngHd`^n`;TJp17H)GCHIjf*|?3ej_)_Q8%A#Yg1Jy?@47JmC}r zABrhVfSS~8-ApZ~SRpV?L6!HfDz$d5??PF=j+s=;oszk7F4y;ry^$JwX_dZ6o)YAdH#W(57-U^CM*1m-4I!Z~b`-44O6-kjIQz%XG zr2mV(eo)Yy)=lgBm`xz5nN%jDc8~!Yx_M@k6*}Ybkx4z^ees`tpB18Rp_S^}|3=(< zMm5#9TfZP;qe-uVbfpSXq((&qM2v#c0z^fn#1QEL0s*Ag8xT+sqI9H52?zutT?M2Q z2|Y+}2{k~7XWh>}d+f9K^X&8PbKVc{Ck7d0FvwV}|Fz~d=WoVIUAbL(J9psGbtW>e zKhW;}kKkWDo)_8OD#|?gjDUleTT{_@V>c&V`BiMcHXS5eJ`&6FV>r&GNtU<+e$ML@ z{`l?v=Yw9+qkvm)qPdB$77PTL-yh9M1na-fX+{G^lUNGj!9fioOz~Oahf(aRyrtMC z3-j=GngH;QvzqI-gPxFATNwj|J2inls`xAkL|I`tJP`ww#n8Do6Zgb4%E;M7iqV5S zWDH9>Xd`wU#(?JI89Fj>$uOcN($7+$ufHA*+Pf$gjTbgfEN!AsC?DNhY2IPn;pOc> z%9D)RHly~yMO45O?i*D`(s>4BDJs`3IL-Wwv+~l{&~u+piiBRZFZ)j=iReFr|3L!$ zf5ah~fF)QWX4xF2-VaQ3uE;)>`VW^ z%)4oQzO#F4LFzkf|LK?f*9+udeed3UjT$i17cF$Xp9ar2{AAlnvX0#_`S31i?X#Jn z&68Aggz==Ej|A==&?Q2c#n7S;YoJ_SXAWJ6Ypp}p;eq1Aa|XPfpm4V*R@V+TOtdO; zmOgM`%79wnNL$nZ;D_TH-JdPbmpr+JGCTbX-d*|CdY9Qn?ci-TL(Kg5Yja5$pGth? zh@!->T6fgOx|97tH%qjn_pYV+4bhq5IzF=f4QcE!Oii`e%7`)b4f)3DP>xqH;A1*Z z?}Jv4zPqp(z0kjo60B35SP|0uO&58LUd*c#@)|7!tzQjNW86{aJ(#Prqd2OkuMLne z7giqx4wOu~zKTDmbV|@|H$Z2sJop=EiSmQ}%#=2v3JID?>~i)>g+_sDPDfSj@=JaG z+h%49$;pn=os@GCNyyw+@?XDjiD~82_tD*BmNsp#hOTIJdAMAw*ls$%r_}kvqdxIR zV$l`6z_rOxheM{2l;d{8^sJ7aEdxG|5SIsIS7>L-%((a5sbU{pRaPG$^}8R8JOMT{ z=ueR&h?L{;l7;Li+0>wb{!@}c15*MNjzdt(x|lgN{S{4$s4MREF*}Zk9f;_7<1Hch zJmmss^!=xZNIYMVG;q)7!`*5Y8IW29u60(h0$dI=gBuxpTAyTmO&)%sXw9Z0kdJ|h zDfqH86NX$D24I8Y*~i-)&JV8Fz~y@2F~m{n80kI>?Dg-mX|lLWD9Rud@H=IqqyR;d%Ex6)SHifd|jvJ(K{y%+~o=y0`t-?NvbEZ`c&1#EbS z&o%v?5jk)VKcNHj26;>|8xzV0#~fF780WHisHe$wt^S{osa}cec+Nr~7Tr_j+VEED z_gX`vi&V79ABHq{p18-%_ZgUeE#(CN`$wW%*E!9s&yTu^vxl}fi-lm{Mu?BVS$?g2 z<~VdjyAIeJ^#^`unDIXcpouUS^o4?sS`L5E?)1;C=C78gHQ->&@Z$E+%avnFA18hZ z19X+<*qmV9#;;=h0C(ry#->4)CeSpj)^4L*qjyiaYQ-n2%eAr9go9g@&pE>wO0^>t z5wd7E|52M3?NeJq67~}xR_nUza+vi#9$vJ(&6%i5oWHUJrYK*Un@_Sau~^8^Y=`pE zlt*6D1StzE!X@^1+~Il1PiMlL@_#35NMMI0#H91*UU5cT{DRmGf+Vs1?REaQllSz$ z^#xIYazL6F6+MII1%+b0M-kpdFUxk%J|5K7D}_0jl})6yolI`dbn-|#NQ7T`qs3LN$QH!zYL`khi>=N)Mw*;Sl)V{AFbOXrq1tW$HSyk5^IFt zKuj3oIb&I?+#Fy#K2y)@Lv_L|AEg=uuRI8T@?P~bGq^}nvMERa37Y}6Mu89&-1Gte z%}AUro#pmxyFoa9_7p|OuVHs|?$w~|-jm0Q3kI*wK4PAab%7_JJGKNQzW?fP?+2P) z9T@*de~2i6RQ%tutm8id#B8?RO>SrU`3U9nF2wXGnKa^8*Jgf#*IU_aVL!Ji=`Z-o zP&U#T>Ax<&GByYX^Du7ws{`pjzvcj$tBAvM1c^==0TGP{2iI!mb$MTM!S9( zlpa`Ot(2Vs?{()jyix1Sga!=>GBjKnykJO7SnFU z`ZR5D$RcZ_RN>AC!MYmH-z6#su~pR(AbDm64(VY)(`en?^PpCeL*>UAOOYF^9o4^j zp1pzGZaALo*=zOLiY+#LcPsP3=Nsc+9%ITBpE|>H!pXL3kFG8MrSeGFqj0o)i$LKS z$r~hY9aR+0+=)uc=@JTm#K3Thf$77EEJL2)|8B$m|L=8N3TZzP3p(w*r>z|J*mP46 z`DyM*$FMf#ZTnh&Uc-Bi%(c;^h>WM&;he9VZ=GcNi<$~7r1`0h9c(~xw)EK0E?7~T zatimUyn**k+oiusP9zrDDIbPCwv;-i1y`gcA9e+!m}a37LHt;9FpIQRa5vly$)P%D1Jl zlbjH>`=`5`*@pq3pk{|Hx)mer&|5-Pw)qP}h1xaz)$I<~`Z+0fKefu94C>zySa_^k zeD>X=g2R}4ya3YlI%P3JUHLRMXV}5Tzf_TRAo=0UmY{$~LL8H1F>4&t<&#VfR%Fi( zQSs`=VLCg?02csoo~gI5W$4|!Uql>DRgs4mG2cI(nR;bXE>2;^nj!i2nbSDH6~p*9 zf4YK!yhzK^YzF~B5@FyWSd5c^Cj=us>Gv{8V#m?hz(qNf81;8(=D+c3{Cy$Ff7Mq- ze>bE8y{(Q}i}aj^-MLzeOyBjTQLlh#N6P(y zokXEYs5HGfUDXESa(FMd#7w~_2%1fIz#v}zC|)QqWzc_;uuGuIcQ$aei*dA(&}^}l zjyl?xnm;!VIrY4JR0o;rVEv(bO(B@`+qa8^E-2PMp_;!_ESxS~+d#=qEUdap;)9lAfB#y!m6LGGdJ@;6ddly0L*w=VqGb9W-8OH}|K3^K zX+rY$`eOd*>Tbq|hKAZoY{uT+!_cWoArq;j&>RWY>Z_s*49`*q@#5-Y45*vKL7?Ws z0-F`vM{C(K{pBdlSIs;l()HEko+~!#b!K+c5SKkZ2p4i=t?>0v1?axVH;Usq;GXeR zIiy)Lj>_G>H_gl65+sq>dDziWHi<3B_p$++Yqu-Xi)&h*!MI=k{M?p$O4|EQqdfxQ zkRe-9Fi5yvR?KM?xC@Pifg4uM0LH}WSq$g0zA|~^9jWPrRp#AM#hgZLvT2GZRuw*CpBd0i01` z?;b?hJAQIg(QWQTU|gQ+ozz|BwaHl!8&I@~BKR-C`Jog=`bWPYV%|pj)hjs64`DX} z-gt@UoS%X}s)YPBg_RSr`;f!H?5y>S>|#YP@Fu+(jmbf_eH8^!vOhn`>`Ga35RlAN z6zaEi<;q5;JV>^As|?=dyb0u7x9!D3fJPan*|M5Z`niF}Lk>$DU*0oGk91SE!S3QN z`EJ^cl@&iZ#y#&+#1e59#f4$IdKwjan6OD4sF=9aP!ScEQDXYaUTyiM+mot61bpvy z=T_j>6|aYuXDbiQ!0p-cjRY+EOxrAi&kPhpmqZ%0Tlz{G4m0Q3^1N~$v@>(pX)k85 z!e(DCn<)LZX4=jlz|z{PE@YlszP{gUwB?bW2QAJw?Dna}0^tJ)-Ct?5&tS)@V@ip< zAEK-0OX}mDJbrCFw5Q(t-N-BC!ies74SAku7Pn-Buy`h&RKph+E?$gFxKZ&P93gsP z1SMZYyF=mVm}ZBiiLooA)GPXCzU_MZ*7fg5DpVBNKn0-Gv_6=oNXEW|gce+u z1m$8*mZ1zB$xdG_9h9~~b?_ZFC7nMEni62FV(C-(!J-dsQE%mmaLf0l<4I6QZ{eqT zLhs(lr})d4%DmH>-`BzjnTMlO7=Xk4FK?3nLkr%&e6Lk65aP^*Mms2s;+=(Oq^t2< zE~5OWlSHFW;+q=4fwyOM*XG`GO?aQG1vv*=SpXqD(ebbP7rwyYo}>#j{R=f|SEI!f z)*Vb&!*plY*Cf8YW7prhbnT}B@PLG%iXW*g1qlu61{7o1T?jwCjwPmuty|Qpv37ie z@!D+G*96_bnNvE$KU~~8bEdkQ9ykckfQaCk!uBQ9Rd)cSTVBTzOQfhR)?phi4Z18< z*>&j%1lJ~U4zGRL8mr!VZ4bmr=@+R+B)1SifB=VV;%jzZdwRO2%Zns+DWrL-alMU; zX@2(f*5fLf2b9#OT4f?alUy0VT`ec?$v=i^_iRz1TUCsQn%JJrIiO5icWSk0IaTON z`OcHJ?s-0&uRW%5E{Waz)vcd~!YS;bQ18v!llqGf&f+1F<1%?Oi!I90JS198mpCRI^>w zlSbp*cew{6zE8F8&wJqJv`(^daI6x2W7JH=I9*OzJTGdmZgmQU*!W!gHqE+}+&T4W zrBwSon_0slC}kvY^>KZrp`UVWvldN(eDC$?C~TIyQ!Q>-b`YL3G@JRLv0+#-AL)dx z!&aLB+l9QC8xlEOnF6&ZlCLO&ToPaVW^)YF;CvMxwf^e6weJF)51${p))EL+c^acz zE)f$@g%sT=NvNcffa<(o;mP0Y7tk}r>5L=7t1Ws1(0hIKZd2_6A>+IDRJM8tc~&*B zzAXNi=-p_Zjcc1q{taiQts*l;&0$&7wrgKfWLIVyJ9n1Iv<|aFXw@ z(;0W?1Rs9gF!URQ0T>8rE?upB19JCGkLyh%1IpNU7P1R5of;bCXAC#8jUIEToKU$g z+DDoeq8femH&~rg8&&kO*Vktyc$D6ORF%)AIgVLL?VP~b(H>IYQO-8^k)2x2U-4S<8b?OP9S8@< zj0HW|8qb5RI}BVG0fp*nk@`5szUe|qd<_s7^?a%L@KxjBGS$@xX~Y^!y50YW?HAjI+OA0Nj*6{k~83XrocOGimH@0-Xx*GEhX-a$-LJ^_DhBz7_*ikfL~=&sGn3ZW>{qXjndeneL6ma-{yW55O8_)B%6eF z{tx}(A3B7baAqb<#|5D*ZG180|DHqQ{(TN<4oaCDr`8%(QF&(@6U7>mBOh|bgW8tb z5)aNAS1iWO$@~z0@7uu;$nl_C;r{KRd#fVOsy*!t3>zlPQ2oS6s1Obs9dr?O8-8l+ zKpPRZE?ILQRIhlvRR1M~fMRj=e|5_9sn}S+%(G<0z9`z2Y^8dO#y*N-M<-t955p!? z@pt!{#e#kY`uS6rmZG;%9|i~7j_&=_{co&( zuAyDTPN4oUP~@oj`Gt?}t0}rzjVmg~cORQ&Y!edvH&4=B$)I@b3v$(W_Yc$pDOHn? ztLL!^c|~}?xfpO7vda%nw8oEr;IRD{qw~M%=l?NE|JU!C790OQa-7z+U~XN3n6^GP z>;QE32p#1nB#?PbEnAZj@q#1-Z4sjA1TpsJ%gCd-(_byAkWWzL(^a!!Y!{}TFXNg2 zdw=uq1yvKk=D80zWU_sPTkgJIAxwlbhxQu-Kx&zH4TjJJ94EnNG(Ej~0KayK0HRU&mRJ3PZQokQ+~#ZjYh+8zOgz|@;=R|5;Z(<; zhoN6w8P~^_xV-9e+ctXHe2ek-b#Vhsrq2{o>=Mv6kli@P5sYEfXpmT#ohDCItu*B zUE)_v&MY^+k`Crw@vj5mKgyFX`h42>c(uk!P}lgWxVXeu86lb`u6$~owKhtE03_hj z4Fw)~&NadSl4-UxsTkS3#|D4^d@|uu`{~Vgmfv}C1_3n*46VVcp3AmR^M7utI~Ug0 z?%NZmjyB5(#XNe`kpU2L722nZ)YZZQjYqSnb3`;NQk+6*PQ_G2Ymfq^H}coI7i9NK zM3;GW9lghS=fJ_nviH5Qq@z?Zr?joz781%s)29Am@Fla%ETqr$F;hv?of-Ec%S=cM zq4FhyvgF@&TQwOremPHMK3S1BvF0CJp%x`Ssd+l8~sD+4M;Z8ovD%xm)YsEfK_K~2Py5{SJK>%dqvQy%#s^WNzm z1LZ-0d@evGv|AE8vnYp(PWIKU$I}g7%JHj6Nr( zuOp|sUIF38MeD(`bi4W^`|wZ1wkuW=dt1Wh2aMD>(*@BhH)oRGhdvT{nrVORor35K zsL(qMbM(WCDdKX{3u+0~4NItcavzE7?|KRfxP>l7E{sV-b0U92N?019Y%A&hUbO@b zjVn^q@X*QiQ5A`6FPs>Cl7ER1I($S~C_jNz?70eSg06fyP$o5m0?l3%uNqNfbFhj* zZiq~3WR+WgJC*XPF>!qG@Jhw66)QLiZG|Hzl67WYRGcU3m4<;1BsGa|?Eih`F5|n76E2 zm$OyI;_Bxs?Sd?(+aWd<>Ez8lN3n*phNxXDTKuPusaG%(0;~myEWipm6lFu+Z23;s z?92eQ$ATj>J|P3zvM*BTsh?U3m-fvkfZG^+% zA#OASs;~Reb?Tf26+pP2kv<^*CQi4lgYLze4>{E|H<-yn(#%XB1ZbtYiH9gwh+f>5 zP>Fx`^2}a!Aagl=jLsBkL2(MFapys)CGECs3-JZZqkGHqwk!J?JM!uu>Tr*rTHmZa z$amvXcj2}7*(fCS5pz4HPfLtSQ1@r9)j(ncnal|_-*?PRb_0Yd`Eu$VnZ|o*)i*qJ z+n+R?iu(9sTmLq1zTlCTMbXG{rkT$^Tn4wZJOH|$^?Sa%5VW#GgRdeiev6%4vYZkp zz_DVH`ur50AYCj4oM;rKURXKI^>g(mm+OFmt8(50m?yWL@T0og@b_JEIwx8a0pK;Ace6E+PmjCRl8-o5o=6hh8M}4Z&h}{{7OA9`I(3xiVe3<;EUpv!ENNAY zOu(E~mzOt2X%@HXYg6kPS#~}eKfEPUBEGfn^fx@bia?B(4MDjGM^;nj!OPaq__gFVt{$3@(_0QvqC(`w zcx)oO#%t2*y4)o8%;J~ijRlt2Sje@FCqT*fbN9V#oWI?y+t2=f->^Ej-_k9{?h>Tf zL@_ICPAcsP)GKSx9B|N6xv(i1a{vBy$;U^nv!C(EU=#szT!NB0RP!ga^=hnkFiJPp z;p&oEnpC$s1Dv^L9lu~3Y9Uc^m0zAs3vJxI;CuO0meyABZD2l>s;R>m`i^-wKDQwb zW^V2`K??(ve|-0v(i0=cqWq|cxobba>6-B6&zkmaRCk{pUd#H!u$pND77~5;J|WL> z=?=hyNf&!cMYxdOkf1E9bg>Zww2yqC`7gUa4AYjq0P*H)$&yfL-=ER{=5b{a69aNC zYQ8`p1-8a&y;o-mu{3YRig23jb5G!(WeUT*RF^Ct|8z|d)&17khKq9IF_(>$0K!vfk{6@pxY^FCy6*uAP0KmqF2f?i!j^r~;^*ve;<_hWIFNxwFv$pzTwrTMuMcSo&MCZe*9M;}_L zRKpd8OM?ANPKlg%&2F0e1GFkZ9u4g%b5j$|2Gteq)~m2MT*OpB!D)dAEkRp@Z2kMr zE>mBRvf#YErgNavU)^pUu7|z&xuPSuZ+}a-q`vmRXEW{Kd0;n|qsQZl7H=P5iRIPh ze)6%qblE?@yh+9Mqto*zzHsTEAKje8VxFqIZu`mPRm*$tWg@#I40 zh{J3>2s-(P;n$+yABLjxCI?{DW~8Lh?hn>lwJvjeNbF?>wi_Ujhx;K+0Q0O#s2-k{7qI8s; z$LF)}-M2}7qc3EzkGsUy~{iGKMTTLzB$yYuT4$mCy60{gU-aLB>nDtFa(}_W+ z$w1*_xR;9O90yOQ*1*oS<}pvfmM)?QC)?+_O*<2TawIiiuCM*QW(+o}S=c#QB$JJE zblWQF>i&yiX{Zd>_1}>8o~!MXt3+M-8Q>^H3LD2>C;KG9a+dp#e<_MvTj*(?|L{D~ zM@zO?rr{35Hii);O${UuYJtPNqSiN+D)%y%-)$f^q8Qx1G`__RrXQe zDL^W1CwLTK;ZgBcFGzDSO6uj_PKel2R)h=f9U2(0>F3v z(+;m^Wm}Ce4&%_p*OjD_XRiKQ@=@wwKBnG0doqG=Z#H$~f-$qBjnuua*}^t9;n`Y@ z=kJNWQdmQE>0xa(%3#`6^V}6tO9tj!B8FVd3DO6Sk1kx--RhocuAV!33)JfwK-)-{ zdDDz_wOnvWpYQ$irnhGFXh5@o!3)2HGXP5CY0M=F30ye(sp^TU7P;fG$M4Q{vzE|QZ~vI9EdLq9aF7PW z$3Raw2E^ZkOh@Z81Ygx{y$V#Xd^wy?mKGygE@`Je@X1Y9f=C7IN8ro=PlcefhQlRt z`A7DWyp;#h@D2EcuDST!#l)LuB#SPFGM==YM~%%P7=a?og(hDLWG4Jeea4D`dj%Eh z(FHF}ocn@RxCvRg&KgP5iF=7TSvn9LC~N56%t+Y}r^_HM`#SZ{H)z@hF6_4D8me8r z)gcp#e1AH|*^Vb!lQF5qTvfj6U&04Y{0kt#->>~$E%V|J!xUA%-FJO|1LriS*G2z= z3_Tn}Q+@?kWP5>s3D2UVnl*uA4G(;7+Thq16#Z&=U=AXA!2%9rtGYcfalQ4LsalMQ zopHW<%CA7SqigiVR) zD!${{Fq5}U?ix1SqA_xR49e5Uh^pSZ!bm@`C~ zjGM_ij=$SP0(?7#r}s zp(^G#&KaM;O#|{)?Y+V|L{v5t)q55kk$xE77gxgq=CYe8$bB|?=z!6iBbq5x<>EXQ z0yGPg*PgR}VDL;VYL-LpDThz9<8DyS!L{ve)P#*1G(MZ~fR%nuJ?lyOu&B`URW8)8 zlkI77zR4#H2M)LIyA9k<%G`bxX|8iewjV&JQgLZ%L-~6~3+(TXSW)PjA)IfC^hU@j zY=r~$s>P6EIkw5sI?iks7MW&TzFF~Dllg`DxvI-&JcT+xee5$Jp?`G)Xv5qYF)=C! ziM?#rOkH0d`E%M~w7h1ou@QDbl{htNF3j_#HqrZgGP8wbRe4W#`GY|2S)eN8YTK0F z5&L^Ouko%6&OR4uKI?VtF#Ygz{BDV#Q_Oc_PkAYeH_-V#;C*FfSr@Bd4e4 z3N>>RfIwyeo&~(Iqg!H1m8F2KDVkq7UhC@(?GP}tfMI)dR9#V{p~V7c@>@xdRVB9|7iE95X<*QCsT+U~<=~Srs_qY<=S%w3V3|@Uc;OzD-|cw+izU}fWchxN>d=;vYQbAQ{R zf=_tP9WJh?YKGv-)N6)E%PX*bJmW?hji1JxuhjU97QCdlJ%9E1JlN+b7#nICg>$}J zz0s}l$mPHsP@d zxO&r7%X*VXF9;~m3x)EW#+n2XBbcAyUw)sv7mOC%Ie%#)sM|B?UC@Li7!ltd-jBNK zjhNL#U+?$o)u6B552?VedPhLU$G^u;dC; z>}PUV10f!+do_1eZaKjH`P0KQqZ=;*T)4jnR9r@TCQ~BcN=inVn)RW4s7aLVJ+~p6 z#q1=1Cl``#Z`#r@h0k|@o&ROKB4joiw^#XdzI0u(_Df`U16P+w+EHB68z;HB=bh#r z<2D+D+wNcldCbRhvuN4=o`!!3Y`(Yf$G*So#-Wbr8m20-4a0+aNGWVrj?F#~%*~zk z$8Q>7u6z%mb`T>+=g&Rydr?t_E~jRAqa@Q>NY%QKBOPi51R5P(V7J__9EY=-HS_p( z)i_69@AQ%K&lvm43+2;K(tkXfz^l%uE7mQb`Djq;cs??d1dfE`0_QlWcXS0s(-FDO zM60m%-Bsb$u7NV844u_+xQHCKV`~=tk&fs{COP zgUh|Ua-!?x;JUcRNFN&wOdX*#-WtR`AP+AKnWdIZ?4@r3=W7DKVCrP!(AbNbChL)R zh9&kTB^|7>m*gyt?IJJL2@vI$|OxGM#h551CXWxY5d5N_J^Sw+EIv6Rzu*gIACfclQ1;=|>4 zn7=7X6+fAdbe2HeXt;8mEhZ6-EmKT4Acs%AKXj<}EAXqlqt4>%!W;)sd216sNzcDB zX3&T11mPuvRDuSwK~%q^r!=EMUG+IoB%Q@tjf3S^G37(^DT;)4_+X|dOxMxF#P4Fd zr0`v9K~{($ggA&jsK{>|qhq3LwCZKyr4`FPcnB(1UytfX+6>3=56#IYykt%fTfGT@?pQCtgohgKjODM#_IDdIml-%7UUYLR?5e?o8U3GK;kfjJ@oII(?H7>$CGn&bk?*f%@& zf&Sl!%)Ifl-uC8!DuT)~P8qX`KX8;DiSJQz7f)7yVZ8muPs?Jk*JVWg9thpG+FQw< zpZ9ym7yoltdLO3T==t&ZElP1FaqRVsW~eSBsY$iFW$JSJ9W2H+VoKT~?rELf= zV;}4-wW=nH!*%mtNcN-%SMEQ=)S}yzu}F@)HT}9^-(uRW=!K!urvpw$b`RRT((2f} zS>VoGC+N=-+MM3xk7UXTFCzqyB_@BLy-j5<+*Y`f@4v>Q0ge=n=ZZgLr@llEql zf6%|PTBiAMC>*;6CTZz5>05$TQo8@z3JP30-4i@>p-+fT0PsD!Ld4&qR}<*t#{DP* z{%|bhK=EW6pKm%JW#aZeyU3e5?^LT^`5Mh1zkV!S%+lOgS|dz-6zfh!9RUyaWzxCT z+XFwKu?uJ=0{FM`*dK;HZz@1d8rz(u7dpolN>4WDqSE%Y|1d<=xJcFwV|7YaU$*4h zkGGnHdOdw+aZ%Rg*Vyf)_@=;Cgsei$D-r-%)5zXqgaIqQ9I233O&Fi;!%Vp1s;$W;WwROgAQKdzO{JBk1 ze@vhD0vGMM%R6t zd#achU?s>3Rrnf@Tc|&}=MuyWdAE0az-#z0Ck7}#MFW1H7#WIK4C?F* z=A^0U=ZuQT9Vq+MDl5FyZA1O&f$ySS$JWH{w93<|B$fs3f}Y%DUJMto6-6Ec#eXx@ zbf;Y8j2+U+cC;q8m;Gm;TK+~Xm#JdeWLC%IfU}L%_DRZ5fs;T`@}puw3L>ArQ-Oe} zZ~NFTafTCPCdW72z8^Xq`5@rnrb`vweVlXxa1vh)B{Q=)p9_k&+B>B^i+*-8zC#WQo?jBG|C42(!kF&k1z)@)&fVkg@U{F5s`szg9|N))ijrtuX1OuJ6UGkoN(3r$>3tg8fM5K^?)Po(ugBK8kYNiS&=V5 zqio@QEl@58nmal0eY%in4h18yoVMDCx^#l=>6tDX&h~?t^CQ9RN$@G-+|$d#I^AZs z2iXk3SxRMY51z+Zzt#1)J?GJ&`djt$#ZdM$B_~fYTR#&$qrQ!3{f!7~)@h=0zPgF@ z-w^ahpGm$_X%l&3|1PV4rq(m7FrT{A`|d1442Spr8@=YAbsYI`&6+630s2WKA3BOI zGk`UN7<|rHh?p`X)`2Ek-53etME>Z5h+ZQfkEZy#>UIaTHx5W^jzY=` zjpyZm+d-eVt}{P;wlN0?-Nf`+{R&FJ-Y?3}kdHLEI_kTku9?6qw!NO^S?8UrP1U+D z{C;-g#Ve}#?K4C_;ri%@?kOYK@Jo-cisZhXwsc$}omE!&}k zkIn!`(~LfjuQb#MZRCG+A%>2-SRH2Jf^7S=^PtY+Uo8|&wL8QgG@bdT?=;)@Yt;h5 zYERP{rP&lC1MZL)qjuxLZRxgbJ*JDx8FOk|L|04AS6~;-6oo1Yx9BhDmhPw9Qu|2Y zb;%TAX>qaT6)ePG!O4S>(Nx4^gJ4(e_ zxnCPpW^hky>E^$5-j+ogTJvr^FjQy=YWR2ISY={MJkah z5gf~!b=~f|%AP!C2o~+eHcqRg8w_tOnIjnzu+|yL4}hKKG-;Ah(g^ialkR;~wCR<( zT?Gv_rHd|hTZw&EZW|vaRA4zokX4KALIB5f6+eDzKHZl`BtZRmLEOPidu#%DX@qApA1)R5`J6XUdV`O)2Q__PC6H)? z4b`r$Dz@-^{7zN_{6N#mtBKHosqO~I$me&_(GJ4Ycv2$sitTQGYSx;z&T<6t*${17 zJZ9S3{)+pe{+%zUB@>uE8aCJBKddyU@4e2aZniflrd7+-67#O;XSp-e{Evqm?4@e= z)2@EamwIu&TLdO2$vfp~w+{fq@=!|0`S@90%p7&v;dR^Pc_OJ$ZY4g9BmdIbTW-asz;haun8t3Zo=9z7}x1)*LOZZ-h5$+!}JsQO(GV-@OM4h*Ui&8S`5Slr0YW4(PADEM^{^ z7a-Q3V;?pSV&x^_?p&t1uKs%OefahpP@UWoKSs%&$!9aHCoVHz*%0D6PRA)%EC(qi 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 kpZ2sYVOK|*Ig?Sq%Px5*tN;K2 diff --git a/legacy/doc/checkbitsping.png b/legacy/doc/checkbitsping.png deleted file mode 100644 index 289246859e3426997e9442c123082cb3e723d168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10245 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 H;rIUsy<$rX diff --git a/legacy/doc/passwdprivi.png b/legacy/doc/passwdprivi.png deleted file mode 100644 index 5bb142f52be5c1f343185fb30c4adda2a0d02a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47940 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 diff --git a/legacy/doc/preloadWithRole1.png b/legacy/doc/preloadWithRole1.png deleted file mode 100644 index 228295c95609238198d74362d3b4ea681692eafc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24647 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 GhWsCgs=KoQ diff --git a/legacy/doc/preloadWithoutWithSetcap.png b/legacy/doc/preloadWithoutWithSetcap.png deleted file mode 100644 index 939aae745cd5ffa155bd027d1af9c283d2b31536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25372 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 M2}SXGQRCqM2XmaSC;$Ke diff --git a/legacy/doc/rootfindcommand1.png b/legacy/doc/rootfindcommand1.png deleted file mode 100644 index c62dcc50e9385099a77082e74c7eff46ad95fd0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7793 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∥RbjcBRO{0^%{ML~>LMQ}6A_z{izMb+dk)Pj{bF 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 Bp+*1z diff --git a/legacy/doc/scenarioNoRoot/privilegeshell.png b/legacy/doc/scenarioNoRoot/privilegeshell.png deleted file mode 100644 index a4f8ac32760f284d174e7d40b3751fe17fa5e98f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22409 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 diff --git a/legacy/doc/scenarioNoRoot/setuidping.png b/legacy/doc/scenarioNoRoot/setuidping.png deleted file mode 100644 index aef58326f7bf769d7e19cdc51b8032e2bd597218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41399 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%0A*SM|`u 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 diff --git a/legacy/doc/scenarioPython/connectionFailed.png b/legacy/doc/scenarioPython/connectionFailed.png deleted file mode 100644 index 2318f0b5eb6c20925c8704c7e21a65d36defd5f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30942 zcmaI719W6vx9=Tw(6KwVZQHi(q+@jKq+_RIJL%ZAZQHi}rJwgb=brDLbM72t*RD~c z_Nu+tnrp2&fAe3V^0H#E-!Z=f0Rh2EhzlzM0fB&iz3+hp|9YLf>bCtlLD`9GI06B| z_5D476R6;@fPnCUB!mT&UDMApTwGD+Uk3S@T8C}i<-`SHGp0%*!yrM>XqUbzTd8m9 zick-U2;cedyCb&pA@uuat9Sbo5{3bY0SJ&J{7B;BwrMr3%j+qdcobkm6E>_FV~1|8 zo?~a}w;h)hjt65Lhg4v{A7d2$Wfrv|^Ca(GoK2bHi92eumD?T~??te#E7I)(|J0~klF?}rC(QcARN>u*&RG(XwEdYLT6DdrT>}s88u3WB=Vxan7SB<=elI5R zj)>SxnqB)Yqu|W&1SCF00>O~>W)Ghl60L`DQ^7``k~TY0c<|OF{=vnNDGQ>5$KA6+ zgnrRyOzyXH=MDpQ5)i;xbDn$Ds55S;A+y#KOm98F0&{v6&7O;;M*2BESo(S3PI{jm z6oabZ)S7GPN&6WqafS?jqEZP4`vD&`eGLwOM?mPGgWU`7mhM>;=)lM4zFJMeh5hiZ{X5UDs)SA)q2I@@!Dn{-(H6=Ti|GWoL(ei*esx zB>jCQ$W>6POUv8UX$Bvk;Nhm|mI?Ulw(w1ohuqlGX0=9g#1OprzW3dV(_X`)Zhxqg zy+|WdcwRFPvTDWv6YM#B+#jK$csHlZAyNOLK74R>It!&aSE5Fmx9w28P(vXrAavFh zmX8)VTK#4uIWBO86D)V>lYM(F!iqEKv?Cw3>6uid-3@YtCY7CBj9)afe}Q z0rR28>#OyEwTB%cwEBwzSiwD_TF&UZuB5&?;(nc&(MG^BD`YefRiO}_e7bdUY!)7% zNMH6jd1tmLrr+QxG9%n$SXNq*?#|n0X@)QR${gF_NLvsbrt;1hzr$#8hYHT7nnS?=crXQg~!te7L0U58i4c^0bY2 z#fpZB>A8t=nDFrKMI`#4;Hh_NLo(d? zTc8Lxklg{IhElJ7AFNflySL~Ih)TM#b+(rh+`m4}-Cq;!pIW0`9i=eQx@Zi4xNJJ|^sagk zqGlSdzWnn1RRt+A>$jTO8SD%dJS{3R&8sZ;GHLneQpt(Plbz|ZH7aM@Jp&t*u}YDI;eqZHc@)eXcf1O4o?Ezhv#P6R{g~c z9c@EnVl|x2egr(*=qMmOIsE}m%6ml6j$oXm^g+S6l3SZPxM(5M?x$#>;W&Q`T}I}8 z@9MhrMkSgjsav-FiDO)#fi)Ug5~`x+An#;{2w~=XU2-F8Obc~dtr*MGI;v>!wk)-6 z2m*sG6CupQVCNjacNAAQ@?A*BhLal)Am+-UW@DU$NBFg_)su3M>BEwSg&ut^g^jdx+g(edcJ4`H2za_PW0TiM+#iIRl!|8?DAl^?5Ggr zu`!X4HDW(2&o*7qY)7N7CwEpnUTTgH(77#a_Pa980uBf9r+$eyIi#kXf3M)xqMo{j zFhasP5=f;$C12pRl_-sxwYXbw^$2F&Ml7Vw`!%jByt^Fe!5oeH-i7Of7Yv;q%~p`s zqT7@6MYwuP{0xAPB55^mo};3xCKy-i0V>e<`l!sufHgSRb`iPTnw~e{LZEW8&vi#C zqW|N_eWI7E?>7CNHv|6^D*~LYE|zU)n}iU{yWj2!G(vQJ*rA|18Sv zlA;L;3V`dLv=h%&HH?cc^GP+h4+1z-9;zfbYb%bRHoUtb||AUB<}WFJ>W<7rEoyMi%o#sefp#8hieia*k4JPA%23s> zjk}+-h@zpxKST$`IF+gz!sPZa$EIzIy_Mec))7r1R(kLNejX(51A=WC^@M`)kDGK5 z{~X|dvHXo9g$Yu5O{!nVMY4%8H3mtv)(O}ftQnd_M5q&7jU0Unn-Dre##YxF@HziW#g_in;lQYu9u#}-#x zoxB5sQKfj}h`5{<#<0f@sn4?m0@C5g$!Kmw<}T+l_~gZE(MsIc-2wJn@EQUm-IFRf zpX7J4h>L&aG!eeig9O@fC}Fo8*tR9j?wC(_35OA#$=iS@}o$^up)&wpO@ugCf3`s3d^{y5#e=is6Quutv#pxHqx9St)hdc0U3Onjj&q zDkz+(;9mj=tvQzHe)?;Y(;X^+%(wKNb~+_fJ45f0^uXgW;If);mJ4#puxMZ|dVSf` zM^3ENC0X)`4-h6|J_CfWdC;eB6TH2wBNJAG$-gi)AcgagyOTpGydcox!BF&vpO9yl zb=1d@vIP(Xrd|ksN~_oUblEw*eq&OK+I7$^pE*g$pR$71mnm=So$XIGds zCc5_Nk5iyk@T86<*22&EAQY6B1Fw@ZS+%7ANV0xM`q;UAvw`{JJ~d2&9VV443~nh( zNwE<2ifs_z#Z-lJ{;&61Wwz@TrI3taS8gIKe@0z#koI2!n{D4xk3k4PjLez=wPqJMXJ%KJ=!8IKF~x zG>}f5)+^}06GME47>DEoAiAN4ShLbDzI5W@H`PgoOj7pE0Ny@y#?Dq(C+Z z5-c=FhS#lfz4YX)?ECl3*#DpqrgmkqES+MLSvz>Ox@`+=UNJlIo&9kzf>mh?QU1nVB#?O40d@jhSa~3u7H#t{LWZc^-x2 zg7Y!^7a{E-0^&OA8Q{YyT@UBH?dsdMHbx4iDfU?b#i4wr2Y6*gyWJw5F!ENUb`xIh zydV6$h2&BMhwQ3FJPBiiPZv|DPV>uy4?XdVW@d^j2bQkRINoxUu44osLB*XgjeuBUNo{%*kJ|A*5={aL=C zlnl6=9^7lt;hcNxy&Z-q2jrzCxBYEk9H=Q7=Sk|^gC$1uiG|87LGD(Tp*E$BYDj$q zNlD2wI>W4X40>B1aY_*z43auUx(%l)W?pjwrz4 zXX6Z{c8~Lc7mT9GfyOHN?O6o5nITi6il|_)M{sq>^QJy^^&&%fh=AAhccgt13vp9W zB%6@T4}Lg*F>*`+QATv4Y!S+&?mQk$#Qd;lc?9B^g0Om6{}5l_>}jt0bs1VVAT;VC zRrxquPL~{R(4&hZ8%j~ao^NgvON@*1$<1iptz@`5X4^RS$S+JD4UJ&DTpUvOPQwkhvQ{BrL$oIq)pa^bms|DGsvs%rw7etoe*m z8$z&xg0BzZF-B@L{n5QUFuTD0$-H?9O$r9Wa(0&A&nVJ+uR3_>;mFAz*6*NA1&k+t zrANg|j*`zicd60whr;-?d2b+*kdPX`rOO@)T0M&`KW!_pezysPY5x7}B9p(lG0Cp3 z9Fb#AmqqguCj8r!dXX`%Av5C8*M?GvGlQT?4$;GBLI5PtJ-2n>^6w@njN*U;byWVGQES>(oUHf6t)hBny%)4lvsjqI(7eC$M=D*%O|3pmvTB z6;Mqe#e7)VJ@MN#P|wG9xX<7S;9Msj2&~LPR8n?%>V7r{HKR%dm|}q6fY((Ii(g-l zN7suRs*NN0N&u-)8x}W17zXc9agHRg+sCQk@E%oZY{rijGl?Jy0@>kD=nf%p)~V-p zpY*jsnqvo7mm)rar4!iX9hp-NdA3ck)bF)P9|*6CTPAk^nNw? zjbqoLpIz<;hIFGD=#&A0OE{Fq9MYXJq#rNo3?7e^b7A6?ng7)-M^XU-V_5Sj8oi^h z7A(`xC_&=<8YT5o2oT>_dhQh{K-PwmWf3*_rvGI&I@Hky>gj zXRF*`<0Ke!zR`%ZXriqC1b6ru2kvI~kWKt!#)wdxuj5o1uL~oi*1A-`M z@R(Z{1)GH}G+x9EJ+d`Vk335sXk5PwSr{-At3)IO&b(7@+~|NMYAvWJN%O|rz>jCwS&t5?&WIB>|1vEo7Vy6B}O*HSGy+5A&<)j zXD|;{k$jS>Os_2A3DVWMw)ZF$&ZXJab6T-zi+A&>Y{6$HpQ zTyt@utH5wF!0+;EJF)z!4eCeq8I)-KXm)|P!e1EoS1O(?C{3MvJm3p$i;?M67Elb4 zxqo=CvV)_kdJ_7&7fPIaiGQm|3^1w#a*#!&pgTVPXo5Frgxb5H-*#*7Fr2cWATm;+ z==i+LeHQ|09xNNmNdRxWE$pooa8+4e9nC84$H$x8-I8Te#R8N~5_ss76DSFVv}hEX zYf$_yqVm>Vt?$da5yvPg=#4zba4k>iQKwQZVFdlAg+f8TJ=ca^7X6I;CJ(7eJT@pf z{4pTDy{SrQdnfcMge$>@>No;TTpOZFXT&0I%}mQWm=Q1^xLqZ^^aGJ&QP}>^8Q^lH zmBl2ibArrAAK_zG=xSEnm`~N;pvdc!S_^f@|J@an5Q`on z6{qZS_dEcT@&KHMEK!MiEkLdB2lqS8P*4T{Fp5v2==_t;W*uT@UM8S~9qT!_KdN3H zSLoU=I@Vn~yyG+j@<(hKypbf;uO2a~M5ax{hfa(~StfgQNrsE){y4QDW7wX&+YHy1 z)7a5TMem>1`_#U9O-+VH#W7jo&My>z*hhr6*EM$=-xDsltRwrOem#Ylv@l{77$9yg zFhZ;cB^$sAhUGV|Zx}j*R8NO8vygWW{9L4|Os^dV^RfZE544Al%tcJKdL4ewg0%Kn zyhc){Dr3eDJ8&`fyC`>j*n4kgF%brvtPQ%(Tv8uwaHY@emRWkEHU-hUir{=+PdEZh zW;ZXwbXLD9-tM>EKWG8=?_f-bn-xY)mIp8(_aOV8G$l#I!ig#n?NzBqoe4!xTjspjKtXYD5Y&LN7&HjY7191Sl zhkVl!%Aj{g-yPai>W(xzK=D417nSVGX>vH5)CZOz;xc<>+CKM5dgA zySJm(tb_dSjChE!Oon9eW~WJOcc{frYjo2#cG%TFNg6&QvYm$vz8s?ijtBFL%gH$p zk&%K#NkaV`p#F(5pTb*NdXg5IA(xSvA!x|`P}clYRoQ`nWsJHkJi$jg!6|d#aM)f+ zrsiu^|J9$`%BgTJF8O!S3?_fz+it&pS8@u$`FUU1tpD1ikQ2e2_e2dYAs9{qVCJ{T z2LgGARAquW{2~XJVqv|TLspPv_cDz%<5}1A><6&yHH;HLSatep6Hf@m)ANX`qB-@mc+YQBLow2JaSrb$C% zOP_r{R#)(O5LFz+EF<*kp=-PhfJ{Qq`wmRx>Umv$H_w)>L3uBFg*(*8F4m`m9!Do8ks@^3}yF6|gT}jk2PNmsA z?bW01X{Z{n9*iSfVNW6M&6)x4FwDE5R|S7Q<>Bg5cDtx8Q|nFMCqipFnHVqKam?6* z)Rb!rw-VCQ`_cw|-!aHfhA z$-wBu8-L@Emm4Y8zC$(a0CLx9#~vAJtj*vDT%`WvSB=ISOT!yulVNdTLAtbo@Xs^3 zrWmQU#;oh@EDS(i-e7&jp4zMl@MHzD>rQtjahZ1iBUvOI{MwZBvC!pA{F|cPMbgVC zu73Zo%zTeJqN_1nLl)5HKec{Yo1SU5a++sSc7}SAvuG@#zaNPC668)50DaU@@*(w9 zCi(b8l=FiStqo07NgnaJ+7PEI4GT_iS$8{$9XXyEac&!3wYoJ!lwStd^t9^BL%ENp zr`G}4CD8=wZDSxLM8P{OU0ie|9*vmv)zWbNL{UU9Gf<-di%OlyQ^R=nd`5CMRlmN( zmB}af{h>*4ncSAxe~FVr?1bWYAZw<0lJ*t@8sc{c_Z)zpr6Fd}$HL8Fi-{bkdL>jC z{;Wcjed);(J$@py1Mzt{#}5SdMzp$}(HegSoyo0f#C_TMg6=}yidYG+XKMcxFov~~ zDKlL79cm(gD&_IUV(oQ(%>UJf#OwO!2dzUTU`Bhm&4eQPzS}7pB?f4JabXj>cg!gfTEt!z4=IQtvW}`ZYhxQeJsZm6p@{x1{CeK{T zYji=S3^mRC0O@m;zdCFMLgXFS(@S@$^(4lqP5nqNF_sRcKZL%7Wx9T5V1&u}O(H^Q~ zR1@?NiF4B|T&%iy!e!@=Rmua#FiOFQ)Q#p!U#ym5#fXU^hDw7qmiSt<5ZVF6?6A%S z%%?o~#RU;4Ml@j+NwHFlx!=hXvjll89ROCFzak~Al0a<4Ui0m*Ou476q5Pm95tm^Vt<*d)ns`@u@U-9FdH9@CXdqz%*a6qG|2reQF3K*rBhR{%uuDkc4ge-m)t!)0z_d zF~L(-HXMq5e<4Xn#+FVcX-6q;p}L`CHY`ViVx&{~b+i2IUh-8U)tM^mnekG(>L}}; zbPaOHsksvMYej!uR&_P=$fkgp*jT5|vcDt0Cu zL%-#^{DGdb^K|)4ybXohWcg!oGm2nw`p)EU}Li>*&?{NQN^^1oDCQ5!ahiGWKK@G-y-y%q04c_WKT8^GF zde!oD8d~lz|GSRC25|oP@~khj*sbHX20{JD5=cdGV2b~-I{Ufqf7Mwfv5KxCKn;H= zq0wxA965TFq>2!#7IfSFdHYH6s48Z8E3ldryy*&%AQ*v_wD$RG99?meX{`<>vmP)g zc4BF@5ih=4m;QS*vjibF78ZN$4f!R)akT(bhESC)c`y-Pe{mNJDw8dE>N2V3AcV4Y zY0BRIpT-9Sx{6-s*BlR3?%-z)Xt;YTDi?3vtU%L`mW+9sX(Gv{zozeuriCx4j)_BK z$GAV85+&-MvGK68tc)yc9CmBb$8vEUZR(%3`ivCMPhk+}_TDuav#E#X(BIK(J<0Kx zwJe>PSSE8VUpwoJsCmrny2)_RykYZ}j5P61DukPZAee3kA%iWg>Ak_>hG@cmq)u;U zomF$*+nG2h-D@rMXGd*%Bf9Ml0G5An3Id&h# z_-uaN=1?TT1T!+KF-&o>xK;}pGgCMxmWrrp8WT{W)TE89CVt5<2 z44a|7!Cv+pT{kf#NuZ*zchsND>!48xHs_b&7rpGz%Jsy8bQw|^yn{7eoLtx|1pe)RuLe-6AWl0O zE&+wC#%o{W*JC9ObO|)8N#a#{?z3d-;)Z|jUBf(d-8(em?mqHKJK@b>;6*0-cDx_k z@QMn$d-1|I9|aJBx%hi%50u06b)V8r?43+$f4sdClTz+iC0T7LHxjs7ztV-XjcW7O z@n|x%3Bqw*8y&nm0)KuGX5~DtkBIXDujMvf`&EZ@ws)WTwD+JNz}?*xAA$h2?gMc^ zI9E@u{VtKC-SLrI@7~KfzqUrJCPzh02r2{y2LLLKT4rT3gF8EP-EJ-_<+0E>yeSpwSWXp`_QwhU7s&>8YJWk_$l}*dWI`Hu zo^jgC(jLfJ%0n5|ALSE2JAQyUI*-(sGJD)$1c$i{{EsA#)kv1?K54r+*P=rs3p4$1LV;eEjxVb=Ir5 zoS^6*Xz8$&I<#>&i?{uVqXCc-jq~2@y>5|~oAX!XSh|tD8dS4Xf4fuE{iKQa9lbO@ zmU47+l{W5`X82QF{1wL5nBw~^awd9bX*TOmiE31z+Ga-OJL-5uEGH%Qr@Z}4uxdb*7 zk1K=ZL)?B}S_qE8{u!ptjZ#SFx-WlmyIg(qHx!f2_DUvh6kq>bmx{&KiXDq-!y3%Y zaZgB&Kob-QZY=1JxeZ}c=i_ES-|!C><{F0JKa(zIc_@hS#uj-%Qe86{$@rjAF8a?dwY z&8R@`ED3x%17I=mC4pb7NBqUkykI$m0IT8$AsfAAbqT%51AtxB83_R5?iiMDQ=~T|5guR zbwZfE%osZ&*RyIKT&j71?vP=|uge+=pVSc}E03_EDI(uxU+wq^vqh%X-Y#CV?mt_0 zh#O|p5mnz|J*g{fU`5aU=%$hbzuwQoLp1sp$WJ=q6GTuw>S|$W5MbMA#hhZ%Y_OZ_ za6Bal0a}jjWm`Cj8~!mk&;6`M%DQQn3js!0SC`{zSv`yEK=D7P_`RmcP@M<52T>G; z@2gVF2_y&$wRGF_N>pfupSFm$gA%Sm@H-Vg>jS;Wa+=@X#<1nPwLZ_lAzhh~ZPU9Y1KKN6CmKn~q9{M|S}g60amV{93^;U*OKS3_ zoSI%Eodh(b?p?Ya^6bE4PJ6Jh{fqZP`CDpoTPg>nt8+#dGW-Lv!9HaNpM`K8(I*vE zKa=?K!~*^~wN^RmOm__`R7{yFb>c{oA8VNXE)o09_|Fe%8X@qBzRNur`TKH_L}M#f z=za^2=l898Zd8mQ54%=X)UTa~_l}llnC=@ogv7C?l9E>0y8qjcg=gwjH9Ue%>fQ^! zCC6T&h@)~M*1R2FiNvZ@*z`9`JTjY(%!wRAt~ivD_V1RQ!E)~QQk(J}vcpz=-7!(P zixc_-DmtN8(~7z=V|set!$D7;R$+0A6^~LCbKNJ-bH?@x7BbA6`uzWBAx6>Y^7B_C zsoh<<16;}sCjXu6Tbz?w%34zC%qr4cx0)XljDU#UJoT(%WZkjy9lDgnxWDhin%c5W zxt&;{xvGcS5-(akTM(xW+V!3jF?_lKb}hao|IyS=AU^L-81r~$zIeAW?e=Pn>u_c9 zK^NF6KIV2$h@DKLGcXH6{k)hK4rB3v1ok>Cb+b~nMdEwn``gtOaTzkYqdSjL@<^Ov z9FAY{>)QtlSKb%uca!12NPi8XGF@d?S z*|}$k!@U@lN={2z9(I5QGbFn68Ag()?QaxHyj)QpMvy6@SvyEEiA zq(cDx8(E!(7l2cIk?5;+x}_Vq^|pb$EQHv0&wq*q8+KpM^Q`ELeKd44wlu&MM`Z#<~v(8tWRjp)ZChCb&B7RKo zmOzAAzW$Ev#Zs;M*$E}3fnjo(DPB%a%Q(QugxQYk(xfj?K2u*<_@Hh{vk$Obw=1_=d+nOMGAi-IecJx zjph!8lCGw-LTrz)MR;_$w1GP*iCPfCA3v0|+Qrn=6(j4>VbZ~JK7$XCy^(AvV(KAL zQ&E9P+hxXuIAvBJ#NH6MMMmlaBQh3J=D^<&F$tOT^q>UGk`mqo&#L?g6tyZ#_(A^z zDC3l!NbxSgWxRY?RRA3n*^kTqjmt@_q^KPv=K8}Aou@9LVxIQeQYFs4K3w<#&+_Rp zH_7e5-v^qH$M_Q&7~l2r;H9MZ2;(3?c2`!uauj2}IgrVsU8vpaWlUuE2K2 zZMWq0VYBGnX<5F|Hss%Jy;Ps4b6E=g2i=;l8O`1HL|D6T(t;MBWHl7(tK6gqf8nC# z5`j9A#1uKup`fL-PDJBm!Z%uKj4V%DpNRX6?ET3*v2wUrvr4|&X(}MFqb6{o0-RQo z46=U-T(4zI(~Ic<`^e`AO`xke0zFaXvrFa~Z~RR|A`b25Lw691myN+|1L@*6hWsnP zx&KT8I{c-<*nhowE760@ZMR4t)rqsq|FI}LhP|}>Ge6^;Ft)*s#WsYE;e1+T?UYCf z;GJx%cCOGis_7M`ebU-f}=#A*s6<2I#FUWkYb@w0?WU!7Jk+ zdpZx8TvnncdeXVlTJFj$hiE$fu!niGrtugBm_e+yz?xzU^>pED1;$qKKWH0k|>NpUG?Dz4L^#jyr4BlcENrd0^^MI7_01J%-f4ih3h ztZWu6jR{2iiauWv-K~7Wqv3Sg((+ZFrhc%8giEgei=52?$4;>E4pT2wKdmyA-=*Ca zYz2f#_Ra|MA%9`DI%(Q(5=TFpMQ45&v`a!H<{Xv@y+MwETj$<&F( zTB~g^!bz@#0>C*HS~cbNTMZu{Z5@5ej+C-#O9yjRdX18o9M5VNRg;L$WZbvim=2$W zL+>GBL1L#T<%`UvqzfF-s<&reN2*g1ofFRt3-C>>HMG`876YG!?-st_0vVgNHch*e zC{W>jzJQ+SuLM9O@gU{psg0&^kEo8oJ7mwq=~6#Qd@J8uFb(p6)GEvN{CWQkeSX3>;$drc%9MD6->19OPy5yyO+&l*1>9wdw*7I z)6XD<7B#!w0$V!P$n?X|6e&A(#qBLSlcCM zP|zvj2yFVtF0}5dYmMMjKgRGn^sQ2#!r1>%5IYQ?(oW7==%}k*`}LiUXKz9bx)iqw z(|xVlSB&}8%~Xx;U^PCxVyuc4>L>Jfq;W}yii6#^yZ!5*Y;bRAVk1l4PB-Y{%9wLQ zNUE0eSiXtH2B1^tn|9aUFJGN9BF&aDR#*D#>K`C^E|c?4A&IzHG>HU>!IDBy(pgo$ z?iEq_(JF1TgZm*YbZNf&jOUb5ek-%*(YyPH=HYUdyskRgJu~fB$y5klHpzsITbA4H z=5|pXXM}p`9>@O;5>s|{m6ltaAt)M$BcHdeEGh5P;7SnP9xuN17cOq43p?%%j=dg&e7uYB3SG7)#Ci+fdu7~*mi?PS z`pkQwXWMRO%J*U@em|ve%{iSo%0Xy7?faH7*Kc1ElXB4y+ZdhiGYE9Y(p!8KAWy+W zQ)}{!Wcu#NKu7dQdL5v0I4ZrUSZV#eTD4&|v_VnoojE<^(3drp0Ef~? zjijipQ&4s}ff;8+x>X*cd`mdZMjX4IkLy<>u2F7LPY^k7;rHEO81z?4ebGszeIA;jEQ3G-uP>b*t~p_wZj7`yx2PNU`_Sw zvUZvJtlh9zQiL1E$5KFFIlQ+6gdq*@n#g6}Iu6$qs-ofm|34wAW4HOIVae2q=((Wx z2mtYO5O*R`3Q%yN@8Q4&epiBs?(sYy1NBrRA0e<%&T2)Z%VT%D8}=>BkzNlBboc$h$2aX^$p7B+QpjQMoGRp)kSIO z)_NM3&86s!TBrToF|KS^?WP@g(z%)0&9{d|v?R&rgMdt-=G)=lZH;df9~{-t8z3XR zkR1t(vuTtjh2<#3{f^{^+Fk2h+QUZCIszZ)rL=J=6^`wyRkO{^mL*wVA|Ir+AI!yu zIe8U|vK$pb=?)pQPRiUB3j$)+Efm#CE;_VY-2vW872S@nrVj~CJ4u2Ww&v;PjWVKA zHTy`p0t+yEmzsk!mr7LVFe~I#&hNvAE!dStbqYz2^*-E|4~gt4Q7NE$UV?jbr78Do z%Kp|EXD=^~yz4qf{Mq=ZnvZYT_!tZT<>QQ01{AI9n+N`Upfp2o=ll$Y7&LUb>otKp zXSp6`V$9QyXbERin}sN_`eLORbMRJ&iuof>yLY0-8Slx#H?{`WeNiq*UYPba^k)WJ zhZleE>W8Lc##tFErgg|)RV9C)g+{B9cDK2FS3tFVTufBW#RKKUGhnxPot1=UI8iDD zT!RTeC7gnsyzKR{-F?V$0i!!WU^htr?X(?wgVn^UCZuBoQXse@h&+?#lN^hWdqlK5 zGKQd${<9+VZuJ%8)iPh9RJnNljk2WQCHP+jOL6AYe-$iMpK-JZ_&jDNd_A4{JiZ^& zx7or+fR2QEv1Q!$Uhuy>2{uZi5~nuHyB&bk8AN#5krK^z?Cr~x%oE2kV6#-voJ;aGubTlhHJl}{pFoh|u2DDY^soUAzd;NHQMuK4r`T@G@c z$(=8_p?*7A$f_qv{bf_2u*dP0VZ!dF>Y6Rp?1C)ImiV4=!*l+E6Bh0wYr$*hrlJbZ z&YSi1c6x9TiXkae#h^AF$uM_wzAepX-Nf1L_GRb|wL`u-Vos%MP2cCw1ztAru9xCc zYun#PKu((MN-JWVLy?nyaoa>k*~_&QQ;joM6+|8ydNsArI5yjOIv^%3$Fk9cO~pK4 z=m@M9e=_MkO2;0&fJVbw2@j`aTAyQ_{qjGECUTK8&DT<#MMF}hyTR5q$4#R(w||b= zw$@GQ5jHxe(x3SFKc`wOro%wYh1b^V%u6%s^bY;N6U;lDiamT563xE~fii4`JZu4o znV8&fo>SaaA>OJ~gPpqF9<5Y`mRLfWvr!CAxQ-m%ubo5>JtUJ36xDoICVOQZZQRsJ zwGw6=I_+nAeT}C-E>bxH_}ls21Q=KObPoHD^awg7f8Mv3mA)tU11s{1IdI+%QGFIK z$z08wy`>UxOiWhPG5Jc%t^qUJr2Bsa2c&Ppug3DKzVK61h%-|$^Al9z?FRowsAx{x zCo1&^^up88l%i$UP#Kg(8qb*!V6S4!b-P`xM*r=SKE_$vMFEKCW^xhj!w2+IfV$D0 z28f>#p22g(MMB11Z&}OCNRC|QVFF)R?D@j;Nb4ykdclY0@Z&(2iWWAn<5?X;aH-xZ zxV2DPS1lcUJALRG>gY3TITY!frlR*mF^BvAL8uLZy`q?5g|rX}D;9m6OQr=OIN1Xt z1r>FnB*~a~eoTCxg9|Nf4s|JS%z--I9Mc;1XFro^;Aw)sEv}$}rvALZv^I@q?3@wHR#912)IbN{c}*TKI04^+K<__@zA35a zHO}`!?>?clwyL(ikpEXcfoZN{37#H@H~)ALG_3p9aku#fm_HIrs>8(;Nu7(lKpxmZ zu1)PrB?BA&FLbj3oHI=09|T-&uEGR5f$#c^%#WMmcEZ2KO=-dt&AjLTZ_G%_`j{IK zMP2lOc**2X#i{F{BK>vUeq7$NDL5eCPbUs^KG5;KO+$Nj0+dgV2EOf%dtZ^j=VLR? z)5zA=(aYL`0;$^9%gsn_pZ{B1i_Un!V-(R!XZjpYC_vA3LGItAu0F%vQ0DMTg3jg` zYh;n)#J=P&2B%3e#e`9o0If9Ms6iQf(Qgs^jtU<^$uYH8PwjmPNs^P7%;druueiAf zQ9xm%1J_|5w}MsMw;^H%V;tm;jQ>Ol7uMT*0h{|#pm8-C%eKHa}K3w{_0^cd#` zf{wQ~swc$K)nS8~l(>8=I6_imvfMyggFS64{Gv1l)axR_mR>~G_4 z*PDR~eJL(M|7Hjw4>x>#BxYlvb-Ev%n(@dSC+i8i^*B%2)^bjbibzO5lk8Ogkw$PZ z&yM-VF;^LJOsy0|v$N#ifj{jXAuKXAB6|0T7=z%s}P{;MaH z6v~AI|JT%AVJ|;n-(d}p8#^E&FDUt%dbu-o#Y~`oTco74#=hTj{o4ts39Pca@ZdjV zCw|F>Jm zTtKc#9`vC-L6p+p6JtkoD zKRrN0(Ow&u6@5&%i8=|DqeNM7$gbb8^>*TDJ@vH_(7o{fTLDM4Xx4D*(FVs^SCaWx zR)O_kU|Ng8FkoVwT!JM1ZI?^cGes&#g4lH^lKbJxc;>S`)3r82IZk%0FrW{%we>~) z7Cfi_ezDwFir5skCXGMQN}VPVTD0){Of#IFM9-4Oe|rT9DTd!Z>vWQ@vr>dJ#RV2=f8fc5BJ-8+=iz7! z=@ebf2wiyARh{^i<_zLMy9(E4nmPY6`VdM&+}RJPbS102Z}hwWk=0ohl{^CD7`8J1!IHQ+w_`wim|bQTyll7x=^`W8XzJr88`g@NMS>?rRJ)Dj~;B< zT@L&*n#}#VW<;{a8htXl^?`3>k#Ap*9r+p$L4CJGCZX6EtUd8oJj79oF3r|QD*wN} zzA3u0sOz$lRK={Mk{jDqv2EM7ZQt0oZCe%Fwr$(!)c1|*IV23EY@&1bb1t#~xR}W2dbY!Kqth`u- z3{(~mr9>1DD!*xUbj-tx$e(D9{qdkM?v^VmDoV;|;`x0dC57JjAT#MNyPu=})I28h zys|X&+QNK(&NoZ#n+%ego9iAJGv9`w!f|BA*On3VFzs*0sid4)pqH{zhSk3iK%1}9wCZAv)I(K26l7FT$w3?nmQWRT z0Xd8{InW=a)t9w2{LH;D3^M>Hc%~^8TXQYTW+Vd$NTI`z+mkG6Yfdz}%mX$s>-Shw9WHCd9-&?ff# ze=ystxjhA0CiSS4=*^B`$5UE`E>!8epJIl@kJZP4*WA9&LnK1LI}Lqv+XXv13hX75 z&caLG;n_EZXR25aRRk+wi)wJM1+deBi;{0AX=8_Ty3xdV+fJzrl(?32EwMS!q{hK< zR~cpr_qSNWu*ZYn*Ti$A*StH`ovrenmGX@bWU0z>`rGnj0ue#thsR^|gzSd<`IoM@ zn=IfAVdtyS5__YJ+Vrt0Vbta~wY9L)o*%h42q)=$MlU_1(GE9zv!t;_!u>sA<*;^1 z5DE;A(aP5j`Fe%NBjGGcS)#9oKn87J&j;n+Hwd^krmx2Nm)_NiGTX&!u&r=mour(J zL0+tuEGY$TpIAxtpKYN!m*4vL4SU&PT#jl2I6jA=J+#h^!5u9$ z$ptcl2qt8CYn0_;~LoNhKcbye9sPK#{T386kWF}99k{6O`H^O&Ui}>+& zDA?QJ%!%7xn;Dfa5-Tim7>HT5=gVpDvRZ=dhsDoVo>Xe)?%gt+A2F2g5H%1S!XKjE znaNhc`Oap;i8k6UQnQW@tS*C^a_+TU4fdgb+SPUat)>wXIIQjCl5s!Ba;jR_H&)y^ zxfdTB;4x1tjcQ4_RD$gi zW~NF*`>BeiJB)A?dZ2xIPy=;*{mB-F<+GY(1A8?l1fp?bSD_CIzejlJ_yHfGmY15>~Q}j{bksCz2|vVP`m@tY+zE&$@)xUm91|BnD;@B*{PV)IakOqI_gp}vLA)4 zd4!IO9K+8Ka7qf|&CbEu%|844UNpOYe~(OUbzHqp_}J5h`?Za)g?N7Am%#&JHr3l| zB&q_B$+M8XJ*MjL;`7OQ!G&trJ^@EPFMYe5ekTf$@7v}fB{;*JjkVQWx3RqHY zD6QB_II!snx5zaF3lWykH@l&_@deWBis;=i*0J>7GfsN6!6ec8Lgs<+*SY6u|6u$^ zhdwAlRD_qLtp>CJkWtHxiA-=f6ZFpN)1niI;?M?^urh^)o|C!Jn%tLbH~5vuO&Zw+ zLP3FD`$g$En9=t)=4LN5-CnS-qB|V_kdTVzJ6im(uTYlOMo_STu*$P})j=EsV>LVo zNay09c&fLg@0rhjC2UJKoqN9mRo1j;PtyMPyH(awIV`-|bscjv1v6VwnMmdeJ&QNV z&6Nk(50pqmQsH;zUsI7{(g*=)M}7hf2nfOfX{2~#Z4P972$xARcUSAYhl;$?8L#5K z4i#R%Y>ml0;r6h&1L7UCY8&s3^HMV!v^@v+RGVn5^@!b_&kUt!jX&Moc4f9* zyM62v#dRcYt8ePf8kP2JZrkdPNEKsWyH|f(y0uId4{1(z+)i}A8RGn@>czP4{IlDt zPjxWumFYj(p3xum`v9#y$>M~o<7KgkNZXYdMk+$6xrSNmwF8eIDz4f(N+k%RI1pJkrW%QDbI!CTg=g3PgoM@D(0e#F#HZJF-+6}q+M8_c36ZOr*( z1=LIx*dCh*r+ca%yAEc+I)q=m@r1$K^dO#HQ9N&m5S*0O-Tn|z;}hOp zN!~>)eh2m8!9#=uogvjihWyVTNQo*8SpPzfTnGP+`Rl2nQ5s(s`pme$Sbf^z(5l{qvr4w%aMq zIiOrJcss=p_H^^nq>46!)vBfG7CpiQ(5zgJ7a2Meme>~?QRgUrOl&+ShE^06s{6&IBzP=Vqhn!K*hV?*_35G;h|#ft8g_?o;*$<&DZsGXh^JX*|nqF`4ER zHN^C%TC^}@!M1`mqK}z6%iUyOX?!G8AUxtemZ0Kvgay-!@b)=kLEA*<4TWA4!Z($B zpA+N`#K10ahHSAWk~k1iD1vEHSr@=Nl66>R20NEicgprusG>T(cW7HLsl69YGG}5m z6aR8$lEhL$pws$iFjpFz$P^0Z$Ti%TzcKwzo}3MUN7b3%Oq261~!Mu1ZU>h^mEc<7-Nv419A4GMZJc z4yd5@L!b7L_12ncY!}R-5KIlZo0pNh5a1>GxC+5anX=(%XM$FaE5-E7oMA^F&p;xZWCyprkc17Ie8irbha(!-=B6h+4cTv~4E$<@gU5p=dl}(;9FH zFI4G%;LxHVLb_q}NaC5G$?XtbG+TZX&w7fMJlAj$v4JG)r#nAL13c{3wRH?HLv03q zwfF(=OUnLlec#!-&D-^XcH;-h6hnXa#qmx?NBpfyA|c-9z5#L*ZfPfyz+wAf4%Aznv>JXR_f7p<$2sY=DO~{=Fq^t z4tKT$#fvrzf}7k-<#{5CjhRT(k|lY-{`IYor(TvByHKt~=IpnhjR6_K`vDCE5D{mF`@dJIxQVyxz z{649TKns+%B~lreTheE_WqY|Dz(Mhh_jt#XYgC)o^e<+Anh|s5i59jF_#S|Gx-K>=J0Ms-}4|dEpF9|7wP&oS!kh zqJ#a_FAP;Wc)mam6K8uWb2E9mz>C zV3WCK+#cyY)}R>Pd4cF{2~3ykfGv}&mrqoIJ2q6QZo!6#bZ_qVzUT1CAck7$_yzxbRMuD?N()K zd32BX748w~MRG*yTa-On8Ix&xbSB=zU9{YDS$SUl;#!g0v?HGvf;)?Swr{?z6n=g+ z{xKe3Z~2E>WMYp?dxrZ>A6RMh$_;5P9r&uM;j4LC`-X6sd#7MI?21Tx>o z`O0hM0#QGyzOh%yy*UYXsYt(_8kUSj&3K-qztKY}{pQy>p)KC?@vf#j zF+xz$5!|!F#1WGcNM{LJuGvsG|6@#B%V9-{8N5VRv!ce~BX8{G)&l3%1_GY@TQ z!eF#4Os%x+{mz_NrScv!&k~5(^LHlZ`{^Rci-3FOkMXHf@js2vjo0r8RDn1N{N>#u zJIREAlZ}Ca*emTUe{6Te@CmrKyCaA_1lG_aLup#~kb!t8Rlw@(BxuI0FBdNaEI5&z zRCA{BKL8$J?`qpUo}P&Fp}Sh}SFv=d-VS0vG%ff3bZO&dFDW*~X$H^9v-73vXKgn; zy25B_UOrqN2hi6f6fB{Lb*bKoQVA~pgk#}iSnq5IKvdwb?deGKaMUdTI>4)sUUX2? zLgOEnbzsmtX})|YTVu7_17E-kEH48FdXMZKh|m)L-P^%Gd%99@417}|&}Dry8DL+i zsm)e=2ix0^mQfB`ZS0;%s3hXaItordzAx}=G^G+_vKnB2Hqvt0$Nk-=i>SV-*;6P3 zZn*uk=Xnc3+VB_Sgc-$&IoTh3Sye@82Mvc;JJhXo)H^t~y)>T_#Y>vQy7dTLSPGW% z?agO4$!iz@gyeRgKU~{&*`K~$|7^o~*)IdrhWC9M1%hfaq&J80+}OEPU{EExxQN9W zY=M1%md*~MGEZpt^;{B~FNJ?$jU}~^$K%NZ?nHk%Kkq+HBar}Oxh)JEQhO(nuDCb$ zgY`xk^(QAR)~buuemB1nJHM}q6kZ=7N=y5 zma81YwQbGG8g$MVYdfV@H2Ue<-)6*MuEl!wOScty^0`s){V%-Iyr z_XG(l&n#E%v%){6VC2Ulg>cmR^Q{Gcw0DpGGi*&|mh3+83NlTnYT1iPpceG`hIYy6 zlU|-qw2@< z^B5y#xkD48d_n|HciZ9B44Gs(CaSAyU&yq??f->Lw|5Gas!5ts38`63xlER~r`H z$%)M>6XbzUI^8Xw6fVwu;UZw0qWB%@p@HYidRfR*Jj(X)kVuM<@Wlp?V2w8aMl0AK zH}dHj6IY(z_%dCs4w-2@{~HEsS`M1)bn{GH%ZsQ!lAE8ZMO-qnn|HoN4%b=fZuE&g zTr7=d7EXTnnX9g9Xc2nqJHx`K*J*&7hx#QHDb_U*1f?Bj2y&Oit|4p~na+;dM})53 zpRr$JjcFfD-*_VN6rHg)2a_m#nShCYVKKIJbY%HqnzxYWxJS|wUuxW}(bi|U1n6RG zrvC%+B*U)mZ~o21UMqDVkv++76gPOo5oV$V%zJ@r+G|6m5W56%y_UAyWa;9hovXPl zo3f@01hs~#kbPp^ahlidMiUI<{Sz)5<4E z)Jt(1<<#ILxsqOIE45^gK-By4<}$>ov0#S`G98&GHE7$=ysi+fVBKCDNU4!vIStur z%sq9))ss^%W@N*L75S7S2&Fz5`!Skqy)K1geW8{aAQawXSjI5>ymB0wsfoKrvn^gqKHn zYy2|;t|pGQN)^50R65>u zHul+|q`y$?c<;ZL`N|tNX%env7iUbsEsp6p_@?=0F>Pn0if(LX8j1#>W(v)j>Mb49 zr?~d$ybNMo&!Jr1zFyvT2bxVSUoM8@L9gMJ8t!(Pg6n^t@aEJ$QDusP7I zWBIF%a*ay3$oT<@(~y{@r8P9@<4KAurhKCJ%eIT!$}yqdXO)RSg4j~N5=d;Z@oPLl zf99#Udf#r$b5-e&{<1J-io?osIy)Oglv2NN7H~X}4bI`D#9K;REy!7B>y}sf2M!Uq z56{%I!=;3K-iLGd8>>YVx~N!GH#s8(3k)j#YyW0Vf#iN7JJoLeI?OZOf4l;?6yx=N zZRF0a3omPS8(vt$(pha+HHkQ(yU)xgfbv1f*vBdC0JWFjd<)ex)y0UZSC+ zK?aZzAzATe%iFD?f>wks){z~T$|Y%YbgeJ4Js6^jGid#>vzwy*{jTwN03I(UdO0e2 zBq6@ZMP{?=2^i3NfV#s}M8hC&rto&sSJYG;Q5*Hibq~-kz?tMnfZG~<-89l{?Pqnn zw@^SjZ12&$eL!@5`myFUE*L-N8S%@Jp)@$-&G;kli;^bPJu;ztFAlcOVvPM$)ltrk zxFnt3u?M}@cxs|B!}Uy`G{zZqEVSB;4LG#{Xz%PW7~1aPIrP)QWJDtS*Ui5iZqwJg zU$nK2OSHh^4}Gc`as$U?v2>SvX0pU=%cO3+RK_0$Fx8hZWXFda_eYmiPP&T7=PX8u zCsTxs?1UvY!R7vl3#dwvQ9bgaZSjO|O3hveiYk`|`~57Y{$aZMKyJ#oMuiYqOeXOM z1CM8Q-l~XHVk#ckFKk75w2=bB z{jxcs0Dzc-3(7%C(9;WcT3WI;UpP}L7jxGS&i>4&|9dw_3meP`3ZA>G;jxHRfg;mT zzU|OVn>;SSR|n&u(@&kTEM!?|uGq&5wUl(X+6WX=gNkGQIe*-lL)-zcune9juGpu$KwIC)nLPCp>vI<_Fd{Yr@3sOz*9h0VRBzy_a?f$pHqVNS zhw{rM8}J>JS9xleYaLF#yQGNVBHS&}0)LV<7JYUmI9g&4i#a4`;GrMye}L}g9mjx7 zPX-Uhk}4e-b$xL9+~?eHY@wSnbG6&07GPy=VCPc}6gwm<#kFu7jUP~=yXIqhcZlqm z%sAy$537wCveFs1_(Z>&rT&e`?eRm3j~}FR_wk%Ok~3%r9~bZ(!m9ZJUW;Y2yE3b( zdOTsC#v0QK)?N9!dt@}_`HC}L^|Vi`Ey%a@AW4XGyrKhC8Eug%v4S-%jI{7-eDPNV znm(}Knx>)Li_`I{<-5W?c>bwkUxM1IVx!qqBODJT#%3`7E^DnP-0kBNYvyL-xxd>< z1_FL@m!tl_O*_&C*#RXHYVCQ>#qP5uIP1Kfy5N6+`(o-TeT7E3-?LU7A-ddLqo-+a zUVBS_ELRh6@%{gG>mdO+m@Z)qiwg@>0y}wmoJf`@BZAaQcRFd3ZE%YB4+#7?`;GOn z9c&{nIid|)upN&t9)Vd~kkRSeH-N>zI|B4*5Si%ENi~Ku4q-_rw)$loQ>3*%gR>q_ zs1=D!2m?JO*z~bdKD5-$;hlbehD6Ng!Z>sPryBYh-S%6^o2Jp9UKlFBFhZ_^+iYE0S11>BucTV!eZIZ6Kcra5+HarqUGd6 zVef7yU7uw|bt$WlF;BL4p$P)_3d(d@=#8~U;`adMn_RtqSt$2wo`gmA6MoEbH`n@Y zjeq^jmeB`cf9wLR-VQ@hKH9qpr>Isi`5_kes~SrywLrx2jvDUTvQR0;`Yu~=uWy;JOnvTqctDsNt1gpV_?f9d9SQuhUC6+9j& zoDQh=D;|~P_b$o-AQhQy#M-(G_Oy5Y`c8~Ne6XOrxcNcw;NL&4Z%%WUIg(nvT=H|C z-Bx5o`5O|d55hR?NIyzUp)|iKV77Wb#TRW>SUKOR@)X!CDbM#5$+`4#(o5o&8+x$@^axU-s=oW_*rL#4Y<@9oQNc3^U?7c3vWO%$wD z$E5)PRyEVV0|iC}SI*|UUPB^^N^R5cqEU$^m%ewYr8#6;<^7#Ez>VXzxRgjApos2W z2q{zK;q)vRdBCriEDuiSteLDMmJ~)9o~_K^lEH}gkd)k0R+~V(<-iz zX(${g>P_FGWj1k;Ny7D;JAFtGtCK~+uYC+I!q10lp)0WLX`T?J!ip!t+S@W#>x_+U zaX>P5norD)BDwYGWMSdy?r!`7Q4b+Zgha!hTRAEWe}F(f?iIds-eE0FlYb471U9O` z4EW0|8OVpu!c{Hjq734m)X}H8$=HEuE!&b=s%)Kx@s#X#m=$q#w~FM)a@le`^ywa$ z=2cF5xR&;pdt?xNiaToLeq=U`_b@pD4D3JOhb}p3safK44*SE(WDqw0`o43#49y*K zP~j0c`l;#V4AC*mO!sjj>|(pU7U+e#HlUjFrxV{q+{5j~Xx+&gO^d0m&igAt_|R=u z`PLz0Yl-EfO4m?x8P37;4|~_=k}}rX8%(X&LcpIfu5FTPITnCh>BbhurXSP_yzX(6 zuwC=BbBDH8ps-`@?(4jTb-Ea&8%}_1<_2v9n?stQlG`Gmm%c zxO=@p%5b)Og=i$rSk0Cr_y1+Yy_8b!r1ffoZpP8QQY#3qd zV(*^o)fJH~i1(}8@kQyoAZ%oHC$kqwu63XNQ&@6|Siw z@+7s39?mjEI!Z?08Z9-@>`2&&JLRE5wQRday`;=MB`NX<*-}t?9#do2o#y2n5myPD zu@$bBHTAvhYv^GTW$so3LADc$>?Qc6w*LDjKKY|fGBOkG7(sInBAkKzPaE?$EZ`sNvp@7}AveyZyZzS_H5h#C%7Rs3{1 z`zbnWt@kmO6OnN$go=HrKdT;fwI`Gk59PH*jYfow2Guxo{#JcN_{AOaG5Z{abLj$l z3OQwx{54V&ZIG;#4nH}0DYGYnKNEeCre_ck!??ynPiahH0@H?Dv(s-ksuuFF2k-EJ{xgTf%g4QcT z<+?=>DMcgy`Yt~9T&40?4w36s84qQV*$0nBkLC+8z>D_jd_{yZq}*J;?8HCXxk)Ge z#P&*A-C3FcAEHPs!6Bt2$ZcuGXwPi=yqD;*{ECyhqb&$br2v!#)K;t?VtFECqdhRh zr0otIn1QU+KvpN-C>=oo=@~R(ytLohEHXenMPlB`-X(leafRQ#os)RBhUDg-a#6kl za|vJoclBL9;z+l~3>C2kw5fHc;OV4WJDD@har{JS-pc_RpCx_keuZa_U#H3rb*idH zQ-2TXwqB*5YP47~f517+P`fd5P?jz!VvDZrm*n3gIIiYQ(%HGYOyTs-PizJBa9V?#=f>wg zpHQf*0n9mtZEJq(9tfhn;J9rbuKi&Om9KxX8%G)!n;qy^o(3?o(xcUY1dAlDhfBpC@ADrH>|C@A3jQDU*6+fCA zg0Aa*4n5;drl;3k*B#;hskkJ4rYTAG?BFRc`fL~;GMzkbSTYgxOXQ{ zLrz&t*~ItTJJe{j_goB*?pZ-^H*Q*q({FTL*wYTWej+Tj`sZOLwho4%f*Y#ZxtPX1 zQ+1+4W}{jXo@IV{?!~I&x?J6XfB{y20ll=5o)qX!K0cOmwJ)=_dUxgp&NrBrjKXej zS0N1ki%3!oG{aGb8LH5p4+RkQL?QZ}GKZbSbHnj>rr*p4_D>CTua%TK&Y3=QMG&-m zOM%yaANV08pv1v{R!SdM*X7a_jfmXioOG7!E#5M5TwjO7$|Q}HEMs}b@?n$YQdB6g z=Zdn6<=w>S-6TEJgolzIRt*zH(eNaMoitI9xoigfw8Vey{~$WA(4B1GXHi5hX)2_< z!(euuY^A-QZ#&{ZEJ;ge@t{=^5+DFx2;dkIjAYAZ9P;sVI~_NBN+jckoz9xAr~8 zAf;IK_7CMC@JWCDDT<@ZvwoPn6JYo7`@XB%V4yA2fB#X8X-!6W?|eDDMWOJ)+I{Ka zFIt3CX<5PVTzJe#xi{;!6Q6?Cxe+O*%{Ou(bI*yb#TJVFoXI*X0sozpAAL}wyUIbDX#PrnlQrBYV3Is2s4I3} z<~q$?sC3?^_FETAmqae`NS1`CU+~=s@{dzU^6YN3l7j5jq#1=%sY#mo^1TUqK^jO^ zS}p15(!C1nFLpLsYHt)=AJ$ocHCmGJRD@TmAAguq&z?*2jVKkUD|<_mho98JRSAjf z&*#rxk}xAhh)#0_Y9|owKqkpv~ru zJW@gQB}nA@kovG(e;J8$UaX5>oAK9#|IIjJAw=Zu+iDFSMfbDN4r#w4W{$*rOK9O;`TTh~c;fY3Dl2`~VSh65{1sDUr z4~*RghbB&+bmn;8ma&|o$T;t=z0lpKZFU(d^5TRV?y(ApVAfc>ft*(Elc~+|&VIhQ zng(cbI*yzMyWz|UHD6z73A`s-UpFMzPRW!lY|oDgkihZr@ks#!kk~Urv0rEzbnysw z0mW}9rwh_H%jqxo@%q7G_p*vwi+F=_*k|wU(IXuU-9(VVNIYD0sZRi?)w9(->B@2{X9vBLt{1`o_`5mK+(D!p05Vz|mck_8FcVAfIKaWBmmFclj&x` z2-noRRb$@FO=b9MKY@xXrx@QnU0676os6)$=m^n)E&@$YT{ee@YbM&aZU@-40zvsT zXk36&B^MJFLC6YM4)aiBUW0ZF5m8e`9BWsbva^}NvO$rzw*+GFPK;je1f5ws<1x^| ztNCs@8mlLb{}9ZrS36X!xVc021Xaa^XkUx`TDdmhMxw)Z1|S1sIC~E=O4>4TC}K!P z+n|utg*va&&s|pXP%MhDy}*tggV`>HC%@ba+j)wgTU&1_els8v4bUlteT3H#BnH$D zW+wmx(&%Z@cB12i_36l6nmPmWn!!gW3U}7&6>iz>*GOtG*7e ze;;2J=?#)=$10HOX3!HFeXPyo;JBwi3dy4pVUI=*B6#*3l;7nOn-0m*TmOia3DeH8 z8e9Myj2He9DNU~1@9h5fabr7Vr~x$i(I0Y3kv#wY4yE zEQV+^O=uxRHaYcp7kIEG?G{^@LynQ1W13y!{aasx7EknNjk5v$btITq6>(bdh>Q)Y zNwPG}&Pz_@2?z5`5V4KTvdqW?q*Gcqwdgb@{!RqC3trQ82I=x3v zbL>LG%4t#KH7Ms_eI23E`Dbj%fS6_D-Zh`-eG)9lP!Jm#_6TpPV^AuwBeoSEoLhK8 zbSlv@vOp^Xc`Q0Dj>xY|vy{<8Nsx3S1$%=nVzZ49#AZ)_GUk6!)^x_1Kzzi64;8xL z`3CDs$I_KA!^d2UEMY#}vraKYGyI62_LUSUR=2fyMeV)XtqJGC3Ond(dSpClEN8na zrSNaV;t`6RD=B)Bzq(mbnOta^0khnjQLZ)ra2*@jQ* zUvFCWkryX9Fn~cqt*&rxx;~Wq_)ufdMz-=qo(_>_riNob-Basr?G?JG`=Mmgm$8|Z zZ#oV5$jik;N--4Z35(b5BQkZtJd`hpSAlOG@HJD6iIO(zB4U5;JOXBC=c2R=w6CbR zEYo2nVi{DR^dFmy`G*XF%*K>)517I@=qAR*4eG=za5U;EICD}U4JCfh1||PWPnw_8 zQXvA6<-`y$)Q#p<#C#Bz<26sFjUhsZf*RI&pkD{lq!!^^?TmY2s5hK;flqSjm{hl$ z0zyP8M&xA0HnSTYXywLia=|AF3O}Ed!<6)^l=;WRM|VqF?qQX*R!@&juARqMi;0F< zb8;1|c+fpCVp4?h(|)zJGUxt?$YHGzhs4P$Bgm@g4_Hb9Mx4$Bv7R0|c)r+aGXq`7 zkH{Hd!55ZGng*kGQS+AbG+=`jE#2k|mOf zva?d+xkZW@smu~vuT3c`*SYFVQR%G2`>I8|+c$*HGXr5_J1ybpm40^Ukv4h+EY(Q> z_6N+HwKN@M7U$&Eu_b4YLx@<>#mTkNB`0TB-%n{)IxU zo+gT>w&>m_y=W(ON-5_{l>Lo{H>f=Xu8fII>ya^YytSt8PAL@=6ThG6gO@F1<{%mrmll8MArm~}yI~fL$b!(}47m78DKmJUh z_iMfe*I4U;4k14QTfKUvSTS%q+-=u)Jk*eO{kKh|_WP5G7+-W-{ol+7-k1FV zd1?MFrXCkSj44>memCITI0vYGA=0>faFHH!sUFYq2NdGctQW)^#!ioC8VG4Ysk!yV)?eXzI> z8B%7-Pr;njIJX^cPU)Rt4MmqbO?5EO_l;~C1z%I-S?uZ^NOi(&4%jg)w%1*+2*7gJ zVJOE{ly8?OIH*+s|J24P;lJOV9S@V@dPH^m@6AEJR9N#U?|C3~-1mINqIkKRJ1do}Z@+{3t>^ zenAqxE$T8_Em$I?As)z4`an3XqGo(E7;nN^eQB~`jiuR77xUL8jcog|bPDuFyPSAd zaklnZ+O2_2=QR*O4;2P;go%99mW35Y|_ zwRk{udf5K+^1Vrtkl?tNs5s0093}Od z+ev-QGnt;yI?q}$I=~Ra6QAYNr`DPJbNPd z*O6G~EDu>A51m;?MsSz*B=rejxu*1;6~4zxfI=;0k}Gq4-zgXg9dq u`#%MMShRruvN=(N|3_x{|E=s3fz9M`^@<3d^6SFlZ=!-y0+oC^zW)o0Gqqy? diff --git a/legacy/doc/scenarioPython/connectionWithRole.png b/legacy/doc/scenarioPython/connectionWithRole.png deleted file mode 100644 index cd201e20b7221e8de6c4bd6bc322c3c06ad0318d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21625 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 diff --git a/legacy/doc/scenarioPython/proofNoCaps.png b/legacy/doc/scenarioPython/proofNoCaps.png deleted file mode 100644 index a37d4abc112c9c3909342a78d69ce3f36d46e0a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24379 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

~z4~`U>qPKVXc2$+vZ5tKs-rzBtLdPhN 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 diff --git a/legacy/doc/scenarioPython/runscriptwithp80.png b/legacy/doc/scenarioPython/runscriptwithp80.png deleted file mode 100644 index 810e9ac6bcf4ca78e6e0fd998d6028010b6e0c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40598 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 QeuDJTQqxy0RknTnKT8soC;$Ke diff --git a/legacy/doc/scenarioPython/runscriptwithp90.png b/legacy/doc/scenarioPython/runscriptwithp90.png deleted file mode 100644 index 91a0c7efa2ccedf23cd39b8d94b5c7974d8e3baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39545 zcmZ^~1ym-zvM!7>xVyVM4EEyg?(XjH4DRmkE`z%a4uiYD4DK+v^YiU}?!M<=_ncm< zyVFTks;iQ8CzX0473C!mU~yqVKtK?rBt?}$Kp;lG(sAFQzOL(15ZfRi@KjbJB8pNX zBE*W$4(3+2W*{Jvk*Vp>s>$P+fk#Z0ZFaaEZD&6pO@b6) zPN76MDY}6)ighGqAO|cDm6&3lkO+dn9t&b*IJPS{7`VDZ1hU?Jly`R_))wkEB)`6N zeD*~_#WNj%1&WHuA4qkqB_M$Xb~z3w>4JRYQ*_`V(}2(XRt%wyicM_F#$8UgCO2Iv z9jCZDGz=jq4;m=D=SY46QZcb-eBiWDNVKFp_CT7a2+@Jl$f?o)N9Y6IOV$0sbP2dUx_g;P>A?3SOD-?BO)F>_5oa#q*lF?K2k! z4`hRVI>P00U%XZd0pR$;_$=cd(cocw*#Zw9d~P(RlxU=!{o zyw{1c4*LAM!I4s66MFgrz6Cf+i#PqG!vO84bWTHU1~Hs&d~X6#^}T9(P=7!5r5AIe zT{*lOgL(7Tgb)m0(J&}IY|1dcb1!?<=8g&V0pb~LJmgZTJrkJs>enE;W>E6TV}^iJcVJWXPRgRZP5Ze9h+|1EUGhGS zTl`5!{5g*@7+wG%42_1cx%_1;?drMO~Kx>E{vRocDU9qXViGS+;j z=x%WLAZ~FlfP3lt!Bft~S9WY%L|i4@HQZ9%E{ zSqunNdP77*u2a@rsn}xUqOpycWvb=HlJ&yr(()okcD zq5q-VVL1vE*_-&a1U-Qg@9s^+BM+IIuiF#PFpnG0iYxy~qie7$o14bz_v7t_!F$^~ z%HyfojS>&-dW(`}$(h8>#9^|>`0m>H(~aZNnRVaoSS~o&Sn(XbkJgNww{j0}PU#xXMUE1jaySzI1gx9pm0H9 ztS7L;?}$r{)5txR|0RE$i<_$-+d}Z0sLSeH&LZsA^JsXQVcI}fSC5>rg>kFSypE<0 zPuHQ{sza2t=^Z3th;#mW5&q0BAMs{W^Z)QX*ZZCd=|1vQ>5^L0^ zTBDrvH}9}dv`2Y-1JY>u#8F{=CDV*Y_?3!)O&@$8pFh+4#XH4E_!|(~6Jip9i!cH* z3<49n719c77`hgzlgJh|hfo)76K@xvm3QBhnuHzTYIcm!3Yz`9&ipZ~BWwzR7egK{ z9>IX(UHvQG!-X3HiPz+l^2pA#5uFcOe;n5v%kK)*%jr{>+(FQLeIi~{v-14zZ!OU2-#XFR_WTTmzMHjYODF|);WdEss64QRgC)X}7Kh&`jlb@WTO zuS4gEw%t`d$7>qE=XKvDhLU1_(dOgMM|GBn;F=DD;?vPDwa z)uiEQcS`1(Vt~R!?$p#x1@XDg{JLppdPVL{f*}*y`9#EbNWHHIB)$%TJlzmHCv z?;TE%txKd4l@c-lcpT|JHGxil|K_2cP!YDs+H|-$?~YfOQ|4In68OJtX6~?2&AjCD zxlfhv=muB$uIXs{}+640Ny3azN!~zuN3~&SN zJgx3;c7VMBZ4dJ27v2Ef^T3Tq&qlfXtsw5R@V#yL8H%Li{n=92vO`)<4PydP!9AVNZ{ZO z@F2t-px0uo%(Hz?hC9FAvCkPm;*O}VLYxzULT$%mmG@Bg@csz_;M1axOzeChs9!4w z7)MDh7Z4CkihoW}DP{6&5D?HjD^*QbO*vT}69+p+BU1-sGe%E4$1iFS5P&DoSJKYR z)ri>B&eq3_1BNQwVN;%dW3swt;PEaKp7M$Ey;&d5y44@*o;3~)9z z=TR0F|1b8hCq7b3S64?KCMFLL4@M6*Mh9mLCKhgPZYE|{CRSF4FA4@1FMC%bPX>Dz zvVT|df9er6b1`wYa&)zFuqXbfUL#`%H&;GV(tiZ~=lJ(~nt59NUrF{Z|E1QKf=vIE zFtIQ)GySLTFIK=mxjc$io@Tb1qE>ch_AXyC_*qz4SpolI_ z|E=V|H~~!mXz<@O`nS3MmHTBcepmq0e{9bWn>RE9`PCfwR-y{3Uw5#7+UDz!_&TZo z>;9FNS&j9LzyJXe1d$RIQuPEq??LiaRZF{iRr!WW@@))=4GUIO0JR__bv8vsHWrAM zRX%{QrJKXv%(h>cY_TuA5Ik9O0*!NWosd@{Tf~2?OUCyH_z&9!X%*Q!}!r`#)3s!jPu?Hbps#gd%l`ko<9}!ZO>7S)QYmR6AtB5BwmW)Z?iBDM zehk`=s7c8=@Me9^y8F@j=31vGrbc&ZS2uW#CZ4H^s8{pCl&HLV+RlITecbY>!fgYw zYgz3qgedP+Y0#(G2#%Rlg(uEt%B>vQCZqLI;9*sfm>`eSxa^nUv<)REqkBY&5vSW` zVhS?XudmwGx3*QdGVt#7>uFwVT>HnEKk#A%6^JCZ4VRng$pv!^hL2PiK~0GE_bJvbZ!2%MF7P0_5Q zn-W?(t8Gf6EnyzEX5HHd_I{1%)$hHwZAJZ#y)s@dYN?a%@OOZqv>LBb4 z=aspz2RrEq9s3+N!R91IoRHiIPn!V_9tLO!7A54mvVKqNiFrnf51u&_1GaN{D)feH z1Z`2pGKpFL4^G6v1)tddiK@HMdcoa*BM*6rh zof=LVYSaI&l=p&-#&8Q#8=U^i3$xz*v?4(@zi)voV&mws2P&immR{MfJlFd%7UMm23jm&AK-x8@g$`EIJv> z>ca2*J>fkC$3wlxk4$=6nLo@VHhYl)w@6DyR!NIitwtN&5H-whvnQ)S#W?h}F2YI3~e44!<7E;z=#SmsA7c&$-ou7XPTX zeJ|v)VFe2d9^g6?$C1$18XYB-2qZ8`G&$)kL9qc~zw>29nf>i>|6uLaeZ39 zaIbo7twGt@y*bf@z7P)IBu`hhw+#xdB%HG^{z>H0qw45tI}jXq%SytIB6?kVO!ND% z-t9wdx*FSl;f`NE=hxyX8g$@&enK0VXpab&$j@%W z=J($iRZ`E@D}RTjv)p8sBA{+tG6CiZm^^_uC9taZ%xFZL70*v94GwV0;49$u;jIAS z)CHQnI0qnBSul+XrlZcHSwc-%*gpL^Vq@_?yz*{0%++#uyX>;yP zG5#QBAO4=B8Za_iIJIkX%;NN60DXsUuEsYxd9I){fITShLEwP?jM-RNKvwvBu#4nX zUmb|&C|Jx3N^NXQDHao&hhiu?w1hrWJjS_z<~LJ&86(V|LZ4DT*1BY09x;}aXI3rp zZ~Jr_ZLGj3^!U2RtW}@Ld#=-k)Wc?jtca|B>j=b)?-!4{)}xnrN)oZ&V3jp6lJ%b{ zUjva@S_4^Pr_7>=idl)qGqw^h46uoY}rt7^|ga_ji6k@B^{0 zy^lG17?t$GHwWR3!Y0erYTXmbJoN|gV3vUlMWQWY`=gP+>kc4X-^e8LSteF{Ob8{Z`n2 z#!7q^nv^;ZsWRMW2qMU+!s}bWYwh&eeU*YeS}_a<5zj`=70mhd0}e@sT-l2Poy%ep zohtwz#Ns1L%QRUVE1R2v?|l=4QAwA63307?bq5p{#pk6Kf3NpZjtg=iSW=P;?$24? z9x#kG7r8~=fBkMXp~rbH?Hfu)0tS=p4?ResvGiE{-F7he6@(%7BbL?+Bd+%rz(~0E z;|+s*)rS_x=M-^F32~*?WHLFjC?Eil?UIN};o{*rFmBl#|MNQDlR*GlD9gRzqA;$V zVAiuy@!He>~x1=Q?)LA zue$4z=YH?}W8~4GbkkuzP=4I#ZtNPn0}0P90CxAlzYL*eiD<7eherN%BkqNj1&42ym|- zqPheuWxdZoeb%VySw@DXy-F-j(#nwoY@iYQI^k`^%-O$9GwH;KM?8)X)*Fp$e`Z%k z*k5|^w#>w5?R^Ye^+ey``#UUD#?ouuQI~DzMiizD3QhP(0$tey-0%bF0}#0J=%1o* zEH@hb{2x6=RG5HYHZ$`{Bpk!Pzpc`%3mDZsvw~X3Q8=-dxR<|hT9FX|GjkHbxObwH z1!^?eRw6N!_HyUp&QtYy5pr9zl1SX#k@78Kb;r5V%Hj%W`x#rVe*B>$FCPLdJ5w+X zyqD*CC)hdbT`5`S3;X5ymV?NA*Bp{8uOG;3iT|Ts>1SK|ptLK{A0L#b9y@r+(z9L6 zlJ~P(6{6n7EMMoDy(O2_^8mdeSJa~=cQrC((N<4!WCS*aK9Bq=f3*X?a_!VX!5rnZ zbyCBCUdG1sxyKf5L~GY`{b_3_f`!1DY0dEvTLwR>B({xiI<_FNuHd9J*|Mg<4dtqb zK&lVBNJ?vs3!vh^UhH^3KQg0iN-SOsg`E@NG?va!efnB5yt?J7SnHh%R`jtt< z33k;D_Yw{S%Twx6&77gB6q8BGUZQJvMN~oHBUDuXf;R?T=62S_Q}zk>0Bo^V1)vQE ztt2{_zR|E*z&Yl^A5c`ZZqa;8vZ7Aa~UJ@!`~7pq4SGg6)A=3*dL;M2l`#!8iw81S{J-%3REGrijG5*`f z66c@2UCRqZ6$p8YKX|G=NIKl!<#7$nbh=e%?+U_K7w(YhIB52|E)?_B)24bk9gWb^ zZ$kW~G=2pP+J9PA6P9?eFpeh9S?8xf?P}iRj?v_2A(EQi1OA7&kx!RBdJ+{ys&#}AG@l8lZgc^UXOy`WwS!7xI z5MMIl#eO&|E~@$7&cm>)YO>%2cD0U@sq4%A#mzE!2Q&EifiJQ@=0vGLv(ai2gD;V< zg2?C>Rixt;ec8Wtd%UDVl^=&Rv$NoabxFT&a=KqVRP!{UZeL3D!<0|Yo0jQ<5BS#hHmu-+huqm)GtZjk5zoPw;VcDRf+$3 z3evanuEuOXgQX(1u6Y6lRnxbR|8f3TUx6MxBz*TI7b(1O6`Y0f^16_-@U~AJmdd<^ z%~6U|Q#J!qR26^!Tf+orWo0Xv&-Od=w$85O)jM!BxH1`8$EK$7h>3*HL14l~SvI`q zp2PFXk_;-Q3k``}P7sLvm~DSPkZXB%qN|TtHMYj0Znndx6q)NIAh`L+$}Aw~{$my= zN?VH`K?ZEw7aG4QnvNqjW(c|$);Y$CppEE1|LV1%lDx{aJ~%Pwzvj( zZJI_=EgEIg#bwRlwg3<8BW8G@&#^;78oGnF(0swMF&#J3DB}KD@MYSBuxw5-An<5j z&?lB>wvIk0oZBWo0}iYA>ITLD?V+awA%E)z8IwtNfx!Dio}*zim_5*d7;%S&wdU>^ zI)h=#K@1I6nbKsCrqUJ3nX_(q5Z%ZxGN^#6Y-)tuE8$S=;Bt@)sGujzRYnl7o)$jk zbC7M?G8FFr407V-IJ&{baSi%rX&-gEdTRuPTlhJKE`HXir{mZ_rJ%%#`dPp322Z!J zKT3_Sn=Tv!Ntgv9r0~g;M7SOtz}eXcY%$9>FMnC_|J-fdrr@sYZOa1x6+W_FT=8;E zE&tsUMc^J~GBdG+H}A10VRwap3TnM=#y7v&BD`F`_u%Q5CDRXX(yi9?>ld%1J`?+U z*U<&Xn6=tR_^2_aM6w(3B91pz<|2OTHbcw_BA_0WJ|nb%Di%=O>{Ffnn1-7Btz+i0bdHRlO3bzxXjOf}=*zIOEW){Ej^ zBd8$&6Z_G`OZfdRdl0ZV0+Yu?lk@e=-i#R#EsQ{gZ{G`Acu#-l=eu8F;dzc-MVe#*Y_##vz1I)w)wkR?_M*r32YKRZ73G z`@z|@w%tQSJK6&dU8_Dwm;i+Zo>aP&&%O>x#7wp@k&)8w574;cYD*e{;JC;(6VarX z9T8N7Bg_M^4f&4#eH9Jrq)WJ*OxZc3ebM=EQP$EMBR%_~^kh^;U^2bu6P3|i?;mRL zpY_3W3S9OWEQev`F0bS*F9Rw7L=k&V`lPa`@8~T%r|-cmhkb}j8-cF1JMgLQq49q) z1$iv*2d#BCnJx|f8jMVj2J%M@R@UAlTl2qC<*+a|Y!`8oY9mq^$Z*```6Ju{*ModI zZPg~=ox4-V=!~9EJ&YGs$?!Fmmy z*IA->M5QgZ|3PAL%4Mx+0M8Ngw5Q{nd%eb4e zR?N7IXt@n#Xo7>1@R(9OR+wDqaEY{9$zNtFacQd;*CSvoMhcN}()=GzLi+v`NIcn7 z&&Kb@7b(S>#vB-Pu4Y)58BpHM%5wni%Hs&ycxQy~wpsN6c8-f;&dul;&Q0`ZMU7rf z_Z&!3vdrn{&{Mdw_9+%913p;7>?j25^n{!?XlQ5UgQVCoSh0jNcLrxCVg+WVZn-E% zF6lW)=W{_BNOO5#QesqjOyXm!dquoWmgTAUI=$C7>h%i)-4)((m&cycROj2Y0SDqTAwH z3qihBKH_EG9`xu#&w;uqBfX<#ehuN+28Ln01-KEKQ#kP!<`+Hg+Now1F@GE&7HG>v@RHOQpMnnbx*H`vXi)B-hHLH*W+IcI*r{^*7C9pc&010#h*=Mig+~m%3OyG%k&D~rb^9x z0v@g%?Uy=Pv`nPD`Jv{(cyI5CScsUjU(2CgnvR(MOQs znb0~kK{j=`ze@FB9r$XYo-De%Y~a32kkcfoH$JJCKrsQh39M-mE`kyQhJQ4*b!HIq zh(gPZ=@8_|ira64#q@jJ)hEv|v=!8T5ZGS-9>pNwL)glhV9Tk~hwYJ96{&Bz3E@;J zBQm_`{;Lsi4SRwuBfi!Eo)D0JGW=`$Al~TrxaUyy79lQPVsmGRe>+86U@CuD_pB1j zuA6=9VCAE2RKHHW=#JaKWUM(#mjw2)mR~?rm3;MFjvRFkx7M*kMSelW&kko*O)?6P z+#*U3$VQp!pZ=|=KG@iD=9c#LwG}IH-roszCFI5T3PA~@(yG;q4&Lk>x9apJ*lOS$ zWK1>X68)Rr$ljZGA^CE-M>^YpEq4F<^VnxQ>0Lz(JuU~|#i+)VJo&(m3GKC+T;J%N zkuV@HXWnlAGiGFg9f}uXOuz<{NjV>wzI=}tUdngEV=u4n=}|OX4UdZj{T@8|4NPZz z*%Sj&+Y*d@Oc?~x{49F_dRuNmI$R}pmi2&v&rJy4WOmS?y8m^a6wY8TAA~FB{PZbPM?spB3)`auDmcDK=xtgLNH$3#W5vi2ch8bLG`cfATJjjSzsbEFG7~ps+;|94Y|@*>#^nT%&yVuFSB10A(?FB& zNT7ndd3D(5k#=^-@~#kTe%3oy&g$$3OtI{ohPc0b*P8@aa!i2$8k7^bd%UGa~#1O(E@Pb*HjYh z_#PCu8Y?7dfs}iwYXbHZ{u6!cDaH&UW93IrBz3^2yGNZhXrp_EYX=_5Zt|w{BM$(GZCe zkKHt*a&)xHa#+?A0-TBVi|GM+aC*OJr1<6Co=T?*e#1+Ibu0X4pBIkBBr+TR6%_=zkKI%kV1Z^F;B+>ua~^VUZXapshNAV7@78(tqBY%ti(G_@z7hsGrC+ zzdCY@KuO-ObwTWl_0;aM#Z(j}QpznvWp^%bca^@gF@Axjib?4RXpJY|yrG&g_h@gO zKae7I!8xC-7j=5yWX1+orU`3;{|wgSS6Of;fbv0ja=^3tP3uaJH}7X{X+d$WkE~y- zqr*;g#q@a-8N+qf{yFKnrU1|}&MN&$d-gb1>wc)zNVL$0c*a=m)Kq6k;n1Mq}~S$`8ScV ziMNqfam63eyEL8lfpu@CTL#M8->16J2L5qhkzY_ZGDMPYgk&wdwXV-%6942`S!?ib zdq-Uuok~oPdh~CC4X}O6_5IB?!@tQX8ife=*6af;pl+1=LA6gd-b{M{y2*5a{dxk4 zzuo{Pb#oTo|1F6aautvhbN*KT_xSzMXkKrxqA6WizF7fHZYirqVQD^2Iw1B((~_V; zccV|+mphBiOSq!<1bW#pO#(@k`vx52fae>_f$--q1m!s8B4*+X@~W{};?*>zG%FCa z^BYToa?q64P6Zh=P>Mm$Bdq8&+}sHiDDNK*55pm~%RnZlm(kWt7|Rzkg3x0bpx)V; znBQG1>U?C?Hpwv#7cs&z)PUtm-G1b9#};N1y$-|NrGc#^Uo3UV4lvg8u?z9ywn@W* zjpQ}``gCjRaoLeeX?iGY>#42Vpm0CpA&pY=^^Psh{bG%3`zYq0Rq^A(?7}AH+ zjXkG+c|b$)3}hm(w zm_m`@RccW{y(~X!8Nr+=Et5}7O>KHK5Vt466ac86VvX0CpFbVt^o#a6E3q+~Z33Eo zpB0{zHDhmjc?J60LBq(DdR1d-ZQ!fGLbEwjM08SFGu3|pi0i@Do`W4`N$qm3ODy() z1}`}CBeaN(r^XXa#TJm9uo3G>y(IHX>i;ZvXP!uEsi^i<1*l4XP8g0sEC2ZwM=6M< z43Te!2ymh;1tN92w2u_9JP~hrRT=?FLi%4%Jr;^kWd;}@r7=@b`}RWqcRY zxf|*MObx(mOO}i3NkXUC1`twg2o&YQKjDRSGruZW+#?sX`xCqNz&(g{_?f2@mI88= zKajKJJ8U^FeXNqZm1!z^RqkGvCy)9061!p5u4;w|tYrg$y~_FkqaTEFVi)y_S9634 zmb9)XK*x*d66b*{A3W|=v_(s1sgQQ-_GX8Y&H{pX7CAgQ^b>(h()ZHnr$Gq%Z~ydY zmNBUrxN06{(&u=Z#O}9_NB7Ow=tAK*m^p5UAuRd+YtJbw$}K01DTf@9^Iepe)2Nl> zV>u0Kk`FKr5`XNQYmk%MnIiuE>GTE7zDfssrtAPhWSO|tF|Z8 zzbn{6(cm%2n9%LgaJZZJHq31JCi`#e)LeZLX1_lxMl1FBzoJItQT9Tgqk>H6b6#9* z^C3J}iDhYVE1AAJqhMzjira>^+nXP%3CnJHo5@o!3s+MSq6IZo?kCl!B6u3*oJ#qd zRWbAu#Hh<4Rm?L2C462)FFRcOdsqD5mCpPf85Yag>#g?xfi+Y_bsZ=W55wC1b7Am#E}xpQ$!q9$9QB}t#nO&Gvt-lE&|B6aEqIMl}qC9xbxc$0O|8}XFT8z06a=aS`obDaNn z)GWs*#6uCHCk|r-{(HHuq%SB>9^a&HqeaFmXoT^5C}&4*-AL7!m(}gYV0_rdj;n~WzE1+=GlWwWQ7<2(nRa}=>46JU`1F4+DcbC6&6(;tL(eX4ji*u#RnC^CfRAJL?^*U8(1`<)aCjIJ{fd9 zp(XK2)w9?gnJ-w{vnJaWC!OGcrV3P@eM?ns=ioAD1ua8=99$ZNj+{K9uert~6PP3` z(Bo7`*Rma^jSnE`7$s#f8P`x~Gh#IPXk3DpKwxM&I{ti*t?Ek^w(Xzn9V0(K5jtvl zAiQRQ5(aR&%c4&MkZL%kCiURq%v(n1DChINw=@=+VBh5M#!adaGIcxQQwb1D%vbMA zqP}TY9p2>IpyRl!PVRlzL6>_{6v6QFD-CVR2T#e%Q{cnJ0X%Q35en_}vGBU* zk7g^gm=%!yef+Y24TyN#%l?ga@F|S!Y0AOf&}I(txo{x40k-dB>6YD21(#8>`VJsl zeHRgrCry)x&y{^2b*}&Qp{7@ecuQPg?hUe_so&6-yuVieEA1u55gBnZl?+L$@SQ=T z*FVg8L??O|D_Us-H+pr|Tvd7NRA38daay_=5@B7jrwLhLYMVI!k=(-Yk4p4U!w=gS zfL08|C-loc{l36E@r&Oh!TQGDb#VS3#@4H1-i=4s715~%vw4PpGXq}#) zq^qo?EE49C5oB$v7i@E<#-VV{%doWUyE&eCDP;b{{1Q(TB9)Z7%#=HTk1rfbsToAV zjK#bfygm&!3-Kl7-gP#{H%eHuitDGD-%@Hk{aYaAmm4(|@LppGEkBO|F2p4HK*++4 zCCZn}HL}yH2M2B_aU+Y#vmvG50tc;LHqOa0H<6t@oXQ!DVJ2N<=j*_xp1S+>>nt4F zP(Fimj1lVtx|!wYZ#}$XktNMp1sopw*wnO&`|VG=N&eoJ&7v|j6d>-xq^Db~}0 zuMlB-?*IAaK=pHoSH5}mYq~%^Mi~d%`q=N~+1?4o1Y3(fiyP(Ie-=5h>Ex_OEj#f_;n#?-SEdWP z?$A$_=1P-~5c|%Gx$|bV+z!Mc&RwdutMt?~0p}2{7+3wh#i`iri6e2JNx`Zu^$+>t zl_?G-N(m2VNSM3hkTxugZRifQnG6z7zvrT~?rzqnH;~GuZ}0iS0{up@Gw~Ia9#0NabK_6ha`=JsCCyRL|OB(C&Kf}r}=5NqWM{B!LnBqo{BZUC6 z+JEK^obmm7uj#zJoUB%AyA|UaVAxZg3z$=tld&Erv10;MaT0#{zy#=RO4cQONNRH8 zJCS`w15Ql(l{R45^=6|id{REi>kp-Gq*xVvERa%c$q`x67Ml8Vu9qJ#5bXi6gWG>m zUeLQwUWj!Q)5fu!KH(wKtMSS!b+%uKi2YHx9$J^YtB@Aej?#WlLMNiYx~MjzOG6C# z_J{#Jou<-L@>(CP@HKkK6ejtMBV)?+P3IQBHahJ&c9NyxVjL$KtNLG_M?{KKCtKI; zB(GiYGl_I-FB{Xa&L`@4Q4vA{K5Hbq;kcuOpBukJ4dAX zZC{@1;Vbc5o`CGDocTzO;)!|d&HaHc1B<$Jqruhg1YfHh3in6L&YK47$uu-$&N=q| zaiKC2=(KW)ZOFX&cnIf6_r9}j{;h9bgI{}ERoiAb(|v8@)ei|O3z|FP^6UzIMyDFW zoFqR9?^I61^jpfifjuV9!sg~#9$PTc` zW|ele^N_V@mzzJ`85sJLDCzsZGR{60^!Oy>Sgg#0vz<&`H_C-JfiSd`5}b9ct({^s zf$n>gEasL>_HJ{Y!sv5q8z?wT+$z%%H!Yp@kQ-@yQ5cv);Nu-;p5f}ncb^FJ(kv3i z))LQ5Xv}Di``F1z<5cLIKQ=~RIl3O)bpfF8Sv8^bdWC8;CL{MtdAG*#9&SZ93+tS%zOOhact~1}ZjG~14Pn_`g%8=8 zut>7~eQQHUd2B&N2?uTOq9=S;qh7Hbo_W+EPc_mZV*(^xKw^xutZq~0TorJSk{?BH8bJdRotq$_%f~Ov=6+>m3+S@<8`$dDZZ{hC&^k=H7?%suL33+RsWai~g3 z<4`UW-1aL*6KE*wYY(&5c|;Y}UOf4zIX@b!j3*P4u1|@Gtlh8r53VdoQ`689_ffa} zIRUS(#fu29@6mhSSfbqT+vZr8qkW2^Et+t5SrT>Oa4KvxxY4JDoycewwHPIucJB5D zo`40V=1;Rpg}L2Sc!G86(^h7mwBbj-?uXs7{Pbql7w@jVtIIq1@bV4snbMP9oBfmC zT?aC;?jAV*633wC0?e3@>T3$5eet6Jbag8Ul!f>6`Z~e2mw1O>K z?`MsAQg4t8;fz|R##vlfo*$RX@8NpuNt&P;5-&Q&Po;g3rfxiS4g=aI>31)FS}npC zU8)kYiib`@X>o@vU9qJR*etfp1`_hyGZ}`s!bH|YMNzT9?ljGWJ)h12qyR zLJ;FeVXX3q$5wgy#95yq`{lOS0 zxMHJs7FThBQo>%Fa+Xj4j2iWfH`_V@gW-jgaZi0HsRQWeqvoFEo>OY(_9n(gbC2FUOOQk^! z&W6PWG3UCQV$qGwBO|*qr@W8rFB9U$z}OhS@5q`4sOmkuZ`;z1hjY6yQ?(HU((jsH zQdn?ynk(7yS9VA5eSzw@`$KE179$K2!7CXaK5idNBv!pp{RIb^hh<@P@Uqk@tO0=!v>9P<{+3R$cd^@1*vts?P}Eci5fAp7;y>Vp{(F&vFMV~_J>FH3Z3ZB6 zPz*;i*z|ol{*4~k9D@L8QE%O#hmGovd~Uu47}fR+sS1wJo=^Cpvk(v*w=V_`ZY-NL zZTUEu>eul82XlZd`A@Z*>sXRe@n4bsL0`ZJ`v_}eip>8Nxj$82`dIAX|MwD5BYw7~}s}tj10l@fSt{uP94X>VJi5{E$RDE{tn1 zH9g=DnzI~!JrLt^rk!7{>$^!}YfRvw#GEovHy+)NuM>bAT&yVHz(UO1pQHz{`cq%$ zDofv5ge%R1ZwPY5Jn8?BBGe%U9AnIi?q=B{(xqch`d|BApli0Bay<*?Ig1K?SzeN@ zTZXkHb$V7N9td6O310Cg5{02&t=o)L*P{qcvrVNH+GgzB%#1abm=eE#pH>x|u?43@ z^9ui;lok~I*6tqTQ;s?4Md!i>nXNhs1z(p%9qJpTq5B#1utc zWUw(JT72k6RO%fUz$4q;1{S}-QQy9_F$o?p3K(*U%qhnn#7_&4yP^JEJ1A=c`5#S- zLb@~0lJ-LcfkHCrkoGkHyX}m$puA*!s(-^?tQtB?t8y%M_E+FKNt0zJzR4}MF}GuKCxuA^NWt`qi(zPV16+`iV5@sO6jmx4A6LfoJ6Z^zi=%1N!m* z5%-l*aVX2W354JQg1ZHGch}(V?(XhRfWh6}-5r9vI|O%kw>R1Q+;h)+C;RvN$6Cyq z?yjyb`Rc109KN6F`joX0g^i;k+Wa;-IbQ{4T zN=K^Z^`#hg?L&{z4h4*Px>0d01r)= zSJ!vN&KDy;{jwSxwzcqg{2Jrc$fl%@gO!Eg%96GIYkNC>iGgqFV%{MnxER>U|?gsirFn zzRa|&ElnKy_R2Qe6Ivq*;=9X_`!(hnzR2>{yEb3-l zr`X|R9E^8y42(A>QI9r$P&~SP_cE!ihhGLOHz@MH80}CeW!NjCf>DV|!3J7wlLp)D z-;`7Ur?__DaHEo*9~s6tX`gy4qI7{_>N(;GL&ePsR1~n(X*V^0pNjr;m~~dLpRl!H zZbTu49478j-xv2&dsIFlLZEOY`kO1izXt{d6x}W)U1fZ|mr^76Y^F!_?Q8l{Vp==0 zb!8^zY{OstT!UIwSmj$|>h8k~4lb50Mk;cI91J8TDT|(}Sy9TL8&zw8LNrItF|nK+ z0rpZh6$?k6egdxS4#y2SnMy1ms9QE{IjI6TQ=i}UjS z(Oy-T7a453n7qY!Vx;jjK>c1846ls>7;%quA(`&(RUEDTmdoGl!`$ahISyJnOJ?Hl z^h4;%&Cj&s_s1lsG651CZ*^2~srOK4tb7?ButKv~zb=`jU_CzYq@)sX9OSW9dD2Mq zRvO09v81Gt!=#Ekk|Hin z-_U28twL@;wi1ovGEbU32+r1?4oZdem4NCP`kTv)qTca#T)Z=P^rTE?J~q+Y4);e! zN(4l^<`SNIR%LIEqYxOR1nO>?n58xD59{x(j4+9929_jM=d02mA2|^G_i{NX2_Alt z9@VXdlg(S!uM7>PBPy8uMNv=qwWeh;A{MZ<;6y$_%H3Fn6bS%)bVPpIpC;O{-XE9g zJXeCYZHhy^y~|1M#r%^h>w=79>mwn{iO5pKV3y_o6~ha;t>MJ&=M9&Dv3DF)UEra+ za3|@HS`_DEDf)3f9LZiRDp<&*I}YU?e^gW^loN_JG=#*~|+&?{xx*jnSDCaf-G$0zyhL#&Z?P zB9n-c?mxMPgD*s1izKn{5A{?ZVW}!xJJPY)G43nV4@Y4Cgc*VeC0}lSp|fB^k9_bo zn+gvXRnzo~XV^OQNkqXAWkkWSA(Ez2e%&7AzAmpbo@jbKg#%Mmj{ZI zXPl?^je3eF>vDz8<+1!WNl;!|fNeKNS9{GXR3nZn(d(9QMOTmktjq$#_bFCr@nxbu zqu}avzWK0#*6C!fb&98MlJPhsYQB9@Wr}xP#SD+zE+IT7%`oW9a#s7>!#!$E!rcxS zlc>$29EDKVC|QgBuO}SvtDIk2Ww*Pze^NI{kT2N!I2PqkAM6Ljt{X>X<<%oI`hPwA z+^&h~_BW`*)}IT!rZq1=5N5y`RwpOhvW!646l@+h5i9(PFweFOWe3Hb9h|+p{otE_ z1@h@`H`!3I$M(~3xPnOYTAoX_j1*<9(UF!L_3)Lq-_7?+K6?#QgaD;`k)95IyPuSC zShPDgwRRa8>_241^2#TPWU-Eu znRwi{<(-4IJ;F;6*MfJu0<1){9UU>U}MkTlHjqkF3X>{E>P-S)3jQ*cS=iiOGqQ4;|@rf1b=3Y7Wxh_tjXll4e zJW~nVuq1t=yf&RLVB4&{FQVycE6JY1%?PzLyd>`Qd2U6ygUn=lW%)HeIlH5eeITKV za0icFCY{AbEN@ij%A{;LYJ2~f`epkN7 zJWT06+0PbpxEkdG*b{OH8u4x2F6P)YN5ah9=~f2Z|D@WgAQ4#lZhDr}*<&kyO7fzL z+P$zL@&!xL`ljeaYf4|uX8ML)8RuvR+)A=H%Bpu+p|);lb!~4q$R+Ymqz00(pC$Um zIGEGF@pC;KIqT2P5`82B!+~$AQ_$J#CCO^;-7ycOCsgwOD7IKD?c5RFW2iZ-V8Km< zvcq>c1xKr%a&|nisOXL`;?!`eCLN3BE+Ns#x@@a`uBu*IWlCKRdsHs+yE2M!{qMr4 zx!`Fss{{rnxb`-;L~0F$7*lg%VRAelG-X^7G-cF2>NV+7N2k3)tJ2f>fqY?l!?Dc@ z^sYgfn=#RujK19SUHnzGWWsed`je`K&@(qQ^22|}yIF+@K!O!RfhgF>W?m&Ds$Qsq zd>^}nSGQy`t<496&`Q#ZG4vaD7%wQs}*Ns$)W%`~1IK^xg12u0+sDJE3!( zj7K53ltP;_iBOrg^9iMyEeV$LNzE(yGZOXO$=wXrs?_Py(EnWx*)8^zBg@9p&tc%p z7+0+wI+q*)DQ3#`j8T=ZlEC`oGIV0f)wNl*2;U~_In^xduWsDf zDw7rLPVZ2wp6=2UQCtqIT{Ff)s z68TznipC%$k1WF&pWvd^%Rh4zF%|cn?Yus*fSw3LKKbSc{-s;zsZ0cNQkv2pCg|6b z8UMlraf*#J+Q4BkEhky9`3aUZE~D?mTI#3F-yk9g>6{bgUELm~PI6NL2b}GnM#38~ zct~*Aeun;4g~*f8pU3rnj!{1C@{KRo$?EdHT21KM9&J`(@vWzo$(_vLS}RCi(qG?w^dDDB}qk-0kD2E z^Yv{$qU7cr=BB!VjJmpD3s>C-+6H4FH}!{TVRxSMXpf|SkOD&0AzCi@YVNsCP+aDB zF^vrRz8hY1`0oXrQs<C}!&D286 zMm>W9;_Z?lwUT{IBl*`#eeC79E4Fu|?5en~T;i^^|$77y@0c$AO3?^Z$=x9qM?JyWz zRh&{FGNI<)>kz2!sx~gDyng?|Q%IQjc9aA7#3|G7|9j8}SB#J3fXa@=#Nc?Jrirk* z1!V^%O}7@l-Zwir0(m(%BW4^7+_1_{tG>xaB?V=iegs=BJ%e5ceKH&aqlq4un$zQX zm0o7=p!M@b^Na*?v;FTPcbsbRb(NX=Ho@PKU*R`m&i|81E5_Z;!RCyN(T_$vfFzyTQt&Um1Vdv${hQa^Be?J3CK}ssouJ7>csHnC$ ztd^S_J2Muf6BzEf9LNqDhg3v0{Kjk-W_rHqvpWo_>8SUdf zpdv~4wXl+TDNR)&gzB1PaKMbTbIt+3Q_*dY{NKIjw$(qPE01`ul?N^dt`?$d@dd4F zZY<&|9w7@>?ZLO6Ksx5X)HS$HT?oOhEh+iHcF~Wnw9~L*wrV{gSP6iaXaU>k7j1_P z5>11z%HlgZK3y98{HyO=h~LSbyzqZU2wb=!Afg7(*A85)C|_0OkT%6m#wJHDWV-(F zJI9cvHAm>TpzN6*!0jDm{W`rIy0`cF= zvUG(8>Ao-YF51W_O&`WG7Z8z*Fi%j~(&E`(Arp2QiF$>ie@^$lEE4Yp* zwOk6H>m7bLk$8&D)XfZhYe4K$YcDd=C1TnYL^UwD$~4=a#@!)gkEMv zXpMzqPNHJ0mhbtYP?Eb7I7v&MK3orwTU8eRZLb5-u>|=CiQHO96XLyQP5?622k$>$XqGa(%{kij z2wg(5a!{h3(ScOOuwQagEnlk90iV;_S4L~iFdx-WB!qch1YNn481FTDJkaMM-FSWy z&sz>UGqVQm{5(R2Z31AvzGG6DzTQ}!^CgT#Hcv?%w&rUA1vL2IfgQCLXGkQs9G2Q+ z@Db^>SW5-U$k%B+$q!?cWj_-FV`>2wcmrxV8!98eTp-j@NQU(@KBnd8oo2h#zGDD z!0+gS2!8*Dx%XylG%=d8RO@UszqZ8rVol_Zb9|}2eyeRh_HyrCK1WVOB;yby%P~Iw>_x&jaJJ-0Bdyhl=ATT+bJ7 zCn_!M`G-A@wLAia%5;c1FGrVMG|rATo-bYvC?&-(mKZ}D@ezJ-d$~0hIC6*6)u$6W zf*n>d-4agDN2n9_%nap`LQ{2Qko-Fe_~q-^ebO6p(oc_AI7~59nMSiK38? zu%Z^Zg7$z*_mSaKLG+J^2GP+$;r>%VvvDlSyGDyr)YbK>$h*?O%MVha_43KOvjw@d zk$sFmfXN&^B5^d}=)uqn&sHufk;i7_ca^L%aV*j;z1BS(~5rTHSL!4jO}Kh$RVW<_5{oT0Jh{iIe6<3 zp+yn7wtW!Yto~~NchWKZ0zDwQaT)DODa-&Bk+UD8be_<2R%2M@p-NZ6rz`l+F8c!_ zgf#Cmt&;Sbrl-Z4<|ae(`xC+_X14TCPVH*Y_m+dg#j5qHHx(S2iXb|wC5asx_peKE zTt7bE-wLadO!Ye9hzEb^HJcMgzPd!D0Ts$W*VC(HhQL~hKwTT_?IwGLH?a^*?Ga4*8)M(nQF42wPqj*n!BU-53%U)WBTHKbnQ_Ybko@c&V%-x zTGrP$Ii*Y0B%Pt(319&%&5REY52OIALq%FGzGW7xp8$%eVCH)>8f|S`a&4>~sOU{n zIVByKpY!VRBkSs$oTWZKMF(rlEg8UMai+_ojTOfj(5kaLB=v|U`iAeG>tW?1kK61` z&=R{9O)VQA9xWSplT@N*wzF!bR$vU#CNQ+Z&xkmErlJe_G^=+U2~{;W*F>5(_K#Q6 z6b{kbMN5okceK_!`4($wuD5GVIdHvwBh=f5(Xa4^9(I>qrW2)vjC^bw{n*TWEwe}- zibO-`O*ou^YupE$)+@gntSe#4S6>5M^G#pbO zS`aO@P#E2U{+TR-rw2`^!Zb+u#DyH2AwXzE@VrelsM_$kgid}1fj7P-y1=C%SmILQ z{Nj&=-rp6iMhah6w0>TBB%YZ9(h~U62AaMikGZ0_kVj1KAlL2BNfrXI`izzrgD5xU zYmwUTZWN(m4Q9gifV9VlUFm%t84^d^8et1>vu{_HXHqej^hUXD7WjbrH%wD8!>1n} zDjZ5jIXHP>SDEmrgA-(ew?Smf-LE?+!dgZ=d5#lK{PFfPEw0NEsb-@kW74_`zB+x= zvDcPpBWbVXca&K916G_t-N~_4F8gFVsAv7x@;9qgbE(lV`U#1t7}Fz2QcPI?;A%b+ z+dRWxSfX)sh-eG)%>F>e5!-uNs5V}MpzvwA;4W{%)v#Z0!$~2Q>?xz3LT!Kxf|B{g z+;8@JRDW%)H~Mqv?l8HIw_Sr%x1CmO`Q~jHzp@gRuaYKhKum4MqFH}=lfWLkIxB0u zvZZJ6_`S(h}rB1awm(veBD^u(D{v$T(H;Y6_lF^!Kse1hw-dgc)}En z)`Bfq%Evc_#QJK3?T@vlYCHUvYTr)b*?gUT%qCFRqO^%59Y&RKUWeW5jz93>*UT%P z{^W^F*)&6v-&PG0plOvWp_`RP35DzMy9B+FguOBE%{xMi0l%3kuo6~tx12hTufzA@ zeno^IG0W>+|0jdg)D9WI1VHc8YPQR_MFaMmpTUa3ib!cIh7Pq%maE-9M4Bj4v@^YY7F(xjuJ%3X-SXB<8$JQG*Y3k z)d%=|JZ=927H1B#rOWi&6Z5PM4Z**+eZiY$IG_#(;sRq=I(S&kis0v&o;g9F!{^cL z!VDOr@xtDAUk@x0tqHqNk8ia8X`>nU+`MXTp+B@eoDNef(^BSI5{ z1S^@(eJ*Oo*mPNn;c^ zEI8FQ=F;X&KmOJX-;<$Y1$oWHogz(Bc|DuBAWRR)uhkt@MAj?tuPDCmOCbJvyD%M~ zIip>d3ZpM@+d&lhlz?(syVK%mxK4lyoS^@RDxcUcWR{9(_;+=Q=2O6>uU3JK zeGQ7J2|vFaOP-V5J_i`jj!%@x7YM2=N`oDQMC~w4)TwAZYWB`Ux8_9x~`X zKQ_?hdkb$&jRUKHHYni_wsWIH27*lv9>d&I>j|}=hTQg~m0ACqqq}j;&x?k8 zGy*kce4B;(U) zrjdzKI=dfa8k*q;p7(T41n%*&VaZ&waB$n-paEl%JJ?u-Z-67+?d5a)(+c9Y+bek$ z3kr^*s$Ex3{$EmUxAvndC)1VRBSq|X%`d&8ZjR;>-#$9aduxfc&@S}%WW$ql9L>y# zT5~_#Vj(5H#;#v-LA@f~jK16d$mJZ%km9GiU1%?E+ZPWr)o^rGqFZ5-xgH-$YWbPX z(6LMfiIndp#?#3-(v5&8#)h!(gv3JqnYi;72Y`yprdkP z|5%xk>-=H+aa2sGLS zs+I5e5$3H!5xIKfn1Fz=hueFSD#dfzL9!{F9M| zCSB+l078s|5ZF>h5M2~Z);gmb#nf8HY^*N2pr2U@n5Va%4-rt-Ck83{TWKN|7S`-~ z6{SHHk4-M$7As^E>Md}^jK1W|Dzf|{&byU+jXlBLFZh`J*!M7Yz0D*|><%2}Z#EzY zNI}r8%GT+C(O12;b(!J3LFDxB^EfVTAaqvf5a;@l-G*a4wd_EIuuxFSrt+gpTBUQ; zgv>qZIFj}$M!5-&MoRV=?}cPOsJd(k^Kv9`yL&!6wc@eDS$Ff`f{5WPt=C>Nh>yW` zxPK;Q>q(w2U|u_|S#S!+;~4$dv${ZS@45bs4J*OUrVPyHBZIaKs?osx3># zYqAWSB0i>z$}vq-xa9P9w87)nG#r%Y$Ph4HR_O@49FXz-F7#k=Drm{sP;0-y!V=^r zceWXB(R&X6dXr_m*^f-8X+7Y|>ai(gQYov;+*h4}I!N2F%?6X9`%1doxf-J&dr+uG zERJ(NL9?d9$}fa(+_oaC(JW&mcZ<`DnfavO?qpJX>M&ihs>0z}beeMAyY{Z?Y1WvEjsXP&-3$1Hr0vYw<*t^DMbQTw^V#rA;+} zi&U4-(4MC%eef2Uo-n3&+sj@J@;-~6K^+|Y4w2vd(6erFfT@oLoi>oF?(Hvsirdcv zz%4mN60OX1*>2uUDxnf19!~dt6e^9HgMGL%BNygo7ll5bw^gmCmr;14Ccc|S;q7@W z@ppNJ^X7X^A9C5qe)qGEK=a8%S)8LcpR$TWS_JQVibZy5ZTo!cwjLG?ek*{f-r-7` zAH1){*L56;-G7&UPT(r~g*al`J6Wdr#Knl!$O7U#d2^MP8S=Sgp&LybWWV%cW&PzN z)6l)H-dR(YF@$3w#{rSCa6lp!v;%`k&_{fqloGqRw|p#;lH+LR6Ll9(l}IxXYfhF~ zt@G{=`Gy;c+9s2%TJ)=oGU=R6*y?M=1Nt+a!FItF<+NiyolA=CHcY=>blr5}wqv-ivI}c*OzH;$&aW zU7%4{8s-FfyA@wdUkS?A&^xrJLERpXDRGZ3_MWsidN^>qZpd;+?>sE7<UIE?4`ERrhT z+7u&iT|IS{vRA0u)#O9omXJ>jpBT?4KHBQ|;8`sFxzq`cKRgn2%N(|SY1U={lJT`QjZ z0Xo(|{alN2^e^2rBMR0GcK{t+CP``!%^!ej9^*!Q0C>L|n)T01o7RxnjacOq6ALAH zww5$4&+)_%i~l8hXn;!A6%{(|z^@u@xtrX+7nSk(wVX0z9zZD&2by@hkvI}Y5RhIF z$9%AvB4uF@nOHiSl5lFb8Y3R`{VYYUmQq1xS7wUR9cQUFj>z6_%)FLaF=dlR*^0ih z)OCWKn&q5{^^DE%S`BU{wESfp+wLkgKkoAq`7op*U*6M=hxLydoiPll%p79Uu`9zR0$U^M`?^w)Z^%|;{1sZIL&t8-93YR)0h-U{rfx%*@ z?(`EbUG>%CGCp?#I~`KG^h6tCQd3I}jN#~>dvdPu(mv-_emz?JA#ysr@?h0>o1e-5 zDs+#fw~H&gZyzSPYFR|dtZHIwagU|nIr@-Ak2Jh5&2xM8;OP~j;#4c8sq%dUecj0* zjz&u(=d^O0$T(EeS+x?D3*mVcv62dY*}b9WUgM$*fHT3rQlRl1JCC|_N75@FXMbnw zHqLzQs>RkQj;?3^Zg&dI^SvsowWNM*80M>Z2v_ayPOrPP)5J|YO3|B-X_b0>>&ix+ zf6hH&wTzokZbde@xy9KS{(0;|q3&ICndW#PIj&L{?81rq<24}jUcr)YYEsvouP6?Dh&f&0r{*-zC&NVni z@0Q}qpZ3kUy40owpTjPzO&+Z~D32=f222N7Btw5OmgR?<{D`%7CTh1Gh-UYLls zD&mqC<(k1G3rYgN=sYt->Yj!$=GDXT7ZrD9fnm~0KL@t131yh*8vYN09$66KF@?yp za>MyKs*!K7lEE)kckH>yAn7I)jk}X&mo~V;t|X+2|yH zg?4BOn8z`UO^n zdx`$WF~(Q#3JSB*HE>SnaI#AU`vwZJ9WHInKyKTgJW+<*`>7ap`20GI21!rHlx=${ zg3@=pPpDIo!p`GO(9mVe2kT<@l-Qz1)+cI=ISil4ZDWv5U_< zxMrK*Eo0d6lYRn^<|uZ@-J`u_x^vwhV-QRn)4Zhm+OfD0d%6^EQ`OAP0A9FF-0+)w^c@QSdU} zl(Xx7{`D9Y%$RlCL*8)Gm>h;D%sNkdX--?d&E;$t3P<;I{KYzWfVLovYkr4)BB?ut zbnLsvgS6$RNV@YUy+h#{(|sDHJWRhi&R;Z69V3bA25z4O=S5^$wUQoIZ4S#$(_!pY!Jy{$=f!Cl6Bi>OfTTu-ZPp`=3PbfkSpt9+S0qhW&FMg$#CdnZlbfB!%&@i>Ff7v8n#SiO zIg<>0#yJ$3MD8x0(eX24E4ZkI6}@{{862>QLA#IH3Pot{hNXd3J^{g&Nb@3#zmSJz z^(!(a=?;Sv<25PxIqpnUifqfjL==E7u}cehU9Q+MD5fv~n6}wZ%5f;2F#HRM^M`IT z-5S5M!9#QVZHn$!5L@n;YsvB-X^Lr=T?I<0%Q~{?rRcRku%gUZIAK&pR~WRXx~jGq z9;FuZpn%q<5B19@+r9?Ug{pp*l@C*ws4T`AWp_vo(w%Dt4rM<|&dt1^Z$xXMdc>~w zAPe11v19?D%cIt_(>`LphFzAgh0A)Q$d23G!W(S4bJk2>D|1t5c|7r%KixIAGkTIP z(8m?q;jRkK%O>3v^<7pRht}<8s@Yea`Xz0HBghaaSv3r?A>fA@^1`G-=Z#%Wi7u(C>RqduG z>3qgtJXFCfBZ1Uy?imQn(ke_+#8-)2At%8&y*|%wgypf-lm%|*oRXGkCQ_C%m4eUJ z8hY)NU&xxUQmCt(AW_=AK7kR=##jEUfTS6Vz3C+1l#N6!!R}@fhK)gCVzy_pXk@h< z3m97Ri1E%K=9#Kk^!3)fk+)d1M(U0s$y)J$Lfb~(&mOQSq%m$>Ndd*sVZq{C{X;sZ(f!w+6sdn&IN7A!#!CwW5XFJ;B zvCQT25WF1B3AE1s0Q%fWZ!^vdf{{5#QjY+H(eWzqK1e^iVXS?HT9p77Xe?p+F1m9@ zwQl4m8EU;5W3MwC(d(1_A1jsg)<_*;L6;>hCD_L+StDG#h>$2fnZJhQtO`?VUq2nL zjl(qSJz(djy=5Gixy7H7Z1oU@y1^+)dhFEQ_}nh*Wm_p2Q0ix&Wu-}Rkgjm!WbnMs zX(K%mth@!dSZ&|r<@BhO-d=C9QpsH~yoFqDIZ(z`c9caW+^U}7>zA%=Pj@EKs{th2 z=>~Yk3np!)C}WVvSN;wzU{u=&m*h^n#Mgq-v^vUxvwt&HFFlTviy6GuaDNT!4Z&+^ zm(jlM)NMU(ZvmUD7p&}ilCWijmAL2IZYYIsr(q2Yj}M3_gVa-#u;Wg_#;N^Xj5-{q zQ$7L9k@jeZ0h*-*7;OQGplbX1HWKf&_UD0*YqoR%$j7O)7dl3gb=nY9m;ms=C}HBc zDEq2ZCsE9j3a|~Ojy64yyDb;TA)m!lF|s&(8$0k8xKw;4>qY%yHq75FG=it|&;+MdmgD5Y3`&M$)s{5h5 z__lxe?*b&4nT#VdI;hDg>}0||uu3gtlT3w5x#_q>ROK`@3rq7vcA$Cy?f>4^GlXQv zRT$+&osn}|plSag$;f#_I!koj9gc34{KAbYSe)sVsm(upc*`GW$6jli>}0U}m4-6U=aerz8;W)cwZbWj?d6W3YiI`<=6S zn{Byyja!Ol#TknM{Lq|OeY?(Q&=#$Ebs2Pjl)CpOI-O4(fd8?6@hKO?0+uIgktn`&8e;#{qV}l9fO8wHT^dCM2-9tGwTF} zrnHQjYNkiImO#=8bt1(m+aooH-JTkU8d*I!!5IY5k)H&8H*XPKEbsf(73P5j7g%;{ z6mR=ug*rxeSSOC_M%~6TpX}S6rkPwESZkTk2EPU?(QRLvzSQ$T8}kTxBzdZelYL6| zIsMX%#CIT)FuF=jHo-Rj{M6jUkxCpU(Vi+nxk`Ua6$4#w!D%Z7w~$GjPygmd#S$Om zpd~zkW!e1;w&c*nW?$YJ8_x2byE~a(4130K|I0v~Q9K*bTajg>Mzv(4hqv%9LIFx9 zN0s0tq%8&{GX7S?kP~(EUwKF?E>?|B;vSRrTXuTkoTgo4IxU4%tD{?Gx@yt5%Gr$; z`qQ*D-vs}_hj-WDVe3lu~Ca#D>R z>N(ixkG)}G4(;I2CoV&#Hd7hiDwSilKRs}BP|mO-nIT&fgYUT9I4;$_r~k4CZ}N~! z`D#gO;>W~Ct$D$w@7)Z-c~0hss-bcU)Dc9mRGk$0k#rism~eQ%bZw0N;t>armgVZU z5fJUJ=~m7|AI=P?>ng^ctCQ?T`FYf0T!#a#sk~dK^?As|h$dL|02 zAA?$>y)6C72X4Mca)=^^*R}$;)y`5Eg zX;y)!>XJGmNs+Zc+%Hv%IDwmuMTNt~X^jG)m*EB%Tyn`{(eOUIMYX1`3944Pq1o!` zZ@yZHW1A@;Yre5wuG6U1zMYmL2%>XTu+B^zX#`^tO)hA2iet~)ATh8{V7)gc6G$K> zfzd50$9%o5LvB47eG0fSK3ayM{|g9QgZqklZ2Sd-C&Fr`pU!;dQ+jx{N|hw)DBZ7# z2di*@V4yi!J4yF*MIcks$=1Sh&n2b#O-e?3aFUZm11tHGPf}cs$1$TLQ@eX;{g)#! z{aA?rv_xQ{F1f*7MWm+jzt(7}dq%fJB;EF|WMPqNWf{!aJ6_^fJ3F{PCRlja{7Z>W z`^-jIlDBWDb@}#}K`A8kv)6*Yt(0dO=S<0Zjsp#|PM!9|I{zd8fK7G=SaV$+(SWG{ zwf5|L!h4)LNc~HbX<&~IhCQ0Hv z{fa6BX|E|hP99qys<`W3$B0UXsNib}-7qsM);T_(Bi?Lu$bB z?r0aaMbVe#^Jk7+CZ{iN2#DZ6ju)2XZMF|v*J^)!4{6CrZiRN#dQzE2D5XjU<{lzK z8&5OGQ>xy!`vj{vdXt?yWjUrgGxerAPUTMaBThjVF4S=}9x(TgDBDY!#Wkwxe!+>1 zc|7tf`8zJ(lsjDR{qHUd%{+00$MTUWzdJ|7o*i&)yO!lKaV2sTbPk4}gShhmolNo) zPs(>yPh*qUWZxXtL6Jk_i5|3+qc5n_DRG+%RhL}cpNL{-q`7KFufr(e+1R#MBdk84 z+G{S+8W3{A_1C^p9;#GQp)hh!y7_@EyZLP?KHHkC=dLFfcQ)N2&U$0WkDm~Io%ody z7;W7sJUq|Hb{l#NWAQ6;sF9ZY0ULCu-&E5~`xd9~x-BIYIQs54Q~`7c9&5-)Ty>Um z=n=70zBqa>M}jWtao*gq)3v0-B!x6SacOnL9xv-nQKu1Rb=@pZgLm8?jk zgUfWi(Cf&R@vXyZ>W?Y(W3`k!nzCNY(O-t5G1VG=5v?#z&~hNZmTg|KUAfUW#KVOj z=X2_z&8dq!_|4m!$_;C;(XLKB;CmqzHl(92;ljRgQG^b?jkc0aPv5b&n(iA!WWhIoU zW$VFHrysTg!X7IX5`K=>bjRr2%F`?QD$#3#%2O2Z6^NcuoDjiI$?nA zRIL}38%jy*QRRx;n$-k;P=(NS`-lTY-YOfm{Ojs;ym=%2Q*opE(mpE7QfenL;eNP@ z2-$D=?SA1hVWvob-u$_#(I9m@xpA|u#(AY;<2p4}SDdQ3@m zlU+(=!Ag-!Jy)uomS+o1-`M&fZx*N#gMg2A+jSFffd+AIa1arRcH89^uS5Na7SKlN zt+-8Gs1H_f{Otqh&Ae}qqm3CtvfON*Q!9DaY)shk`vh})f%~F#UJ5w+x)zo!Q@bz* zy8zzvjPKv%jc-KFesT~AEuKHjJr%&S5<)-9<9r-X;~T)?ve`=?tMk_%fl6T_!;QR= z%%Q}bOkRw`_JV$1H}~b7tC2*5nq|f-X4sXl$?iMGiydY@!|7i7z^L$sqpqHmUm@@} zr6FWDIq2KBIWNGv^(wkOBbA_Q>eLE{^sW_&0!{MiIyBPj2ihnW7bl=P~R!*;a9qm={?ni`7-5pM91ep%+x zsDu^|;vlp~Cn{;osge{=I|R}St({$eCw5=MERI}knKK;O04v0CJ;x-BfzdRfHI>Z~ z66_b%x{o3u9Un!CltbO2Ix57D!Yc1bTmbRqSpL-`9C+RhnYQdLPRC&burQPiQtQ07 zo(5FE-=fElJs9#OoV2038&}2&QM~#|I>>u zNF(XT`Qr;@W3+w^fmvl8(=(H@29DU~&+TM1)7|HDbsyu*wisAcn#sTnv;SfMT>-zE zcp^fd{$FGo;IIDT#qo}Nw6SwwLP|=SJk?-WmwV%swo?hCrl4r+g0MgXSEyo&j%I>n zc%ugI0l)8Gb#~^JlLM)LA1PXFgyl(TeVV^PVh~G>4h}c(44w_3c5jHj3J` z21?9|5X1tlHJm&)tot9iK^y5GF#FqTx1uEQ%s|3WsA9zQFSq*SE?K|+TL%BpsQi%_ zJ_Gpq?%GWb3B0}E(z4G>!~5eWO@V923J)M8`*;KYx}E^&|FKKQgbes!bF!K=YD60# zt%?qn)Fb3SH0s~9r=PGuMX1L7)RA8!i8Y6F+WO1)*zEJIvTSQ(b$(4t`OMf*YWOq8 zaFyHfTT((StUg`eP{<#Nbw5IZC&=k`t`)Kh^GbEk_FT!*SirDxuw&|ITk35)+#Txf zfF?pysK?P19t$t719J4pq@)0U+7z$CZxJAOpb4MF23UD7d_0v?KMwg^k-M2I&RUz_ zB|>aDb+6nWm4*bEwgK~gT{EqkNP-Jcn}li8(hLgbCKr5KTs-?c6hznQ*tPk`p*M9{ zADIF5Sn3mG&YDTSI09!5u$3BZe$t5M2SziVsl(zZDAlu&WxL=-+U|Es58wxpq_Yn{R`e*4t1J~;Vvu~1E&N9}e zagb^y)cEkq?&^h2G*P)%C^)Skc7k%%?jEZQM zrDp37qT^8H*8lH*Zy*VEMpds7#EC+FeV^uH}RR#cRkos_pPT> zM=5$5wvWU^olSm-;^x_*#vTS&=3FHVZr=OUK3C>}AGrTdVb>Yd)Y`2n0!K{nNJpv^ zv4Di$BuMX|1_VMk^d70w%O^Dy0Rg3hBoqNbP^1TtazbyRN&rD>5C|=_8}I$@ob$~v z^ZnfO?wLKa-giImTF*S|Sr-&So@`B;9F`@%f?+1nTbOG5!<{>onv^!|MkteZyv z3qChg00X7O+X&?@U(+UkI7{B#I&*bvbmoybd6{md!~(`|!*hKZBXw?{jYGe;W8We0 zl{z|8(9=Iy#Lnj-3LWP@XTP9=u%pb3;Xb%pkD0=rFoFz~09T==`lT9HM{yR3xN0rW5I&eSYS z#)Y-tb!Q7g#_k)etcJt^}J>2;PLM( z5{Pe~f|RsUFGPXCTrQ|LxBPq0jSRYazoOu45oa~<&#qRI_Up{|8yMNEg!$a|$cpNTHiP z3*pRz6Yh|LkM^rLmxBs!j0#l+@5+KRjmy7nDZ{s~b|qvM$J^+}p;V6zze0a{cSIWa z#@s3N-P_YSvR;uj9;{YtOv<+|5k*&XZQLfHBkYmlpWV*L1Ws;M##M&Be&1sr#TRJr zJbDL1+iktMNH=L=5#hmM8ci6!#`}#BoCJimyoO)-$KCih#0smoeX-e85<}c|sLDU6 zh(9{*7l9k?6AJF82DA8TywHF>FJ9mrrw*PtRH7MYiUwQZWnzmqC|8NzEMn&+#+6IE zA|kk_FC0qNsQXpZ9hlh4PM1+gt-J?r!!Kto>Wg|awM%i+X5yAyT`4VBY$EU!759u~ ze1WLKIlQ+mPv!Fnc%M~e9J27q@enSCpkn%CUm~a4VA7{$`u4@Ob0k)^)}aH^qGbCtJE}E86FtzH9?$v8Y^)R#Vps7^jD^>^-2_(+bk$kBf6B)AZCg0Zx2ME znHN>Hq=AwTsd`i}_U2x&(x|=OQNQD{hg>{GD+U0VV2;&??h}I$DkMnfA_RkGo^OT2~6abM?VY$Hz%GFl@#FWRFW7O25jG`bXMA&UMs+*AjGN z+s41jM&`Je18toizBuA1+LF=1QghBv*Lvn~x-ecxQo9O6_?~RfZ;GzuFhyVDctUFN z8@Y1I);0Exkhc~`=Y%x9jR;Z_xdSyQpHn>OY))ERiF45ySXw&MVs&Ii-|@{~6iVdO zl0xxXDjG${$)c%H{JUNZCG2_%o9$~r4QB{+hWa^c+*2yDx!B1cRCJ4&Qn|9fXek^*jW6eI5=W9autR7<*QZR#eA*hSD;fU8! zgXsYo6LNvaGG*hEeXiWcr<+lt7&8)8+6THRdG@Ml^}HF#C8RwLu*Mn;^PYGCE|99T zt<9(vDm&ILdemru{Zhq#-)8PJI+g5x5OeqL4P$wR-Fxr%TcBzmQ8$-A8O35#I~_z1 z&Yf(d-Y30av|FA>7gt`e6a^wckb3`+8+4YdQJdigD)XOkIzhYGg(FR`I`PO`;)2|% zt*HsK+e4LUbTl<>)myA!UT)L}Tuag}W)Y+Gj?eUm^OmwSq>wv+WuIkQ=)VORxfb`czhZWhePkA}9R+TGKxe?NH;@Z}RA z7TT9@Y?@#uHeDw)Lz0%n`@#&+j~kZUjQc+JjsT?)YK0w_*e;L`PiID$LkFvR@$(@L z8)FTq=6Ntw)AHnDas*Ath^ZByP9x9F=&;)M5KTRCguQdvMoI88MGDeS($CoNFv-;? zfw?n}!~9RhxYJ*t-aWo2Ts2xo*(%FP78%o6{zPO@i$YgJZFg8kAWq-M+2)Mp$ePIJ zUEELJK$}HrjsgPlnl+iGQKDiY74!(J&KkU;{^D3UIl*L##o~l^kBO?o#2ka7-x?vO zjB9wye%(<%8DE0l*$2vb5N8?;=o><$sY>T{+oryD!_z0;dxfO`pQ$|Fblx1y>~6N>#q%tf>l z6}kY()62{tbaB2sxH-_uFS4iCxMlXK9vFRTpW~aksxG>pI0u?|Y2!iQDAXs}t&0<} zw8rq~i(1|$ej;+HT3X8@_F69+fi3frDWSriL3}fEMVlLXbS5W!;9ileu3?)-Jn9uE zCMG`l@pA^WVv=?-a$m!9(L#*BSvQIwU0Hms^1`S`{DZk!AYy{nOv9!5hV+hCPX3&Y z@EmfU9teXA=j8^Y90K_w5tg3^$6e~7Rk*}PXpvsZ6KV`(h&f%Kc?%p7QP34}G#uzE zJBl6n^sJ!4R*rtd#q+3Q?r1P){AgkN)vDhvkg+8v4uu4a?>ANhUarB4pka9mUFI%f zBLAq@|3;nqTffmpvq@stS(~ZpUAvB}w0CVzz;$ZTpfz_g`3Fk2KCuXDamfl7 z4KT{-Rh@lJ&9P5#fk*)1I?P54f}#}T;LLe(v+IZU)G04p7jf9|uY-0&ZNAnYsK7!G z-yw#wbDdM403h2c{p%J9re2Hfwtcdl5~oKn934OZXJuTcT~LE%#+a<|Q=t^!5BdUz z@u8F$6ecaErHY{XLgP&6)T*&1W?}I;E5T@?rCrLDh=hVQA;Lh2 z5rdw~X$(^Gb8w+NwZ4uN#=}a}vRNp@DueqFt$?<8(BC;nryH3DhdfX`i8y*bHB&f9 zv|P1j+*xG#al=pjFh)gwwp9Qat8|BUYx3ob5a5HaLLK9uuTRx;i~?r#wh~(yQrzNa ztjfPel=}(r_D;^`hXdT_Awc&o!Q5r>-6l$lJUx{!9=E4#CGm^XKIRI?RAm`?YRx)R zEX|g&5jRTFI3E+~0!8LcX;}9rkDv$mww^zr18<=5Q@>Z!wP?dXznTk`)Rc5#Lb&p* zo5zY&1%LQU=GLXrdBX6^iFI_(qeC1_On=kl_dIkkK*UH-9LfO+-8b@JF!SBccnhLn*N{T=&2sy-z$ zGBW4ieqDdttp2<1eR6};hhumoBgXJcgVb+#?hkjobiahPNUOqH8Kd?TbR@dTi);aM f>3h=2Z5K2{(($?mMSP5;uaar0>8n;MTSxp4yUY77 diff --git a/legacy/doc/scenarioPython/solutionWithSetcap.png b/legacy/doc/scenarioPython/solutionWithSetcap.png deleted file mode 100644 index 735bc1d920d94c59c5f98cc565b35beeab9c946b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10968 zcmZWuV{~QPvW{)rwmPr(@gc*yz}{ZQFKU`kZ^uxnsQbV~@4wEX=~JUE`~t z^0H#EP*_j^006KO;=+mm06<`0?_3anegT99UjP80dd!7{t90GQc#>4c883-`iZT1U$#9?yk;|}>e*bZrE)bpPJsH|MUkQu_J#o%Ly+V_ z_|j`?djY{dqVNNN856+6s9V* z*#{`*{C6~U{Tq;VV+PM4!wZE!z$P7-Hlr!Si48=@Yblro(Xy!@A~Q^qj$Udiu| z^yrk(n8``0T$1XZ8FTAsWW!-zE_P|_!ha#wGLwhD8FQG1e#W6^Q{E>35(XV|F!tud zR>L9Z0{(HjOI-(@XTmG^GnuA?fk*pbQsyyvxqmsf_BYb6rH(4tNNv5GDc67yzs*KraF?!98qff&!v#x@2k6y-Z4N!kt@15*DzVye5`HKWh_# zy1JSIV1|3%?;jtHbH}dW3ROOhCclBVwEZyLH?3)Y$!cZ;^1FYo7k+|K;_g{z9-Bys zEHks-&4Gg<_yfrUp73Lr&?D;#Jg34RL6QT#YiXltLXC#fd}hz zEx}3(fU-kG`5A42n1K~_yW2r(1GjInxm!u| zS$2z7f0O=!X@`IVN+05Ghn4|+*sZmV)C9!~#nyeeZFyzggzp0xoev-hCn9p3N2B1B zz(xg==qD-qQ{GY@wAfG?wG?kYJ2O}}a3g?D z1YdwHmus4B8u*CujtvGg|0m;MlYUAHI}CgsOnfxu0L}o5A)TR(Q3%6jjXDjgWrTAN znEq}}$x`AH?UMHrm=#w8JXa|0;I`cfyJH469n4^lgxzyfdsBXsV-t20;hI<*jxMCfPaHl0c@hjHZ3qJpI0H}v>}`bHNV`l1;S>TY#K@mEeH4aN z_B=H~>T+%3Ucz3~mSA9;agHeyP<#9h8l%TZfOYgA9F__x|= zz(O&r%Bm8Vif8hJ#yKKxSX3*V-uL7Qj!bkG6|BG{S?XNpnE|J7&cIFuEr~5WEyx}N z9@8Gp9r8KwIeRd((RYIfJWMFGm+S}JkE$ryD561+K}2%k zBH<#3qE;tV4|Z?p_gdzG>A1L$-spiCe&a2K%H z0HQ$2z$~zI(C~m&!L69Cm`uWGL0BQs+;Ibf2+RiNGy5icH`OP4=xXR5^aNTrGz07! zsyymAq-K^{)*J5xwYi4kAJb&hGe=Pv!6_n)-x%=?y$!<+Uw6xQRR?v#7efyR8%eg1 z43Xf-Bk1pRnmo6sh<=DXhhNaJ>b7}ZCz4`G%_L`NlvXGFzB48wV`Qyiy@sZaQ0d2# zGbBqSkF055_FSUp$jZ>kK&-@W41MKZrfsHhPdOY|9mbZp7N?ZO-1oeddahCeR-{(s z`xRWEQY2G2Sjc9)#f-$P2|5zMBJjP?<=|$FH@BHVZz+2}?l+gEGztkPO-NsOKP?jK zFT|6iG;uab@Y?md(ON#ba19rS<{5|Xn+sG^YSt>Ztli|>S;;%ehmk0ima>H^EcJ19 zon|o2`1(SlijS4H-$JKvi?|wc+Sv^si`waHd26oNhHUlw=KB?+*lS0fHFSEsdI`R+ z@u!7h_)~mWzDLVeo$i+hwxAgSWx=e${lR(-)s5Qk(+`7j_~eabw&%+SP1c_-XD;0j zTwL5PIFyQ1Ba~Qcn6-80=+3ZtB*dEGL-E) z2PzBll^Pw*Z@s(|9oVltkBe$%Dk!R6yj^^DRWqHnB_qY9PXrJ858dB?7{WQf3xAdz zR1a+T^y-y?&cBNhML8|7&(F) z+?jNh1<5>Om*CUz9l26=CoZVTfwa(^W?9IXS=&U~oLR(LTA4mrS$GPcr=Kr!mP^i5 z;Hf*OxwhI^9(LsT3SjVg{-OIJI9HMjcN>E1w(4QPL{_)}I=$Xat5a_HwDU#n>i(>n zc4fV8fu428fm=n%YHsVb+7CT!PaMy*N-iDSW9JL&)AUW(hmgU@TQ+YS-Io3~=W~~% z^A4_Q*Nb%>r^Zjb!;P!=yVojwW4;u(rVGRag>Iw%!G1ZGY~^>;7cHSqqt8^pZ2ya* zSUG&ST5!D&x{vo!`3>fqx}8JLNz0J)5V`25$h!{pC&QzHtNlK+4}3}Agia=R=M%X} zzShB=fe_trUAd0s8`XE~`&Rc$&Vk;+?6yfazU$nr{Fg!E?4#@!-a#K9-kLM$3#nnX z*(&SJfDWFtv6KvyTH*3zRe)d^b`DHGwt0Y<-Pny>bby_n)DL&fDd|Z*nJvC+>1ZBW zF@RDYz))RqeukO+GqDiD9ung$i}*ZlKr35%?9T-D_C zGY1F5&Aq)vp&^4y;Hj){vyF0);deVC11Ice=J@sbNN?dEfV+yYUMcwM5dZ*y8Rp9B zPUloT>x%3&aYQ%6DI=#H)|^!M@}~$qQ59Ozux~W(-RT= zMdD=1L!>SvPatILU_$VXj)jhah!={0fPmY<*pyRISoA;aUtc^#W=>9aob>druC8>h z%yhO6-{~1SI5_ATnCO|9Xul|E9o=o54BTjK9EtxH@?SZ^CXPl9=5|izwl)NR- zIy>=P29}?)nw!NAG5v;r2n%+&q&8W|Bvi1R_;Hmobu*wCRXag=GG=Q zj$b->zcI3N|3&}*cK+4)Kb#u>!^!c#jQ_LoA4YEaKj;4+d;WITU#nl<;)UX-|Ht#Z zP!fEl^Z)>OloG-M%5H$?nXu|8i_L?dG~tE_F>(Tf>fIrm&CNP=DI4TrHsac#quNL#HFntZb))Vf((gSgcSlzRo;LS z;QiY#$Ii&Pm}#i#TJLf3ms1@N+AckP4#!d*C&n@sZ57v0W~a747_cI@A|V+7$+|#N z0FayNAkFebquS~q?JiOQkoAG2{l5070cHFaS|+*v`uIcGg)7T%#N@1nSgzNJcYJ)j zujd*-_3cX;bnNw4%9UvL$9SEYx;$rDI*-P;k)x7a)Ve{IOTF#l`e6HYg>z?BC}(NjY*vy zzdV_IbnIc%EL=RL3j%rJ=Sac58xy30Ek(wJJn$EV_)rHcdl`+8siMz%JG{lFlzmZ7 zwU6+R9HR3|N`|j}y)nVcMCMo;8}677H(Xl4^7XR(AfrVHyksfzk|O%I;L7{Xnupp-#a2L{1WRZ<%`u#RMD$B1JSCoF`JT)0E z=-wTELk8<+M(^F&PIo`!8vY#HuBtuq#}4>@wGbY0otV%eP;7ZFE3k#mxcMT4Udu@$ zQc{t(PA37Xk>iFnhaF&y7io7-*(vRo(mBQ{!?gv-r-O~*na>@_P(2Bw^C1Lj%B-ND za~_+Cv85_!~useQPC`Rb|u@V#gPQ?f(oxj;v;U}UvzGy5FVF=Dg|MKE1nnUnoR$DFzuSUS`>`bsDGH*8=S+z4dsvb_)3R zvJ}N`wO67&1B0J$_eD!^Pz@A1jUnSt+czu;$_mZOs9TvQE+8RbTD1jl ztMb7!Gm6)pfR8<XYHSEgH{nt2p_Ll+ta$SULH?$(yaARUdAc=j$I3?*b$NX)E@1 ztMCG@@CCAh2%>zbVT7^%5D`~_B`R(-xiPXs;!@z17?pX)@6=|wRmAT<%yX{Ua>d4e zNpi-O;O6=BU0bu(&xGm)ZrR4`wp@#Ods5i=cmS&9<@LjLv1P#oWivM?`v_VQGO%9U&<<1RHlW+e7kB>QSvcuMz62eBk#%FIPWfMr0<2XqIw*-OS7I=w6o(n0QCx+>k~imFWTukOb)HCpZB@KN>c0yZtL8@h`wv1J-`^TBuMNo zL1L_|=ENz}qitAcD4)r6>A@xYZvUGBJ_@> zD2E$3>Df%>(wvJ@&=^Zi{8{I35DJNFlPumZ`@6-MyxV=T{e@^4GfcnMen4m5jffGE z61!n%Nh9Z1A3)!jSj#h9g)b+j0qtN-k)&in1|NUTn#xFbTG0Vq{qIfwvTuGa%CpUS ze59xzG~}L0?x!f9?V%7oXruK=#h5upnK)F3s3k!dM}UrVDlk;w*5mj*r2Av^B5fr z2-fpT@a;=8Kd1`wiwjx3-dDrf)r4@v)ms={8}bQzAZb2aT5ykkdw686Bn>oP6%SeRO;TXy7quAGOIh?mBF1uvl3Mm&HuH9OPoZP`C$O z(7i}$P00uGp@1BhMFD_#$KMd!fN{Sfr-jKpL;8rFC)BS8_SqT}huEn46GrP_B&hXm z9lQF1tS^a~`(pc~`eGm}sv3z(6Fp#BR&!A=XQ-YRVII-}*$;OLXk5#_5xhZLQP+G! z)j{C2I2dOo1Xyo>ly{%c$??-13n6NA%>!KlIObj_!oAP6tf5spN>Mg=eRbwn#(DAC zDYpu@nGW13pW@-8JvjbNm2r|1P{BeiFUN%cvj_`=XO`0fB8T!87@J9iG4=Buo#08gJZ1$} zqG3%>?vxlCgiDGQ0yh`zj8|JqZ03NK+0ml_KX#OiIoaCe2le&HAv0E7a8n zbU*p0tc(~!#chv=Q%O57cHnNVZL$ls@Z`l@t)VA9Ybhqhq_Fv5ce*Zbgdq% z-}3_imBjuY-v<@~cdbL53?0eeI*p+H`t z*AbkQEK74^E~M&}su0ORgN&3Ke}25=Y8@d=k>O~tHr^>18n6m3d2o7&^WIxyRSCIq zZhljqq8Rs9#+2Ph|P+Xt%j5vM|e)Ua-F1 zeZbZEZNO%bNlPEL#T@rN2nKbABU7Jewjtj%oFE^qQ}>!B&G1N8ZbobJ+ity1E17dO z&VaVlhJ1~wE?aW84Ep%nNq7y9H5}aG_q;9sZ-tfX{u%vI?q~HRO&gLrB(#Dhe1>Wi zN$Ra%=@zdHUnA|mq(Q`@alz<_K;)@kf{d_955;f$9))5}SIxkP={%OKD_(-t!SK$S0ZV@s=x}j%JthqQo;?l&ODo)b4m1@ z#@M;D%ohahUB2<*y=U5Q81jIVrFF@^mSn3(V&HHu9;RRmo;XXoE$@wpMBf?Mx9m|w zMouXbZQr{huOPpt9MV!=#Gp{z*nZY%ysFfhhLC2Mv_6&}QaPZi-MSUc?^wj&^!__5 zS1Y#@P3VYYs2_eMH!=s?D9%IXeO z>vfhgdwRQyO7PyKh{1>*_E1LxCmq&BsN^g##81q~qwLwa4g>@DgsmuENuTp3r{o*U zOX1mWsirpx@V5Y#CJiGrapFXw`^4h%Hw3LdL`Kpc0WU?NOdtdHr4Oc&k7qqIs}B&p ztPjZ2s>}k}$}G`Kjk!f!iN`H$Gpja9atp@1DnvS&sG=kC*&|-q(N0(Vhm73iKyzl$ zV3ws%nD6EpyyvZg)F|PJ&}4$1LKa~#znzG7uB+Mi)BIk^rkJrD18pciBf{*!vKFK& z7KLVq3X?3ARbE#TtQox?I7qVsg6odwS+6-XnG2!77smbQ#Rd9)30sCX%~peFD@SGM4e=vSCa5@X;Vkwmkz-M6?(qIkN_?17felRl#)O=*?TqhU^Tsw{Ka zgZ*4eYek?<^fcjGkbPF7be(s|IqU%wLM@eb6_he6t11mL3S{3cNQ)YCDf3Zm`So`1 zw96hSnjPz~xjWZDPC&TOLAXfxo`|!z*A|eic?plUKG*Tij(9!@ zKeC`Ts*&|H9~2#fTRGJVx;Q1lHqDtSEWwlZxK(LiELW;0f_tBJJH|8)}8H zj|i74DrELx+YjH_ne>ySrWuyDw+V@{(Of4IW@{UC7oN`urO5?{mUFfKBqW}!Rh6I5 z0n+v@_Ye-Mw1t&Ft-0)~ak_6=!#Gbz9L5o0)jy2!CS-N}C9n6}BpEXi%$J&x2ek@w ziigGNb5LhbIpqcpIa%I|#2De)uLjNN zBDR-%fcpFEJdI*=og2>G6lq`B<>J`A=va+=;(k`o9!R!)EKZVmP&yIGUW_m&rv?h{ zpJrCF?7Q@k^`;i3@tVW1=Q#h=-Bg~)HZEeS14C)^&XBbjj1@dge%M<@*V>@&JblYH5~u{W_B$R#1WrJno2Q{kINNVt3Kxz1`W;TZXFAPkPsTfx7t7Hb z8ErNNk2qq$Gm=PLIDih4aJ+z})FlbMY?iR&nWcaDj$hnVam?;5Q1pqZW};_|(4qli z@-r^Z(Cz}ipy3e$g_J{-B&LFpso{je_b9V7NSg&uLSQm@>}(4h$0MHD&ffmJMcv+w4Xk4wZhhh7 zG;U`rxePNX%>AuBxg?hGOn$)7E711hbmT*PMbi~uvVFT=CZ;Wg0Pc+|dA_kp+E{28 z_Sr2Wwv*OWy)EhkO{8#|qn`N|bMCKbthyKCGQ!6i#nEfQ2wyWlv9J1BBs!CBrBLU{ zu#<2ys=u^D%{iYkeHe&p%NPE$TQk8{(+}S!9uxFglDEB2wlhWHy0AKw0RIxh4N``+ zR|!(^pl2i|ZGFZO4} zcdIv;R-{TmH55+vCi2-5b)uB8V`hY|@foi#x3ND;cMU?CdGwhC?mOgedB?O5^zhEBhSx3&4xko77S&<*9T#+p%yYjjkmzvIw-zX)Ppq1pw(P9dQ zOkt(zu-AyaJj}{F`@bm)hf~WBRBDB>YnJa<+^?Gb95&WWj7Aelf1oX!gi>k783sx5 zQ$v~p5f2w1#SoLjTxvC>w~eYts#kMYyAz2vVp6G?B;c^M#Cw=1I-!*t;@87F*<(7^ zeIAx@pq19hw(#inKvC81KIvQtt&F-&4&J>Qoso>Yo{mkZhXcooQ;5wMvL>ytw!R)J zph_VA3gDG0P?}Ba{XTA_@(u6M2C9gx?zWD?4IJ5N!8kQf6vqOCTJ&Cf1*K=i>1bVM zj@nh!0{*3!&FC3%{Kc2`XlaCP&;&HdGE#C{AJBs)2L+L+_mttk3Lcc~KGzM*I2@t$ zycELg&NauLE*u=8G+`Qe04&WhPZ<-nuAL~Km0TZ&3&}Efzw+yf2}qMqrpoza9IVtG z-}o|YV@F4Uisn>tQuo|my8VFK6G!Q$q40oFw!bbj6VqX1I-&ixnO;f0B!jQ@+vlr> zkBdgl#fAGZXhs^2F;Bx;Mpe!rz;<|_P{E5KN8@AF#rLvUj0e&r*^iDUePt_AOsZLQ zBGA<03xXfZ{&h9REB3#l)+0tS1EK(6E@^|J|9A%z2n*I-B4J&*4ZhY@+VXn=JpTc=8@)DnphUd_K z1?0ZLl#XiB^DzE8X))Sj*RHf^bQ07X?%|#@Mjd{T?=;|kuY zFE@au?MbZYI&DY)c8`?O^iNHU9dIAw&? z4+u-3_3ykzMGr~lyy&@9zT_va}#S{eH=&&0jc9$X4#wy4q4Fy}- zMGzw$4yG|G=RDj?{{_3=UkPjqn`XklshM7{bdwXLo{`T{?r{4#wa`#_KANqeJ^Shw z;5YsjCJkk`GWoO7!vPjyZmqCYwRa&G=&#xhdmD+SJ56qzXOhT{yjOF zf(NQ6sh!COne?cNx3b|E>NQ_ucr~w{{IP{vX&h+hXw!Ak``d}cx~2J1a8)I;%{rj! z3CYVYPvmNQr$;qd30JB5cOl%p^EWq=EH6>vNtV}GTY_(ggfzi+b-@ciZO!;mL7QtS z-K%D4XJX}EHLXTz2pLtDK74QyP{Ci>D1+){@jfX!ZI*lRuC*!Ycz=A|p|2o%AWjK( zx8~X1YH~OOF6{IE_*HS~Al(jiVsht|oMaur^cKXQ7m&z#RVK>v=m-(XAd4WT=iE}w^nKa0;vM~k34 ze63LGc~Ve7alvY>3)e4(>V5;?88XQ576k5K2N#x>bdoGX%h_v}t&iW(bknRyb~9TM z&)LTk4~EwIv^I!#qtoA4`unzY{q!q5o*^ybr|jz8I5k7^^^HW7889T75%(TJ?!U{+ z{pyOxY(XAsXFQ`ge%VxeyYDJ%n59qN?w7*a2;G|H8**TR!**&FXvFYh z`IW+_pfT`&w<%quKtB1R(QG0?n*~iIwTJDC&Bl#85*lKW;;?SG`3I&{Sw{G|v!sAu zO{k?l{>ecH^~NdpS#T83PP0Z*M#P^`+WkPfl4`ruDvWw43&RDzJj@f)*ySCw;`&i% zy&W2E-dmY4tj>oqO7L|_F01IQ2>-4g#Yk89$jI-CYHG>wo@(5I@Sm#DQna*9Yfow@ z+%+((ABAa$tLVcUr#ARnNn?M<4v%n)?UM^WEkb5omKjV#V#1ZF^3yYmPBNy9h)^5c`{9J4yV79U%&{zp9^ z8N(C^ODv)RFm3!k<9~{>J`k@Y|Ey2@xR}iMx_{cvKPNpVnG9?DmrR=f>o3c64r4Yn z6j62q6%+m+sdk5mQ%+YA-I;198Akv06%@z^{!g6ONiSpd-vD2agovzgrJ#Pm{{cSD B(iH#z diff --git a/legacy/doc/socketWithoutWithSetcap1.png b/legacy/doc/socketWithoutWithSetcap1.png deleted file mode 100644 index d509dc991e31a0cb8fedfecb5a8a59820e275b00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60313 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 nB3Jfw%hwTBnB(fRDjN6J5duC(M5VhgJ_? diff --git a/legacy/doc/tcpdump1.png b/legacy/doc/tcpdump1.png deleted file mode 100644 index f11db3e2e0911dc5a57ecf6c72c48160185294f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132749 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 N;OXk;vd$@?2>^Mc&1!L?ry#BKi}=DTYdYe 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 XgL762-)ENoUTu&PlM}5H*7yH^tT=iK diff --git a/legacy/doc/workping.png b/legacy/doc/workping.png deleted file mode 100644 index 1f19c957b239fa227dcd20dea0ae95d3254b190b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29469 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 Cv~Q6B diff --git a/legacy/src/capabilities.c b/legacy/src/capabilities.c deleted file mode 100644 index 3509472a..00000000 --- a/legacy/src/capabilities.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * - * - * This file contains the definition of the capabilities management functions. - * - * Note, the copyright+license information is at end of file. - */ -#define _GNU_SOURCE -#define __STDC_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 -#include "capabilities.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int errno; - -/****************************************************************************** - * PRIVATE FUNCTIONS DECLARATION * - ******************************************************************************/ - -/* -Add or remove the capabilities in/from the effective set of the process. -Add the caps if enable is different than 0, remove them if enable is 0. -Return 0 on success, -1 on failure. -*/ -static int caps_effective(int enable, int nb_caps, cap_value_t *cap_values); - -/****************************************************************************** - * PUBLIC FUNCTIONS DEFINITION * - ******************************************************************************/ - -/* -Add or remove the set_pcap capability in/from the effective set -of the process. -Return 0 on success, -1 on failure. -*/ -int setpcap_effective(int enable) -{ - cap_value_t cap_value; - - //Compute the capvalue setfcap - if (cap_from_name("cap_setpcap", &cap_value)) - return -1; - return caps_effective(enable, 1, &cap_value); -} - -/** - * Set setuid capabilities in the effective set of the process. - * Return 0 on success, -1 on failure. - */ -int setuid_effective(int enable) -{ - cap_value_t cap_value; - - //Compute the capvalue setfcap - if (cap_from_name("cap_setuid", &cap_value)) - return -1; - return caps_effective(enable, 1, &cap_value); -} - -/** - * Set setgid capabilities in the effective set of the process. - * Return 0 on success, -1 on failure. - */ -int setgid_effective(int enable) -{ - cap_value_t cap_value; - - //Compute the capvalue setfcap - if (cap_from_name("cap_setgid", &cap_value)) - return -1; - return caps_effective(enable, 1, &cap_value); -} - -int dac_read_effective(int enable) -{ - cap_value_t cap_value; - - //Compute the capvalue setfcap - if (cap_from_name("cap_dac_read_search", &cap_value)) - return -1; - return caps_effective(enable, 1, &cap_value); -} - -int dac_override_effective(int enable) -{ - cap_value_t cap_value; - - //Compute the capvalue setfcap - if (cap_from_name("cap_dac_override", &cap_value)) - return -1; - return caps_effective(enable, 1, &cap_value); -} - -/* -Activate the securebits for the no-root option. -Return 0 on success, -1 on failure. -*/ -int activates_securebits() -{ - //Enable effective set_fcap capability - if (setpcap_effective(1)) - return -1; - //Set the securebits - if (prctl(PR_SET_SECUREBITS, - SECBIT_KEEP_CAPS_LOCKED | SECBIT_NO_SETUID_FIXUP | - SECBIT_NO_SETUID_FIXUP_LOCKED | SECBIT_NOROOT | - SECBIT_NOROOT_LOCKED) == -1) { - return -1; - } - //Disable effective set_fcap capability - if (setpcap_effective(0)) - return -1; - return 0; -} - -/* -Activate the no-new-privileges for the no-root option. -Return 0 on success, -1 on failure. -*/ -int activates_no_new_privs() -{ - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) { - return -1; - } else { - return 0; - } -} - -int cap_get_bound(cap_value_t cap) -{ - int result; - - result = prctl(PR_CAPBSET_READ, (unsigned long) cap); - if (result < 0) { - errno = -result; - return -1; - } - return result; -} - -/** - * Drop all the capabilities from the parent process bounding set. -*/ -int drop_iab_from_current_bounding(cap_iab_t *dest) -{ - int ret = 1; - cap_flag_value_t values[CAP_LAST_CAP+1]; - for (cap_value_t i = 0; i < CAP_LAST_CAP+1; i++) { - values[i] = cap_get_bound(i); - if (values[i] == 0) { - cap_flag_value_t value = - cap_iab_get_vector(*dest, CAP_IAB_BOUND, i); - if (value == CAP_SET) { - ret = 0; - } - cap_iab_set_vector(*dest, CAP_IAB_BOUND, i, CAP_CLEAR); - cap_iab_set_vector(*dest, CAP_IAB_AMB, i, CAP_CLEAR); - cap_iab_set_vector(*dest, CAP_IAB_INH, i, CAP_CLEAR); - } - } - return ret; -} - -/****************************************************************************** - * PRIVATE FUNCTIONS DEFINITION * - ******************************************************************************/ - -/* -Add or remove the capabilities in/from the effective set of the process. -Add the caps if enable is different than 0, remove them if enable is 0. -Return 0 on success, -1 on failure. -*/ -static int caps_effective(int enable, int nb_caps, cap_value_t *cap_values) -{ - cap_t caps; //Capabilities state - cap_flag_value_t cap_flag_value; //value of the caps' flag to use - int return_code = -1; - - //Define the value of the flag to use to enable or disable the caps - cap_flag_value = enable ? CAP_SET : CAP_CLEAR; - //Get process' capabilities state - if ((caps = cap_get_proc()) == NULL) - return return_code; - //Set or clear the capabilities in the effective set - if (cap_set_flag(caps, CAP_EFFECTIVE, nb_caps, cap_values, - cap_flag_value)) - goto free_rscs; - //Update the process' capabilities - if (cap_set_proc(caps)) - goto free_rscs; - //Treatment done - return_code = 0; -free_rscs: - cap_free(caps); - return return_code; -} - -/* - * - * Copyright Guillaume Daumas , 2018 - * Copyright Ahmad Samer Wazan , 2018 - * Copyright Rémi Venant , 2018 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/legacy/src/capabilities.h b/legacy/src/capabilities.h deleted file mode 100644 index b3adb7ce..00000000 --- a/legacy/src/capabilities.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * - * This file contains the signatures of capabilities management functions. - * - * Note, the copyright+license information is at end of file. - */ -#ifndef CAPABILITIES_H_INCLUDED -#define CAPABILITIES_H_INCLUDED -#include - -/* -Add or remove the set_pcap capability in/from the effective set -of the process. -Return 0 on success, -1 on failure. -*/ -int setpcap_effective(int enable); - -/* -Set setuid capabilities in the effective set of the process. -*/ -int setuid_effective(int enable); - -/* -Set setgid capabilities in the effective set of the process. -*/ -int setgid_effective(int enable); - -/* -Set dac_read capabilities in the effective set of the process. -*/ -int dac_read_effective(int enable); - -/** - * Set dac_override capabilities in the effective set of the process. -*/ -int dac_override_effective(int enable); - -/* -Activate the securebits for the no-root option. -Return 0 on success, -1 on failure. -*/ -int activates_securebits(); - -/* -Activate the no-new-privileges for the no-root option. -Return 0 on success, -1 on failure. -*/ -int activates_no_new_privs(); - -/** - * Drop all the capabilities from the parent process bounding set. -*/ -int drop_iab_from_current_bounding(cap_iab_t *dest); - - -#endif // CAPABILITIES_H_INCLUDED - -/* - * - * Copyright Guillaume Daumas , 2018 - * Copyright Ahmad Samer Wazan , 2018 - * Copyright Rémi Venant , 2018 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/legacy/src/command.c b/legacy/src/command.c deleted file mode 100644 index efa63f89..00000000 --- a/legacy/src/command.c +++ /dev/null @@ -1,251 +0,0 @@ -#ifndef __STDC_LIB_EXT1__ -#define __STDC_LIB_EXT1__ -#endif -#ifndef __STDC_WANT_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 -#endif -#ifndef _DEFAULT_SOURCE -#define _DEFAULT_SOURCE -#endif -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#include "command.h" - - -#include -#include -#include -#include -#include -#include -#include - -int find_absolute_path_from_env(char *file, char **pfull_path) -{ - - int res = 0; - char *path = strdup(getenv("PATH")); - if (path == NULL) { - return res; - } - char *saveptr = NULL; - char *token = strtok_r(path, ":", &saveptr); - while (token != NULL) { - char *full_path = malloc(sizeof(char) * (strnlen(token,PATH_MAX) + strnlen(file,PATH_MAX) + 2)); - int len = snprintf(full_path, strnlen(token,PATH_MAX) + strnlen(file,PATH_MAX) + 2, "%s/%s", - token, file); - if (access(full_path, X_OK) == 0) { - res = 1; - *pfull_path = malloc(sizeof(char) * (len+1)); - strncpy(*pfull_path, full_path, len); - (*pfull_path)[len] = '\0'; - } - free(full_path); - token = strtok_r(NULL, ":",&saveptr); - } - return res; -} - -/********************* - * PUBLIC FUNCTIONS ** -**********************/ - -cmd_t *get_cmd(int argc, char *argv[]) { - if (strnlen(argv[0], PATH_MAX+1) >= PATH_MAX) { - error(0, 0, "Path too long"); - syslog(LOG_ERR, "User '%s' failed to execute '%s', path too long", - params_user_get()->name, argv[0]); - return NULL; - } - char *command = realpath(argv[0], NULL); - if (errno == ENAMETOOLONG) { - user_t *user = params_user_get(); - error(0, 0, "Path too long"); - syslog(LOG_ERR, - "User '%s' failed to execute '%s', path too long", - user->name, command); - return NULL; - } - if (access(command, X_OK) != 0) { - free(command); - command = NULL; - int res = find_absolute_path_from_env(argv[0],&command); - if (!res) { - user_t *user = params_user_get(); - syslog(LOG_ERR, - "User '%s' failed to execute '%s', command not found", - user->name, command); - error(0, 0, "%s : Command not found", argv[0]); - return NULL; - } - } else { - user_t *user = params_user_get(); - error(0, 0, "%s : Command not found", argv[0]); - syslog(LOG_ERR, - "User '%s' failed to execute '%s', command not found", - user->name, command); - return NULL; - } - return params_command_set(command, argc, argv); -} - -int get_wildcard_from_path(char *content_ptr, char *abspath_ptr, char *args_ptr){ - if (*content_ptr == '*') { - *abspath_ptr = '*'; - *(abspath_ptr+1) = '\0'; - if(*(content_ptr+1) == '*' && strnlen(content_ptr,PATH_MAX) == 2){ - *args_ptr = '.'; - *(args_ptr+1) = '*'; - *(args_ptr+2) = '\0'; - return 2; - } - return 1; - } - return 0; -} - -/** - * @brief return 1 if command start with absolute path, this is not checking if the path exists - * @param content the command line - * @param abspath the absolute path found - * @param size the size of the absolute path - * @param args the arguments of the command - * @param size_args the size of the arguments - * @note if * provided only, the absolute path is set to * and the arguments to .* - * @return 1 on success, or 0 if no absolute path found -*/ -int get_abspath_from_cmdline(char *content, char *abspath, int size, char *args, int size_args){ - char *abspath_ptr = abspath; - char *content_ptr = content; - char *args_ptr = args; - if(get_wildcard_from_path(content_ptr, abspath_ptr, args_ptr) > 1) - return 1; - if (*content_ptr != '/' && *content_ptr != '*'){ - return 0; - } - while( (*content_ptr != ' ' || *(content_ptr-1) == '\\') - && *content_ptr != '\t' - && *content_ptr != '\0' - && abspath_ptr < abspath+size-1){ - if (*content_ptr == ' ' && *(content_ptr-1) == '\\') { - abspath_ptr--; - } - *abspath_ptr = *content_ptr; - abspath_ptr++; - content_ptr++; - } - - if(*content_ptr == ' ') content_ptr++; - *abspath_ptr = '\0'; - if (args != NULL) { - while( *content_ptr != '\0' - && args_ptr < args+size_args-1){ - *args_ptr = *content_ptr; - args_ptr++; - content_ptr++; - } - *args_ptr = '\0'; - } - return 1; -} - -/** - * @brief join argv to a space separated string - * @param argc the number of arguments - * @param argv the arguments - * @param res the result string - * @param res_size the limit size of the result string - * @param res_len the length of the result string - * @return 0 on success, 1 on error -*/ -int join_argv(int argc, char **argv, char *res, int res_size, int *res_len){ - *res_len = 0; - char * res_ptr = res; - if(argc <= 1){ - return 0; - } - for (int i = 1; i < argc; ++i) { - if(res_ptr - res >= res_size){ - return 1; - } - strncpy(res_ptr, argv[i], res_size - *res_len); - res_ptr += strnlen(argv[i], res_size - *res_len); - *res_ptr = ' '; - res_ptr++; - *res_len = res_ptr - res; - } - res_ptr--; - *res_ptr = '\0'; - *res_len = res_ptr - res; - return 0; -} - -/** - * @brief join command to a space separated string - * @param cmd the command to join - * @param res the result string - * @param res_size the limit size of the result string - * @param res_len the length of the result string - * @return 0 on success, 1 on error -*/ -int join_cmd(cmd_t *cmd, char *res, int res_size, int *res_len){ - char * res_ptr = res; - *res_len = 0; - int commandlen = strnlen(cmd->command, res_size); - if(commandlen+1 >= res_size){ - return 1; - } - strncpy(res_ptr, cmd->command, res_size); - - res_ptr += commandlen; - if (cmd->argc > 1)*res_ptr = ' '; - res_ptr++; - int max_len = res_size - (res_ptr - res); - if(join_argv(cmd->argc, cmd->argv, res_ptr, max_len, res_len)) return 1; - *res_len += res_ptr - res; - res_ptr[*res_len] = '\0'; - return 0; -} - -int may_be_regex(const char *str, int size){ - char *dup = strndup(str, size); - int ret = strpbrk(dup, ".^+*)(][?}{$|\\")!=NULL ? 1 : 0; - free(dup); - return ret; -} - -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/command.h b/legacy/src/command.h deleted file mode 100644 index 4d4ec625..00000000 --- a/legacy/src/command.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef COMMAND_H -#define COMMAND_H -#include "params.h" - -cmd_t *get_cmd(int argc, char *argv[]); - -int get_abspath_from_cmdline(char *content, char *abspath, int size, char *args, int size_args); - -int join_argv(int argc, char **argv, char *res, int res_size, int *res_len); - -int join_cmd(cmd_t *cmd, char *res, int res_size, int *res_len); - -int may_be_regex(const char *str, int size); - -#endif // COMMAND_H - -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/env.c b/legacy/src/env.c deleted file mode 100644 index fecfaf72..00000000 --- a/legacy/src/env.c +++ /dev/null @@ -1,205 +0,0 @@ -#ifndef _DEFAULT_SOURCE -#define _DEFAULT_SOURCE -#endif -#ifndef __STDC_LIB_EXT1__ -#define __STDC_LIB_EXT1__ -#endif -#ifndef __STDC_WANT_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 -#endif -#include "env.h" -#include -#include - -#include -#include -#include -#include - -/* - * This function is based on the tz_is_safe() function from sudo. - * The original function is licensed under the ISC license. - * which is compatible with the GPL license. - * The original function is available at: https://www.sudo.ws/repos/sudo/file/tip/plugins/sudoers/env.c - * - * Verify the TZ environment variable is safe. - * On many systems it is possible to set this to a pathname. - */ -static int tz_is_safe(const char *tzval) -{ - const char *cp; - char lastch; - - /* tzcode treats a value beginning with a ':' as a path. */ - if (tzval[0] == ':') - tzval++; - - /* Reject fully-qualified TZ that doesn't being with the zoneinfo dir. */ - if (tzval[0] == '/') { - return 0; - } - - /* - * Make sure TZ only contains printable non-space characters - * and does not contain a '..' path element. - */ - lastch = '/'; - for (cp = tzval; *cp != '\0'; cp++) { - if (isspace((unsigned char)*cp) || !isprint((unsigned char)*cp)) - return 0; - if (lastch == '/' && cp[0] == '.' && cp[1] == '.' && - (cp[2] == '/' || cp[2] == '\0')) - return 0; - lastch = *cp; - } - - /* Reject extra long TZ values (even if not a path). */ - if ((size_t)(cp - tzval) >= PATH_MAX) return 0; - - return 1; -} - -/** - * @brief check if string matches another string with wildcards -*/ -static int match(char *str, char *pattern){ - if (str == NULL || pattern == NULL){ - return 0; - } - char *wildcard; - if ((wildcard = strchr(pattern, '*')) != NULL){ - if(wildcard[1] == '\0') { - return strncmp(str, pattern, wildcard - pattern) == 0; - } else if (strncmp(str, pattern, wildcard - pattern) == 0){ - return match(str + (wildcard - pattern) - 1, wildcard + 1); - } else { - return 0; - } - } else{ - return strcmp(str, pattern) == 0; - } - return 0; -} - -/** - * @brief check if a string is in an array of strings - * @param str the string to check - * @param array the array of strings - * @return 1 if the string is in the array, 0 otherwise -*/ -static int is_in_array(char *str, char **array){ - if (str == NULL || array == NULL){ - return 0; - } - for(int i = 0; array[i] != NULL; i++){ - if (match(str, array[i])){ - return 1; - } - } - return 0; -} - -int check_var(char *var_name,char *var_value){ - if (var_name == NULL || var_value == NULL){ - return 0; - } - if (strncmp(var_name, "TZ",2) == 0){ - return tz_is_safe(var_value); - } - if(strpbrk(var_value,"/%") != NULL){ - return 0; - } - return 1; -} - -long long array_len(char **array){ - if (array == NULL){ - return 0; - } - long long i = 0; - while(i < __LONG_MAX__ && array[i] != NULL){ - i++; - } - return i; -} - -/** - * This function is based on sudo code source. - * @brief filter some environment variables according to the blacklist and next to the whitelist - * @param envp the environment variables to filter - * @param whitelist the whitelist of environment variables to keep separated by a comma - * @param checklist the checklist of environment variables to check separated by a comma - * @param new_envp the new environment variables array - * @return 0 if the function succeed, 1 otherwise -*/ -int filter_env_vars(char **envp, char **whitelist, char **checklist, char ***p_new_envp){ - if (envp == NULL){ - return 1; - } - int res = 0; - int i = 0; - char **new_envp = (char**)malloc(sizeof(char*)*array_len(envp) +1); - *new_envp = NULL; - - if (checklist == NULL && whitelist == NULL){ - *p_new_envp = envp; - } - - for(int j = 0; envp[j] != NULL; j++){ - char *env_var = strdup(envp[j]); - char *env_var_name = strtok(env_var, "="); - if (env_var_name == NULL || *env_var_name == '\0'){ - res++; - goto error; - } - char *env_var_value = env_var_name + strnlen(env_var_name,ARG_MAX) + 1; - if (strncmp(env_var_name, "PATH", 4) == 0 || (is_in_array(env_var_name, checklist) && check_var(env_var_name, env_var_value)) || is_in_array(env_var_name, whitelist)){ - new_envp[i] = envp[j]; - new_envp[i + 1] = NULL; - i++; - } - free(env_var); - } - *p_new_envp = new_envp; - error: - return res; - -} - -int secure_path(char *path, char *secure_path){ - return snprintf(path, ARG_MAX, "%s", secure_path) > 0; -} -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/env.h b/legacy/src/env.h deleted file mode 100644 index d5e4b781..00000000 --- a/legacy/src/env.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef ENV_H -#define ENV_H - -/** - * @brief filter the environment variables according to the whitelist and the checklist - * @param envp the environment variables to filter - * @param whitelist the whitelist of environment variables to keep separated by a comma - * @param checklist the checklist of environment variables to check separated by a comma - * @param new_envp the new environment variables -*/ -int filter_env_vars(char **envp, char **whitelist, char **checklist, char ***p_new_envp); - -/** - * @brief replace the path by a secure path -*/ -int secure_path(char *path, char *secure_path); - -#endif -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/params.c b/legacy/src/params.c deleted file mode 100644 index e7a400bf..00000000 --- a/legacy/src/params.c +++ /dev/null @@ -1,294 +0,0 @@ -#include "params.h" -#define __STDC_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 - -#include -#include -#include -#include - - -static user_t *user = &(user_t){.name=NULL, .nb_groups = 0, .groups = NULL}; - -static cmd_t *command = &(cmd_t){NULL, 0, NULL}; - -static char *role = NULL; - -static char *d_keep_vars[] = { "HOME", - "USER", - "LOGNAME", - "COLORS", - "DISPLAY", - "HOSTNAME", - "KRB5CCNAME", - "LS_COLORS", - "PS1", - "PS2", - "XAUTHORY", - "XAUTHORIZATION", - "XDG_CURRENT_DESKTOP" }; -static char *d_check_vars[] = { "COLORTERM", "LANG", "LANGUAGE", "LC_*", - "LINGUAS", "TERM", "TZ" }; -static char d_path[] = - "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"; - -static settings_t options = { .env_keep = d_keep_vars, - .env_check = d_check_vars, - .path = d_path, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 1, - .iab = NULL }; - -/** - * @brief Set the POSIX user variables - * @param name The input user name - * @param nb_groups The input user nb_groups - * @param groups The input user groups - * @return static user_t on success, NULL on error -*/ -user_t *params_user_posix_set(char *name, int nb_groups, char **groups){ - user->nb_groups = nb_groups; - user->groups = groups; - user->name = name; - return user; -} - -user_t *params_user_get(){ - return user; -} - -/** - * @brief Set the command variables - * @param command The input command absolute path - * @param argc The input command argc - * @param argv The input command argv - * @param cmd The output command object - * @return static cmd_t on success, NULL on error -*/ -cmd_t *params_command_set(char *p_command, int argc, char **argv){ - command->command = p_command; - command->argc = argc; - command->argv = argv; - return command; -} - -cmd_t *params_command_get(){ - return command; -} - -char *params_set_role(char *p_role){ - role = p_role; - return role; -} - -char *params_get_role(){ - return role; -} - -/******************************************* - *** FIND OPTIONS *** -********************************************/ - -settings_t *default_options_get(){ - return &options; -} - -void set_default_options(settings_t *settings){ - if (settings == NULL){ - return; - } - settings->env_keep = d_keep_vars; - settings->env_check = d_check_vars; - settings->path = d_path; - settings->setuid = NULL; - settings->setgid = NULL; - settings->disable_root = 1; - settings->apply_bounding = 1; - settings->role = NULL; - settings->iab = cap_iab_init(); -} - -void options_assign(settings_t *dst, settings_t *src) { - if (src == NULL || dst == NULL) { - return; - } - if (src->env_keep != NULL) { - dst->env_keep = src->env_keep; - } - if (src->env_check != NULL) { - dst->env_check = src->env_check; - } - if (src->path != NULL) { - dst->path = src->path; - } - if (src->setuid != NULL) { - dst->setuid = src->setuid; - } - if (src->setgid != NULL) { - dst->setgid = src->setgid; - } - dst->disable_root = src->disable_root; - dst->apply_bounding = src->apply_bounding; - if (src->role != NULL) { - dst->role = src->role; - } - if (src->iab != NULL) { - dst->iab = src->iab; - } -} - -static char** split_string(xmlChar *str, char *delimiter){ - if (str == NULL){ - return NULL; - } - char **array = NULL; - int i = 0; - char *token = strtok((char *)str, delimiter); - while(token != NULL){ - char **re_array = realloc(array, sizeof(char*) * (i + 2)); - if (re_array == NULL){ - goto error; - } - array = re_array; - array[i] = token; - array[i + 1] = NULL; - i++; - token = strtok(NULL, delimiter); - } - return (char **) array; - - error: - if (array != NULL){ - free(array); - } - return NULL; -} - -/** - * @brief check if an option is enforced - * @param option the option to check - * @return 1 if the option is enforced, 0 otherwise -*/ -int option_enforced(xmlNodePtr option) -{ - if (!xmlHasProp(option, (const xmlChar *)"enforce")) - return 1; - int res = 0; - xmlChar *prop = xmlGetProp(option, (const xmlChar *)"enforce"); - if (!xmlStrcmp(prop, (const xmlChar *)"true")) - res = 1; - xmlFree(prop); - return res; -} - -/** - * @brief set the options from the options xml node - * @param options_node the xml node containing the options - * @return the options structure in the global variable options -*/ -void set_options_from_node(xmlNodePtr options_node, settings_t *options) -{ - for (xmlNodePtr node = options_node->children; node; - node = node->next) { - if (node->type == XML_ELEMENT_NODE) { - if (!xmlStrcmp(node->name, - (const xmlChar *)"allow-root")) { - options->disable_root = !option_enforced(node); - } else if (!xmlStrcmp( - node->name, - (const xmlChar *)"allow-bounding")) { - options->apply_bounding = !option_enforced(node); - } else if (!xmlStrcmp(node->name, - (const xmlChar *)"path")) { - options->path = (char *)xmlNodeGetContent(node); - } else if (!xmlStrcmp(node->name, - (const xmlChar *)"env-keep")) { - options->env_keep = split_string( - xmlNodeGetContent(node),","); - } else if (!xmlStrcmp(node->name, - (const xmlChar *)"env-check")) { - options->env_check = split_string( - xmlNodeGetContent(node),","); - } - } - } -} - -/** - * @brief find the options node in the xml tree and set the options - * @param p_node the node to start the search - * @return the options structure in the global variable options -*/ -void find_and_set_options_in_node(xmlNodePtr p_node, settings_t *options) -{ - for (xmlNodePtr node = p_node->children; node; node = node->next) { - if (!xmlStrncmp(node->name, (const xmlChar *)"options", 7)) { - set_options_from_node(node, options); - } - } -} - -/** - * @brief retrieve the options from the task node - * @param task_node the edging node where options could be found - * @return the options structure - * @note This function is checking from the most specific to the most general and applies defaults if nothing is found -*/ -void get_options_from_config(xmlNodePtr task_node, settings_t *options) -{ - find_and_set_options_in_node(task_node, options); - if (task_node->parent == NULL) - return; - find_and_set_options_in_node(task_node->parent, options); - if (task_node->doc == NULL || task_node->doc->children == NULL || task_node->doc->children->next == NULL) - return; - find_and_set_options_in_node(task_node->doc->children->next, options); -} - -/** - * @brief free the options structure - * @param options the options structure to free -*/ -void free_options(settings_t *options) -{ - //free(options->role); - //free(options->iab); - options->apply_bounding = 0; -} - -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/params.h b/legacy/src/params.h deleted file mode 100644 index 59ff6923..00000000 --- a/legacy/src/params.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef PARAMS_H -#define PARAMS_H - -#include -#include - -struct s_cmd { - char *command; - int argc; - char **argv; -}; - -typedef struct s_cmd cmd_t; - -struct s_user { - int nb_groups; - char **groups; - char *name; -}; - -typedef struct s_user user_t; - -struct s_settings { - char** env_keep; - char** env_check; - char *path; - char *role; - char *setuid; - char *setgid; - int disable_root; - int apply_bounding; - cap_iab_t iab; -}; - -typedef struct s_settings settings_t; - -/** - * @brief Set the POSIX user variables - * @param name The input user name - * @param nb_groups The input user nb_groups - * @param groups The input user groups - * @return static user_t on success, NULL on error -*/ -user_t *params_user_posix_set(char *name,int nb_groups,char **groups); - -user_t *params_user_get(); - -/** - * @brief Set the command variables - * @param command The input command absolute path - * @param argc The input command argc - * @param argv The input command argv - * @param cmd The output command object - * @return static cmd_t on success, NULL on error -*/ -cmd_t *params_command_set(char *command, int argc, char **argv); - -cmd_t *params_command_get(); - -/** - * @brief Set the role variable -*/ -char *params_set_role(char *p_role); - -/** - * @brief Get the role param - * @return The role param -*/ -char *params_get_role(); - -void set_default_options(settings_t *settings); -void options_assign(settings_t *dst, settings_t *src); -void get_options_from_config(xmlNodePtr task_node, settings_t *options); -void free_options(settings_t *options); - -#endif /* !PARAMS_H */ -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/sr.c b/legacy/src/sr.c deleted file mode 100644 index bce07aeb..00000000 --- a/legacy/src/sr.c +++ /dev/null @@ -1,428 +0,0 @@ -#define _GNU_SOURCE -#define __STDC_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include "env.h" -#include "xml_manager.h" -#include "user.h" -#include "capabilities.h" -#include "command.h" - -#ifndef SR_VERSION -#define SR_VERSION "3.0" -#endif - -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif - -typedef struct _arguments_t { - char *role; - int info; - int version; - int help; -} arguments_t; - -extern char **environ; - -/** - * @brief parse the command line arguments where command is the rest of the command line like this sr (options) command [args] - * @param argc number of arguments - * @param argv array of arguments - * @param args structure to store the parsed arguments - * @return 0 on success, -1 on error -*/ -int parse_arguments(int *argc, char **argv[], arguments_t *args) -{ - int c; - static struct option long_options[] = { - { "role", required_argument, 0, 'r' }, - { "info", no_argument, 0, 'i' }, - { "version", no_argument, 0, 'v' }, - { "help", no_argument, 0, 'h' }, - { 0, 0, 0, 0 } - }; - if (*argc < 2 ) { - return -1; - } - //check if argument array is correctly terminated - if ((*argv)[*argc] != NULL) { - return -1; - } - - while ((c = getopt_long(*argc, *argv, "+r:ivh", long_options, NULL)) != // Flawfinder: ignore - -1) { - switch (c) { - case 'r': - args->role = optarg; - break; - case 'i': - args->info = 1; - break; - case 'v': - args->version = 1; - break; - case 'h': - args->help = 1; - break; - default: - return 0; - } - } - *argc -= optind; - *argv += optind; - return 1; -} - -void safe_memcpy(void* dest, size_t dest_size, const void* src, size_t count) { - if (dest == NULL || src == NULL || dest_size < count) { - // Handle error: Invalid arguments or buffer overflow - return; - } - - memcpy(dest, src, count); // Flawfinder: ignore -} - - -int sr_execve(char *command, int p_argc, char *p_argv[], char *p_envp[]) -{ - int ret = 0; - int i = execve(command, p_argv, p_envp); - if (i == -1 || errno == ENOEXEC) { - const char **nargv; - size_t nargc = p_argc + 1; - nargv = reallocarray(NULL, nargc, sizeof(char *)); - if (nargv != NULL) { - nargv[0] = "sh"; - nargv[1] = command; - safe_memcpy(nargv + 2, nargc, p_argv, p_argc * sizeof(char *)); - nargv[p_argc] = NULL; - ret = execve("/bin/sh", (char **)nargv, p_envp); - printf("sr: %s : %s", p_argv[0], strerror(errno)); - free(nargv); - } - } - return ret; -} - -/** - * Set uid from options on current process -*/ -int sr_setuid(settings_t *options) -{ - if (options->setuid != NULL) { - if (setuid_effective(1)) { - error(0, 0, "Unable to setuid capability"); - syslog(LOG_ERR, "Unable to setuid capability"); - return -1; - } - uid_t uid = get_user_id(options->setuid); - if (uid == (uid_t)-1) { - error(0, 0, - "Unable to retrieve the uid from the user/number '%s'", - options->setuid); - syslog(LOG_ERR, - "Unable to retrieve the uid from the user/number '%s'", - options->setuid); - return -1; - } - if (setuid(uid)) { - perror("setuid"); - syslog(LOG_ERR, "Unable to setuid"); - return -1; - } - if (setuid_effective(0)) { - error(0, 0, "Unable to setuid capability"); - syslog(LOG_ERR, "Unable to setuid capability"); - return -1; - } - } - return 0; -} - -/** - * set gid from options on current process -*/ -int sr_setgid(settings_t *options) -{ - if (options->setgid != NULL) { - if (setgid_effective(1)) { - error(0, 0, "Unable to setgid capability"); - syslog(LOG_ERR, "Unable to setgid capability"); - return -1; - } - int nb_groups = 0; - gid_t *groups = NULL; - int result = get_group_ids_from_names(options->setgid, - &nb_groups, &groups); - if (result) { - error(0, 0, - "Unable to retrieve the gids from the groupnames/numbers '%s'", - options->setgid); - syslog(LOG_ERR, - "Unable to retrieve the gids from the groupnames/numbers '%s'", - options->setgid); - return -1; - } - if (setgid(groups[0])) { - perror("setgid"); - syslog(LOG_ERR, "Unable to setgid"); - return -1; - } - if (setgroups(nb_groups, groups)) { - perror("setgroups"); - syslog(LOG_ERR, "Unable to setgroups"); - return -1; - } - if (setgid_effective(0)) { - error(0, 0, "Unable to setuid capability"); - syslog(LOG_ERR, "Unable to setuid capability"); - return -1; - } - } - return 0; -} - -/** - * Set capabilities on current process from options -*/ -int sr_setcaps(settings_t *settings) -{ - if (setpcap_effective(1)) { - error(0, 0, "Unable to setpcap capability"); - syslog(LOG_ERR, "Unable to setpcap capability"); - return -1; - } - if (cap_iab_set_proc(settings->iab)) { - perror("Unable to set capabilities"); - syslog(LOG_ERR, "Unable to set capabilities"); - return -1; - } - if (setpcap_effective(0)) { - error(0, 0, "Unable to setpcap capability"); - syslog(LOG_ERR, "Unable to setpcap capability"); - return -1; - } - return 0; -} - -/** - * Jail root as a non super user -*/ -int sr_noroot(settings_t *options) -{ - if (options->disable_root) { - if (activates_securebits()) { - error(0, 0, "Unable to activate securebits"); - syslog(LOG_ERR, "Unable to activate securebits"); - return -1; - } - } - return 0; -} - -void escape_special_chars(char* input, size_t input_length) { - char* special_chars = "%\\"; - char* escape_char = "\\"; - size_t i, j; - - for (i = 0, j = 0; i < input_length && input[i] != '\0'; i++, j++) { - if (strchr(special_chars, input[i]) != NULL) { - strncpy(&input[j + 1], &input[j], input_length - j); - input[j] = escape_char[0]; - j++; - input_length++; - } - input[j] = input[i]; - } - input[j] = '\0'; -} - -void display_version_warning(xmlChar *docversion){ - printf("WARNING: The version of the configuration file is %s, but the version of SR is %s\n", docversion, SR_VERSION); -} - -/** - * @brief main function of the SR module -*/ -int main(int argc, char *argv[]) -{ - arguments_t arguments = { NULL, 0, 0, 0 }; - char callpath[PATH_MAX]; - if (strnlen(argv[0], PATH_MAX) == PATH_MAX) { - error(0, 0, "Path of the executable is too long"); - syslog(LOG_ERR, "Path of the executable is too long"); - return -1; - } - strncpy(callpath, argv[0], PATH_MAX); - callpath[PATH_MAX - 1] = '\0'; - escape_special_chars(callpath, PATH_MAX); - xmlDocPtr doc = load_xml(XML_FILE); - if (!doc) - return 0; - xmlChar *version = get_doc_version(doc); - unsigned long timestamp_timeout = get_doc_timestamp_timeout(doc); - if (!parse_arguments(&argc, &argv, &arguments) || arguments.help || - (argc == 0 && !arguments.info)) { - printf("Usage: %s [options] [command [args]]\n", callpath); - printf("Options:\n"); - printf(" -r, --role Role to use\n"); - printf(" -i, --info Display rights of executor\n"); - printf(" -v, --version Display version\n"); - printf(" -h, --help Display this help\n"); - if (strcmp((char*)version, SR_VERSION)) { - display_version_warning(version); - } - return 0; - } else if (arguments.version) { - if (strcmp((char*)version, SR_VERSION)) { - display_version_warning(version); - } else { - printf("SR version %s\n", SR_VERSION); - } - return 0; - } - if (strcmp((char*)version, SR_VERSION)) { - display_version_warning(version); - } - - openlog("sr", LOG_PID, LOG_AUTH); - settings_t options; - set_default_options(&options); - user_t *user = user_posix_get(); - if (timestamp_timeout == 0 || check_timestamp_timeout(user->name, timestamp_timeout) == 1){ - if (!pam_authenticate_user(user->name)){ - error(0, 0, "Authentication failed"); - goto free_error; - } - if (timestamp_timeout != 0){ - if(dac_override_effective(1)) { - error(0, 0, "Unable to set DAC override"); - goto free_error; - } - if (set_timestamp_user(user->name) == -1){ - error(0, 0, "Unable to set timestamp timeout"); - goto free_error; - } - if(dac_override_effective(0)) { - error(0, 0, "Unable to set DAC override"); - goto free_error; - } - } - } - - if (arguments.info) { - if (arguments.role == NULL) - print_rights(user); - else { - print_rights_role(arguments.role, user); - } - goto free_error; - } - - cmd_t *cmd = get_cmd(argc, argv); - if (cmd == NULL) { - error(0, 0, "Unable to get command"); - goto free_error; - } - if (arguments.role){ - int ret = get_settings_from_doc_by_role(arguments.role, doc, user, cmd, - &options); - if (!ret) { - syslog(LOG_ERR, - "User '%s' tries to execute '%s', without permission", - user->name, cmd->command); - error(0, 0, "Permission denied"); - goto free_error; - } - } else { - int ret = get_settings_from_doc_by_partial_order(doc, user, cmd, &options); - if (!ret) { - syslog(LOG_ERR, - "User '%s' tries to execute '%s', without permission", - user->name, cmd->command); - error(0, 0, "Permission denied"); - goto free_error; - } - } - - syslog(LOG_INFO, - "User '%s' tries to execute '%s' with role '%s'", user->name, - cmd->command, options.role); - if (sr_noroot(&options) || sr_setuid(&options) || - sr_setgid(&options) || sr_setcaps(&options)) { - goto free_error; - } - - char **env = NULL; - int res = filter_env_vars(environ, options.env_keep, - options.env_check, &env); - if (res > 0) { - error(0, 0, "Unable to filter environment variables"); - syslog(LOG_ERR, - "Unable to filter environment variables"); - goto free_error; - } - res = secure_path(getenv("PATH"), options.path); - if (!res) { - error(0, 0, "Unable to secure path"); - syslog(LOG_ERR, "Unable to secure path"); - goto free_error; - } - free_options(&options); - if (user != NULL) - user_posix_free(user); - return sr_execve(cmd->command, cmd->argc, cmd->argv, env); - -free_error: - free_options(&options); - if (user != NULL) - user_posix_free(user); - return -1; -} -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/src/timestamp.c b/legacy/src/timestamp.c deleted file mode 100644 index 2d9a3e7a..00000000 --- a/legacy/src/timestamp.c +++ /dev/null @@ -1,1151 +0,0 @@ -/* - * SPDX-License-Identifier: ISC - * - * Copyright (c) 2014-2022 Todd C. Miller - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This is an open source non-commercial project. Dear PVS-Studio, please check it. - * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com - */ - -#include -#include -#include -#include -#include -#if defined(HAVE_STDINT_H) -# include -#elif defined(HAVE_INTTYPES_H) -# include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#include "timestamp.h" - -#define TIMESTAMP_OPEN_ERROR -1 -#define TIMESTAMP_PERM_ERROR -2 - -/* - * Each user has a single time stamp file that contains multiple records. - * Records are locked to ensure that changes are serialized. - * - * The first record is of type TS_LOCKEXCL and is used to gain exclusive - * access to create new records. This is a short-term lock and sudo - * should not sleep while holding it (or the user will not be able to sudo). - * The TS_LOCKEXCL entry must be unlocked before locking the actual record. - */ - -struct ts_cookie { - char *fname; - int fd; - pid_t sid; - bool locked; - off_t pos; - struct timestamp_entry key; -}; - -/* - * Returns true if entry matches key, else false. - * We don't match on the sid or actual time stamp. - */ -static bool -ts_match_record(struct timestamp_entry *key, struct timestamp_entry *entry, - unsigned int recno) -{ - - if (entry->version != key->version) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u record version mismatch (want %u, got %u)", __func__, recno, - key->version, entry->version); - debug_return_bool(false); - } - if (!ISSET(key->flags, TS_ANYUID) && entry->auth_uid != key->auth_uid) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u record uid mismatch (want %u, got %u)", __func__, recno, - (unsigned int)key->auth_uid, (unsigned int)entry->auth_uid); - debug_return_bool(false); - } - if (entry->type != key->type) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u record type mismatch (want %u, got %u)", __func__, recno, - key->type, entry->type); - debug_return_bool(false); - } - switch (entry->type) { - case TS_GLOBAL: - /* no ppid or tty to match */ - break; - case TS_PPID: - /* verify parent pid */ - if (entry->u.ppid != key->u.ppid) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u record ppid mismatch (want %d, got %d)", __func__, recno, - (int)key->u.ppid, (int)entry->u.ppid); - debug_return_bool(false); - } - if (sudo_timespeccmp(&entry->start_time, &key->start_time, !=)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u ppid start time mismatch", __func__, recno); - debug_return_bool(false); - } - break; - case TS_TTY: - if (entry->u.ttydev != key->u.ttydev) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u record tty mismatch (want 0x%x, got 0x%x)", __func__, - recno, (unsigned int)key->u.ttydev, (unsigned int)entry->u.ttydev); - debug_return_bool(false); - } - if (sudo_timespeccmp(&entry->start_time, &key->start_time, !=)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG, - "%s:%u session leader start time mismatch", __func__, recno); - debug_return_bool(false); - } - break; - default: - /* unknown record type, ignore it */ - sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, - "%s:%u unknown time stamp record type %d", __func__, recno, - entry->type); - debug_return_bool(false); - } - debug_return_bool(true); -} - -/* - * Searches the time stamp file descriptor for a record that matches key. - * On success, fills in entry with the matching record and returns true. - * On failure, returns false. - * - * Note that records are searched starting at the current file offset, - * which may not be the beginning of the file. - */ -static bool -ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entry) -{ - struct timestamp_entry cur; - unsigned int recno = 0; - - /* - * Find a matching record (does not match sid or time stamp value). - */ - while (read(fd, &cur, sizeof(cur)) == sizeof(cur)) { - recno++; - if (cur.size != sizeof(cur)) { - /* wrong size, seek to start of next record */ - sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, - "wrong sized record, got %hu, expected %zu", - cur.size, sizeof(cur)); - if (lseek(fd, (off_t)cur.size - (off_t)sizeof(cur), SEEK_CUR) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "unable to seek forward %d", - (int)cur.size - (int)sizeof(cur)); - break; - } - if (cur.size == 0) - break; /* size must be non-zero */ - continue; - } - if (ts_match_record(key, &cur, recno)) { - memcpy(entry, &cur, sizeof(struct timestamp_entry)); - debug_return_bool(true); - } - } - debug_return_bool(false); -} - -/* - * Create a directory and any missing parent directories with the - * specified mode. - * Returns an fd usable with the *at() functions on success. - * Returns -1 on failure, setting errno. - */ -static int -ts_mkdirs(const char *path, uid_t owner, gid_t group, mode_t mode, - mode_t parent_mode, bool quiet) -{ - int parentfd, fd = -1; - const char *base; - mode_t omask; - - /* Child directory we will create. */ - base = sudo_basename(path); - - /* umask must not be more restrictive than the file modes. */ - omask = umask(ACCESSPERMS & ~(mode|parent_mode)); - parentfd = sudo_open_parent_dir(path, owner, group, parent_mode, quiet); - if (parentfd != -1) { - /* Create final path component. */ - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "mkdir %s, mode 0%o, uid %d, gid %d", path, (unsigned int)mode, - (int)owner, (int)group); - if (mkdirat(parentfd, base, mode) != 0 && errno != EEXIST) { - if (!quiet) - sudo_warn(U_("unable to mkdir %s"), path); - } else { - fd = openat(parentfd, base, O_RDONLY|O_NONBLOCK, 0); - if (fd == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, - "%s: unable to open %s", __func__, path); - } else if (fchown(fd, owner, group) != 0) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, - "%s: unable to chown %d:%d %s", __func__, - (int)owner, (int)group, path); - } - } - close(parentfd); - } - umask(omask); - debug_return_int(fd); -} - -/* - * Check that path is owned by timestamp_uid and not writable by - * group or other. If path is missing and make_it is true, create - * the directory and its parent dirs. - * - * Returns an fd usable with the *at() functions on success. - * Returns -1 on failure, setting errno. - */ -static int -ts_secure_opendir(const char *path, bool make_it, bool quiet) -{ - int error, fd; - struct stat sb; - - sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, "checking %s", path); - fd = sudo_secure_open_dir(path, timestamp_uid, timestamp_gid, &sb, &error); - if (fd == -1) { - switch (error) { - case SUDO_PATH_MISSING: - if (make_it) { - fd = ts_mkdirs(path, timestamp_uid, timestamp_gid, S_IRWXU, - S_IRWXU|S_IXGRP|S_IXOTH, quiet); - if (fd != -1) - break; - } - if (!quiet) - sudo_warn("%s", path); - break; - case SUDO_PATH_BAD_TYPE: - errno = ENOTDIR; - if (!quiet) - sudo_warn("%s", path); - break; - case SUDO_PATH_WRONG_OWNER: - if (!quiet) { - sudo_warnx(U_("%s is owned by uid %u, should be %u"), - path, (unsigned int)sb.st_uid, (unsigned int)timestamp_uid); - } - errno = EACCES; - break; - case SUDO_PATH_WORLD_WRITABLE: - if (!quiet) - sudo_warnx(U_("%s is world writable"), path); - errno = EACCES; - break; - case SUDO_PATH_GROUP_WRITABLE: - if (!quiet) { - sudo_warnx(U_("%s is owned by gid %u, should be %u"), - path, (unsigned int)sb.st_gid, (unsigned int)timestamp_gid); - } - errno = EACCES; - break; - default: - if (!quiet) { - sudo_warnx("%s: internal error, unexpected error %d", - __func__, error); - errno = EINVAL; - } - break; - } - } - - debug_return_int(fd); -} - -/* - * Open the specified timestamp or lecture file and set the - * close on exec flag. - * Returns open file descriptor on success. - * Returns TIMESTAMP_OPEN_ERROR or TIMESTAMP_PERM_ERROR on error. - */ -static int -ts_openat(int dfd, const char *path, int flags) -{ - bool uid_changed = false; - int fd; - - if (timestamp_uid != 0) - uid_changed = set_perms(PERM_TIMESTAMP); - fd = openat(dfd, path, flags, S_IRUSR|S_IWUSR); - if (uid_changed && !restore_perms()) { - /* Unable to restore permissions, should not happen. */ - if (fd != -1) { - int serrno = errno; - close(fd); - errno = serrno; - fd = TIMESTAMP_PERM_ERROR; - } - } - if (fd >= 0) - (void)fcntl(fd, F_SETFD, FD_CLOEXEC); - - debug_return_int(fd); -} - -static ssize_t -ts_write(int fd, const char *fname, struct timestamp_entry *entry, off_t offset) -{ - ssize_t nwritten; - off_t old_eof; - - if (offset == -1) { - old_eof = lseek(fd, 0, SEEK_CUR); - if (old_eof == -1) - debug_return_ssize_t(-1); - nwritten = write(fd, entry, entry->size); - } else { - old_eof = offset; - nwritten = pwrite(fd, entry, entry->size, offset); - } - if ((size_t)nwritten != entry->size) { - if (nwritten == -1) { - log_warning(SLOG_SEND_MAIL, - N_("unable to write to %s"), fname); - } else { - log_warningx(SLOG_SEND_MAIL, - N_("unable to write to %s"), fname); - } - - /* Truncate on partial write to be safe (assumes end of file). */ - if (nwritten > 0) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "short write, truncating partial time stamp record"); - if (ftruncate(fd, old_eof) != 0) { - sudo_warn(U_("unable to truncate time stamp file to %lld bytes"), - (long long)old_eof); - } - } - debug_return_ssize_t(-1); - } - debug_return_ssize_t(nwritten); -} - -/* - * Full in struct timestamp_entry with the specified flags - * based on auth user pw. Does not set the time stamp. - */ -static void -ts_init_key(struct timestamp_entry *entry, struct passwd *pw, int flags, - enum def_tuple ticket_type) -{ - struct stat sb; - - memset(entry, 0, sizeof(*entry)); - entry->version = TS_VERSION; - entry->size = sizeof(*entry); - entry->flags = flags; - if (pw != NULL) { - entry->auth_uid = pw->pw_uid; - } else { - entry->flags |= TS_ANYUID; - } - entry->sid = user_sid; - switch (ticket_type) { - default: - /* Unknown time stamp ticket type, treat as tty (should not happen). */ - sudo_warnx("unknown time stamp ticket type %d", ticket_type); - FALLTHROUGH; - case tty: - if (user_ttypath != NULL && stat(user_ttypath, &sb) == 0) { - /* tty-based time stamp */ - entry->type = TS_TTY; - entry->u.ttydev = sb.st_rdev; - if (entry->sid != -1) - get_starttime(entry->sid, &entry->start_time); - break; - } - FALLTHROUGH; - case kernel: - case ppid: - /* ppid-based time stamp */ - entry->type = TS_PPID; - entry->u.ppid = getppid(); - get_starttime(entry->u.ppid, &entry->start_time); - break; - case global: - /* global time stamp */ - entry->type = TS_GLOBAL; - break; - } - - debug_return; -} - -static void -ts_init_key_nonglobal(struct timestamp_entry *entry, struct passwd *pw, int flags) -{ - /* - * Even if the timestamp type is global or kernel we still want to do - * per-tty or per-ppid locking so sudo works predictably in a pipeline. - */ - ts_init_key(entry, pw, flags, - def_timestamp_type == ppid ? ppid : tty); -} - -/* - * Open the user's time stamp file. - * Returns a cookie or NULL on error, does not lock the file. - */ -void * -timestamp_open(const char *user, pid_t sid) -{ - struct ts_cookie *cookie; - char *fname = NULL; - int tries, dfd = -1, fd = -1; - - /* Zero timeout means don't use the time stamp file. */ - if (!sudo_timespecisset(&def_timestamp_timeout)) { - errno = ENOENT; - goto bad; - } - - /* Check the validity of timestamp dir and create if missing. */ - dfd = ts_secure_opendir(def_timestampdir, true, false); - if (dfd == -1) - goto bad; - - /* Open time stamp file. */ - if (asprintf(&fname, "%s/%s", def_timestampdir, user) == -1) { - sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - goto bad; - } - for (tries = 1; ; tries++) { - struct stat sb; - - fd = ts_openat(dfd, user, O_RDWR|O_CREAT); - switch (fd) { - case TIMESTAMP_OPEN_ERROR: - log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), fname); - goto bad; - case TIMESTAMP_PERM_ERROR: - /* Already logged set_perms/restore_perms error. */ - goto bad; - } - - /* Remove time stamp file if its mtime predates boot time. */ - if (tries == 1 && fstat(fd, &sb) == 0) { - struct timespec boottime, mtime, now; - - if (sudo_gettime_real(&now) == 0 && get_boottime(&boottime)) { - /* Ignore a boot time that is in the future. */ - if (sudo_timespeccmp(&now, &boottime, <)) { - sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, - "ignoring boot time that is in the future"); - } else { - mtim_get(&sb, mtime); - if (sudo_timespeccmp(&mtime, &boottime, <)) { - /* Time stamp file too old, remove it. */ - sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, - "removing time stamp file that predates boot time"); - close(fd); - unlinkat(dfd, user, 0); - continue; - } - } - } - } - break; - } - - /* Allocate and fill in cookie to store state. */ - cookie = malloc(sizeof(*cookie)); - if (cookie == NULL) { - sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - goto bad; - } - cookie->fd = fd; - cookie->fname = fname; - cookie->sid = sid; - cookie->pos = -1; - - close(dfd); - debug_return_ptr(cookie); -bad: - if (dfd != -1) - close(dfd); - if (fd >= 0) - close(fd); - free(fname); - debug_return_ptr(NULL); -} - -static volatile sig_atomic_t got_signal; - -static void -timestamp_handler(int s) -{ - got_signal = s; -} - -/* - * Wrapper for sudo_lock_region() that is interruptible. - */ -static bool -timestamp_lock_record(int fd, off_t pos, off_t len) -{ - struct sigaction sa, saveint, savequit; - sigset_t mask, omask; - bool ret; - - if (pos >= 0 && lseek(fd, pos, SEEK_SET) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "unable to seek to %lld", (long long)pos); - debug_return_bool(false); - } - - /* Allow SIGINT and SIGQUIT to interrupt a lock. */ - got_signal = 0; - memset(&sa, 0, sizeof(sa)); - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; /* don't restart system calls */ - sa.sa_handler = timestamp_handler; - (void) sigaction(SIGINT, &sa, &saveint); - (void) sigaction(SIGQUIT, &sa, &savequit); - sigemptyset(&mask); - sigaddset(&mask, SIGINT); - sigaddset(&mask, SIGQUIT); - (void) sigprocmask(SIG_UNBLOCK, &mask, &omask); - - ret = sudo_lock_region(fd, SUDO_LOCK, len); - if (!ret) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "failed to lock fd %d [%lld, %lld]", fd, - (long long)pos, (long long)len); - } - - /* Restore the old mask (SIGINT and SIGQUIT blocked) and handlers. */ - (void) sigprocmask(SIG_SETMASK, &omask, NULL); - (void) sigaction(SIGINT, &saveint, NULL); - (void) sigaction(SIGQUIT, &savequit, NULL); - - /* Re-deliver the signal that interrupted the lock, if any. */ - if (!ret && got_signal) - kill(getpid(), got_signal); - - debug_return_bool(ret); -} - -static bool -timestamp_unlock_record(int fd, off_t pos, off_t len) -{ - - if (pos >= 0 && lseek(fd, pos, SEEK_SET) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "unable to seek to %lld", (long long)pos); - debug_return_bool(false); - } - debug_return_bool(sudo_lock_region(fd, SUDO_UNLOCK, len)); -} - -/* - * Seek to the record's position and read it, locking as needed. - */ -static ssize_t -ts_read(struct ts_cookie *cookie, struct timestamp_entry *entry) -{ - ssize_t nread = -1; - bool should_unlock = false; - - /* If the record is not already locked, lock it now. */ - if (!cookie->locked) { - if (!timestamp_lock_record(cookie->fd, cookie->pos, sizeof(*entry))) - goto done; - should_unlock = true; - } - - /* Seek to the record position and read it. */ - nread = pread(cookie->fd, entry, sizeof(*entry), cookie->pos); - if (nread != sizeof(*entry)) { - /* short read, should not happen */ - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, - "short read (%zd vs %zu), truncated time stamp file?", - nread, sizeof(*entry)); - goto done; - } - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "read %zd byte record at %lld", nread, (long long)cookie->pos); - -done: - /* If the record was not locked initially, unlock it. */ - if (should_unlock) - timestamp_unlock_record(cookie->fd, cookie->pos, sizeof(*entry)); - - debug_return_ssize_t(nread); -} - -/* - * Write a TS_LOCKEXCL record at the beginning of the time stamp file. - */ -static bool -timestamp_lock_write(struct ts_cookie *cookie) -{ - struct timestamp_entry entry; - bool ret = true; - - memset(&entry, 0, sizeof(entry)); - entry.version = TS_VERSION; - entry.size = sizeof(entry); - entry.type = TS_LOCKEXCL; - if (ts_write(cookie->fd, cookie->fname, &entry, -1) == -1) - ret = false; - debug_return_bool(ret); -} - -/* - * Lock a record in the time stamp file for exclusive access. - * If the record does not exist, it is created (as disabled). - */ -bool -timestamp_lock(void *vcookie, struct passwd *pw) -{ - struct ts_cookie *cookie = vcookie; - struct timestamp_entry entry; - bool overwrite = false; - off_t lock_pos; - ssize_t nread; - - if (cookie == NULL) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "called with a NULL cookie!"); - debug_return_bool(false); - } - - /* - * Take a lock on the "write" record (the first record in the file). - * This will let us seek for the record or extend as needed - * without colliding with anyone else. - */ - if (!timestamp_lock_record(cookie->fd, 0, sizeof(struct timestamp_entry))) - debug_return_bool(false); - - /* Make sure the first record is of type TS_LOCKEXCL. */ - memset(&entry, 0, sizeof(entry)); - nread = read(cookie->fd, &entry, sizeof(entry)); - if (nread < ssizeof(struct timestamp_entry_v1)) { - /* New or invalid time stamp file. */ - overwrite = true; - } else if (entry.type != TS_LOCKEXCL) { - if (entry.size == sizeof(struct timestamp_entry_v1)) { - /* Old sudo record, convert it to TS_LOCKEXCL. */ - entry.type = TS_LOCKEXCL; - memset((char *)&entry + offsetof(struct timestamp_entry, flags), 0, - nread - offsetof(struct timestamp_entry, flags)); - if (ts_write(cookie->fd, cookie->fname, &entry, 0) == -1) - debug_return_bool(false); - } else { - /* Corrupted time stamp file? Just overwrite it. */ - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "corrupt initial record, type: %hu, size: %hu (expected %zu)", - entry.type, entry.size, sizeof(struct timestamp_entry_v1)); - overwrite = true; - } - } - if (overwrite) { - /* Rewrite existing time stamp file or create new one. */ - if (ftruncate(cookie->fd, 0) != 0) { - sudo_warn(U_("unable to truncate time stamp file to %lld bytes"), - 0LL); - debug_return_bool(false); - } - if (!timestamp_lock_write(cookie)) - debug_return_bool(false); - } else if (entry.size != sizeof(entry)) { - /* Reset position if the lock record has an unexpected size. */ - if (lseek(cookie->fd, entry.size, SEEK_SET) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "unable to seek to %hu", entry.size); - debug_return_bool(false); - } - } - - /* Search for a tty/ppid-based record or append a new one. */ - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "searching for %s time stamp record", - def_timestamp_type == ppid ? "ppid" : "tty"); - ts_init_key_nonglobal(&cookie->key, pw, TS_DISABLED); - if (ts_find_record(cookie->fd, &cookie->key, &entry)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "found existing %s time stamp record", - def_timestamp_type == ppid ? "ppid" : "tty"); - lock_pos = lseek(cookie->fd, 0, SEEK_CUR) - (off_t)entry.size; - } else { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "appending new %s time stamp record", - def_timestamp_type == ppid ? "ppid" : "tty"); - lock_pos = lseek(cookie->fd, 0, SEEK_CUR); - if (ts_write(cookie->fd, cookie->fname, &cookie->key, -1) == -1) - debug_return_bool(false); - } - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "%s time stamp position is %lld", - def_timestamp_type == ppid ? "ppid" : "tty", (long long)lock_pos); - - if (def_timestamp_type == global) { - /* - * For global tickets we use a separate record lock that we - * cannot hold long-term since it is shared between all ttys. - */ - cookie->locked = false; - cookie->key.type = TS_GLOBAL; /* find a global record */ - - if (lseek(cookie->fd, 0, SEEK_SET) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, - "unable to rewind fd"); - debug_return_bool(false); - } - if (ts_find_record(cookie->fd, &cookie->key, &entry)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "found existing global record"); - cookie->pos = lseek(cookie->fd, 0, SEEK_CUR) - (off_t)entry.size; - } else { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "appending new global record"); - cookie->pos = lseek(cookie->fd, 0, SEEK_CUR); - if (ts_write(cookie->fd, cookie->fname, &cookie->key, -1) == -1) - debug_return_bool(false); - } - } else { - /* For tty/ppid tickets the tty lock is the same as the record lock. */ - cookie->pos = lock_pos; - cookie->locked = true; - } - - /* Unlock the TS_LOCKEXCL record. */ - timestamp_unlock_record(cookie->fd, 0, sizeof(struct timestamp_entry)); - - /* Lock the per-tty record (may sleep). */ - if (!timestamp_lock_record(cookie->fd, lock_pos, sizeof(struct timestamp_entry))) - debug_return_bool(false); - - debug_return_bool(true); -} - -void -timestamp_close(void *vcookie) -{ - struct ts_cookie *cookie = vcookie; - - if (cookie != NULL) { - close(cookie->fd); - free(cookie->fname); - free(cookie); - } - - debug_return; -} - -#define TIMESPEC_VALID(ts) \ - ((ts)->tv_sec >= 0 && (ts)->tv_nsec >= 0 && (ts)->tv_nsec < 1000000000L) - -/* - * Check the time stamp file and directory and return their status. - * Called with the file position before the locked record to read. - * Returns one of TS_CURRENT, TS_OLD, TS_MISSING, TS_ERROR, TS_FATAL. - * Fills in fdp with an open file descriptor positioned at the - * appropriate (and locked) record. - */ -int -timestamp_status(void *vcookie, struct passwd *pw) -{ - struct ts_cookie *cookie = vcookie; - struct timestamp_entry entry; - struct timespec diff, now; - int status = TS_ERROR; /* assume the worst */ - ssize_t nread; - - /* Zero timeout means don't use time stamp files. */ - if (!sudo_timespecisset(&def_timestamp_timeout)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "timestamps disabled"); - status = TS_OLD; - goto done; - } - if (cookie == NULL || cookie->pos < 0) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "NULL cookie or invalid position"); - status = TS_OLD; - goto done; - } - -#ifdef TIOCCHKVERAUTH - if (def_timestamp_type == kernel) { - int fd = open(_PATH_TTY, O_RDWR); - if (fd != -1) { - if (ioctl(fd, TIOCCHKVERAUTH) == 0) - status = TS_CURRENT; - else - status = TS_OLD; - close(fd); - goto done; - } - } -#endif - - /* Read the record at the correct position. */ - if ((nread = ts_read(cookie, &entry)) != sizeof(entry)) - goto done; - - /* Make sure what we read matched the expected record. */ - if (entry.version != TS_VERSION || entry.size != nread) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, - "invalid time stamp file @ %lld", (long long)cookie->pos); - status = TS_OLD; - goto done; - } - - /* Sanity check time stamps. */ - if (!TIMESPEC_VALID(&entry.start_time) || !TIMESPEC_VALID(&entry.ts)) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, - "invalid timespec in time stamp file @ %lld", - (long long)cookie->pos); - status = TS_OLD; - goto done; - } - - if (ISSET(entry.flags, TS_DISABLED)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "time stamp record disabled"); - status = TS_OLD; /* disabled via sudo -k */ - goto done; - } - - if (entry.type != TS_GLOBAL && entry.sid != cookie->sid) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "time stamp record sid mismatch"); - status = TS_OLD; /* belongs to different session */ - goto done; - } - - /* Negative timeouts only expire manually (sudo -k). */ - sudo_timespecclear(&diff); - if (sudo_timespeccmp(&def_timestamp_timeout, &diff, <)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "time stamp record does not expire"); - status = TS_CURRENT; - goto done; - } - - /* Compare stored time stamp with current time. */ - if (sudo_gettime_mono(&now) == -1) { - log_warning(0, N_("unable to read the clock")); - status = TS_ERROR; - goto done; - } - sudo_timespecsub(&now, &entry.ts, &diff); - if (sudo_timespeccmp(&diff, &def_timestamp_timeout, <)) { - status = TS_CURRENT; -#if defined(CLOCK_MONOTONIC) || defined(__MACH__) - /* A monotonic clock should never run backwards. */ - if (diff.tv_sec < 0) { - log_warningx(SLOG_SEND_MAIL, - N_("ignoring time stamp from the future")); - status = TS_OLD; - SET(entry.flags, TS_DISABLED); - (void)ts_write(cookie->fd, cookie->fname, &entry, cookie->pos); - } -#else - /* - * Check for bogus (future) time in the stampfile. - * If diff / 2 > timeout, someone has been fooling with the clock. - */ - sudo_timespecsub(&entry.ts, &now, &diff); - diff.tv_nsec /= 2; - if (diff.tv_sec & 1) - diff.tv_nsec += 500000000; - diff.tv_sec /= 2; - while (diff.tv_nsec >= 1000000000) { - diff.tv_sec++; - diff.tv_nsec -= 1000000000; - } - - if (sudo_timespeccmp(&diff, &def_timestamp_timeout, >)) { - time_t tv_sec = (time_t)entry.ts.tv_sec; - log_warningx(SLOG_SEND_MAIL, - N_("time stamp too far in the future: %20.20s"), - 4 + ctime(&tv_sec)); - status = TS_OLD; - SET(entry.flags, TS_DISABLED); - (void)ts_write(cookie->fd, cookie->fname, &entry, cookie->pos); - } -#endif /* CLOCK_MONOTONIC */ - } else { - status = TS_OLD; - } - -done: - debug_return_int(status); -} - -/* - * Update the time on the time stamp file/dir or create it if necessary. - * Returns true on success, false on failure or -1 on setuid failure. - */ -bool -timestamp_update(void *vcookie, struct passwd *pw) -{ - struct ts_cookie *cookie = vcookie; - int ret = false; - - /* Zero timeout means don't use time stamp files. */ - if (!sudo_timespecisset(&def_timestamp_timeout)) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "timestamps disabled"); - goto done; - } - if (cookie == NULL || cookie->pos < 0) { - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "NULL cookie or invalid position"); - goto done; - } - -#ifdef TIOCSETVERAUTH - if (def_timestamp_type == kernel) { - int fd = open(_PATH_TTY, O_RDWR); - if (fd != -1) { - int secs = def_timestamp_timeout.tv_sec; - if (secs > 0) { - if (secs > 3600) - secs = 3600; /* OpenBSD limitation */ - if (ioctl(fd, TIOCSETVERAUTH, &secs) != 0) - sudo_warn("TIOCSETVERAUTH"); - } - close(fd); - goto done; - } - } -#endif - - /* Update timestamp in key and enable it. */ - CLR(cookie->key.flags, TS_DISABLED); - if (sudo_gettime_mono(&cookie->key.ts) == -1) { - log_warning(0, N_("unable to read the clock")); - goto done; - } - - /* Write out the locked record. */ - sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, - "writing %zu byte record at %lld", sizeof(cookie->key), - (long long)cookie->pos); - if (ts_write(cookie->fd, cookie->fname, &cookie->key, cookie->pos) != -1) - ret = true; - -done: - debug_return_int(ret); -} - -/* - * Remove the timestamp entry or file if unlink_it is set. - * Returns true on success, false on failure or -1 on setuid failure. - * A missing timestamp entry is not considered an error. - */ -int -timestamp_remove(bool unlink_it) -{ - struct timestamp_entry key, entry; - int dfd = -1, fd = -1, ret = true; - char *fname = NULL; - -#ifdef TIOCCLRVERAUTH - if (def_timestamp_type == kernel) { - fd = open(_PATH_TTY, O_RDWR); - if (fd != -1) { - ioctl(fd, TIOCCLRVERAUTH); - goto done; - } - } -#endif - - dfd = open(def_timestampdir, O_RDONLY|O_NONBLOCK); - if (dfd == -1) { - if (errno != ENOENT) - ret = -1; - goto done; - } - - if (asprintf(&fname, "%s/%s", def_timestampdir, user_name) == -1) { - sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - ret = -1; - goto done; - } - - /* For "sudo -K" simply unlink the time stamp file. */ - if (unlink_it) { - ret = unlinkat(dfd, user_name, 0) ? -1 : true; - goto done; - } - - /* Open time stamp file and lock it for exclusive access. */ - fd = ts_openat(dfd, user_name, O_RDWR); - switch (fd) { - case TIMESTAMP_OPEN_ERROR: - if (errno != ENOENT) - ret = false; - goto done; - case TIMESTAMP_PERM_ERROR: - /* Already logged set_perms/restore_perms error. */ - ret = -1; - goto done; - } - /* Lock first record to gain exclusive access. */ - if (!timestamp_lock_record(fd, -1, sizeof(struct timestamp_entry))) { - sudo_warn(U_("unable to lock time stamp file %s"), fname); - ret = -1; - goto done; - } - - /* - * Find matching entries and invalidate them. - */ - ts_init_key(&key, NULL, 0, def_timestamp_type); - while (ts_find_record(fd, &key, &entry)) { - /* Back up and disable the entry. */ - if (!ISSET(entry.flags, TS_DISABLED)) { - SET(entry.flags, TS_DISABLED); - if (lseek(fd, 0 - (off_t)sizeof(entry), SEEK_CUR) != -1) { - if (ts_write(fd, fname, &entry, -1) == -1) - ret = false; - } - } - } - -done: - if (dfd != -1) - close(dfd); - if (fd >= 0) - close(fd); - free(fname); - debug_return_int(ret); -} - -/* - * Returns true if the user has already been lectured. - */ -bool -already_lectured(void) -{ - bool ret = false; - struct stat sb; - int dfd; - - dfd = ts_secure_opendir(def_lecture_status_dir, false, true); - if (dfd != -1) { - ret = fstatat(dfd, user_name, &sb, AT_SYMLINK_NOFOLLOW) == 0; - close(dfd); - } - debug_return_bool(ret); -} - -/* - * Create the lecture status file. - * Returns true on success, false on failure or -1 on setuid failure. - */ -int -set_lectured(void) -{ - int dfd, fd, ret = false; - - /* Check the validity of timestamp dir and create if missing. */ - dfd = ts_secure_opendir(def_lecture_status_dir, true, false); - if (dfd == -1) - goto done; - - /* Create lecture file. */ - fd = ts_openat(dfd, user_name, O_WRONLY|O_CREAT|O_EXCL); - switch (fd) { - case TIMESTAMP_OPEN_ERROR: - /* Failed to open, not a fatal error. */ - break; - case TIMESTAMP_PERM_ERROR: - /* Already logged set_perms/restore_perms error. */ - ret = -1; - break; - default: - /* Success. */ - close(fd); - ret = true; - break; - } - close(dfd); - -done: - debug_return_int(ret); -} - -#ifdef _PATH_SUDO_ADMIN_FLAG -int -create_admin_success_flag(void) -{ - char *flagfile; - int ret = -1; - - /* Is the admin flag file even enabled? */ - if (!def_admin_flag) - debug_return_int(true); - - /* Check whether the user is in the sudo or admin group. */ - if (!user_in_group(sudo_user.pw, "sudo") && - !user_in_group(sudo_user.pw, "admin")) - debug_return_int(true); - - /* Build path to flag file. */ - if ((flagfile = strdup(def_admin_flag)) == NULL) { - sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - debug_return_int(-1); - } - if (!expand_tilde(&flagfile, user_name)) { - free(flagfile); - debug_return_int(false); - } - - /* Create admin flag file if it doesn't already exist. */ - if (set_perms(PERM_USER)) { - int fd = open(flagfile, O_CREAT|O_WRONLY|O_NONBLOCK|O_EXCL, 0644); - ret = fd != -1 || errno == EEXIST; - if (fd != -1) - close(fd); - if (!restore_perms()) - ret = -1; - } - free(flagfile); - debug_return_int(ret); -} -#else /* !_PATH_SUDO_ADMIN_FLAG */ -int -create_admin_success_flag(void) -{ - /* STUB */ - return true; -} -#endif /* _PATH_SUDO_ADMIN_FLAG */ diff --git a/legacy/src/timestamp.h b/legacy/src/timestamp.h deleted file mode 100644 index 9c6f2077..00000000 --- a/legacy/src/timestamp.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef TIMESTAMP_H_ -#define TIMESTAMP_H_ - -#include -#include -#include -#include - -/* Status codes for timestamp_status() */ -#define TS_CURRENT 0 -#define TS_OLD 1 -#define TS_MISSING 2 -#define TS_ERROR 3 -#define TS_FATAL 4 - -/* - * Time stamps are now stored in a single file which contains multiple - * records. Each record starts with a 16-bit version number and a 16-bit - * record size. Multiple record types can coexist in the same file. - */ -#define TS_VERSION 2 - -/* Time stamp entry types */ -#define TS_GLOBAL 0x01 /* not restricted by tty or ppid */ -#define TS_TTY 0x02 /* restricted by tty */ -#define TS_PPID 0x03 /* restricted by ppid */ -#define TS_LOCKEXCL 0x04 /* special lock record */ - -/* Time stamp flags */ -#define TS_DISABLED 0x01 /* entry disabled */ -#define TS_ANYUID 0x02 /* ignore uid, only valid in the key */ - -struct timestamp_entry_v1 { - unsigned short version; /* version number */ - unsigned short size; /* entry size */ - unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ - unsigned short flags; /* TS_DISABLED, TS_ANYUID */ - uid_t auth_uid; /* uid to authenticate as */ - pid_t sid; /* session ID associated with tty/ppid */ - struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */ - union { - dev_t ttydev; /* tty device number */ - pid_t ppid; /* parent pid */ - } u; -}; - -struct timestamp_entry { - unsigned short version; /* version number */ - unsigned short size; /* entry size */ - unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ - unsigned short flags; /* TS_DISABLED, TS_ANYUID */ - uid_t auth_uid; /* uid to authenticate as */ - pid_t sid; /* session ID associated with tty/ppid */ - struct timespec start_time; /* session/ppid start time */ - struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */ - union { - dev_t ttydev; /* tty device number */ - pid_t ppid; /* parent pid */ - } u; -}; - -void *timestamp_open(const char *user, pid_t sid); -void timestamp_close(void *vcookie); -bool timestamp_lock(void *vcookie, struct passwd *pw); -bool timestamp_update(void *vcookie, struct passwd *pw); -int timestamp_status(void *vcookie, struct passwd *pw); -#endif /* TIMESTAMP_H_ */ \ No newline at end of file diff --git a/legacy/src/user.c b/legacy/src/user.c deleted file mode 100644 index b70c978f..00000000 --- a/legacy/src/user.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - * - * - * This file contains the definitions of user management functions. - * - * Note, the copyright+license information is at end of file. - */ -#define _DEFAULT_SOURCE -#include "user.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#ifndef MAX -# define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -/****************************************************************************** - * PUBLIC FUNCTIONS DEFINITION * - ******************************************************************************/ - -/** - * @brief Get user_t object from POSIX system context -*/ -user_t *user_posix_get(){ - uid_t euid = geteuid(); - char *user = get_username(euid); - if (user == NULL) { - error(0, 0, "Unable to retrieve the username of the executor"); - goto free_error; - } - gid_t egid = get_group_id(euid); - char **groups = NULL; - int nb_groups = 0; - if (get_group_names(user, egid, &nb_groups, &groups)) { - error(0, 0, "Unable to retrieve the groups of the executor"); - goto free_error; - } - return params_user_posix_set(user, nb_groups, groups); - free_error: - return NULL; -} - -/** - * @brief Free the memory of a user_t object -*/ -void user_posix_free(user_t *user){ - if(user == NULL){ - return; - } - if(user->name != NULL) - free(user->name); - if(user->groups != NULL) - free_group_names(user->nb_groups, user->groups); -} - -char *get_current_username(){ - uid_t euid = geteuid(); - return get_username(euid); -} - -/* -Retrieve the name of a user id. -Return the username or NULL if an error has occured. -The username should be deallocated with free afterwards. -*/ -char *get_username(uid_t uid) -{ - - struct passwd *info_user; - - if ((info_user = getpwuid(uid)) == NULL || info_user->pw_name == NULL) { - return NULL; - } else { - char *username; - //We do not have to deallocate info_user, as it points to a static - //memory adress8 - - if ((username = malloc(LOGIN_NAME_MAX * sizeof(char))) == NULL) { - return NULL; - } - snprintf(username,LOGIN_NAME_MAX * sizeof(char), "%s", info_user->pw_name); - - return username; - } -} - -/* -Retrieve the user id of a given username or from integer. -*/ -uid_t get_user_id(const char *username){ - struct passwd *info_user; - - if ((info_user = getpwnam(username)) == NULL) { - //check username as integer - char *endptr = NULL; - long int iuid = strtol(username, &endptr, 10); - if (endptr == username || *endptr != '\0' || iuid < 0 || iuid > (uid_t)-1) { - return -1; - }else { - return (uid_t)iuid; - } - } else { - //We do not have to deallocate info_user, as it points to a static - //memory adress - return info_user->pw_uid; - } - -} - -/* -Retrieve the user group id of the user_id uid. -Return the user group id, or -1 on failure. -*/ -gid_t get_group_id_from_name(const char *group) -{ - struct group *info_group; - - if ((info_group = getgrnam(group)) == NULL) { - //check group as integer - char *endptr = NULL; - long int igid = strtol(group, &endptr, 10); - if (endptr == group || *endptr != '\0' || igid < 0 || igid > (uid_t)-1) { - return -1; - }else { - return (gid_t)igid; - } - } else { - //We do not have to deallocate info_user, as it points to a static - //memory adress - return info_group->gr_gid; - } -} - -/** - * @brief retrieve multiple gid from comma separated string - * @param groups_str comma separated string of group names - * @param nb_groups number of groups - * @param groups array of group - * @return 0 on success, -1 on failure -*/ -int get_group_ids_from_names(char *groups_str, int *nb_groups, gid_t **groups){ - char *groups_str_copy = strdup(groups_str); - *nb_groups = 1; - for (int i=0; groups_str_copy[i] != '\0'; i++) { - if (groups_str_copy[i] == ',') { - (*nb_groups)++; - } - } - *groups = malloc(*nb_groups * sizeof(gid_t)); - if (*groups == NULL) { - syslog(LOG_ERR, "Unable to allocate memory for groups"); - return -1; - } - char *saveptr = NULL; - char *group = strtok_r(groups_str_copy, ",", &saveptr); - for (int i=0; i<*nb_groups; i++){ - *groups[i] = get_group_id_from_name(group); - if(*groups[i] == (gid_t)-1){ - syslog(LOG_ERR, "Unable to retrieve group id of group %s", group); - return -1; - } - group = strtok_r(NULL, ",",&saveptr); - } - return 0; -} - -/* -Retrieve the user group id of the user_id uid. -Return the user group id, or -1 on failure. -*/ -gid_t get_group_id(uid_t uid) -{ - struct passwd *info_user; - - if ((info_user = getpwuid(uid)) == NULL) { - return -1; - } else { - //We do not have to deallocate info_user, as it points to a static - //memory adress - return info_user->pw_gid; - } -} - -/* -Init and close a pam session to authenticate a given user. -Return 1 if the authentication succeeded, 0 otherwise. Return -1 if an error -occured. -*/ -int pam_authenticate_user(const char *user) -{ - pam_handle_t *pamh = NULL; - const struct pam_conv conv = { misc_conv, NULL }; - int pamret; - int return_code = 0; - openlog("sr", LOG_PID, LOG_AUTH); - - //Initiate the pam transaction to check the user - if ((pamret = pam_start("sr", user, &conv, &pamh)) != - PAM_SUCCESS) { - return_code = -1; //An error occured - syslog(LOG_ERR, "failed to start pam transaction: %s", - pam_strerror(pamh, pamret)); - goto close_pam; - } - - //Establish the credential, then - if ((pamret = pam_setcred(pamh, 0)) != PAM_SUCCESS){ - syslog(LOG_ERR, "failed to set credentials: %s", - pam_strerror(pamh, pamret)); - goto close_pam; - } - //Authenticate the user with password, - if ((pamret = pam_authenticate(pamh, 0)) != PAM_SUCCESS){ - syslog(LOG_ERR, "failed to authenticate: %s", - pam_strerror(pamh, pamret)); - goto close_pam; - } - //Then check if the user if valid - if ((pamret = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS) { - syslog(LOG_ERR, "failed to check account: %s", - pam_strerror(pamh, pamret)); - goto close_pam; - } - - //Authentication succeeded - return_code = 1; - -close_pam: - // close PAM (end session) - if (pam_end(pamh, pamret) != PAM_SUCCESS) { //An Error occured - syslog(LOG_ERR, "failed to release pam transaction"); - pamh = NULL; - return_code = -1; - } - return return_code; -} - -/* -Retrieve the list of names of group for a given user. -The main group id of the user must be known -Allocate an array of array of char that must be deallocate afterwards. -Return 0 on success and -1 on failure. -*/ -int get_group_names(const char *user, gid_t group, int *nb_groups, - char ***groups) -{ - int return_code = -1; - int ng = 1; - gid_t *gps = NULL; - int ret_ggl; - int i; - - *nb_groups = 0; - *groups = NULL; - - //Retrieve group_ids - if ((gps = malloc(ng * sizeof(gid_t))) == NULL) - return -1; - if ((ret_ggl = getgrouplist(user, group, gps, &ng)) == -1) { - gid_t *tmp; - if ((tmp = realloc(gps, ng * sizeof(gid_t))) == NULL){ - goto on_error; - } - gps = tmp; - - if ((ret_ggl = getgrouplist(user, group, gps, &ng)) == -1) { - goto on_error; - } - } - //Enforce consistency in results - if (ret_ggl != ng) - goto on_error; - *nb_groups = ng; - - //Retrieve group name for all group ids - if ((*groups = (char **)malloc((ng+1) * sizeof(char *))) == NULL) - return -1; - for (i = 0; i < ng; i++) { - char *gpname; - struct group *rec = getgrgid(gps[i]); //Retrieve group info - if (rec == NULL || rec->gr_name == NULL) { - perror("Cannot retrieve group info or group name"); - goto on_error; - } - if ((gpname = malloc(LOGIN_NAME_MAX * sizeof(char))) == NULL) - goto on_error; - snprintf(gpname, LOGIN_NAME_MAX * sizeof(char), "%s", rec->gr_name); - (*groups)[i] = gpname; - } - - return_code = 0; - goto free_rsc; - -on_error: - if (*groups != NULL) { - free(*groups); - *groups = NULL; - } - *nb_groups = 0; -free_rsc: - if (gps != NULL) - free(gps); - return return_code; -} - -void free_group_names(int nb_groups, char **groups){ - int i; - for (i = 0; i < nb_groups; i++) { - free(groups[i]); - } - free(groups); -} - -/** - * @brief Check if the user should enter his password again within the timeout - * @param user The user name - * @param timeout The timeout in seconds - * @return 1 if the user should enter his password again, 0 otherwise -*/ -int check_timestamp_timeout(const char *user, const unsigned long timeout){ - - char *path = "/var/run/rar/ts/%s"; - char fullpath[PATH_MAX]; - snprintf(fullpath, PATH_MAX, path, user); - - - if (access(fullpath, F_OK) == 0) { - FILE *timestamp_file = fopen(fullpath, "rb"); - if (timestamp_file == NULL) { - perror("Cannot open timestamp file"); - return 1; - } - unsigned long timestamp = 0; - if (fread(×tamp, sizeof(unsigned long), 1, timestamp_file) != 1) { - perror("Cannot read timestamp file"); - fclose(timestamp_file); - return 1; - } - unsigned long current_time = difftime(time(NULL),0); - fclose(timestamp_file); - if (timestamp > current_time - timeout) { - return 0; - } - } - return 1; -} - -/** - * @brief Set the timestamp for the user - * @param user The user name - * @return 1 if the timestamp was set, 0 otherwise -*/ -int set_timestamp_user(const char *user){ - char *path = "/var/run/rar/ts/%s"; - char fullpath[PATH_MAX]; - snprintf(fullpath, PATH_MAX, path, user); - - struct stat sb; - - //if fullpath exists, check timestamp - if (stat("/var/run/rar",&sb) != 0 || !S_ISDIR(sb.st_mode)) { - mkdir("/var/run/rar", 0700); - } - if (stat("/var/run/rar/ts",&sb) != 0 || !S_ISDIR(sb.st_mode)){ - mkdir("/var/run/rar/ts", 0700); - } - - FILE *timestamp_file = fopen(fullpath, "wb"); - if (timestamp_file == NULL) { - perror("Cannot open timestamp file"); - return 0; - } - time_t timestamp = time(NULL); - if (fwrite(×tamp, sizeof(time_t), 1, timestamp_file) != 1) { - perror("Cannot write timestamp file"); - fclose(timestamp_file); - return 0; - } - fclose(timestamp_file); - return 1; -} - -/* - * - * Copyright Guillaume Daumas , 2018 - * Copyright Ahmad Samer Wazan , 2018 - * Copyright Rémi Venant , 2018 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/legacy/src/user.h b/legacy/src/user.h deleted file mode 100644 index 5ae3dbee..00000000 --- a/legacy/src/user.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * - * This file contains the signatures of user management functions. - * - * Note, the copyright+license information is at end of file. - */ -#ifndef USER_H_INCLUDED -#define USER_H_INCLUDED -#ifndef LOGIN_NAME_MAX -# ifdef _POSIX_LOGIN_NAME_MAX -# define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX -# else -# define LOGIN_NAME_MAX 256 -# endif -#endif - -#include -#include "params.h" - -/** - * @brief Get user_t object from POSIX system context - * @return user_t object -*/ -user_t *user_posix_get(); - -/** - * @brief Free the memory of a POSIX user_t object -*/ -void user_posix_free(user_t *user); - -/** - * @brief Get the current username - * @return The current username, to be freed with free() -*/ -char *get_current_username(); - -/* -Retrieve the name of a user id. -Return the username or NULL if an error has occured. -The username should be deallocated with free afterwards. -*/ -char *get_username(uid_t uid); - -/* -Retrieve the user id of a given username or from integer. -*/ -uid_t get_user_id(const char *username); - -/* -Retrieve the user group id of the user_id uid. -Return the user group id, or -1 on failure. -*/ -gid_t get_group_id(uid_t uid); - -gid_t get_group_id_from_name(const char *group); - -int get_group_ids_from_names(char *groups_str, int *nb_groups, gid_t **groups); - -/* -Init and close a pam session to authenticate a given user. -Return 1 if the authentication succeeded, 0 otherwise. Return -1 if an error -occured. -*/ -int pam_authenticate_user(const char *user); - -/* -Retrieve the list of names of group for a given user. -The main group id of the user must be known -Allocate an array of array of char that must be deallocate afterwards. -Return 0 on success and -1 on failure. -*/ -int get_group_names(const char *user, gid_t group, int *nb_groups, - char ***groups); - -/** - * Free the memory of groups allocated by get_group_names -*/ -void free_group_names(int nb_groups, char **groups); - -/** - * @brief Check if the user should enter his password again within the timeout - * @param user The user name - * @param timeout The timeout in seconds - * @return 1 if the user should enter his password again, 0 otherwise -*/ -int check_timestamp_timeout(const char *user, const unsigned long timeout); - -/** - * @brief Set the timestamp for the user - * @param user The user name - * @return 1 if the timestamp was set, 0 otherwise -*/ -int set_timestamp_user(const char *user); - -#endif // USER_H_INCLUDED - -/* - * - * Copyright Guillaume Daumas , 2018 - * Copyright Ahmad Samer Wazan , 2018 - * Copyright Rémi Venant , 2018 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/legacy/src/xml_manager.c b/legacy/src/xml_manager.c deleted file mode 100644 index 832d53c6..00000000 --- a/legacy/src/xml_manager.c +++ /dev/null @@ -1,1880 +0,0 @@ -/* - * - * - * This file contains the definitions of xml management functions. - * - * Note, the copyright+license information is at end of file. - */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#ifndef __STDC_LIB_EXT1__ -#define __STDC_LIB_EXT1__ -#endif -#ifndef __STDC_WANT_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 -#endif -#include "xml_manager.h" -#include "command.h" -#include "capabilities.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef ARG_MAX -#define ARG_MAX 131072 -#endif - -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif - -#ifndef REGERROR_BUF_SIZE -#define REGERROR_BUF_SIZE 1024 -#endif - -#ifndef USER_MAX -#define USER_MAX 1024 -#endif - -#ifndef GROUP_SEPARATOR -#define GROUP_SEPARATOR "," -#endif - -xmlXPathObjectPtr result = NULL; - -/************************************** - * PARTIAL ORDER COMPARISON FUNCTIONS * - **************************************/ - -typedef u_int32_t score_t; - -/** - * @brief find element by name -*/ -xmlNodePtr find_first_element_by_name(xmlNodePtr role, xmlChar *name) -{ - xmlNodePtr actors = role->children; - while (actors != NULL) { - if (xmlStrcmp(actors->name, name) == 0) { - return actors; - } - actors = xmlNextElementSibling(actors); - } - return NULL; -} - -/** - * @brief actor is matching the user criteria -*/ -int actor_match_user(xmlNodePtr actor, char *user) -{ - if (!xmlStrcmp(actor->name, (const xmlChar *)"user") && - xmlHasProp(actor, (const xmlChar *)"name")) { - xmlChar *name = xmlGetProp(actor, (const xmlChar *)"name"); - if (name != NULL) { - if (!strcmp((char *)name, user)) { - return 1; - } - } - } - return 0; -} - -int actors_match_user(xmlNodePtr actors, char *user) -{ - xmlNodePtr actor = actors->children; - while (actor != NULL) { - if (actor_match_user(actor, user)) { - return 1; - } - actor = xmlNextElementSibling(actor); - } - return 0; -} - -/** - * @brief counts the number of group names that match the given groups - * @param names the comma-separated list of group names - * @param groups the array of group names to match against - * @param nb_groups the number of group names in the groups array - * @param all the number of group names in the names string - * @return the number of group names that match, 0 if one does not match at all - */ -unsigned int count_matching_groups(char *names, char **groups, int nb_groups, - unsigned int *all, char *separator) -{ - if (names == NULL) - return 0; - char *names_str = strdup(names); - char *saveptr = NULL; - char *token = strtok_r(names_str, separator, &saveptr); - unsigned int found = 0; - unsigned int lall = 0; - while (token != NULL) { - for (int j = 0; j < nb_groups; j++) { - if (!strcmp(token, groups[j])) { - found += 1; - break; - } - } - token = strtok_r(NULL, separator, &saveptr); - lall += 1; - } - free(names_str); - if (all != NULL){ - *all = lall; - } - return found == lall ? found : 0; -} - -/** - * @brief actor is matching the group criteria - * @return n matching groups -*/ -unsigned int actor_match_group(xmlNodePtr actor, char **groups, int nb_groups) -{ - if (!xmlStrcmp(actor->name, (const xmlChar *)"group") && - xmlHasProp(actor, (const xmlChar *)"names")) { - xmlChar *names = xmlGetProp(actor, (const xmlChar *)"names"); - if (names != NULL) { - char *names_str = (char *)names; - unsigned int all = 0; - return count_matching_groups(names_str, groups, - nb_groups, &all, ","); - } - } - return 0; -} - -unsigned int actors_match_max_group(xmlNodePtr actors, char **groups, - int nb_groups) -{ - xmlNodePtr actor = actors->children; - unsigned int max = 0; - while (actor != NULL) { - unsigned int n = actor_match_group(actor, groups, nb_groups); - if (n > max) { - max = n; - } - actor = xmlNextElementSibling(actor); - } - return max; -} - -int scorecmp(score_t score_A, score_t score_B) -{ - if (score_A > score_B) - return 1; - else if (score_A < score_B) - return -1; - else - return 0; -} - -int twoscorecmp(score_t user_min_A, score_t cmd_min_A, score_t user_min_B, - score_t cmd_min_B) -{ - score_t user_min = scorecmp(user_min_A, user_min_B); - if (user_min == 0) - return scorecmp(cmd_min_A, cmd_min_B); - else - return user_min; -} - -int threescorecmp(score_t caps_min_A, score_t setuid_min_A, - score_t security_min_A, score_t caps_min_B, - score_t setuid_min_B, score_t security_min_B) -{ - score_t firstcmp = - twoscorecmp(caps_min_A, setuid_min_A, caps_min_B, setuid_min_B); - if (firstcmp == 0) - return scorecmp(security_min_A, security_min_B); - else - return firstcmp; -} - -int fourscorecmp(score_t A1, score_t A2, score_t A3, score_t A4, score_t B1, - score_t B2, score_t B3, score_t B4) -{ - score_t firstcmp = threescorecmp(A1, A2, A3, B1, B2, B3); - if (firstcmp == 0) - return scorecmp(A4, B4); - else - return firstcmp; -} - -/** - * @brief actor is matching the user criteria - * @param user the user to match - * @param actors the actors node to match against - * @return the score of the match (between 1 and MAX), 0 if no match -*/ -score_t actors_match(user_t *user, xmlNodePtr actors) -{ - score_t score = 0; - if (!xmlStrcmp(actors->name, (const xmlChar *)"actors")) { - if (actors_match_user(actors, user->name)) { - score = 1; - } else { - score_t max = 4294967294; - score_t n = max - - actors_match_max_group(actors, user->groups, - user->nb_groups); - if (n != max && n > score) { - score = n; - } - } - } - return score; -} - -#define NO_MATCH 0 -#define PATH_STRICT 1 -#define PATH_ARG_STRICT 2 -#define PATH_STRICT_ARG_WILDCARD 3 -#define PATH_WILDCARD 4 -#define PATH_WILDCARD_ARG_STRICT 5 -#define PATH_ARG_WILDCARD 6 -#define PATH_FULL_WILDCARD 7 -#define PATH_FULL_WILDCARD_ARG_STRICT 8 -#define PATH_FULL_WILDCARD_ARG_WILDCARD 9 -#define PATH_ARG_FULL_WILDCARD 10 - -int path_matches(char *full_path, cmd_t *command) -{ - int path_matches = NO_MATCH; - if (!strncmp(command->command, full_path, PATH_MAX)) { - path_matches = PATH_STRICT; - } else if (!strcmp(full_path, "*")) { - path_matches = PATH_FULL_WILDCARD; - } else { - //check wildcard on path - if (!fnmatch(full_path, command->command, - FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD)) { - path_matches = PATH_WILDCARD; - } - } - return path_matches; -} - -int regex_matches(char *args, cmd_t *command, xmlNodePtr command_element, - score_t *retval) -{ - args[0] = '^'; - int args_len = strnlen(args, ARG_MAX); - if (args_len + 1 > ARG_MAX) { - error(0, 0, - "Configuration file malformed, contact administrator or see the logs\n"); - syslog(LOG_ERR, "Regex in line %d is too long\n", - command_element->line); - return 0; - } - args[args_len] = '$'; - args_len++; - args[args_len] = '\0'; - - //check regex on args - regex_t regex; - regex = (regex_t){ 0 }; - int reti = regcomp(®ex, args, REG_EXTENDED); - if (reti) { - error(0, 0, - "Configuration file malformed, contact administrator or see the logs\n"); - - char error_msg[REGERROR_BUF_SIZE]; - *error_msg = (char)'\0'; - regerror(reti, ®ex, error_msg, REGERROR_BUF_SIZE); - syslog(LOG_ERR, "Regex in line %d is malformed : %s\n", - command_element->line, error_msg); - return 0; - } - char joined[ARG_MAX]; - int joined_len = 0; - join_argv(command->argc, command->argv, joined, ARG_MAX, &joined_len); - reti = regexec(®ex, joined, 0, NULL, 0); - joined[0] = '\0'; - regfree(®ex); - if (!reti) { - switch (*retval) { - case PATH_STRICT: - *retval = may_be_regex(args + 1, args_len - 2) ? - PATH_STRICT_ARG_WILDCARD : - PATH_ARG_STRICT; - break; - case PATH_WILDCARD: - *retval = may_be_regex(args + 1, args_len - 2) ? - PATH_ARG_WILDCARD : - PATH_WILDCARD_ARG_STRICT; - break; - case PATH_FULL_WILDCARD: - *retval = may_be_regex(args + 1, args_len - 2) ? - PATH_FULL_WILDCARD_ARG_WILDCARD : - PATH_FULL_WILDCARD_ARG_STRICT; - break; - } - - return 1; - } - return 0; -} - -int check_path_matches(cmd_t *command, xmlNodePtr command_element, - char *content, score_t *retval) -{ - char full_path[PATH_MAX]; - char args[ARG_MAX]; - - if (!get_abspath_from_cmdline((char *)content, full_path, PATH_MAX, - args + 1, ARG_MAX - 2)) { - return 0; - } - if (!strcmp(content, "**")) { - *retval = PATH_ARG_FULL_WILDCARD; - return 1; - } - *retval = path_matches(full_path, command); - if (*retval && args[1] != '\0') { - //path matches and args are not empty - int ret = regex_matches(args, command, command_element, retval); - if (!ret) { - *retval = NO_MATCH; - } - } else if (args[1] == '\0' && command->argc > 1) { - *retval = NO_MATCH; - } - return *retval != NO_MATCH; -} - -/** - * @brief check if the user input command match the command xml element - * @param input_command the user input command - * @param command_element the xml element - * @return non-zero if the command match, 0 otherwise -*/ -score_t command_match(cmd_t *command, xmlNodePtr command_element) -{ - score_t retval = NO_MATCH; - if (!xmlStrcmp(command_element->name, (const xmlChar *)"command")) { - xmlChar *content = xmlNodeGetContent(command_element); - size_t content_len = xmlStrlen(content); - if (content != NULL && content_len > 0) { - if (!check_path_matches(command, command_element, - (char *)content, &retval)) { - retval = NO_MATCH; - } - } - xmlFree(content); - } - - return retval; -} - -int contains_root(xmlChar *comma_string) -{ - char *dup = strdup((char *)comma_string); - char *element = strtok((char *)dup, ","); - while (element != NULL && (strcasecmp(element, "root") != 0 && - strcmp(element, "0") != 0)) { - element = strtok(NULL, ","); - } - free(dup); - return element == NULL ? 0 : 1; -} - -#define NO_CAPS 1 -#define CAPS_NO_ADMIN 2 -#define CAPS_ADMIN 3 -#define CAPS_ALL 4 - -#define NO_SETUID_NO_SETGID 1 -#define SETGID 2 -#define SETUID 3 -#define SETUID_SETGID 4 -#define SETGID_ROOT 5 -#define SETUID_NOTROOT_SETGID_ROOT 6 -#define SETUID_ROOT 7 -#define SETUID_ROOT_SETGID 8 -#define SETUID_SETGID_ROOT 9 - -score_t get_caps_min(const xmlNodePtr task_element) -{ - score_t caps_min = NO_CAPS; - if (xmlHasProp(task_element, (const xmlChar *)"capabilities")) { - xmlChar *capabilities = xmlGetProp( - task_element, (const xmlChar *)"capabilities"); - if (capabilities != NULL && xmlStrlen(capabilities) > 0) { - if (xmlStrcasestr(capabilities, - (const xmlChar *)"ALL") != NULL) { - caps_min = CAPS_ALL; - } else if (xmlStrcasestr(capabilities, - (const xmlChar *)"ADMIN") != - NULL) { - caps_min = CAPS_ADMIN; - } else { - caps_min = CAPS_NO_ADMIN; - } - } - } - return caps_min; -} - -score_t setuser_min(const xmlNodePtr task_element, const settings_t *settings) -{ - score_t setuid_min = NO_SETUID_NO_SETGID; - xmlChar *setuid = xmlGetProp(task_element, (const xmlChar *)"setuser"); - if (setuid != NULL && xmlStrlen(setuid) > 0) { - if (!settings->disable_root && - xmlStrcmp(setuid, (const xmlChar *)"root") == 0) { - setuid_min = SETUID_ROOT; - } else { - setuid_min = SETUID; - } - } - xmlFree(setuid); - return setuid_min; -} - -score_t setgid_min(const xmlNodePtr task_element, const settings_t *settings, - score_t setuid_min, score_t *nb_setgid) -{ - score_t setgid_min = setuid_min; - xmlChar *setgid = - xmlGetProp(task_element, (const xmlChar *)"setgroups"); - count_matching_groups((char *)setgid, NULL, 0, - (unsigned int *)nb_setgid, GROUP_SEPARATOR); - if (setgid != NULL && xmlStrlen(setgid) > 0) { - switch (setuid_min) { - case SETUID_ROOT: - if (!settings->disable_root && contains_root(setgid)) { - setgid_min = SETUID_SETGID_ROOT; - } else { - setgid_min = SETUID_ROOT_SETGID; - } - break; - case SETUID: - if (!settings->disable_root && contains_root(setgid)) { - setgid_min = SETUID_NOTROOT_SETGID_ROOT; - } else { - setgid_min = SETUID_SETGID; - } - break; - default: // no_setuid - if (!settings->disable_root && contains_root(setgid)) { - setgid_min = SETGID_ROOT; - } else { - setgid_min = SETGID; - } - break; - } - } - xmlFree(setgid); - return setgid_min; -} - -score_t get_setuid_min(const xmlNodePtr task_element, - const settings_t *settings, score_t *nb_setgid) -{ - score_t setuid_min = NO_SETUID_NO_SETGID; - if (xmlHasProp(task_element, (const xmlChar *)"setuser")) { - setuid_min = setuser_min(task_element, settings); - } - if (xmlHasProp(task_element, (const xmlChar *)"setgroups")) { - setuid_min = setgid_min(task_element, settings, setuid_min, - nb_setgid); - } - return setuid_min; -} - -/** - * @brief check if the command matches the task element - * @param cmd the command to check - * @param task_element the task element to check - * @param cmd_min the minimum command level that matched - * @param caps_min the capabilities level of the task - * @return 1 if any match, or 0 if no match -*/ -score_t task_match(cmd_t *cmd, const xmlNodePtr task_element, - settings_t *settings, score_t *cmd_min, score_t *caps_min, - score_t *setuid_min, score_t *nb_setgid) -{ - *setuid_min = *caps_min = *cmd_min = -1; - if (!xmlStrcmp(task_element->name, (const xmlChar *)"task")) { - get_options_from_config(task_element, settings); - xmlNodePtr command_element = task_element->children; - - while (command_element != NULL) { - score_t match = command_match(cmd, command_element); - if (match) { - *cmd_min = match < *cmd_min ? match : *cmd_min; - } - - command_element = - xmlNextElementSibling(command_element); - } - if (*cmd_min > 0) { - *caps_min = get_caps_min(task_element); - *setuid_min = get_setuid_min(task_element, settings, - nb_setgid); - } - } - return *cmd_min < (score_t)-1 ? 1 : 0; -} - -#define NO_ROOT_WITH_BOUNDING 1 -#define ENABLE_ROOT 2 -#define DISABLE_BOUNDING 3 -#define ENABLE_ROOT_DISABLE_BOUNDING 4 - -int set_task_min(cmd_t *cmd, const xmlNodePtr role_sub_element, - xmlNodePtr *task_min, settings_t *settings, score_t *cmd_min, - score_t *caps_min, score_t *setuid_min, score_t *setgid_min, - score_t *security_min) -{ - int ret = -1; - score_t task_cmd = -1, task_caps = -1, task_setuid = -1, - task_setgid = -1; - if (task_match(cmd, role_sub_element, settings, &task_cmd, &task_caps, - &task_setuid, &task_setgid)) { - int cmp = fourscorecmp(task_cmd, task_caps, task_setuid, - task_setgid, *cmd_min, *caps_min, - *setuid_min, *setgid_min); - if (cmp < 0) { - *cmd_min = task_cmd; - *caps_min = task_caps; - *setuid_min = task_setuid; - *setgid_min = task_setgid; - *task_min = role_sub_element; - if (!settings->disable_root && - !settings->apply_bounding) - *security_min = ENABLE_ROOT_DISABLE_BOUNDING; - else if (!settings->disable_root) - *security_min = ENABLE_ROOT; - else if (!settings->apply_bounding) - *security_min = DISABLE_BOUNDING; - else - *security_min = NO_ROOT_WITH_BOUNDING; - ret = 1; - } else if (*cmd_min != (score_t)-1 && cmp == 0) { - xmlChar *role_name = xmlGetProp( - role_sub_element, (const xmlChar *)"name"); - syslog(LOG_WARNING, "Duplicate task in role %s", - role_name); - xmlFree(role_name); - ret = 0; - } - } - return ret; -} - -int role_match(const xmlNodePtr role_element, user_t *user, cmd_t *cmd, - xmlNodePtr *task_min, settings_t *settings, score_t *user_min, - score_t *cmd_min, score_t *caps_min, score_t *setuid_min, - score_t *setgid_min, score_t *security_min) -{ - if (!xmlStrcmp(role_element->name, (const xmlChar *)"role")) { - xmlNode *role_sub_element = role_element->children; - *user_min = *cmd_min = *caps_min = *setuid_min = *security_min = - *setgid_min = -1; - xmlNodePtr actors_block = find_first_element_by_name( - role_element, (xmlChar *)"actors"); - int matches = 0; - if (actors_block != NULL) { - *user_min = actors_match(user, actors_block); - while (role_sub_element != NULL) { - int ret = set_task_min(cmd, role_sub_element, - task_min, settings, - cmd_min, caps_min, - setuid_min, setgid_min, - security_min); - if (ret == 1) - matches = 1; - role_sub_element = - xmlNextElementSibling(role_sub_element); - } - } else { - *user_min = -1; - int ret = set_task_min(cmd, role_sub_element, - task_min, settings, - cmd_min, caps_min, - setuid_min, setgid_min, - security_min); - if (ret == 1) - matches = 1; - } - if (matches) - return 1; - } - return 0; -} - -void min_partial_order_role(xmlNodePtr role_element, user_t *user, cmd_t *cmd, - score_t *user_min, score_t *cmd_min, - score_t *caps_min, score_t *setuid_min, - score_t *setgid_min, score_t *security_min, - xmlNodePtr *matched_role, xmlNodePtr *matched_task, - settings_t *matched_settings, int *n_roles) -{ - xmlNodePtr tmp_task_element = NULL; - settings_t tmp_settings; - set_default_options(&tmp_settings); - score_t tmp_user_min = -1, tmp_cmd_min = -1, tmp_caps_min = -1, - tmp_setuid_min = -1, tmp_setgid_min = -1, tmp_security_min = -1; - if (role_match(role_element, user, cmd, &tmp_task_element, - &tmp_settings, &tmp_user_min, &tmp_setuid_min, - &tmp_cmd_min, &tmp_caps_min, &tmp_setgid_min, - &tmp_security_min)) { - int precision = twoscorecmp(tmp_user_min, tmp_cmd_min, - *user_min, *cmd_min); - int leastprivilege = - fourscorecmp(tmp_caps_min, tmp_setuid_min, - tmp_setgid_min, tmp_security_min, - *caps_min, *setuid_min, *setgid_min, - *security_min); - if (precision < 0 || (precision == 0 && leastprivilege < 0)) { - *user_min = tmp_user_min; - *cmd_min = tmp_cmd_min; - *caps_min = tmp_caps_min; - *setuid_min = tmp_setuid_min; - *setgid_min = tmp_setgid_min; - *security_min = tmp_security_min; - *matched_role = role_element; - *matched_task = tmp_task_element; - options_assign(matched_settings, &tmp_settings); - *n_roles = 1; - } else if (precision == 0 && leastprivilege == 0) { - (*n_roles)++; - } - } -} - -/** - * @brief get the most precise and least privileged role for a command - * @param user the user to match - * @param cmd the command to match - * @param roles_element the roles that can be matched - * @param matched_role the matched role - * @param matched_task the matched task - * @param matched_settings the associated settings to the matched task - * @return n roles found - * -*/ -int find_partial_order_role(xmlNodeSetPtr roles_element, user_t *user, - cmd_t *cmd, xmlNodePtr *matched_role, - xmlNodePtr *matched_task, - settings_t *matched_settings) -{ - score_t user_min = -1, cmd_min = -1, caps_min = -1, setuid_min = -1, - setgid_min = -1, security_min = -1; - int n_roles = 0; - for (int i = 0; i < roles_element->nodeNr; i++) { - xmlNodePtr role_element = roles_element->nodeTab[i]; - min_partial_order_role(role_element, user, cmd, &user_min, - &cmd_min, &caps_min, &setuid_min, - &setgid_min, &security_min, matched_role, - matched_task, matched_settings, - &n_roles); - } - return n_roles; -} - -/******************************************* - *** FIND ROLES *** -********************************************/ - -/** - * @brief duplicate a node set - * @param cur the node set - * @return the duplicated node set, or NULL on error, to be freed with xmlFreeNodeSet() -*/ -xmlNodeSetPtr xmlNodeSetDup(xmlNodeSetPtr cur) -{ - xmlNodeSetPtr ret = malloc(sizeof(xmlNodeSet)); - int i; - ret->nodeNr = cur->nodeNr; - ret->nodeMax = cur->nodeMax; - ret->nodeTab = malloc(sizeof(xmlNodePtr) * cur->nodeNr); - for (i = 0; i < cur->nodeNr; i++) { - ret->nodeTab[i] = cur->nodeTab[i]; - } - return ret; -} - -/** - * @brief return the xpath result of a expression - * @param expression the xpath expression - * @param doc the xml document - * @param node the xml node where to start the search - * @return the xpath result, or NULL on error, free "result" global variable at end of usage -*/ -xmlNodeSetPtr find_with_xpath(xmlChar *expression, xmlDocPtr doc, - xmlNodePtr node) -{ - xmlXPathContextPtr context = NULL; - xmlNodeSetPtr nodeset = NULL; - - context = xmlXPathNewContext(doc); - if (node != NULL) { - context->node = node; - } - if (context == NULL) { - fputs("Error in xmlXPathNewContext\n", stderr); - goto ret_err; - } - if (result != NULL) { - xmlXPathFreeObject(result); - } - result = xmlXPathEvalExpression(expression, context); - if (result == NULL) { - fputs("Error in xmlXPathEvalExpression\n", stderr); - printf("expression: %s\n", expression); - goto ret_err; - } - - if (xmlXPathNodeSetIsEmpty(result->nodesetval)) { - xmlXPathFreeObject(result); - result = NULL; - goto ret_err; - } - - nodeset = result->nodesetval; - -ret_err: - if (context != NULL) { - xmlXPathFreeContext(context); - } - return nodeset; -} - -/** - * @brief sanitize string with concat xpath function - * @param str the string to sanitize - * @return the sanitized string, or NULL on error, to free at end of usage -*/ -char *sanitize_quotes_xpath(const char *p_str, size_t p_strlen) -{ - char *split = "',\"'\",'"; - char *str = (char *)p_str; - size_t tot = p_strlen * 8 + 1; - char *tmp = malloc(tot); - if (tmp == NULL) { - return NULL; - } - tmp[0] = '\0'; - char *saveptr = NULL; - char *tok = strtok_r(str, "'", &saveptr); - size_t tok_len = tok - str; - tmp = strncat(tmp, tok, tok_len); - tok = strtok_r(NULL, "'", &saveptr); - while (tok != NULL) { - tok_len = tok - str - tok_len; - tmp = strncat(tmp, split, 8); - tmp = strncat(tmp, tok, tok_len); - tok = strtok_r(NULL, "'", &saveptr); - } - char *ret = malloc(tot + 11); - if (ret == NULL) { - free(tmp); - return NULL; - } - if (strchr(str, '\'') != NULL) - snprintf(ret, tot + 11, "concat('%s')", tmp); - else - snprintf(ret, tot + 2, "'%s'", str); - free(tmp); - return ret; -} - -/** - * @brief return the xpath expression to find a role by name - * @param role the role name - * @return the xpath expression, or NULL on error, to free at end of usage -*/ -xmlChar *expr_search_role_by_name(char *role) -{ - int err; - int size = 0; - xmlChar *expression = NULL; - - size = 20 + (int)strlen(role); - - expression = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - if (!expression) { - fputs("Error malloc\n", stderr); - goto ret_err; - } - - err = xmlStrPrintf(expression, size, "//role[@name='%s'][1]", role); - if (err == -1) { - fputs("Error xmlStrPrintf()\n", stderr); - free(expression); - return NULL; - } - -ret_err: - return expression; -} - -/** - * @brief retrieve the role node from the document matching the role name - * @param doc the document - * @param role the role name - * @return the role node, or NULL on error or if no role found -*/ -xmlNodePtr get_role_node(xmlDocPtr doc, char *role) -{ - xmlNodePtr node = xmlDocGetRootElement(doc); - xmlChar *expression = expr_search_role_by_name(role); - if (!expression) { - fputs("Error expr_search_role()\n", stderr); - return NULL; - } - xmlNodeSetPtr nodeset = find_with_xpath(expression, doc, node); - if (nodeset == NULL || nodeset->nodeNr == 0) { - return NULL; - } - xmlFree(expression); - return nodeset->nodeTab[0]; -} - -/** - * @brief return the xpath expression to find a role by command - * @param command the command name - * @return the xpath expression, or NULL on error, to free at end of usage -*/ -int __expr_user_or_groups(xmlChar **expr, char *user, char **groups, - int nb_groups) -{ - char expr_format[44] = "actors/user[@name='%s']"; - int size = 45 + (int)strnlen(user, USER_MAX); - int ret = -1; - if (nb_groups > 0) { - snprintf(expr_format + 23, 21, "%s", " or actors/group[%s]"); - xmlChar *groups_str = (xmlChar *)xmlMalloc( - (nb_groups * (27 + USER_MAX)) * sizeof(xmlChar)); - if (!groups_str) { - fputs("Error malloc\n", stderr); - return -1; - } - xmlChar *str_ptr = groups_str; - for (int i = 0; i < nb_groups; i++) { - int contains_size = - (int)strnlen(groups[i], USER_MAX) + 21; - int err = -1; - if (i == 0) { - err = xmlStrPrintf(str_ptr, contains_size, - "contains(@names, '%s')", - groups[i]); - } else { - contains_size = contains_size + 4; - err = xmlStrPrintf(str_ptr, contains_size, - " or contains(@names, '%s')", - groups[i]); - } - if (err == -1) { - fputs("Error xmlStrPrintf()\n", stderr); - free(groups_str); - return err; - } - str_ptr += contains_size - 1; - size += contains_size; - } - *expr = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - ret = xmlStrPrintf(*expr, size, expr_format, user, groups_str); - free(groups_str); - } else { - *expr = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - ret = xmlStrPrintf(*expr, size, expr_format, user); - } - return ret + 1; -} - -/** - * @brief return the xpath expression to find a role by username or group combined with a command - * @param user the username - * @param groups the groups - * @param nb_groups the number of groups - * @param command the command name - * @return the xpath expression, or NULL on error, to free at end of usage -*/ -xmlChar *expr_search_role_by_usergroup(user_t *user) -{ - int err; - int size = 0; - xmlChar *expression = NULL; - xmlChar *user_groups_char = NULL; - int user_groups_size = __expr_user_or_groups( - &user_groups_char, user->name, user->groups, user->nb_groups); - if (user_groups_size == -1) { - return NULL; - } - size = 7 + PATH_MAX + ARG_MAX + 1 + user_groups_size; - - expression = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - if (!expression) { - fputs("Error malloc\n", stderr); - goto ret_err; - } - - // //role[(actors/user[@name='lechatp'] or actors/group[contains(@names,'lechatp') or contains(@names,'group1')]) and (task/command[text()='%s'] or task[string-length(translate(text(),'.+*?^$()[]{}|\\\\','')) < string-length(text())])] - err = xmlStrPrintf( - expression, size, - "//role[%s]", - user_groups_char); - if (err == -1) { - fputs("Error xmlStrPrintf()\n", stderr); - xmlFree(expression); - } - -ret_err: - xmlFree(user_groups_char); - return expression; -} - - - -/** - * @brief remove roles if group combination is not matching the executor - * @param set the xpath result - * @param groups the groups - * @param nb_groups the number of groups - * @return the xpath result, or NULL on error, free "result" global variable at end of usage -*/ -xmlNodeSetPtr filter_wrong_groups_roles(xmlNodeSetPtr set, char **groups, - int nb_groups) -{ - for (int i = 0; i < set->nodeNr; i++) { - xmlNodePtr node = set->nodeTab[i]; - xmlNodePtr group = - find_first_element_by_name(node, (xmlChar *)"actors"); - while (group != NULL) { - if (xmlStrcmp(group->name, (const xmlChar *)"group") == - 0) { - xmlChar *names = xmlGetProp( - group, (const xmlChar *)"names"); - if (names != NULL) { - unsigned int all = 0; - unsigned int found = - count_matching_groups( - (char *)names, groups, - nb_groups, &all, GROUP_SEPARATOR); - if (found == 0 || found != all) { - xmlUnlinkNode(node); - xmlFreeNode(node); - if (i < set->nodeNr - 1) { - set->nodeTab[i] = - set->nodeTab[i + - 1]; - } else { - set->nodeTab[i] = NULL; - } - set->nodeNr--; - break; - } - } - } - group = xmlNextElementSibling(group); - } - } - return set; -} - -xmlNodeSetPtr filter_wrong_commands_roles(xmlNodeSetPtr set, cmd_t *command) -{ - for (int i = 0; i < set->nodeNr; i++) { - xmlNodePtr node = set->nodeTab[i]; - xmlNodePtr task = node->children; - int task_found = 0; - while (task != NULL) { - if (!xmlStrcmp(task->name, (const xmlChar *)"task")) { - task_found = 1; - xmlNodePtr command_node = task->children; - score_t found = NO_MATCH; - while (command_node != NULL) { - if (!xmlStrcmp(command_node->name, - (const xmlChar - *)"command")) { - found = command_match( - command, command_node); - if (found != NO_MATCH) { - break; - } - } - command_node = xmlNextElementSibling( - command_node); - } - if (found == NO_MATCH) { - xmlUnlinkNode(node); - xmlFreeNode(node); - if (i < set->nodeNr - 1) { - set->nodeTab[i] = - set->nodeTab[i + 1]; - } else { - set->nodeTab[i] = NULL; - } - set->nodeNr--; - break; - } - } - task = xmlNextElementSibling(task); - } - if (!task_found) { - xmlUnlinkNode(node); - xmlFreeNode(node); - if (i < set->nodeNr - 1) { - set->nodeTab[i] = set->nodeTab[i + 1]; - } else { - set->nodeTab[i] = NULL; - } - set->nodeNr--; - } - } - return set; -} - -int add_direct_parents(xmlChar **rolenames, int *nb_rolenames, char *parents, xmlDocPtr doc, xmlNodeSetPtr set) -{ - int ret = 0; - char *save_ptr = NULL; - char *parent = strtok_r((char *)parents, " ", &save_ptr); - while (parent != NULL) { - xmlNodePtr role = get_role_node(doc, parent); - if (role != NULL && - count_matching_groups(parent, (char**)rolenames, *nb_rolenames, //this is to avoid duplicates - NULL," ")==0) { - int len = xmlStrlen((xmlChar *)parent); - rolenames[*nb_rolenames] = xmlMalloc(len+1); - rolenames[*nb_rolenames] = '\0'; - xmlStrcat(rolenames[*nb_rolenames], (xmlChar *)parent); - rolenames[*nb_rolenames][len] = '\0'; - *nb_rolenames = *nb_rolenames + 1; - set->nodeTab[set->nodeNr] = role; - set->nodeNr++; - ret++; - } - parent = strtok_r(NULL, " ", &save_ptr); - } - return ret; -} - -/** - * @brief this will find all roles matching the attribute "parents" of the role and adding them to the set -*/ -void include_parents_from_set(xmlDocPtr doc, xmlNodeSetPtr *set) -{ - xmlNodeSetPtr tmp_set = xmlNodeSetDup(*set); - int nb_rolenames = 0, size_rolenames = tmp_set->nodeNr; - xmlChar **rolenames = NULL; - rolenames = malloc(size_rolenames * sizeof(xmlChar *)); - - for (int i = 0; i < tmp_set->nodeNr; i++) { - xmlNodePtr node = tmp_set->nodeTab[i]; - rolenames[nb_rolenames] = xmlGetProp(node, (const xmlChar *)"name"); - nb_rolenames++; - if (xmlHasProp(node, (const xmlChar *)"parents")) { - unsigned int amount = 0; - char * parents = (char *)xmlGetProp(node, (const xmlChar *)"parents"); - unsigned int matching = count_matching_groups(parents, (char**) rolenames, nb_rolenames, &amount, " "); - if (amount > 0 && !matching) { - size_rolenames += (amount); - if (tmp_set->nodeMax < size_rolenames) - { - printf("reallocating_1\n"); - xmlNodePtr *tmp_nodeTab = realloc(tmp_set->nodeTab, size_rolenames * - sizeof(xmlNodePtr)); - if (tmp_nodeTab == NULL) { - fprintf(stderr, "reallocarray failed\n"); - exit(EXIT_FAILURE); - } - tmp_set->nodeTab = tmp_nodeTab; - tmp_set->nodeMax = size_rolenames; - } - printf("reallocating_2 size : %d\n", size_rolenames); - xmlChar **tmp_rolenames = xmlRealloc(rolenames, size_rolenames * sizeof(xmlChar *)); - if (tmp_rolenames == NULL) { - fprintf(stderr, "reallocarray failed\n"); - exit(EXIT_FAILURE); - } - add_direct_parents(tmp_rolenames, &nb_rolenames, parents, doc, tmp_set); - rolenames = tmp_rolenames; - } - free(parents); - } - } - *set = tmp_set; -} - -/** - * @brief find all roles matching the user or groups and command - * @param doc the xml document - * @param user the username - * @param groups the groups - * @param nb_groups the number of groups - * @param command the command name - * @return every roles that match the user or groups and command (regex or not) -*/ -xmlNodeSetPtr find_role_by_usergroup(xmlDocPtr doc, user_t *user) -{ - xmlChar *expression = NULL; - xmlNodeSetPtr nodeset = NULL; - expression = expr_search_role_by_usergroup(user); - if (!expression) { - fputs("Error expr_search_role_by_usergroup()\n", - stderr); - goto ret_err; - } - nodeset = find_with_xpath(expression, doc, NULL); -ret_err: - xmlFree(expression); - return nodeset; -} - -xmlNodeSetPtr find_matching_roles(xmlDocPtr doc, user_t *user, cmd_t *cmd){ - xmlNodeSetPtr nodeset = find_role_by_usergroup(doc, user); - if (!nodeset) { - return NULL; - } - nodeset = filter_wrong_groups_roles(nodeset, user->groups, - user->nb_groups); - if (!nodeset) { - fputs("Error filter_wrong_groups_roles()\n", stderr); - return NULL; - } - include_parents_from_set(doc, &nodeset); - - nodeset = filter_wrong_commands_roles(nodeset, cmd); - if (!nodeset) { - fputs("Error filter_wrong_commands_roles()\n", stderr); - return NULL; - } - return nodeset; -} - -/** - * @brief create expression to find all task containing the given command in a role - * @param command command to search - * @return expression like .//task[command/text() = 'thecommand')] -*/ -xmlChar *expr_search_command_block_from_role(char *command, size_t command_len) -{ - xmlChar *expr = NULL; - char *sanitized_command = sanitize_quotes_xpath(command, command_len); - if (sanitized_command == NULL) { - return NULL; - } - char *command_block = ".//task[command/text() = %s]"; - int len = 27 + command_len + 1; - expr = (xmlChar *)malloc(len); - if (expr == NULL) { - return NULL; - } - xmlStrPrintf(expr, len, command_block, sanitized_command); - free(sanitized_command); - return expr; -} - -/** - * @brief find task blocks which are empty on the role with xpath - * @param role_node the role node - * @return the task node, or NULL on error or if no empty task block -*/ -xmlNodeSetPtr find_wildcard_task_block_from_role(xmlNodePtr role_node) -{ - xmlChar *expression = (xmlChar *)"./task[contains(command, '*')]"; - if (!expression) { - fputs("Error expr_search_command_block_from_role()\n", stderr); - return NULL; - } - xmlNodeSetPtr nodeset = - find_with_xpath(expression, role_node->doc, role_node); - if (nodeset == NULL || nodeset->nodeNr == 0) { - return NULL; - } - return nodeset; -} - -/** - * @brief find the role node matching the parameters, filter -*/ -int get_settings(xmlNodePtr role_node, xmlNodePtr task_node, - settings_t *options) -{ - int res = 1; - options->role = (char *)xmlStrdup( - xmlGetProp(role_node, (const xmlChar *)"name")); - if (xmlHasProp(task_node, (const xmlChar *)"setuser")) { - xmlChar *prop = - xmlGetProp(task_node, (const xmlChar *)"setuser"); - options->setuid = (char *)xmlStrdup(prop); - xmlFree(prop); - } else { - options->setuid = NULL; - } - if (xmlHasProp(task_node, (const xmlChar *)"setgroups")) { - xmlChar *prop = - xmlGetProp(task_node, (const xmlChar *)"setgroups"); - options->setgid = (char *)xmlStrdup(prop); - xmlFree(prop); - } else { - options->setgid = NULL; - } - if (xmlHasProp(task_node, (const xmlChar *)"capabilities")) { - xmlChar *capabilities = - xmlGetProp(task_node, (const xmlChar *)"capabilities"); - if (xmlStrcasecmp(capabilities, (const xmlChar *)"all") == 0) { - *capabilities = '\0'; - xmlChar *s_capabilities = - xmlMalloc(xmlStrlen(capabilities) + 5); - xmlStrPrintf(s_capabilities, - xmlStrlen(capabilities) + 3, "%s=i", - capabilities); - xmlFree(capabilities); - capabilities = s_capabilities; - } else if (xmlStrlen(capabilities) != 0) { - xmlChar *s_capabilities = - xmlMalloc(xmlStrlen(capabilities) + 5); - xmlStrPrintf(s_capabilities, - xmlStrlen(capabilities) + 3, "%s=i", - capabilities); - xmlFree(capabilities); - capabilities = s_capabilities; - } - - cap_t eff = cap_from_text((char *)capabilities); - cap_iab_fill(options->iab, CAP_IAB_INH, eff, CAP_INHERITABLE); - cap_iab_fill(options->iab, CAP_IAB_AMB, eff, CAP_INHERITABLE); - get_options_from_config(task_node, options); - if (options->apply_bounding) { - cap_iab_fill(options->iab, CAP_IAB_BOUND, eff, - CAP_INHERITABLE); - } - drop_iab_from_current_bounding(&options->iab); - cap_free(eff); - xmlFree(capabilities); - } else { - cap_t eff = cap_init(); - cap_clear_flag(eff, CAP_INHERITABLE); - if (options->apply_bounding) { - cap_iab_fill(options->iab, CAP_IAB_BOUND, eff, - CAP_INHERITABLE); - } - cap_iab_fill(options->iab, CAP_IAB_INH, eff, CAP_INHERITABLE); - cap_iab_fill(options->iab, CAP_IAB_AMB, eff, CAP_INHERITABLE); - } - - xmlXPathFreeObject(result); - return res; -} - -int find_role_by_name(xmlNodeSetPtr set, char *role_name, xmlNodePtr *role_node) -{ - int res = 0; - for (int i = 0; i < set->nodeNr; i++) { - xmlNodePtr t_node = set->nodeTab[i]; - xmlChar *name = xmlGetProp(t_node, (const xmlChar *)"name"); - - if (xmlStrcasecmp(name, (const xmlChar *)role_name) == 0) { - *role_node = t_node; - res = 1; - xmlFree(name); - } - xmlFree(name); - } - return res; -} - -/** - * @brief retrieve all execution settings from xml document matching user, groups and command - * @param doc the document - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @param command the command - * @param settings the output settings - * @return 1 on success, or 0 on error -*/ -int get_settings_from_doc_by_role(char *role, xmlDocPtr doc, user_t *user, - cmd_t *cmd, settings_t *settings) -{ - int res = 0; - xmlNodeSetPtr set = find_matching_roles(doc, user, cmd); - if (set == NULL) { - return res; - } - xmlNodePtr role_node = NULL; - int tresult = find_role_by_name(set, role, &role_node); - if (!tresult) { - xmlXPathFreeNodeSet(set); - return res; - } - xmlNodePtr task_node = NULL; - - return get_settings(role_node, task_node, settings); -} - -/** - * @brief load xml file and validate it - * @param xml_file the xml file - * @return the document, or NULL on error -*/ -xmlDocPtr load_xml(char *xml_file) -{ - xmlParserCtxtPtr ctxt; - xmlDocPtr doc; - - ctxt = xmlNewParserCtxt(); - if (!ctxt) { - fputs("Failed to allocate parser context\n", stderr); - return NULL; - } - dac_read_effective(1); - doc = xmlCtxtReadFile(ctxt, xml_file, NULL, - XML_PARSE_DTDVALID | XML_PARSE_NOBLANKS); - dac_read_effective(0); - if (!doc) { - fprintf(stderr, "Failed to parse %s\n", xml_file); - goto ret_err; - } - if (!ctxt->valid) { - fprintf(stderr, "Failed to validate %s\n", xml_file); - xmlFreeDoc(doc); - goto ret_err; - } - - xmlFreeParserCtxt(ctxt); - - return doc; - -ret_err: - xmlFreeParserCtxt(ctxt); - return NULL; -} - -/** - * @brief retrieve all execution settings from xml document matching user, groups and command - * @param doc the document - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @param command the command - * @return 1 on success, or 0 on error -*/ -int get_settings_from_doc_by_partial_order(xmlDocPtr doc, user_t *user, - cmd_t *cmd, settings_t *options) -{ - int res = 0; - xmlNodeSetPtr set = find_matching_roles(doc, user, cmd); - if (set == NULL) { - return res; - } - xmlNodePtr role_node = NULL; - xmlNodePtr task_node = NULL; - int nb_colliding = find_partial_order_role(set, user, cmd, &role_node, - &task_node, options); - if (nb_colliding == 0) { - return res; - } else if (nb_colliding == 1) { - return get_settings(role_node, task_node, options); - } else { - error(0, 0, - "Multiple roles matchs this command, please specify a role."); - return res; - } -} - -/** - * @brief xpath expression if user has access to the role - * @param role the role name - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @return the expression, or NULL on error -*/ -xmlChar *expr_has_access(char *role, char *user, int nb_groups, char **groups) -{ - int err = -1; - int size = 0; - xmlChar *expression = NULL; - xmlChar *user_groups_char = NULL; - int user_groups_size = __expr_user_or_groups(&user_groups_char, user, - groups, nb_groups); - size = strlen(role) + 24 + user_groups_size; - - expression = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - if (!expression) { - fputs("Error malloc\n", stderr); - goto ret_err; - } - - err = xmlStrPrintf(expression, size, "//role[@name='%s' and (%s)]", - role, user_groups_char); - if (err == -1) { - fputs("Error xmlStrPrintf()\n", stderr); - xmlFree(expression); - } - -ret_err: - xmlFree(user_groups_char); - return expression; -} -/** - * @brief obtain role if user has access to the role - * @param doc the document - * @param role the role name - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @return the role node, or NULL on error or if user has no access - * @note unused -*/ -xmlNodePtr get_role_if_access(xmlDocPtr doc, char *role, char *user, - int nb_groups, char **groups) -{ - xmlChar *expression = expr_has_access(role, user, nb_groups, groups); - if (!expression) { - fputs("Error expr_search_role()\n", stderr); - return NULL; - } - xmlNodeSetPtr nodeset = find_with_xpath(expression, doc, NULL); - if (nodeset == NULL || nodeset->nodeNr == 0) { - return NULL; - } - return nodeset->nodeTab[0]; -} - -/************************************************************************ - *** PRINT FUNCTIONS *** -*************************************************************************/ - - -/** - * @brief expression to search all roles matching the user - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @return the expression, or NULL on error -*/ -xmlChar *expr_search_access_roles(user_t *user) -{ - int err; - int size = 0; - xmlChar *expression = NULL; - xmlChar *user_groups_char = NULL; - int user_groups_size = __expr_user_or_groups( - &user_groups_char, user->name, user->groups, user->nb_groups); - size = 24 + user_groups_size; - - expression = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - if (!expression) { - fputs("Error malloc\n", stderr); - goto ret_err; - } - - // //role[user[@name='lechatp'] or group[contains(@names,'lechatp') or contains(@names,'group1')]] - err = xmlStrPrintf(expression, size, "//role[%s]", user_groups_char); - if (err == -1) { - fputs("Error xmlStrPrintf()\n", stderr); - } - -ret_err: - xmlFree(user_groups_char); - return expression; -} - -/** - * @brief obtain all roles matching the user - * @param doc the document - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @return the node set, or NULL on error, to be freed with xmlFreeNodeSet() -*/ -xmlNodeSetPtr get_right_roles(xmlDocPtr doc, user_t *user) -{ - xmlNodeSetPtr filtered = NULL; - xmlChar *expression = expr_search_access_roles(user); - if (!expression) { - fputs("Error expr_search_role()\n", stderr); - goto free_error; - } - xmlNodeSetPtr nodeset = find_with_xpath(expression, doc, NULL); - if (nodeset == NULL || nodeset->nodeNr == 0) { - goto free_error; - } - filtered = filter_wrong_groups_roles(nodeset, user->groups, - user->nb_groups); - if (filtered == NULL) { - goto free_error; - } -free_error: - if (expression != NULL) - xmlFree(expression); - return filtered; -} - -/** - * @brief expression to get all elements matching their name (user, group, task) - * @param element the element name - * @return the expression, or NULL on error -*/ -xmlChar *expr_search_element_in_role(char *element) -{ - int err; - int size = 0; - xmlChar *expression = NULL; - size = strlen(element) + 4; - - expression = (xmlChar *)xmlMalloc(size * sizeof(xmlChar)); - if (!expression) { - fputs("Error malloc\n", stderr); - goto ret_err; - } - - // //task - err = xmlStrPrintf(expression, size, ".//%s", element); - if (err == -1) { - fputs("Error xmlStrPrintf()\n", stderr); - xmlFree(expression); - } - -ret_err: - return expression; -} - -/** - * @brief search all elements matching their name (user, group, task) in a role - * @param role the role node - * @param element the element name - * @return the node set, or NULL on error, to be freed with xmlFreeNodeSet() -*/ -xmlNodeSetPtr search_element_in_role(xmlNodePtr role, char *element) -{ - xmlNodeSetPtr nodeset = NULL; - xmlChar *expression = expr_search_element_in_role(element); - if (!expression) { - fputs("Error expr_search_element_in_role()\n", stderr); - goto ret_err; - } - nodeset = find_with_xpath(expression, role->doc, role); - if (nodeset == NULL || nodeset->nodeNr == 0) { - nodeset = NULL; - goto ret_err; - } -ret_err: - if (expression != NULL) - xmlFree(expression); - return nodeset; -} - -/** - * @brief print all task in the node set - * @param nodeset the node set containing the task - * @param restricted if the verbose need to be restricted - * @return 0 on success, -1 on error -*/ -void print_task(xmlNodeSetPtr nodeset) -{ - char *vertical = "│ "; - char *element = "├─ "; - char *end = "└─ "; - char *space = " "; - - for (int i = 0; i < nodeset->nodeNr; i++) { - xmlNodePtr node = nodeset->nodeTab[i]; - - printf("%stask:\n", end); - - if (node->children) - for (xmlNodePtr command = node->children; command; - command = xmlNextElementSibling(command)) { - printf("%s%s%s\n", - i + 1 >= nodeset->nodeNr ? space : - vertical, - i + 1 < nodeset->nodeNr ? element : end, - command->children->content); - } - else { - printf("%s%sAny command\n", - i + 1 >= nodeset->nodeNr ? space : vertical, - i + 1 < nodeset->nodeNr ? element : end); - } - } -} - -/** - * @brief print role - * @param role the role node -*/ -void print_xml_role(xmlNodePtr role) -{ - //char *vertical = "│ "; - char *element = "├─ "; - char *end = "└─ "; - char *space = " "; - xmlChar *name = xmlGetProp(role, (const xmlChar *)"name"); - printf("Role \"%s\"\n", name); - xmlFree(name); - xmlNodePtr actors = - find_first_element_by_name(role, (xmlChar *)"actors"); - xmlNodeSetPtr users = - xmlNodeSetDup(search_element_in_role(actors, "user")); - xmlNodeSetPtr groups = - xmlNodeSetDup(search_element_in_role(actors, "group")); - xmlNodeSetPtr task = search_element_in_role(role, "task"); - if (users->nodeNr + groups->nodeNr > 0) { - char *side = task->nodeNr ? element : space; - printf("%sActors:\n", task->nodeNr ? element : end); - for (int i = 0; i < users->nodeNr; i++) { - xmlNodePtr user = users->nodeTab[i]; - xmlChar *username = - xmlGetProp(user, (const xmlChar *)"name"); - printf("%s%s%s\n", side, - i + 1 < (users->nodeNr + groups->nodeNr) ? - element : - end, - username); - xmlFree(username); - } - for (int i = 0; i < groups->nodeNr; i++) { - xmlNodePtr group = groups->nodeTab[i]; - xmlChar *groupname = - xmlGetProp(group, (const xmlChar *)"names"); - printf("%s%s%s\n", side, - i + 1 < groups->nodeNr ? element : end, - groupname); - xmlFree(groupname); - } - } - print_task(task); - xmlXPathFreeObject(result); - xmlXPathFreeNodeSet(users); - xmlXPathFreeNodeSet(groups); -} - -/** - * @brief print a role - * @param role the role name -*/ -void print_full_role(char *role) -{ - xmlDocPtr doc; - - doc = load_xml(XML_FILE); - if (doc) { - xmlNodePtr role_node = get_role_node(doc, role); - if (role_node) { - print_xml_role(role_node); - } else { - printf("Role \"%s\" not found\n", role); - } - } else { - printf("Error loading XML file\n"); - } - xmlFreeDoc(doc); -} - -/** - * @brief print all roles -*/ -void print_full_roles() -{ - xmlDocPtr doc; - - doc = load_xml(XML_FILE); - if (doc) - for (xmlNodePtr role = doc->children->children; role; - role = role->next) { - print_xml_role(role); - } - else { - printf("Error loading XML file\n"); - } - xmlFreeDoc(doc); -} - -/** - * @brief print roles (including their task) that user can use - * @param user the user name - * @param nb_groups the number of groups - * @param groups the groups - * @param restricted if 1, print only roles and task, if 0, print all properties -*/ -void print_rights(user_t *posix_user) -{ - xmlDocPtr doc; - - doc = load_xml(XML_FILE); - if (doc) { - xmlNodeSetPtr roles = get_right_roles(doc, posix_user); - xmlNodeSetPtr tmp = xmlNodeSetDup(roles); - if (roles) { - for (int i = 0; i < tmp->nodeNr; i++) { - xmlNodePtr role = tmp->nodeTab[i]; - xmlNodeSetPtr task = - search_element_in_role(role, "task"); - xmlChar *rolename = xmlGetProp( - role, (const xmlChar *)"name"); - printf("Role \"%s\"\n", rolename); - xmlFree(rolename); - print_task(task); - xmlXPathFreeNodeSet(task); - } - } else { - printf("Permission denied\n"); - } - xmlXPathFreeNodeSet(tmp); - } else { - printf("Error loading XML file\n"); - } - xmlFreeDoc(doc); -} - -/** - * @brief Check if user has rights to print role - * @param role Role to check - * @param user User to check - * @param nb_groups Number of groups of user - * @param groups Groups of user - * @return >0 if user has rights, 0 otherwise -*/ -int check_rights(xmlNodePtr role, user_t *user) -{ - xmlNodeSetPtr users = search_element_in_role(role, "user"); - xmlNodeSetPtr groups_node = NULL; - int found = 0; - for (int i = 0; i < users->nodeNr; i++) { - xmlNodePtr user_node = users->nodeTab[i]; - xmlChar *username = - xmlGetProp(user_node, (const xmlChar *)"name"); - if (!xmlStrcmp((xmlChar *)user->name, username)) { - found = 1; - xmlFree(username); - goto result; - } - xmlFree(username); - } - groups_node = search_element_in_role(role, "group"); - for (int i = 0; i < groups_node->nodeNr; i++) { - xmlNodePtr group_node = groups_node->nodeTab[i]; - xmlChar *group = - xmlGetProp(group_node, (const xmlChar *)"names"); - int j = 0; - for (; j < user->nb_groups; j++) { - if (!xmlStrcmp(group, (xmlChar *)user->groups[j])) { - found++; - } - } - xmlFree(group); - if (found == j) { - goto result; - } - found = 0; - } -result: - return found; -} - -/** - * @brief print a role if user has rights - * @param role the role name - * @param user the user name - * @param nb_groups the number of groups - * @param groups the groups - * @param restricted if 1, print only roles and task, if 0, print all properties -*/ -void print_rights_role(char *role, user_t *user) -{ - xmlDocPtr doc; - - doc = load_xml(XML_FILE); - if (doc) { - xmlNodePtr role_node = get_role_node(doc, role); - if (role_node && check_rights(role_node, user)) { - xmlNodeSetPtr task = - search_element_in_role(role_node, "task"); - xmlChar *rolename = - xmlGetProp(role_node, (const xmlChar *)"name"); - printf("Role \"%s\"\n", rolename); - xmlFree(rolename); - print_task(task); - } else { - printf("Permission denied\n"); - } - xmlXPathFreeObject(result); - } else { - printf("Error loading XML file\n"); - } - xmlFreeDoc(doc); -} - -/** - * @brief Get document version - * @param doc The document to check - * @return The version of the document, to be freed -*/ -xmlChar *get_doc_version(xmlDocPtr doc) { - xmlChar *version = NULL; - xmlNodePtr root = xmlDocGetRootElement(doc); - if (root) { - version = xmlGetProp(root, (const xmlChar *)"version"); - } - return version; -} - -/** - * @brief Get document timestamp timeout value - * @param doc The document to check - * @return The timeout value of the document -*/ -unsigned long get_doc_timestamp_timeout(xmlDocPtr doc){ - xmlChar *timeout = NULL; - xmlNodePtr root = xmlDocGetRootElement(doc); - if (root) { - timeout = xmlGetProp(root, (const xmlChar *)"timestamp-timeout"); - } - return timeout ? strtoul((char *)timeout, NULL, 10) : 0; -} - -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/legacy/src/xml_manager.h b/legacy/src/xml_manager.h deleted file mode 100644 index d930067b..00000000 --- a/legacy/src/xml_manager.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef XML_MANAGER_H -#define XML_MANAGER_H - -#include -#include "params.h" - -#define XML_FILE "/etc/security/rootasrole.xml" - -#ifndef DEBUG -#define DEBUG 0 -#endif - -#define RESTRICTED 1 -#define UNRESTRICTED 0 - -/** - * @brief load xml file and validate it - * @param xml_file the xml file - * @return the document, or NULL on error -*/ -xmlDocPtr load_xml(char *xml_file); - -/** - * @brief free the options -*/ -void free_options(settings_t *options); - -/** - * @brief retrieve all execution settings from xml document matching user, groups and command - * @param doc the document - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @param command the command - * @param options the output settings - * @return 1 on success, or 0 on error -*/ -int get_settings_from_doc_by_partial_order(xmlDocPtr doc, user_t *user, cmd_t *command, settings_t *p_options); - -/** - * @brief retrieve all execution settings from xml document matching user, groups and command - * @param doc the document - * @param user the user - * @param nb_groups the number of groups - * @param groups the groups - * @param command the command - * @param settings the output settings - * @return 1 on success, or 0 on error -*/ -int get_settings_from_doc_by_role(char *role, xmlDocPtr doc, user_t *user, - cmd_t *cmd, settings_t *settings); - -/** - * @brief Print informations of a role -*/ -void print_full_role(char *role); - -/** - * @brief Print all roles -*/ -void print_full_roles(); - -/** - * @brief Print the rights of all accessible roles for a user - * @param user The user to check - * @param nb_groups The number of groups of the user - * @param groups The groups of the user -*/ -void print_rights(user_t *user); - -/** - * @brief Print the rights of a role if user is in the role - * @param role The role to print - * @param user The user to check - * @param nb_groups The number of groups of the user - * @param groups The groups of the user -*/ -void print_rights_role(char *role, user_t *user); - -/** - * @brief Get document version - * @param doc The document to check - * @return The version of the document, to be freed -*/ -xmlChar *get_doc_version(xmlDocPtr doc); - -/** - * @brief Get document timestamp timeout value - * @param doc The document to check - * @return The timeout value of the document -*/ -u_int64_t get_doc_timestamp_timeout(xmlDocPtr doc); - -#endif -/* - * - * Copyright Ahmad Samer Wazan , 2022 - * Copyright Eddie Billoir , 2022 - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. */ \ No newline at end of file diff --git a/legacy/tests/resources/test_xml_manager_case1.xml b/legacy/tests/resources/test_xml_manager_case1.xml deleted file mode 100644 index 280ad3e2..00000000 --- a/legacy/tests/resources/test_xml_manager_case1.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - /bin/ls - - - - t1_test1 - - - - - - - - /bin/ls - - - - t1_test2 - - - - - - - - - - - - - - /bin/ls - - - t2_test1 - - - - - - - - - \ No newline at end of file diff --git a/legacy/tests/resources/test_xml_manager_hierarchy.xml b/legacy/tests/resources/test_xml_manager_hierarchy.xml deleted file mode 100644 index 2a539928..00000000 --- a/legacy/tests/resources/test_xml_manager_hierarchy.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/legacy/tests/unit/test_capabilities.c b/legacy/tests/unit/test_capabilities.c deleted file mode 100644 index ea93b9a4..00000000 --- a/legacy/tests/unit/test_capabilities.c +++ /dev/null @@ -1,3 +0,0 @@ -#include - -#include "capabilities.c" diff --git a/legacy/tests/unit/test_command.c b/legacy/tests/unit/test_command.c deleted file mode 100644 index b1f58880..00000000 --- a/legacy/tests/unit/test_command.c +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef __STDC_LIB_EXT1__ -#define __STDC_LIB_EXT1__ -#endif -#ifndef __STDC_WANT_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 -#endif -#ifndef _DEFAULT_SOURCE -#define _DEFAULT_SOURCE -#endif -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#ifndef ARG_MAX -#define ARG_MAX 131072 -#endif -#include -#include "command.c" - -char abspath[256]; -char args[256]; - -void set_up_get_abspath_from_cmdline(void){ - abspath[0] = '\0'; - args[0] = '\0'; -} - -Test(get_abspath_from_cmdline, absolute_path, .init = set_up_get_abspath_from_cmdline) { - - - // Test case 1: Absolute path - int result = get_abspath_from_cmdline("/home/user/file.txt", abspath, sizeof(abspath),args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 1 for an absolute path"); - cr_assert_str_eq(abspath, "/home/user/file.txt", "Error: get_abspath_from_cmdline() failed to return the correct absolute path"); - cr_assert_str_eq(args, "", "Error: get_abspath_from_cmdline() failed to return the correct arguments"); - -} - -Test(get_abspath_from_cmdline, relative_path, .init = set_up_get_abspath_from_cmdline) { - // Test case 2: Relative path - int result = get_abspath_from_cmdline("file.txt", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 0, "Error: get_abspath_from_cmdline() failed to return 0 for a relative path"); - cr_assert_str_eq(abspath, "", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a relative path"); - cr_assert_str_eq(args, "", "Error: get_abspath_from_cmdline() failed to return the correct arguments"); -} - -Test(get_abspath_from_cmdline, relative_command_line, .init = set_up_get_abspath_from_cmdline) { - // Test case 3: command line with arguments - int result = get_abspath_from_cmdline("ls -l", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 0, "Error: get_abspath_from_cmdline() failed to return 0 for a command line with arguments"); - cr_assert_str_eq(abspath, "", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with arguments"); - cr_assert_str_eq(args, "", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with arguments"); - -} - -Test(get_abspath_from_cmdline, command_line_with_absolute_path, .init = set_up_get_abspath_from_cmdline) { - // Test case 4: command line with arguments and absolute path - int result = get_abspath_from_cmdline("/bin/ls -l", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 1 for a command line with arguments and an absolute path"); - cr_assert_str_eq(abspath, "/bin/ls", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with arguments and an absolute path"); - cr_assert_str_eq(args, "-l", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with arguments and an absolute path"); - -} - -Test(get_abspath_from_cmdline, command_line_with_space_in_absolute_path, .init = set_up_get_abspath_from_cmdline) { - // Test case 5: command line with space in absolute path - int result = get_abspath_from_cmdline("/home/us\\ er/file.txt -test", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 0 for a command line with arguments"); - cr_assert_str_eq(abspath, "/home/us er/file.txt", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with arguments and an absolute path"); - cr_assert_str_eq(args, "-test", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with arguments and an absolute path"); -} - -Test(get_abspath_from_cmdline, command_line_with_wildcard, .init = set_up_get_abspath_from_cmdline) { - // Test case 6: special case, command line with only wildcard - int result = get_abspath_from_cmdline("*", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 0 for a command line with only wildcard"); - cr_assert_str_eq(abspath, "*", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with only wildcard"); - cr_assert_str_eq(args, "", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with only wildcard"); -} - -Test(get_abspath_from_cmdline, command_line_double_wildcard, .init = set_up_get_abspath_from_cmdline) { - // Test case 6: special case, command line with only double wildcard - int result = get_abspath_from_cmdline("**", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 0 for a command line with only wildcard"); - cr_assert_str_eq(abspath, "*", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with only wildcard"); - cr_assert_str_eq(args, ".*", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with only wildcard"); -} - - -Test(get_abspath_from_cmdline, command_line_with_wildcard_and_args, .init = set_up_get_abspath_from_cmdline) { - // Test case 7: special case, command line with only wildcard and args - int result = get_abspath_from_cmdline("* -l", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 0 for a command line with only wildcard and args"); - cr_assert_str_eq(abspath, "*", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with only wildcard and args"); - cr_assert_str_eq(args, "-l", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with only wildcard and args"); -} - -Test(get_abspath_from_cmdline, command_line_with_some_wildcard_and_args, .init = set_up_get_abspath_from_cmdline) { - // Test case 8: special case, command line with some wildcard and args - int result = get_abspath_from_cmdline("/*.txt -l", abspath, sizeof(abspath), args, sizeof(args)); - cr_assert_eq(result, 1, "Error: get_abspath_from_cmdline() failed to return 0 for a command line with some wildcard and args"); - cr_assert_str_eq(abspath, "/*.txt", "Error: get_abspath_from_cmdline() failed to return the correct absolute path for a command line with some wildcard and args"); - cr_assert_str_eq(args, "-l", "Error: get_abspath_from_cmdline() failed to return the correct arguments for a command line with some wildcard and args"); -} - - -Test(join_argv, test_join) { - char *argv[3] = {"ls","-a", "-l"}; - char result[ARG_MAX]; - result[0] = '\0'; - int len = 0; - int res = join_argv(3, argv, result, ARG_MAX, &len); - cr_assert_eq(res, 0, "Error: join_argv() failed to return 0"); - cr_assert_eq(len, 5, "Error: join_argv() failed to return the correct length"); - cr_assert_str_eq(result, "-a -l", "Error: join_argv() failed to return the correct string"); - -} - -Test(join_cmd, test_join) { - char *argv[3] = {"ls","-a", "-l"}; // argv[0] is the command - cmd_t *cmd = & (struct s_cmd) { - .command = "/bin/ls", - .argv = argv, - .argc = 3 - }; - - char result[ARG_MAX]; - int len = 0; - int res = join_cmd(cmd, result, ARG_MAX, &len); - cr_assert_eq(res, 0, "Error: join_cmd() failed to return 0"); - cr_assert_eq(len, 13, "Error: join_cmd() failed to return the correct length, %d expected %d", len, 13); - cr_assert_str_eq(result, "/bin/ls -a -l", "Error: join_cmd() failed to return the correct string"); - - -} - -Test(may_be_regex, test_regex){ - char *test1 = "test"; - cr_assert_eq(may_be_regex(test1,strlen(test1)),0,"Error: may_be_regex() \"test\" failed to return false"); - char *test2 = "test*"; - cr_assert_eq(may_be_regex(test2,strlen(test2)),1,"Error: may_be_regex() \"test*\" failed to return true"); - char *test3 = "test?"; - cr_assert_eq(may_be_regex(test3,strlen(test3)),1,"Error: may_be_regex() \"test?\" failed to return true"); - char *test4 = "test[\\]"; - cr_assert_eq(may_be_regex(test4,strlen(test4)),1,"Error: may_be_regex() \"test[\\]\" failed to return true"); - char *realtest = "^-a -l$"; - cr_assert_eq(may_be_regex(realtest+1,strlen(realtest)-2),0,"Error: may_be_regex() \"^-a -l$\" failed to return false"); - char *test = "-(a|l)"; - cr_assert_eq(may_be_regex(test,strlen(test)),1,"Error: may_be_regex() \"-(a|l)\" failed to return true"); -} \ No newline at end of file diff --git a/legacy/tests/unit/test_env.c b/legacy/tests/unit/test_env.c deleted file mode 100644 index 33fe109d..00000000 --- a/legacy/tests/unit/test_env.c +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _DEFAULT_SOURCE -#define _DEFAULT_SOURCE -#endif -#include -#include "env.c" - -Test(filter_env_vars, returns_1_when_envp_is_null) { - char **envp = NULL; - char **whitelist = NULL; - char **checklist = NULL; - char **new_envp = NULL; - int result = filter_env_vars(envp, whitelist, checklist, &new_envp); - cr_assert_eq(result, 1); -} - -Test(filter_env_vars, returns_0_when_env_var_name_is_path) { - char *envp[] = {"PATH=/usr/bin:/bin", NULL}; - char **whitelist = NULL; - char **checklist = NULL; - char **new_envp = NULL; - int result = filter_env_vars(envp, whitelist, checklist, &new_envp); - cr_assert_eq(result, 0); - cr_assert_str_eq(new_envp[0], "PATH=/usr/bin:/bin"); - cr_assert_null(new_envp[1]); - free(new_envp); -} - -Test(filter_env_vars, returns_0_when_env_var_name_is_in_checklist_and_value_passes_check) { - char *envp[] = {"MY_VAR=1234", NULL}; - char *checklist[] = {"MY_VAR", NULL}; - char **whitelist = NULL; - char **new_envp = NULL; - int result = filter_env_vars(envp, whitelist, checklist, &new_envp); - cr_assert_eq(result, 0); - cr_assert_str_eq(new_envp[0], "MY_VAR=1234"); - cr_assert_null(new_envp[1]); - free(new_envp); -} - -Test(filter_env_vars, returns_0_when_env_var_name_is_in_whitelist) { - char *envp[] = {"MY_VAR=1234", NULL}; - char *whitelist[] = {"MY_VAR", NULL}; - char **checklist = NULL; - char **new_envp = NULL; - int result = filter_env_vars(envp, whitelist, checklist, &new_envp); - cr_assert_eq(result, 0); - cr_assert_str_eq(new_envp[0], "MY_VAR=1234"); - cr_assert_null(new_envp[1]); - free(new_envp); -} \ No newline at end of file diff --git a/legacy/tests/unit/test_params.c b/legacy/tests/unit/test_params.c deleted file mode 100644 index 3d9bf694..00000000 --- a/legacy/tests/unit/test_params.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include "params.c" - -Test(params_set_role, sets_role) { - char *tmp_role = "admin"; - char *result = params_set_role(tmp_role); - cr_assert_str_eq(result, role, "params_set_role did not set the role correctly"); -} - -Test(params_get_role, returns_role) { - char *tmp_role = "admin"; - params_set_role(tmp_role); - char *result = params_get_role(); - cr_assert_str_eq(result, tmp_role, "params_get_role did not return the correct role"); -} - -Test(params_user_posix_set, sets_user_posix) { - char *tmp_user_posix = "user1"; - char *tmp_user_posix_groups[] = {"group1", "group2"}; - const int tmp_user_posix_nb_groups = 2; - - user_t *result = params_user_posix_set(tmp_user_posix, tmp_user_posix_nb_groups, tmp_user_posix_groups); - cr_assert_str_eq(result->name, tmp_user_posix, "params_set_user_posix did not set the user_posix correctly"); - cr_assert_eq(result->nb_groups, tmp_user_posix_nb_groups, "params_set_user_posix did not set the user_posix correctly"); - cr_assert_str_eq(result->groups[0], tmp_user_posix_groups[0], "params_set_user_posix did not set the user_posix correctly"); - cr_assert_str_eq(result->groups[1], tmp_user_posix_groups[1], "params_set_user_posix did not set the user_posix correctly"); - -} - -Test(params_command_set, set_command_test) { - char *tmp_command = "/bin/ls"; - char *tmp_argv[] = {"ls", "-l", NULL}; - int tmp_argc = 2; - - cmd_t *result = params_command_set(tmp_command, tmp_argc, tmp_argv); - cr_assert_str_eq(result->command, tmp_command, "params_set_command did not set the command correctly"); - cr_assert_eq(result->argc, tmp_argc, "params_set_command did not set the command correctly"); - cr_assert_str_eq(result->argv[0], tmp_argv[0], "params_set_command did not set the command correctly"); - cr_assert_str_eq(result->argv[1], tmp_argv[1], "params_set_command did not set the command correctly"); -} - -Test(params_command_get, get_command_test){ - char *tmp_command = "/bin/ls"; - char *tmp_argv[] = {"ls", "-l", NULL}; - int tmp_argc = 2; - - cmd_t *element = params_command_set(tmp_command, tmp_argc, tmp_argv); - cmd_t *result = params_command_get(); - cr_assert_str_eq(result->command, tmp_command, "params_get_command did not get the command correctly"); - cr_assert_eq(result->argc, tmp_argc, "params_get_command did not get the command correctly"); - cr_assert_str_eq(result->argv[0], tmp_argv[0], "params_get_command did not get the command correctly"); - cr_assert_str_eq(result->argv[1], tmp_argv[1], "params_get_command did not get the command correctly"); - cr_assert_eq(result, element, "params_get_command did not get the command correctly"); -} \ No newline at end of file diff --git a/legacy/tests/unit/test_xml_manager.c b/legacy/tests/unit/test_xml_manager.c deleted file mode 100644 index 49f5f1a9..00000000 --- a/legacy/tests/unit/test_xml_manager.c +++ /dev/null @@ -1,1147 +0,0 @@ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#ifndef __STDC_LIB_EXT1__ -#define __STDC_LIB_EXT1__ -#endif -#ifndef __STDC_WANT_LIB_EXT1__ -#define __STDC_WANT_LIB_EXT1__ 1 -#endif -#include -#include -#include - -#include "params.h" -#include "xml_manager.c" - -Test(command_match, test_all_cases) -{ - char *command_xml = "\ - /bin/ls\ - /bin/ls -a\ - *\ - **\ - * -a\ - * -(a|l)\ - /bin/l* -l\ - /bin/ls -*(l|a)\ - /bin/l*\ - /bin/l* -(l|a)*\ - "; - xmlDocPtr doc = xmlParseMemory(command_xml, strlen(command_xml)); - xmlNodePtr root = xmlDocGetRootElement(doc); - - char *s_bin_ls = "/bin/ls"; - char *s_opt_l[2] = { "ls", "-l" }; - cmd_t *bin_ls_opt_l = &(struct s_cmd){ - .command = s_bin_ls, - .argv = s_opt_l, - .argc = 2, - }; - - char *s_opt_a[2] = { "ls", "-a" }; - cmd_t *bin_ls_opt_a = &(struct s_cmd){ - .command = s_bin_ls, - .argv = s_opt_a, - .argc = 2, - }; - - char *s_opt_a_l[3] = { "ls", "-a", "-l" }; - cmd_t *bin_ls_opt_a_l = &(struct s_cmd){ - .command = s_bin_ls, - .argv = s_opt_a_l, - .argc = 3, - }; - - char *s_opt_null[1] = { "ls" }; - cmd_t *bin_ls = &(struct s_cmd){ - .command = s_bin_ls, - .argv = s_opt_null, - .argc = 1, - }; - - char *s_opt_al[2] = { "ls", "-al" }; - cmd_t *bin_ls_opt_al = &(struct s_cmd){ - .command = s_bin_ls, - .argv = s_opt_al, - .argc = 2, - }; - - char *s_opt_la[2] = { "ls", "-la" }; - cmd_t *bin_ls_opt_la = &(struct s_cmd){ - .command = s_bin_ls, - .argv = s_opt_la, - .argc = 2, - }; - - char *argv_test6[2] = { "ls", "--l" }; - cmd_t *bin_ls_lopt_l = &(struct s_cmd){ - .command = s_bin_ls, - .argv = argv_test6, - .argc = 2, - }; - - char *s_opt_ls_space_a_null[1] = { "ls a" }; - char *s_bin_ls_space = "/bin/ls a"; - cmd_t *bin_ls_space = &(struct s_cmd){ - .command = s_bin_ls_space, - .argv = s_opt_ls_space_a_null, - .argc = 1, - }; - - char *s_opt_lsa_null[1] = { "ls a" }; - char *s_bin_lsa = "/bin/lsa"; - cmd_t *bin_lsa = &(struct s_cmd){ - .command = s_bin_lsa, - .argv = s_opt_lsa_null, - .argc = 1, - }; - - cmd_t *bin_lsa_opt_a = &(struct s_cmd){ - .command = s_bin_lsa, - .argv = s_opt_a, - .argc = 2, - }; - /** - char *s_bin_l = "/bin/l"; - cmd_t *bin_l = &(struct s_cmd) { - .command = s_bin_l, - .argv = s_opt_null, - .argc = 0, - }; - - cmd_t *null_cmd = &(struct s_cmd) { - .command = NULL, - .argv = s_opt_null, - .argc = 0, - }; - - cmd_t *bin_ls_a_opt_a = &(struct s_cmd) { - .command = s_bin_ls_space, - .argv = s_opt_a, - .argc = 1, - };*/ - char *s_opt_ls_minusa[1] = { "ls -a" }; - char *s_bin_ls_minusa = "/bin/ls -a"; - cmd_t *bin_ls_minusa = &(struct s_cmd){ - .command = s_bin_ls_minusa, - .argv = s_opt_ls_minusa, - .argc = 1, - }; - - int tests[11] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; - - // Test case : command match - xmlNodePtr command = root->children->next; - int result = - command_match(bin_ls_opt_a, command); // /bin/ls -a vs /bin/ls - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -a == /bin/ls, expected false"); - tests[result] = result; - result = command_match(bin_ls, command); // /bin/ls vs /bin/ls - cr_assert_eq( - result, PATH_STRICT, - "Error: command_match() /bin/ls == /bin/ls, expected true"); - tests[result] = result; - - result = command_match(bin_ls_space, command); // /bin/ls a vs /bin/ls - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls a == /bin/ls, expected false"); - - // Test case : command match with argument - command = command->next->next; - result = command_match(bin_ls_opt_a, - command); // /bin/ls -a vs /bin/ls -a - cr_assert_eq( - result, PATH_ARG_STRICT, - "Error: command_match() /bin/ls -a == /bin/ls -a, expected %d, got %d", - PATH_ARG_STRICT, result); - tests[result] = result; - result = command_match(bin_ls_opt_a_l, - command); // /bin/ls -a -l vs /bin/ls -a - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -a -l == /bin/ls -a, expected false"); - result = command_match(bin_ls_minusa, - command); // /bin/ls\ -a vs /bin/ls -a - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls\\ -a == /bin/ls -a, expected false"); - - // Test case : command match with wildcard - command = command->next->next; - result = command_match(bin_ls, command); // /bin/ls vs * - cr_assert_eq(result, PATH_FULL_WILDCARD, - "Error: command_match() /bin/ls == *, expected %d, got %d", - PATH_FULL_WILDCARD, result); - tests[result] = result; - result = command_match(bin_ls_opt_a_l, command); // /bin/ls -a -l vs * - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -a -l == *, expected %d, got %d", - NO_MATCH, result); - result = command_match(bin_ls_minusa, command); // /bin/ls\ -a vs * - cr_assert_eq( - result, PATH_FULL_WILDCARD, - "Error: command_match() /bin/ls\\ -a == *, expected %d, got %d", - PATH_FULL_WILDCARD, result); - - // Test case : command full wildcard - command = command->next->next; - result = command_match(bin_ls, command); // /bin/ls vs ** - cr_assert_eq( - result, PATH_ARG_FULL_WILDCARD, - "Error: command_match() /bin/ls == **, expected %d, got %d", - PATH_ARG_FULL_WILDCARD, result); - tests[result] = result; - result = command_match(bin_ls_opt_a_l, command); // /bin/ls -a -l vs ** - cr_assert_eq( - result, PATH_ARG_FULL_WILDCARD, - "Error: command_match() /bin/ls -a -l == **, expected %d, got %d", - PATH_ARG_FULL_WILDCARD, result); - result = command_match(bin_ls_minusa, command); // /bin/ls\ -a vs ** - cr_assert_eq( - result, PATH_ARG_FULL_WILDCARD, - "Error: command_match() /bin/ls\\ -a == **, expected %d, got %d", - PATH_ARG_FULL_WILDCARD, result); - - // Test case : command match with wildcard and argument - command = command->next->next; - result = command_match(bin_ls_opt_a, command); // /bin/ls -a vs * -a - cr_assert_eq( - result, PATH_FULL_WILDCARD_ARG_STRICT, - "Error: command_match() /bin/ls -a == * -a, expected %d, got %d", - PATH_FULL_WILDCARD_ARG_STRICT, result); - tests[result] = result; - result = command_match(bin_ls, command); // /bin/ls vs * -a - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls == * -a, expected %d, got %d", - NO_MATCH, result); - result = - command_match(bin_ls_opt_a_l, command); // /bin/ls -a -l vs * -a - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -a -l == * -a, expected %d, got %d", - NO_MATCH, result); - - // Test case : command match with wildcard and regex argument - command = command->next->next; - result = command_match(bin_ls_opt_a, command); // /bin/ls -a vs * -(a|l) - cr_assert_eq( - result, PATH_FULL_WILDCARD_ARG_WILDCARD, - "Error: command_match() /bin/ls -a == * -(a|l), expected %d, got %d", - PATH_FULL_WILDCARD_ARG_WILDCARD, result); - tests[result] = result; - result = command_match(bin_ls, command); // /bin/ls vs * -(a|l) - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls == * -(a|l), expected %d, got %d", - NO_MATCH, result); - result = command_match(bin_ls_opt_a_l, - command); // /bin/ls -a -l vs * -(a|l) - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -a -l == * -(a|l), expected %d, got %d", - NO_MATCH, result); - - // Test case : command match with wildcard but strict argument - command = command->next->next; - result = command_match(bin_ls_opt_l, - command); // /bin/ls -l vs /bin/l* -l - cr_assert_eq( - result, PATH_WILDCARD_ARG_STRICT, - "Error: command_match() /bin/ls -l == /bin/l* -l, expected %d, got %d", - PATH_WILDCARD_ARG_STRICT, result); - tests[result] = result; - result = command_match(bin_ls_opt_a, - command); // /bin/ls -a vs /bin/l* -l - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -a == /bin/l* -l, expected %d, got %d", - NO_MATCH, result); - - // Test case : command match without wildcard but regex argument - command = command->next->next; - result = command_match(bin_ls_opt_l, - command); // /bin/ls -l vs /bin/ls -*(a|l) - cr_assert_eq( - result, PATH_STRICT_ARG_WILDCARD, - "Error: command_match() /bin/ls -l == /bin/ls -*(a|l), expected %d, got %d", - PATH_STRICT_ARG_WILDCARD, result); - tests[result] = result; - result = command_match(bin_ls_opt_a, - command); // /bin/ls -a vs /bin/ls -*(a|l) - cr_assert_eq( - result, PATH_STRICT_ARG_WILDCARD, - "Error: command_match() /bin/ls -a == /bin/ls -*(a|l), expected %d, got %d", - PATH_STRICT_ARG_WILDCARD, result); - result = command_match(bin_ls_opt_la, - command); // /bin/ls -la vs /bin/ls -*(a|l) - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -la == /bin/ls -*(a|l), expected %d, got %d", - NO_MATCH, result); - result = command_match(bin_ls_opt_al, - command); // /bin/ls -al vs /bin/ls -*(a|l) - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -al == /bin/ls -*(a|l), expected %d, got %d", - NO_MATCH, result); - result = command_match(bin_ls_lopt_l, - command); // /bin/ls --l vs /bin/ls -*(a|l) - cr_assert_eq( - result, PATH_STRICT_ARG_WILDCARD, - "Error: command_match() /bin/ls --l == /bin/ls -*(a|l), expected %d, got %d", - PATH_STRICT_ARG_WILDCARD, result); - - // Test case : command match with wildcard but no arguments - command = command->next->next; - result = command_match(bin_ls, command); // /bin/ls vs /bin/l* - cr_assert_eq( - result, PATH_WILDCARD, - "Error: command_match() /bin/ls == /bin/l*, expected %d, got %d", - PATH_WILDCARD, result); - tests[result] = result; - result = command_match(bin_ls_opt_l, command); // /bin/ls -l vs /bin/l* - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/ls -l == /bin/l*, expected %d, got %d", - NO_MATCH, result); - result = command_match(bin_lsa, command); // /bin/lsa vs /bin/l* - cr_assert_eq( - result, PATH_WILDCARD, - "Error: command_match() /bin/lsa == /bin/l*, expected %d, got %d", - PATH_WILDCARD, result); - result = - command_match(bin_lsa_opt_a, command); // /bin/lsa -a vs /bin/l* - cr_assert_eq( - result, NO_MATCH, - "Error: command_match() /bin/lsa -a == /bin/l*, expected %d, got %d", - NO_MATCH, result); - - // Test case : command match with wildcard and regex argument - command = command->next->next; - result = command_match(bin_ls_opt_l, - command); // /bin/ls -l vs /bin/l* -(l|a)* - cr_assert_eq( - result, PATH_ARG_WILDCARD, - "Error: command_match() /bin/ls -l == /bin/l* -(l|a)*, expected %d, got %d", - PATH_ARG_WILDCARD, result); - tests[result] = result; - result = command_match(bin_ls_opt_a, - command); // /bin/ls -a vs /bin/l* -(l|a)* - cr_assert_eq( - result, PATH_ARG_WILDCARD, - "Error: command_match() /bin/ls -a == /bin/l* -(l|a)*, expected %d, got %d", - PATH_ARG_WILDCARD, result); - result = command_match(bin_ls_opt_la, - command); // /bin/ls -la vs /bin/l* -(l|a)* - cr_assert_eq( - result, PATH_ARG_WILDCARD, - "Error: command_match() /bin/ls -la == /bin/l* -(l|a)*, expected %d, got %d", - PATH_ARG_WILDCARD, result); - result = command_match(bin_lsa_opt_a, - command); // /bin/lsa -a vs /bin/l* -(l|a)* - cr_assert_eq( - result, PATH_ARG_WILDCARD, - "Error: command_match() /bin/lsa -a == /bin/l* -(l|a)*, expected %d, got %d", - PATH_ARG_WILDCARD, result); - - //Test 0,1,2,3,4,5,6,7,8,9,10 - int expected[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - cr_assert_arr_eq(tests, expected, 11, - "Error: command_match() failed to match all tests"); - xmlFreeDoc(doc); -} - -// Define the test suite -Test(count_matching_groups, test_matching_groups) -{ - char *names = "group1,group2,group3"; - char *groups[] = { "group1", "group2", "group3" }; - int nb_groups = 3; - unsigned int all; - unsigned int result = - count_matching_groups(names, groups, nb_groups, &all, GROUP_SEPARATOR); - cr_assert_eq(result, 3, "Expected 3 matching groups, but got %d", - result); - cr_assert_eq(all, 3, "Expected 3 total groups, but got %d", all); -} - -Test(count_matching_groups, test_non_matching_groups) -{ - char *names = "group1,group2,group3"; - char *groups[] = { "group1", "group2", "group4" }; - int nb_groups = 3; - unsigned int all; - unsigned int result = - count_matching_groups(names, groups, nb_groups, &all, GROUP_SEPARATOR); - cr_assert_eq(result, 0, "Expected 0 matching groups, but got %d", - result); - cr_assert_eq(all, 3, "Expected 3 total groups, but got %d", all); -} - -Test(count_matching_groups, test_partial_matching_groups) -{ - char *names = "group1,group2,group3"; - char *groups[] = { "group1", "group2", "group3", - "group4", "group6", "group5" }; - int nb_groups = 6; - unsigned int all; - unsigned int result = - count_matching_groups(names, groups, nb_groups, &all, GROUP_SEPARATOR); - cr_assert_eq(result, 3, "Expected 3 matching group, but got %d", - result); - cr_assert_eq(all, 3, "Expected 3 total groups, but got %d", all); -} - -Test(expr_user_or_groups, test1) -{ - // Test with valid user and group - char *user = "john"; - char *groups[] = { "developers", "designers" }; - int nb_groups = 2; - xmlChar *expr; - int result = __expr_user_or_groups(&expr, user, groups, nb_groups); - cr_assert_eq(result, 107, "Expected 107, but got %d", result); - cr_assert_str_eq( - (char *)expr, - "actors/user[@name='john'] or actors/group[contains(@names, 'developers') or contains(@names, 'designers')]", - "Expression does not match expected value\n%s", expr); - xmlFree(expr); -} - -Test(expr_user_or_groups, test2) -{ - // Test with invalid user and group - char *user = "jane"; - char *groups[] = { "managers", "admins", "developers", "designers" }; - int nb_groups = 4; - xmlChar *expr; - int result = __expr_user_or_groups(&expr, user, groups, nb_groups); - cr_assert_eq(result, 169, "Expected 169, but got %d", result); - cr_assert_str_eq( - (char *)expr, - "actors/user[@name='jane'] or actors/group[contains(@names, 'managers') or contains(@names, 'admins') or contains(@names, 'developers') or contains(@names, 'designers')]", - "Expression does not match expected value\n%s", expr); - xmlFree(expr); -} - -Test(expr_user_or_groups, test3) -{ - // Test with invalid user and valid group - char *user = "jane"; - char *groups[] = { "developers" }; - int nb_groups = 1; - xmlChar *expr; - int result = __expr_user_or_groups(&expr, user, groups, nb_groups); - cr_assert_eq(result, 74, "Expected 74, but got %d", result); - cr_assert_str_eq( - (char *)expr, - "actors/user[@name='jane'] or actors/group[contains(@names, 'developers')]", - "Expression does not match expected value\n%s", expr); - xmlFree(expr); -} - -Test(expr_user_or_groups, test4) -{ - // Test with valid user and invalid group - char *user = "john"; - char *groups[] = { "managers" }; - int nb_groups = 1; - xmlChar *expr; - int result = __expr_user_or_groups(&expr, user, groups, nb_groups); - cr_assert_eq(result, 72, "Expected 72, but got %d", result); - cr_assert_str_eq( - (char *)expr, - "actors/user[@name='john'] or actors/group[contains(@names, 'managers')]", - "Expression obtained does not match expected value : \n%s", - expr); - xmlFree(expr); -} - -Test(expr_search_role_by_usergroup_command, test1) -{ - // Test with valid user and group - xmlChar *expr; - user_t *user_struct = &(struct s_user){ - .name = "john", - .groups = malloc(sizeof(char *) * 2), - .nb_groups = 2, - }; - user_struct->groups[0] = "managers"; - user_struct->groups[1] = "designers"; - expr = expr_search_role_by_usergroup(user_struct); - cr_assert_str_eq( - (char *)expr, - "//role[actors/user[@name='john'] or actors/group[contains(@names, 'managers') or contains(@names, 'designers')]]", - "Expression does not match expected value\n%s", expr); - xmlFree(expr); -} - -Test(actors_match, match_user) -{ - char **groups = malloc(sizeof(char *) * 2); - groups[0] = "users"; - groups[1] = "admin"; - user_t user = { .name = "Alice", .groups = groups, .nb_groups = 2 }; - xmlNodePtr actors = xmlNewNode(NULL, (xmlChar *)"actors"); - xmlNodePtr xuser = xmlNewChild(actors, NULL, (xmlChar *)"user", NULL); - xmlNewProp(xuser, (xmlChar *)"name", (xmlChar *)"Alice"); - score_t score = actors_match(&user, actors); - cr_assert_eq(score, 1, "Expected score to be 1, but got %d", score); - xmlFreeNode(actors); - free(groups); -} - -Test(actors_match, match_group) -{ - char **groups = malloc(sizeof(char *) * 2); - groups[0] = "users"; - groups[1] = "guests"; - user_t user = { .name = "Bob", .groups = groups, .nb_groups = 2 }; - xmlNodePtr actors = xmlNewNode(NULL, (xmlChar *)"actors"); - xmlNodePtr xgroup = xmlNewChild(actors, NULL, (xmlChar *)"group", NULL); - xmlNewProp(xgroup, (xmlChar *)"names", (xmlChar *)"users,guests"); - score_t score = actors_match(&user, actors); - cr_assert_eq(score, (score_t)-4, "Expected score to be -4, but got %d", score); - xmlFreeNode(actors); - free(groups); -} - -Test(actors_match, match_max_group) -{ - char **groups = malloc(sizeof(char *) * 1); - groups[0] = "guests"; - user_t user = { .name = "Charlie", .groups = groups, .nb_groups = 1 }; - xmlNodePtr actors = xmlNewNode(NULL, (xmlChar *)"actors"); - xmlNodePtr xgroup = xmlNewChild(actors, NULL, (xmlChar *)"group", NULL); - xmlNewProp(xgroup, (xmlChar *)"names", (xmlChar *)"guests,users"); - score_t score = actors_match(&user, actors); - cr_assert_eq(score, 0, "Expected score to be 0, but got %d", score); - xmlFreeNode(actors); - free(groups); -} - -Test(actors_match, unknown_error) -{ - char **groups = malloc(sizeof(char *) * 2); - user_t user = { .name = "Dave", .groups = groups, .nb_groups = 0 }; - xmlNodePtr actors = xmlNewNode(NULL, (xmlChar *)"actors"); - score_t score = actors_match(&user, actors); - cr_assert_eq(score, 0, "Expected score to be 0, but got %d", score); - xmlFreeNode(actors); - free(groups); -} - -Test(setuser_min, test1) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setuser", (xmlChar *)"user"); - score_t score = setuser_min(task, &settings); - cr_assert_eq(SETUID, score, "Expected score to be %d, but got %d", - SETUID, score); -} - -Test(setuser_min, test2) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setuser", (xmlChar *)"root"); - score_t score = setuser_min(task, &settings); - cr_assert_eq(SETUID_ROOT, score, "Expected score to be %d, but got %d", - SETUID_ROOT, score); -} - -Test(setuser_min, test3) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - score_t score = setuser_min(task, &settings); - cr_assert_eq(NO_SETUID_NO_SETGID, score, - "Expected score to be %d, but got %d", NO_SETUID_NO_SETGID, - score); - xmlNewProp(task, (xmlChar *)"setuser", (xmlChar *)""); - score = setuser_min(task, &settings); - cr_assert_eq(NO_SETUID_NO_SETGID, score, - "Expected score to be %d, but got %d", NO_SETUID_NO_SETGID, - score); -} - -Test(setuser_min, test4) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setuser", (xmlChar *)"root"); - score_t score = setuser_min(task, &settings); - cr_assert_eq(SETUID, score, "Expected score to be %d, but got %d", - SETUID, score); -} - -Test(setgid_min, test_no_setuid_no_setgid) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - score_t nb_setgid = -1; - score_t score = - setgid_min(task, &settings, NO_SETUID_NO_SETGID, &nb_setgid); - cr_assert_eq(NO_SETUID_NO_SETGID, score, - "Expected score to be %d, but got %d", NO_SETUID_NO_SETGID, - score); - cr_assert_eq(-1, nb_setgid, "Expected nb_setgid to be %d, but got %d", - -1, nb_setgid); -} - -Test(setgid_min, test_setuid) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - score_t nb_setgid = -1; - score_t score = setgid_min(task, &settings, SETUID, &nb_setgid); - cr_assert_eq(SETUID, score, "Expected score to be %d, but got %d", - SETUID, score); - cr_assert_eq(-1, nb_setgid, "Expected nb_setgid to be %d, but got %d", - -1, nb_setgid); -} - -Test(setgid_min, test_no_setuid_setgid) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setgroups", (xmlChar *)"test"); - score_t nb_setgid = -1; - score_t score = - setgid_min(task, &settings, NO_SETUID_NO_SETGID, &nb_setgid); - cr_assert_eq(SETGID, score, "Expected score to be %d, but got %d", - SETGID, score); - cr_assert_eq(1, nb_setgid, "Expected nb_setgid to be %d, but got %d", 1, - nb_setgid); -} - -Test(setgid_min, test_setuid_setgid) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setgroups", (xmlChar *)"group1,group2"); - score_t nb_setgid = -1; - score_t score = setgid_min(task, &settings, SETUID, &nb_setgid); - cr_assert_eq(SETUID_SETGID, score, - "Expected score to be %d, but got %d", SETUID_SETGID, - score); - cr_assert_eq(2, nb_setgid, "Expected nb_setgid to be %d, but got %d", 2, - nb_setgid); -} - -Test(setgid_min, test_setgid_root) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setgroups", (xmlChar *)"root"); - score_t nb_setgid = -1; - score_t score = - setgid_min(task, &settings, NO_SETUID_NO_SETGID, &nb_setgid); - cr_assert_eq(SETGID_ROOT, score, "Expected score to be %d, but got %d", - SETGID_ROOT, score); - cr_assert_eq(1, nb_setgid, "Expected nb_setgid to be %d, but got %d", 1, - nb_setgid); - settings.disable_root = 1; - score = setgid_min(task, &settings, NO_SETUID_NO_SETGID, &nb_setgid); - cr_assert_eq(SETGID, score, "Expected score to be %d, but got %d", - SETGID, score); -} - -Test(setgid_min, test_notroot_setuid_setgid_root) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setgroups", - (xmlChar *)"root,group1,group2"); - score_t nb_setgid = -1; - score_t score = setgid_min(task, &settings, SETUID, &nb_setgid); - cr_assert_eq(SETUID_NOTROOT_SETGID_ROOT, score, - "Expected score to be %d, but got %d", - SETUID_NOTROOT_SETGID_ROOT, score); - cr_assert_eq(3, nb_setgid, "Expected nb_setgid to be %d, but got %d", 3, - nb_setgid); - settings.disable_root = 1; - score = setgid_min(task, &settings, SETUID, &nb_setgid); - cr_assert_eq(SETUID_SETGID, score, - "Expected score to be %d, but got %d", SETUID_SETGID, - score); -} - -Test(setgid_min, test_setuid_root_setgid) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setgroups", (xmlChar *)"test"); - score_t nb_setgid = -1; - score_t score = setgid_min(task, &settings, SETUID_ROOT, &nb_setgid); - cr_assert_eq(SETUID_ROOT_SETGID, score, - "Expected score to be %d, but got %d", SETUID_ROOT_SETGID, - score); - cr_assert_eq(1, nb_setgid, "Expected nb_setgid to be %d, but got %d", 1, - nb_setgid); -} - -Test(setgid_min, test_setuid_setgid_root) -{ - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setgroups", (xmlChar *)"root"); - score_t nb_setgid = -1; - score_t score = setgid_min(task, &settings, SETUID_ROOT, &nb_setgid); - cr_assert_eq(SETUID_SETGID_ROOT, score, - "Expected score to be %d, but got %d", SETUID_SETGID_ROOT, - score); - cr_assert_eq((score_t)1, nb_setgid, - "Expected nb_setgid to be %lu, but got %lu", (score_t)1, - nb_setgid); - settings.disable_root = 1; - score = setgid_min(task, &settings, SETUID_ROOT, &nb_setgid); - cr_assert_eq(SETUID_ROOT_SETGID, score, - "Expected score to be %d, but got %d", SETUID_ROOT_SETGID, - score); -} - -Test(get_setuid_min, test1) -{ - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setuser", (xmlChar *)"root"); - xmlNewProp(task, (xmlChar *)"setgroups", - (xmlChar *)"root,group1,group2"); - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - score_t nb_setgid = -1; - score_t score = get_setuid_min(task, &settings, &nb_setgid); - cr_assert_eq(SETUID_SETGID_ROOT, score, - "Expected score to be %d, but got %d", SETUID_SETGID_ROOT, - score); - cr_assert_eq(3, nb_setgid, "Expected nb_setgid to be %d, but got %d", 3, - nb_setgid); -} - -Test(set_task_min, test1) -{ - xmlNodePtr task = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task, (xmlChar *)"setuser", (xmlChar *)"root"); - xmlNewProp(task, (xmlChar *)"setgroups", - (xmlChar *)"root,group1,group2"); - xmlNewProp(task, (xmlChar *)"capabilities", (xmlChar *)"aLl"); - xmlNodePtr node = xmlNewChild(task, NULL, (xmlChar *)"command", NULL); - xmlNodeSetContent(node, (xmlChar *)"/bin/ls"); - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 0, - .apply_bounding = 0, - .iab = NULL, - }; - cmd_t cmd = (struct s_cmd){ - .command = "/bin/ls", - .argv = NULL, - .argc = 0, - }; - score_t nb_setgid = -1, cmd_min = -1, caps_min = -1, setuid_min = -1; - score_t ret = task_match(&cmd, task, &settings, &cmd_min, &caps_min, - &setuid_min, &nb_setgid); - cr_assert_eq(1, ret, "Expected ret to be %d, but got %d", 1, ret); - cr_assert_eq(SETUID_SETGID_ROOT, setuid_min, - "Expected setuid_min to be %d, but got %d", - SETUID_SETGID_ROOT, setuid_min); - cr_assert_eq(3, nb_setgid, "Expected nb_setgid to be %d, but got %d", 3, - nb_setgid); - cr_assert_eq(PATH_STRICT, cmd_min, - "Expected cmd_min to be %d, but got %d", PATH_STRICT, - cmd_min); - cr_assert_eq(CAPS_ALL, caps_min, - "Expected caps_min to be %d, but got %d", CAPS_ALL, - caps_min); - - xmlNodePtr task2 = xmlNewNode(NULL, (xmlChar *)"task"); - xmlNewProp(task2, (xmlChar *)"setuser", (xmlChar *)"root"); - xmlNewProp(task2, (xmlChar *)"setgroups", - (xmlChar *)"root,group1,group2"); - xmlNewProp(task2, (xmlChar *)"capabilities", - (xmlChar *)"cap_sys_admin,cap_dac_override"); - xmlNodePtr xmlnewcmd = - xmlNewChild(task2, NULL, (xmlChar *)"command", NULL); - xmlNodeSetContent(xmlnewcmd, (xmlChar *)"/bin/ls"); - xmlNodePtr min_task = NULL; - score_t security_min = -1; - int res = - set_task_min(&cmd, task2, &min_task, &settings, &cmd_min, - &caps_min, &setuid_min, &nb_setgid, &security_min); - - cr_assert_eq(SETUID_SETGID_ROOT, setuid_min, - "Expected setuid_min to be %d, but got %d", - SETUID_SETGID_ROOT, setuid_min); - cr_assert_eq(3, nb_setgid, "Expected nb_setgid to be %d, but got %d", 3, - nb_setgid); - cr_assert_eq(PATH_STRICT, cmd_min, - "Expected cmd_min to be %d, but got %d", PATH_STRICT, - cmd_min); - cr_assert_eq(CAPS_ADMIN, caps_min, - "Expected caps_min to be %d, but got %d", CAPS_ADMIN, - caps_min); - cr_assert_eq(ENABLE_ROOT_DISABLE_BOUNDING, security_min, - "Expected security_min to be %d, but got %d", - ENABLE_ROOT_DISABLE_BOUNDING, security_min); - cr_assert_eq(min_task, task2); - cr_assert_eq(1, res, "Expected res to be %d, but got %d", 1, res); -} - -Test(min_partial_order_role, test1) -{ - xmlNodePtr role1 = xmlNewNode(NULL, (xmlChar *)"role"); - xmlNewProp(role1, (xmlChar *)"name", (xmlChar *)"role1"); - xmlNodePtr actors = xmlNewChild(role1, NULL, (xmlChar *)"actors", NULL); - xmlNodePtr rootuser = - xmlNewChild(actors, NULL, (xmlChar *)"user", NULL); - xmlNewProp(rootuser, (xmlChar *)"name", (xmlChar *)"root"); - xmlNodePtr task = xmlNewChild(role1, NULL, (xmlChar *)"task", NULL); - xmlAddNextSibling(task, NULL); - xmlNodePtr xmlcmd = xmlNewChild(task, NULL, (xmlChar *)"command", NULL); - xmlNodeSetContent(xmlcmd, (xmlChar *)"/bin/ls"); - xmlNodePtr xmlsettings = - xmlNewChild(task, NULL, (xmlChar *)"options", NULL); - xmlNodePtr xmlpath = - xmlNewChild(xmlsettings, NULL, (xmlChar *)"path", NULL); - xmlChar *path = (xmlChar *)"somepath"; - xmlNodeSetContent(xmlpath, path); - xmlNodePtr xmlcaps = - xmlNewChild(xmlsettings, NULL, (xmlChar *)"allow-root", NULL); - xmlNewProp(xmlcaps, (xmlChar *)"enforced", (xmlChar *)"true"); - xmlNodePtr xmlsetuid = xmlNewChild(xmlsettings, NULL, - (xmlChar *)"allow-bounding", NULL); - xmlNewProp(xmlsetuid, (xmlChar *)"enforced", (xmlChar *)"true"); - settings_t settings = { - .env_keep = NULL, - .env_check = NULL, - .path = NULL, - .role = NULL, - .setuid = NULL, - .setgid = NULL, - .disable_root = 1, - .apply_bounding = 1, - .iab = NULL, - }; - cmd_t cmd = (struct s_cmd){ - .command = "/bin/ls", - .argv = NULL, - .argc = 0, - }; - user_t user = { - .nb_groups = 0, - .groups = NULL, - .name = "root", - }; - xmlNodePtr matched_role = NULL; - xmlNodePtr matched_task = NULL; - score_t user_min = -1, cmd_min = -1, caps_min = -1, setuid_min = -1, - setgid_min = -1, security_min = -1; - int n_roles = 0; - min_partial_order_role(role1, &user, &cmd, &user_min, &cmd_min, - &caps_min, &setuid_min, &setgid_min, - &security_min, &matched_role, &matched_task, - &settings, &n_roles); - cr_assert_eq(1, n_roles, "Expected n_roles to be %d, but got %d", 1, - n_roles); - cr_assert_eq(user_min, 1, "Expected user_min to be %d, but got %d", 1, - user_min); - cr_assert_eq(cmd_min, PATH_STRICT, - "Expected cmd_min to be %d, but got %d", PATH_STRICT, - cmd_min); - cr_assert_eq(caps_min, NO_CAPS, - "Expected caps_min to be %d, but got %d", NO_CAPS, - caps_min); - cr_assert_eq(setuid_min, NO_SETUID_NO_SETGID, - "Expected setuid_min to be %d, but got %d", - NO_SETUID_NO_SETGID, setuid_min); - cr_assert_eq(setgid_min, -1, "Expected setgid_min to be %d, but got %d", - -1, setgid_min); - cr_assert_eq(security_min, ENABLE_ROOT_DISABLE_BOUNDING, - "Expected security_min to be %d, but got %d", - DISABLE_BOUNDING, security_min); - cr_assert_eq(matched_role, role1); - cr_assert_eq(matched_task, task); - cr_assert_eq(strncmp(settings.path, (char *)path, 9), 0, - "Expected settings.path to be %s, but got %s", path, - settings.path); - - xmlNodePtr role2 = xmlNewNode(NULL, (xmlChar *)"role"); - xmlNewProp(role2, (xmlChar *)"name", (xmlChar *)"role2"); - xmlNodePtr actors2 = - xmlNewChild(role2, NULL, (xmlChar *)"actors", NULL); - xmlNodePtr rootuser2 = - xmlNewChild(actors2, NULL, (xmlChar *)"user", NULL); - xmlNewProp(rootuser2, (xmlChar *)"name", (xmlChar *)"root"); - xmlNodePtr task2 = xmlNewChild(role2, NULL, (xmlChar *)"task", NULL); - xmlNodePtr xmlcmd2 = - xmlNewChild(task2, NULL, (xmlChar *)"command", NULL); - xmlNodeSetContent(xmlcmd2, (xmlChar *)"/bin/ls"); - xmlNodePtr xmlsettings2 = - xmlNewChild(task2, NULL, (xmlChar *)"options", NULL); - xmlNodePtr xmlpath2 = - xmlNewChild(xmlsettings2, NULL, (xmlChar *)"path", NULL); - xmlChar *path2 = (xmlChar *)"somepath2"; - xmlNodeSetContent(xmlpath2, path2); - xmlNewChild(role2, NULL, NULL, NULL); - - min_partial_order_role(role2, &user, &cmd, &user_min, &cmd_min, - &caps_min, &setuid_min, &setgid_min, - &security_min, &matched_role, &matched_task, - &settings, &n_roles); - - cr_assert_eq(1, n_roles, "Expected n_roles to be %d, but got %d", 1, - n_roles); - cr_assert_eq(user_min, 1, "Expected user_min to be %d, but got %d", 1, - user_min); - cr_assert_eq(cmd_min, PATH_STRICT, - "Expected cmd_min to be %d, but got %d", PATH_STRICT, - cmd_min); - cr_assert_eq(caps_min, NO_CAPS, - "Expected caps_min to be %d, but got %d", NO_CAPS, - caps_min); - cr_assert_eq(setuid_min, NO_SETUID_NO_SETGID, - "Expected setuid_min to be %d, but got %d", - NO_SETUID_NO_SETGID, setuid_min); - cr_assert_eq(setgid_min, -1, "Expected setgid_min to be %d, but got %d", - -1, setgid_min); - cr_assert_eq(security_min, NO_ROOT_WITH_BOUNDING, - "Expected security_min to be %d, but got %d", - NO_ROOT_WITH_BOUNDING, security_min); - cr_assert_eq(matched_role, role2); - cr_assert_eq(matched_task, task2); - cr_assert_eq(strncmp(settings.path, (char *)path2, 10), 0, - "Expected settings.path to be %s, but got %s", path2, - settings.path); -} - -struct cap_iab_s { - __u32 i[64]; - __u32 a[64]; - __u32 nb[64]; -}; - -Test(get_settings_from_config, test1) -{ - user_t user = { - .nb_groups = 0, - .groups = NULL, - .name = "test1", - }; - cmd_t cmd = (struct s_cmd){ - .command = "/bin/ls", - .argv = NULL, - .argc = 0, - }; - settings_t settings; - - settings_t sdefault; - set_default_options(&sdefault); - char filepath[PATH_MAX] = { 0 }; - getcwd(filepath, PATH_MAX); - strncat(filepath, "/tests/resources/test_xml_manager_case1.xml", 44); - xmlDocPtr doc = load_xml(filepath); - int res = get_settings_from_doc_by_partial_order(doc, &user, &cmd, &settings); - cr_assert_eq( - res, 1, - "Expected get_settings_from_config to return %d, but got %d", 1, - res); - /**cap_iab_t expected = cap_get_proc(); - for (int j = 0; j < 64; j++) { - cr_assert_eq(settings.iab->i[j], expected->nb[j], - "Expected settings->iab.i[%d] to be %d, but got %d", - j, expected->nb[j], settings.iab->i[j]); - cr_assert_eq(settings.iab->a[j], expected->nb[j], - "Expected settings->iab.a[%d] to be %d, but got %d", - j, expected->nb[j], settings.iab->a[j]); - cr_assert_eq(settings.iab->nb[j], expected->nb[j], - "Expected settings->iab.nb[%d] to be %d, but got %d", - j, expected->nb[j], settings.iab->nb[j]); - }**/ - /**cr_assert_eq(cap_iab_compare(settings.iab, sdefault.iab), 0, - "Expected settings->iab to be %s, but got %s", - cap_iab_to_text(sdefault.iab), cap_iab_to_text(settings.iab));**/ - cr_assert_eq(settings.setuid, NULL, - "Expected settings->setuid to be %s, but got %s", NULL, - settings.setuid); - cr_assert_eq(settings.setgid, NULL, - "Expected settings->setgid to be %s, but got %s", NULL, - settings.setgid); - cr_assert_eq(settings.apply_bounding, 1, - "Expected settings->apply_bounding to be %d, but got %d", - 1, settings.apply_bounding); - cr_assert_eq(settings.disable_root, 1, - "Expected settings->disable_root to be %d, but got %d", 1, - settings.disable_root); - cr_assert_eq(settings.env_check, sdefault.env_check, - "Expected settings->env_check to be %s, but got %s", - sdefault.env_check, settings.env_check); - cr_assert_eq(settings.env_keep, sdefault.env_keep, - "Expected settings->env_keep to be %s, but got %s", - sdefault.env_keep, settings.env_keep); - int cmp = strncmp(settings.path, "t1_test2", 8); - cr_assert_eq(cmp, 0, - "Expected settings->path to be t1_test2, but got %s", - settings.path); - cr_assert_eq(strncmp(settings.role, "test1", 5), 0, - "Expected settings->role to be test1, but got %s", - settings.role); -} - -Test(include_parents_from_set, test_with_xml) -{ - char filepath[PATH_MAX] = { 0 }; - getcwd(filepath, PATH_MAX); - strncat(filepath, "/tests/resources/test_xml_manager_hierarchy.xml", 48); - xmlDocPtr doc = load_xml(filepath); - user_t user = { - .nb_groups = 0, - .groups = NULL, - .name = "test1", - }; - xmlNodeSetPtr set = find_role_by_usergroup(doc, &user); - cr_assert_not_null(set, "Expected list to be not null"); - cr_assert_eq(set->nodeNr, 1, "Expected list to have 1 element"); - include_parents_from_set(doc,&set); - -} \ No newline at end of file From 1a5a24a209fa1172230ce744ab98308237a316db Mon Sep 17 00:00:00 2001 From: LeChatP Date: Sun, 14 Apr 2024 09:02:05 +0200 Subject: [PATCH 04/42] It compiles --- Cargo.toml | 8 + Makefile | 8 +- capable-ebpf/src/main.rs | 2 +- capable-ebpf/src/vmlinux.rs | 67896 +++++++++++++------------ capable/src/main.rs | 10 +- resources/rootasrole.json | 8 +- src/api.rs | 2 +- src/chsr/checklist.rs | 1183 - src/chsr/cli.pest | 198 + src/chsr/cli.rs | 1081 +- src/chsr/main.rs | 80 +- src/chsr/rolemanager.rs | 505 - src/chsr/state.rs | 304 - src/chsr/state/actor.rs | 671 - src/chsr/state/command.rs | 181 - src/chsr/state/common.rs | 173 - src/chsr/state/options.rs | 159 - src/chsr/state/role.rs | 356 - src/chsr/state/task.rs | 436 - src/config.rs | 8 +- src/{sr => database}/finder.rs | 67 +- src/database/mod.rs | 21 +- src/database/options.rs | 227 +- src/database/structs.rs | 162 +- src/descriptions.rs | 290 +- src/mod.rs | 39 +- src/plugin/hashchecker.rs | 2 +- src/plugin/ssd.rs | 5 +- src/sr/command.rs | 46 - src/sr/main.rs | 166 +- src/sr/timeout.rs | 2 +- src/util.rs | 2 +- sudoers-reader/grammar/sudoers.pest | 2 +- tests/pest/chsr/help_test.txt | 12 + tests/pest/chsr/timeout_set_test.txt | 18 + 35 files changed, 36338 insertions(+), 37992 deletions(-) delete mode 100644 src/chsr/checklist.rs create mode 100644 src/chsr/cli.pest delete mode 100644 src/chsr/rolemanager.rs delete mode 100644 src/chsr/state.rs delete mode 100644 src/chsr/state/actor.rs delete mode 100644 src/chsr/state/command.rs delete mode 100644 src/chsr/state/common.rs delete mode 100644 src/chsr/state/options.rs delete mode 100644 src/chsr/state/role.rs delete mode 100644 src/chsr/state/task.rs rename src/{sr => database}/finder.rs (95%) create mode 100644 tests/pest/chsr/help_test.txt create mode 100644 tests/pest/chsr/timeout_set_test.txt diff --git a/Cargo.toml b/Cargo.toml index 91871883..8262ded3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,9 +55,17 @@ md5 = "0.7.0" chrono = "0.4.37" pty-process = "0.4.0" once_cell = "1.19.0" +ratatui = "0.26.1" +crossterm = "0.27.0" +pest = "2.7.8" +pest_derive = "2.7.8" +phf = { version = "0.11.2", features = ["macros"] } [dev-dependencies] env_logger = "*" test-log = { version = "0.2.12", features = ["trace"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", default-features = false, features = ["env-filter", "fmt"] } +pest-test-gen = "0.1.7" +pest-test = "0.1.6" +lazy_static = "1.4.0" diff --git a/Makefile b/Makefile index b86e1c27..82a3d974 100644 --- a/Makefile +++ b/Makefile @@ -6,14 +6,14 @@ SR_VERSION = $(shell xmllint --xpath "string(/rootasrole/@version)" resources/ro BINS := $(addprefix $(BIN_DIR)/,sr chsr capable) .PHONY: $(BIN_DIR)/sr $(BIN_DIR)/chsr $(BIN_DIR)/sr: - cargo build $(RELEASE) --bin sr + cargo build $(RELEASE) --bin sr || true $(BIN_DIR)/chsr: - cargo build $(RELEASE) --bin chsr + cargo build $(RELEASE) --bin chsr || true $(BIN_DIR)/capable: - cargo xtask build-ebpf $(RELEASE) - cargo build --package capable $(RELEASE) + cargo xtask build-ebpf $(RELEASE) || true + cargo build --package capable $(RELEASE) || true $(BINS): | $(BIN_DIR) diff --git a/capable-ebpf/src/main.rs b/capable-ebpf/src/main.rs index 9be1db9a..dbd28cfc 100644 --- a/capable-ebpf/src/main.rs +++ b/capable-ebpf/src/main.rs @@ -8,7 +8,7 @@ #[allow(dead_code)] mod vmlinux; -use aya_bpf::{macros::{kprobe,map}, maps::HashMap, programs::ProbeContext, helpers::{bpf_get_current_task, bpf_get_current_uid_gid, bpf_probe_read_kernel}}; +use aya_ebpf::{macros::{kprobe,map}, maps::HashMap, programs::ProbeContext, helpers::{bpf_get_current_task, bpf_get_current_uid_gid, bpf_probe_read_kernel}}; use vmlinux::{task_struct, nsproxy, pid_namespace, ns_common}; const MAX_PID : u32 = 4*1024*1024; diff --git a/capable-ebpf/src/vmlinux.rs b/capable-ebpf/src/vmlinux.rs index ac92a6df..2c6651e3 100644 --- a/capable-ebpf/src/vmlinux.rs +++ b/capable-ebpf/src/vmlinux.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.69.4 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] @@ -135,7 +135,7 @@ impl ::core::default::Default for __BindgenUnionField { impl ::core::clone::Clone for __BindgenUnionField { #[inline] fn clone(&self) -> Self { - Self::new() + *self } } impl ::core::marker::Copy for __BindgenUnionField {} @@ -153,16 +153,16 @@ impl ::core::cmp::PartialEq for __BindgenUnionField { } } impl ::core::cmp::Eq for __BindgenUnionField {} -pub type __u64 = ::aya_bpf::cty::c_ulonglong; +pub type __u64 = ::aya_ebpf::cty::c_ulonglong; pub type u64_ = __u64; pub type bool_ = bool; -pub type __s8 = ::aya_bpf::cty::c_schar; -pub type __u8 = ::aya_bpf::cty::c_uchar; -pub type __s16 = ::aya_bpf::cty::c_short; -pub type __u16 = ::aya_bpf::cty::c_ushort; -pub type __s32 = ::aya_bpf::cty::c_int; -pub type __u32 = ::aya_bpf::cty::c_uint; -pub type __s64 = ::aya_bpf::cty::c_longlong; +pub type __s8 = ::aya_ebpf::cty::c_schar; +pub type __u8 = ::aya_ebpf::cty::c_uchar; +pub type __s16 = ::aya_ebpf::cty::c_short; +pub type __u16 = ::aya_ebpf::cty::c_ushort; +pub type __s32 = ::aya_ebpf::cty::c_int; +pub type __u32 = ::aya_ebpf::cty::c_uint; +pub type __s64 = ::aya_ebpf::cty::c_longlong; pub type s8 = __s8; pub type u8_ = __u8; pub type s16 = __s16; @@ -170,36 +170,36 @@ pub type u16_ = __u16; pub type s32 = __s32; pub type u32_ = __u32; pub type s64 = __s64; -pub type __kernel_long_t = ::aya_bpf::cty::c_long; -pub type __kernel_ulong_t = ::aya_bpf::cty::c_ulong; -pub type __kernel_pid_t = ::aya_bpf::cty::c_int; -pub type __kernel_uid32_t = ::aya_bpf::cty::c_uint; -pub type __kernel_gid32_t = ::aya_bpf::cty::c_uint; +pub type __kernel_long_t = ::aya_ebpf::cty::c_long; +pub type __kernel_ulong_t = ::aya_ebpf::cty::c_ulong; +pub type __kernel_pid_t = ::aya_ebpf::cty::c_int; +pub type __kernel_uid32_t = ::aya_ebpf::cty::c_uint; +pub type __kernel_gid32_t = ::aya_ebpf::cty::c_uint; pub type __kernel_size_t = __kernel_ulong_t; -pub type __kernel_loff_t = ::aya_bpf::cty::c_longlong; -pub type __kernel_time64_t = ::aya_bpf::cty::c_longlong; +pub type __kernel_loff_t = ::aya_ebpf::cty::c_longlong; +pub type __kernel_time64_t = ::aya_ebpf::cty::c_longlong; pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = ::aya_bpf::cty::c_int; -pub type __kernel_clockid_t = ::aya_bpf::cty::c_int; -pub type __poll_t = ::aya_bpf::cty::c_uint; +pub type __kernel_timer_t = ::aya_ebpf::cty::c_int; +pub type __kernel_clockid_t = ::aya_ebpf::cty::c_int; +pub type __poll_t = ::aya_ebpf::cty::c_uint; pub type __kernel_dev_t = u32_; pub type dev_t = __kernel_dev_t; -pub type umode_t = ::aya_bpf::cty::c_ushort; +pub type umode_t = ::aya_ebpf::cty::c_ushort; pub type pid_t = __kernel_pid_t; pub type clockid_t = __kernel_clockid_t; pub type uid_t = __kernel_uid32_t; pub type gid_t = __kernel_gid32_t; pub type loff_t = __kernel_loff_t; +pub type ktime_t = s64; pub type sector_t = u64_; pub type blkcnt_t = u64_; -pub type gfp_t = ::aya_bpf::cty::c_uint; -pub type fmode_t = ::aya_bpf::cty::c_uint; +pub type gfp_t = ::aya_ebpf::cty::c_uint; +pub type fmode_t = ::aya_ebpf::cty::c_uint; pub type phys_addr_t = u64_; -pub type irq_hw_number_t = ::aya_bpf::cty::c_ulong; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct atomic_t { - pub counter: ::aya_bpf::cty::c_int, + pub counter: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -230,323 +230,212 @@ pub struct callback_head { pub func: ::core::option::Option, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct lock_class_key {} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_system_type { - pub name: *const ::aya_bpf::cty::c_char, - pub fs_flags: ::aya_bpf::cty::c_int, - pub init_fs_context: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_bpf::cty::c_int, - >, - pub parameters: *const fs_parameter_spec, - pub mount: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file_system_type, - arg2: ::aya_bpf::cty::c_int, - arg3: *const ::aya_bpf::cty::c_char, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> *mut dentry, - >, - pub kill_sb: ::core::option::Option, - pub owner: *mut module, - pub next: *mut file_system_type, - pub fs_supers: hlist_head, - pub s_lock_key: lock_class_key, - pub s_umount_key: lock_class_key, - pub s_vfs_rename_key: lock_class_key, - pub s_writers_key: [lock_class_key; 3usize], - pub i_lock_key: lock_class_key, - pub i_mutex_key: lock_class_key, - pub invalidate_lock_key: lock_class_key, - pub i_mutex_dir_key: lock_class_key, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct jump_entry { - pub code: s32, - pub target: s32, - pub key: ::aya_bpf::cty::c_long, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct static_key { - pub enabled: atomic_t, - pub __bindgen_anon_1: static_key__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union static_key__bindgen_ty_1 { - pub type_: ::aya_bpf::cty::c_ulong, - pub entries: *mut jump_entry, - pub next: *mut static_key_mod, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct static_key_true { - pub key: static_key, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct static_key_false { - pub key: static_key, +#[derive(Debug)] +pub struct cacheline_padding { + pub x: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kernel_symbol { - pub value_offset: ::aya_bpf::cty::c_int, - pub name_offset: ::aya_bpf::cty::c_int, - pub namespace_offset: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct qspinlock { - pub __bindgen_anon_1: qspinlock__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union qspinlock__bindgen_ty_1 { - pub val: atomic_t, - pub __bindgen_anon_1: qspinlock__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: qspinlock__bindgen_ty_1__bindgen_ty_2, +pub struct thread_info { + pub flags: ::aya_ebpf::cty::c_ulong, + pub syscall_work: ::aya_ebpf::cty::c_ulong, + pub status: u32_, + pub cpu: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct qspinlock__bindgen_ty_1__bindgen_ty_1 { - pub locked: u8_, - pub pending: u8_, +pub struct refcount_struct { + pub refs: atomic_t, } +pub type refcount_t = refcount_struct; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct qspinlock__bindgen_ty_1__bindgen_ty_2 { - pub locked_pending: u16_, - pub tail: u16_, +pub struct llist_node { + pub next: *mut llist_node, } -pub type arch_spinlock_t = qspinlock; #[repr(C)] #[derive(Copy, Clone)] -pub struct qrwlock { - pub __bindgen_anon_1: qrwlock__bindgen_ty_1, - pub wait_lock: arch_spinlock_t, +pub struct __call_single_node { + pub llist: llist_node, + pub __bindgen_anon_1: __call_single_node__bindgen_ty_1, + pub src: u16_, + pub dst: u16_, } #[repr(C)] #[derive(Copy, Clone)] -pub union qrwlock__bindgen_ty_1 { - pub cnts: atomic_t, - pub __bindgen_anon_1: qrwlock__bindgen_ty_1__bindgen_ty_1, +pub union __call_single_node__bindgen_ty_1 { + pub u_flags: ::aya_ebpf::cty::c_uint, + pub a_flags: atomic_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct qrwlock__bindgen_ty_1__bindgen_ty_1 { - pub wlocked: u8_, - pub __lstate: [u8_; 3usize], +pub struct load_weight { + pub weight: ::aya_ebpf::cty::c_ulong, + pub inv_weight: u32_, } -pub type arch_rwlock_t = qrwlock; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct lockdep_map {} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct raw_spinlock { - pub raw_lock: arch_spinlock_t, +pub struct rb_node { + pub __rb_parent_color: ::aya_ebpf::cty::c_ulong, + pub rb_right: *mut rb_node, + pub rb_left: *mut rb_node, } -pub type raw_spinlock_t = raw_spinlock; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ratelimit_state { - pub lock: raw_spinlock_t, - pub interval: ::aya_bpf::cty::c_int, - pub burst: ::aya_bpf::cty::c_int, - pub printed: ::aya_bpf::cty::c_int, - pub missed: ::aya_bpf::cty::c_int, - pub begin: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_ulong, -} -#[repr(C, packed)] #[derive(Debug, Copy, Clone)] -pub struct pi_entry { - pub fmt: *const ::aya_bpf::cty::c_char, - pub func: *const ::aya_bpf::cty::c_char, - pub file: *const ::aya_bpf::cty::c_char, - pub line: ::aya_bpf::cty::c_uint, - pub level: *const ::aya_bpf::cty::c_char, - pub subsys_fmt_prefix: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct _ddebug { - pub modname: *const ::aya_bpf::cty::c_char, - pub function: *const ::aya_bpf::cty::c_char, - pub filename: *const ::aya_bpf::cty::c_char, - pub format: *const ::aya_bpf::cty::c_char, - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, - pub key: _ddebug__bindgen_ty_1, +pub struct sched_avg { + pub last_update_time: u64_, + pub load_sum: u64_, + pub runnable_sum: u64_, + pub util_sum: u32_, + pub period_contrib: u32_, + pub load_avg: ::aya_ebpf::cty::c_ulong, + pub runnable_avg: ::aya_ebpf::cty::c_ulong, + pub util_avg: ::aya_ebpf::cty::c_ulong, + pub util_est: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub union _ddebug__bindgen_ty_1 { - pub dd_key_true: static_key_true, - pub dd_key_false: static_key_false, +#[derive(Debug, Copy, Clone)] +pub struct sched_entity { + pub load: load_weight, + pub run_node: rb_node, + pub deadline: u64_, + pub min_vruntime: u64_, + pub group_node: list_head, + pub on_rq: ::aya_ebpf::cty::c_uint, + pub exec_start: u64_, + pub sum_exec_runtime: u64_, + pub prev_sum_exec_runtime: u64_, + pub vruntime: u64_, + pub vlag: s64, + pub slice: u64_, + pub nr_migrations: u64_, + pub depth: ::aya_ebpf::cty::c_int, + pub parent: *mut sched_entity, + pub cfs_rq: *mut cfs_rq, + pub my_q: *mut cfs_rq, + pub runnable_weight: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub avg: sched_avg, } -impl _ddebug { - #[inline] - pub fn lineno(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 18u8) as u32) } - } - #[inline] - pub fn set_lineno(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 18u8, val as u64) - } - } - #[inline] - pub fn class_id(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 6u8) as u32) } - } - #[inline] - pub fn set_class_id(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(18usize, 6u8, val as u64) - } - } - #[inline] - pub fn flags(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 8u8) as u32) } - } +impl sched_entity { #[inline] - pub fn set_flags(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(24usize, 8u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - lineno: ::aya_bpf::cty::c_uint, - class_id: ::aya_bpf::cty::c_uint, - flags: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 18u8, { - let lineno: u32 = unsafe { ::core::mem::transmute(lineno) }; - lineno as u64 - }); - __bindgen_bitfield_unit.set(18usize, 6u8, { - let class_id: u32 = unsafe { ::core::mem::transmute(class_id) }; - class_id as u64 - }); - __bindgen_bitfield_unit.set(24usize, 8u8, { - let flags: u32 = unsafe { ::core::mem::transmute(flags) }; - flags as u64 - }); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); __bindgen_bitfield_unit } } -pub mod class_map_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DD_CLASS_TYPE_DISJOINT_BITS: Type = 0; - pub const DD_CLASS_TYPE_LEVEL_NUM: Type = 1; - pub const DD_CLASS_TYPE_DISJOINT_NAMES: Type = 2; - pub const DD_CLASS_TYPE_LEVEL_NAMES: Type = 3; -} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ddebug_class_map { - pub link: list_head, - pub mod_: *mut module, - pub mod_name: *const ::aya_bpf::cty::c_char, - pub class_names: *mut *const ::aya_bpf::cty::c_char, - pub length: ::aya_bpf::cty::c_int, - pub base: ::aya_bpf::cty::c_int, - pub map_type: class_map_type::Type, -} -pub mod module_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const MODULE_STATE_LIVE: Type = 0; - pub const MODULE_STATE_COMING: Type = 1; - pub const MODULE_STATE_GOING: Type = 2; - pub const MODULE_STATE_UNFORMED: Type = 3; +pub struct sched_rt_entity { + pub run_list: list_head, + pub timeout: ::aya_ebpf::cty::c_ulong, + pub watchdog_stamp: ::aya_ebpf::cty::c_ulong, + pub time_slice: ::aya_ebpf::cty::c_uint, + pub on_rq: ::aya_ebpf::cty::c_ushort, + pub on_list: ::aya_ebpf::cty::c_ushort, + pub back: *mut sched_rt_entity, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct refcount_struct { - pub refs: atomic_t, +pub struct timerqueue_node { + pub node: rb_node, + pub expires: ktime_t, +} +pub mod hrtimer_restart { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const HRTIMER_NORESTART: Type = 0; + pub const HRTIMER_RESTART: Type = 1; } -pub type refcount_t = refcount_struct; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kref { - pub refcount: refcount_t, +pub struct hrtimer { + pub node: timerqueue_node, + pub _softexpires: ktime_t, + pub function: + ::core::option::Option hrtimer_restart::Type>, + pub base: *mut hrtimer_clock_base, + pub state: u8_, + pub is_rel: u8_, + pub is_soft: u8_, + pub is_hard: u8_, } +pub type dl_server_has_tasks_f = + ::core::option::Option bool_>; +pub type dl_server_pick_f = + ::core::option::Option *mut task_struct>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kobject { - pub name: *const ::aya_bpf::cty::c_char, - pub entry: list_head, - pub parent: *mut kobject, - pub kset: *mut kset, - pub ktype: *const kobj_type, - pub sd: *mut kernfs_node, - pub kref: kref, +pub struct sched_dl_entity { + pub rb_node: rb_node, + pub dl_runtime: u64_, + pub dl_deadline: u64_, + pub dl_period: u64_, + pub dl_bw: u64_, + pub dl_density: u64_, + pub runtime: s64, + pub deadline: u64_, + pub flags: ::aya_ebpf::cty::c_uint, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 3usize], + pub dl_timer: hrtimer, + pub inactive_timer: hrtimer, + pub rq: *mut rq, + pub server_has_tasks: dl_server_has_tasks_f, + pub server_pick: dl_server_pick_f, + pub pi_se: *mut sched_dl_entity, } -impl kobject { +impl sched_dl_entity { #[inline] - pub fn state_initialized(&self) -> ::aya_bpf::cty::c_uint { + pub fn dl_throttled(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_state_initialized(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dl_throttled(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn state_in_sysfs(&self) -> ::aya_bpf::cty::c_uint { + pub fn dl_yielded(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_state_in_sysfs(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dl_yielded(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn state_add_uevent_sent(&self) -> ::aya_bpf::cty::c_uint { + pub fn dl_non_contending(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_state_add_uevent_sent(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dl_non_contending(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn state_remove_uevent_sent(&self) -> ::aya_bpf::cty::c_uint { + pub fn dl_overrun(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_state_remove_uevent_sent(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dl_overrun(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn uevent_suppress(&self) -> ::aya_bpf::cty::c_uint { + pub fn dl_server(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_uevent_suppress(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dl_server(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(4usize, 1u8, val as u64) @@ -554,462 +443,474 @@ impl kobject { } #[inline] pub fn new_bitfield_1( - state_initialized: ::aya_bpf::cty::c_uint, - state_in_sysfs: ::aya_bpf::cty::c_uint, - state_add_uevent_sent: ::aya_bpf::cty::c_uint, - state_remove_uevent_sent: ::aya_bpf::cty::c_uint, - uevent_suppress: ::aya_bpf::cty::c_uint, + dl_throttled: ::aya_ebpf::cty::c_uint, + dl_yielded: ::aya_ebpf::cty::c_uint, + dl_non_contending: ::aya_ebpf::cty::c_uint, + dl_overrun: ::aya_ebpf::cty::c_uint, + dl_server: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let state_initialized: u32 = unsafe { ::core::mem::transmute(state_initialized) }; - state_initialized as u64 + let dl_throttled: u32 = unsafe { ::core::mem::transmute(dl_throttled) }; + dl_throttled as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let state_in_sysfs: u32 = unsafe { ::core::mem::transmute(state_in_sysfs) }; - state_in_sysfs as u64 + let dl_yielded: u32 = unsafe { ::core::mem::transmute(dl_yielded) }; + dl_yielded as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { - let state_add_uevent_sent: u32 = - unsafe { ::core::mem::transmute(state_add_uevent_sent) }; - state_add_uevent_sent as u64 + let dl_non_contending: u32 = unsafe { ::core::mem::transmute(dl_non_contending) }; + dl_non_contending as u64 }); __bindgen_bitfield_unit.set(3usize, 1u8, { - let state_remove_uevent_sent: u32 = - unsafe { ::core::mem::transmute(state_remove_uevent_sent) }; - state_remove_uevent_sent as u64 + let dl_overrun: u32 = unsafe { ::core::mem::transmute(dl_overrun) }; + dl_overrun as u64 }); __bindgen_bitfield_unit.set(4usize, 1u8, { - let uevent_suppress: u32 = unsafe { ::core::mem::transmute(uevent_suppress) }; - uevent_suppress as u64 + let dl_server: u32 = unsafe { ::core::mem::transmute(dl_server) }; + dl_server as u64 }); __bindgen_bitfield_unit } } #[repr(C)] +#[repr(align(4))] #[derive(Debug, Copy, Clone)] -pub struct module_kobject { - pub kobj: kobject, - pub mod_: *mut module, - pub drivers_dir: *mut kobject, - pub mp: *mut module_param_attrs, - pub kobj_completion: *mut completion, +pub struct uclamp_se { + pub _bitfield_align_1: [u16; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, + pub __bindgen_padding_0: u16, +} +impl uclamp_se { + #[inline] + pub fn value(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 11u8) as u32) } + } + #[inline] + pub fn set_value(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 11u8, val as u64) + } + } + #[inline] + pub fn bucket_id(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 3u8) as u32) } + } + #[inline] + pub fn set_bucket_id(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 3u8, val as u64) + } + } + #[inline] + pub fn active(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) } + } + #[inline] + pub fn set_active(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(14usize, 1u8, val as u64) + } + } + #[inline] + pub fn user_defined(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) } + } + #[inline] + pub fn set_user_defined(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(15usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + value: ::aya_ebpf::cty::c_uint, + bucket_id: ::aya_ebpf::cty::c_uint, + active: ::aya_ebpf::cty::c_uint, + user_defined: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 11u8, { + let value: u32 = unsafe { ::core::mem::transmute(value) }; + value as u64 + }); + __bindgen_bitfield_unit.set(11usize, 3u8, { + let bucket_id: u32 = unsafe { ::core::mem::transmute(bucket_id) }; + bucket_id as u64 + }); + __bindgen_bitfield_unit.set(14usize, 1u8, { + let active: u32 = unsafe { ::core::mem::transmute(active) }; + active as u64 + }); + __bindgen_bitfield_unit.set(15usize, 1u8, { + let user_defined: u32 = unsafe { ::core::mem::transmute(user_defined) }; + user_defined as u64 + }); + __bindgen_bitfield_unit + } } -pub type atomic_long_t = atomic64_t; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct optimistic_spin_queue { - pub tail: atomic_t, +pub struct sched_statistics { + pub wait_start: u64_, + pub wait_max: u64_, + pub wait_count: u64_, + pub wait_sum: u64_, + pub iowait_count: u64_, + pub iowait_sum: u64_, + pub sleep_start: u64_, + pub sleep_max: u64_, + pub sum_sleep_runtime: s64, + pub block_start: u64_, + pub block_max: u64_, + pub sum_block_runtime: s64, + pub exec_max: s64, + pub slice_max: u64_, + pub nr_migrations_cold: u64_, + pub nr_failed_migrations_affine: u64_, + pub nr_failed_migrations_running: u64_, + pub nr_failed_migrations_hot: u64_, + pub nr_forced_migrations: u64_, + pub nr_wakeups: u64_, + pub nr_wakeups_sync: u64_, + pub nr_wakeups_migrate: u64_, + pub nr_wakeups_local: u64_, + pub nr_wakeups_remote: u64_, + pub nr_wakeups_affine: u64_, + pub nr_wakeups_affine_attempts: u64_, + pub nr_wakeups_passive: u64_, + pub nr_wakeups_idle: u64_, + pub core_forceidle_sum: u64_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl sched_statistics { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cpumask { + pub bits: [::aya_ebpf::cty::c_ulong; 5usize], } +pub type cpumask_t = cpumask; #[repr(C)] #[derive(Copy, Clone)] -pub struct mutex { - pub owner: atomic_long_t, - pub wait_lock: raw_spinlock_t, - pub osq: optimistic_spin_queue, - pub wait_list: list_head, +pub union rcu_special { + pub b: rcu_special__bindgen_ty_1, + pub s: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rb_node { - pub __rb_parent_color: ::aya_bpf::cty::c_ulong, - pub rb_right: *mut rb_node, - pub rb_left: *mut rb_node, +pub struct rcu_special__bindgen_ty_1 { + pub blocked: u8_, + pub need_qs: u8_, + pub exp_hint: u8_, + pub need_mb: u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct latch_tree_node { - pub node: [rb_node; 2usize], +pub struct sched_info { + pub pcount: ::aya_ebpf::cty::c_ulong, + pub run_delay: ::aya_ebpf::cty::c_ulonglong, + pub last_arrival: ::aya_ebpf::cty::c_ulonglong, + pub last_queued: ::aya_ebpf::cty::c_ulonglong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mod_tree_node { - pub mod_: *mut module, - pub node: latch_tree_node, +pub struct plist_node { + pub prio: ::aya_ebpf::cty::c_int, + pub prio_list: list_head, + pub node_list: list_head, +} +pub mod timespec_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const TT_NONE: Type = 0; + pub const TT_NATIVE: Type = 1; + pub const TT_COMPAT: Type = 2; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct restart_block { + pub arch_data: ::aya_ebpf::cty::c_ulong, + pub fn_: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut restart_block) -> ::aya_ebpf::cty::c_long, + >, + pub __bindgen_anon_1: restart_block__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union restart_block__bindgen_ty_1 { + pub futex: restart_block__bindgen_ty_1__bindgen_ty_1, + pub nanosleep: restart_block__bindgen_ty_1__bindgen_ty_2, + pub poll: restart_block__bindgen_ty_1__bindgen_ty_3, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct module_memory { - pub base: *mut ::aya_bpf::cty::c_void, - pub size: ::aya_bpf::cty::c_uint, - pub mtn: mod_tree_node, +pub struct restart_block__bindgen_ty_1__bindgen_ty_1 { + pub uaddr: *mut u32_, + pub val: u32_, + pub flags: u32_, + pub bitset: u32_, + pub time: u64_, + pub uaddr2: *mut u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct restart_block__bindgen_ty_1__bindgen_ty_2 { + pub clockid: clockid_t, + pub type_: timespec_type::Type, + pub __bindgen_anon_1: restart_block__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, + pub expires: u64_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union restart_block__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { + pub rmtp: *mut __kernel_timespec, + pub compat_rmtp: *mut old_timespec32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mod_arch_specific { - pub num_orcs: ::aya_bpf::cty::c_uint, - pub orc_unwind_ip: *mut ::aya_bpf::cty::c_int, - pub orc_unwind: *mut orc_entry, +pub struct restart_block__bindgen_ty_1__bindgen_ty_3 { + pub ufds: *mut pollfd, + pub nfds: ::aya_ebpf::cty::c_int, + pub has_timeout: ::aya_ebpf::cty::c_int, + pub tv_sec: ::aya_ebpf::cty::c_ulong, + pub tv_nsec: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct qspinlock { + pub __bindgen_anon_1: qspinlock__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union qspinlock__bindgen_ty_1 { + pub val: atomic_t, + pub __bindgen_anon_1: qspinlock__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: qspinlock__bindgen_ty_1__bindgen_ty_2, } -pub type Elf64_Sym = elf64_sym; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mod_kallsyms { - pub symtab: *mut Elf64_Sym, - pub num_symtab: ::aya_bpf::cty::c_uint, - pub strtab: *mut ::aya_bpf::cty::c_char, - pub typetab: *mut ::aya_bpf::cty::c_char, +pub struct qspinlock__bindgen_ty_1__bindgen_ty_1 { + pub locked: u8_, + pub pending: u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct _ddebug_info { - pub descs: *mut _ddebug, - pub classes: *mut ddebug_class_map, - pub num_descs: ::aya_bpf::cty::c_uint, - pub num_classes: ::aya_bpf::cty::c_uint, +pub struct qspinlock__bindgen_ty_1__bindgen_ty_2 { + pub locked_pending: u16_, + pub tail: u16_, } +pub type arch_spinlock_t = qspinlock; #[repr(C)] #[derive(Copy, Clone)] -pub struct module { - pub state: module_state::Type, - pub list: list_head, - pub name: [::aya_bpf::cty::c_char; 56usize], - pub build_id: [::aya_bpf::cty::c_uchar; 20usize], - pub mkobj: module_kobject, - pub modinfo_attrs: *mut module_attribute, - pub version: *const ::aya_bpf::cty::c_char, - pub srcversion: *const ::aya_bpf::cty::c_char, - pub holders_dir: *mut kobject, - pub syms: *const kernel_symbol, - pub crcs: *const s32, - pub num_syms: ::aya_bpf::cty::c_uint, - pub param_lock: mutex, - pub kp: *mut kernel_param, - pub num_kp: ::aya_bpf::cty::c_uint, - pub num_gpl_syms: ::aya_bpf::cty::c_uint, - pub gpl_syms: *const kernel_symbol, - pub gpl_crcs: *const s32, - pub using_gplonly_symbols: bool_, - pub sig_ok: bool_, - pub async_probe_requested: bool_, - pub num_exentries: ::aya_bpf::cty::c_uint, - pub extable: *mut exception_table_entry, - pub init: ::core::option::Option ::aya_bpf::cty::c_int>, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, - pub mem: [module_memory; 7usize], - pub arch: mod_arch_specific, - pub taints: ::aya_bpf::cty::c_ulong, - pub num_bugs: ::aya_bpf::cty::c_uint, - pub bug_list: list_head, - pub bug_table: *mut bug_entry, - pub kallsyms: *mut mod_kallsyms, - pub core_kallsyms: mod_kallsyms, - pub sect_attrs: *mut module_sect_attrs, - pub notes_attrs: *mut module_notes_attrs, - pub args: *mut ::aya_bpf::cty::c_char, - pub percpu: *mut ::aya_bpf::cty::c_void, - pub percpu_size: ::aya_bpf::cty::c_uint, - pub noinstr_text_start: *mut ::aya_bpf::cty::c_void, - pub noinstr_text_size: ::aya_bpf::cty::c_uint, - pub num_tracepoints: ::aya_bpf::cty::c_uint, - pub tracepoints_ptrs: *const ::aya_bpf::cty::c_int, - pub num_srcu_structs: ::aya_bpf::cty::c_uint, - pub srcu_struct_ptrs: *mut *mut srcu_struct, - pub num_bpf_raw_events: ::aya_bpf::cty::c_uint, - pub bpf_raw_events: *mut bpf_raw_event_map, - pub btf_data_size: ::aya_bpf::cty::c_uint, - pub btf_data: *mut ::aya_bpf::cty::c_void, - pub jump_entries: *mut jump_entry, - pub num_jump_entries: ::aya_bpf::cty::c_uint, - pub num_trace_bprintk_fmt: ::aya_bpf::cty::c_uint, - pub trace_bprintk_fmt_start: *mut *const ::aya_bpf::cty::c_char, - pub trace_events: *mut *mut trace_event_call, - pub num_trace_events: ::aya_bpf::cty::c_uint, - pub trace_evals: *mut *mut trace_eval_map, - pub num_trace_evals: ::aya_bpf::cty::c_uint, - pub num_ftrace_callsites: ::aya_bpf::cty::c_uint, - pub ftrace_callsites: *mut ::aya_bpf::cty::c_ulong, - pub kprobes_text_start: *mut ::aya_bpf::cty::c_void, - pub kprobes_text_size: ::aya_bpf::cty::c_uint, - pub kprobe_blacklist: *mut ::aya_bpf::cty::c_ulong, - pub num_kprobe_blacklist: ::aya_bpf::cty::c_uint, - pub num_static_call_sites: ::aya_bpf::cty::c_int, - pub static_call_sites: *mut static_call_site, - pub printk_index_size: ::aya_bpf::cty::c_uint, - pub printk_index_start: *mut *mut pi_entry, - pub source_list: list_head, - pub target_list: list_head, - pub exit: ::core::option::Option, - pub refcnt: atomic_t, - pub ei_funcs: *mut error_injection_entry, - pub num_ei_funcs: ::aya_bpf::cty::c_uint, - pub dyndbg_info: _ddebug_info, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, +pub struct raw_spinlock { + pub raw_lock: arch_spinlock_t, } -impl module { - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub type raw_spinlock_t = raw_spinlock; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct prev_cputime { + pub utime: u64_, + pub stime: u64_, + pub lock: raw_spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kernel_param_ops { - pub flags: ::aya_bpf::cty::c_uint, - pub set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_char, - arg2: *const kernel_param, - ) -> ::aya_bpf::cty::c_int, - >, - pub get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_char, - arg2: *const kernel_param, - ) -> ::aya_bpf::cty::c_int, - >, - pub free: ::core::option::Option, +pub struct seqcount { + pub sequence: ::aya_ebpf::cty::c_uint, +} +pub type seqcount_t = seqcount; +pub mod vtime_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const VTIME_INACTIVE: Type = 0; + pub const VTIME_IDLE: Type = 1; + pub const VTIME_SYS: Type = 2; + pub const VTIME_USER: Type = 3; + pub const VTIME_GUEST: Type = 4; } -pub type fl_owner_t = *mut ::aya_bpf::cty::c_void; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct file_operations { - pub owner: *mut module, - pub llseek: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: loff_t, arg3: ::aya_bpf::cty::c_int) -> loff_t, - >, - pub read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: usize, - arg4: *mut loff_t, - ) -> isize, - >, - pub write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *const ::aya_bpf::cty::c_char, - arg3: usize, - arg4: *mut loff_t, - ) -> isize, - >, - pub read_iter: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> isize, - >, - pub write_iter: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> isize, - >, - pub iopoll: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut kiocb, - arg2: *mut io_comp_batch, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub iterate: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut dir_context) -> ::aya_bpf::cty::c_int, - >, - pub iterate_shared: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut dir_context) -> ::aya_bpf::cty::c_int, - >, - pub poll: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut poll_table_struct) -> __poll_t, - >, - pub unlocked_ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_long, - >, - pub compat_ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_long, - >, - pub mmap: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut vm_area_struct) -> ::aya_bpf::cty::c_int, - >, - pub mmap_supported_flags: ::aya_bpf::cty::c_ulong, - pub open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_bpf::cty::c_int, - >, - pub flush: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: fl_owner_t) -> ::aya_bpf::cty::c_int, - >, - pub release: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_bpf::cty::c_int, - >, - pub fsync: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: loff_t, - arg3: loff_t, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub fasync: ::core::option::Option< - unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_int, - arg2: *mut file, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub lock: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut file_lock, - ) -> ::aya_bpf::cty::c_int, - >, - pub sendpage: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut page, - arg3: ::aya_bpf::cty::c_int, - arg4: usize, - arg5: *mut loff_t, - arg6: ::aya_bpf::cty::c_int, - ) -> isize, - >, - pub get_unmapped_area: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_ulong, - arg5: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_ulong, - >, - pub check_flags: ::core::option::Option< - unsafe extern "C" fn(arg1: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, - >, - pub flock: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut file_lock, - ) -> ::aya_bpf::cty::c_int, - >, - pub splice_write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut pipe_inode_info, - arg2: *mut file, - arg3: *mut loff_t, - arg4: usize, - arg5: ::aya_bpf::cty::c_uint, - ) -> isize, - >, - pub splice_read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut loff_t, - arg3: *mut pipe_inode_info, - arg4: usize, - arg5: ::aya_bpf::cty::c_uint, - ) -> isize, - >, - pub setlease: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_long, - arg3: *mut *mut file_lock, - arg4: *mut *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub fallocate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_int, - arg3: loff_t, - arg4: loff_t, - ) -> ::aya_bpf::cty::c_long, - >, - pub show_fdinfo: - ::core::option::Option, - pub copy_file_range: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: loff_t, - arg3: *mut file, - arg4: loff_t, - arg5: usize, - arg6: ::aya_bpf::cty::c_uint, - ) -> isize, - >, - pub remap_file_range: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: loff_t, - arg3: *mut file, - arg4: loff_t, - arg5: loff_t, - arg6: ::aya_bpf::cty::c_uint, - ) -> loff_t, - >, - pub fadvise: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: loff_t, - arg3: loff_t, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub uring_cmd: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut io_uring_cmd, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub uring_cmd_iopoll: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut io_uring_cmd, - arg2: *mut io_comp_batch, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct vtime { + pub seqcount: seqcount_t, + pub starttime: ::aya_ebpf::cty::c_ulonglong, + pub state: vtime_state::Type, + pub cpu: ::aya_ebpf::cty::c_uint, + pub utime: u64_, + pub stime: u64_, + pub gtime: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bug_entry { - pub bug_addr_disp: ::aya_bpf::cty::c_int, - pub file_disp: ::aya_bpf::cty::c_int, - pub line: ::aya_bpf::cty::c_ushort, - pub flags: ::aya_bpf::cty::c_ushort, +pub struct rb_root { + pub rb_node: *mut rb_node, } -pub type time64_t = __s64; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct __kernel_timespec { - pub tv_sec: __kernel_time64_t, - pub tv_nsec: ::aya_bpf::cty::c_longlong, +pub struct rb_root_cached { + pub rb_root: rb_root, + pub rb_leftmost: *mut rb_node, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct timespec64 { - pub tv_sec: time64_t, - pub tv_nsec: ::aya_bpf::cty::c_long, +pub struct timerqueue_head { + pub rb_root: rb_root_cached, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pt_regs { - pub r15: ::aya_bpf::cty::c_ulong, - pub r14: ::aya_bpf::cty::c_ulong, - pub r13: ::aya_bpf::cty::c_ulong, - pub r12: ::aya_bpf::cty::c_ulong, - pub bp: ::aya_bpf::cty::c_ulong, - pub bx: ::aya_bpf::cty::c_ulong, - pub r11: ::aya_bpf::cty::c_ulong, - pub r10: ::aya_bpf::cty::c_ulong, - pub r9: ::aya_bpf::cty::c_ulong, - pub r8: ::aya_bpf::cty::c_ulong, - pub ax: ::aya_bpf::cty::c_ulong, - pub cx: ::aya_bpf::cty::c_ulong, - pub dx: ::aya_bpf::cty::c_ulong, - pub si: ::aya_bpf::cty::c_ulong, - pub di: ::aya_bpf::cty::c_ulong, - pub orig_ax: ::aya_bpf::cty::c_ulong, - pub ip: ::aya_bpf::cty::c_ulong, - pub cs: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_ulong, - pub sp: ::aya_bpf::cty::c_ulong, - pub ss: ::aya_bpf::cty::c_ulong, +pub struct posix_cputimer_base { + pub nextevt: u64_, + pub tqhead: timerqueue_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct posix_cputimers { + pub bases: [posix_cputimer_base; 3usize], + pub timers_active: ::aya_ebpf::cty::c_uint, + pub expiry_active: ::aya_ebpf::cty::c_uint, +} +pub type atomic_long_t = atomic64_t; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct optimistic_spin_queue { + pub tail: atomic_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mutex { + pub owner: atomic_long_t, + pub wait_lock: raw_spinlock_t, + pub osq: optimistic_spin_queue, + pub wait_list: list_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct posix_cputimers_work { + pub work: callback_head, + pub mutex: mutex, + pub scheduled: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sysv_sem { + pub undo_list: *mut sem_undo_list, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sysv_shm { + pub shm_clist: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sigset_t { + pub sig: [::aya_ebpf::cty::c_ulong; 1usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sigpending { + pub list: list_head, + pub signal: sigset_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct kuid_t { + pub val: uid_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct seccomp { + pub mode: ::aya_ebpf::cty::c_int, + pub filter_count: atomic_t, + pub filter: *mut seccomp_filter, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct syscall_user_dispatch { + pub selector: *mut ::aya_ebpf::cty::c_char, + pub offset: ::aya_ebpf::cty::c_ulong, + pub len: ::aya_ebpf::cty::c_ulong, + pub on_dispatch: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct spinlock { + pub __bindgen_anon_1: spinlock__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union spinlock__bindgen_ty_1 { + pub rlock: raw_spinlock, +} +pub type spinlock_t = spinlock; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wake_q_node { + pub next: *mut wake_q_node, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct task_io_accounting { + pub rchar: u64_, + pub wchar: u64_, + pub syscr: u64_, + pub syscw: u64_, + pub read_bytes: u64_, + pub write_bytes: u64_, + pub cancelled_write_bytes: u64_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nodemask_t { + pub bits: [::aya_ebpf::cty::c_ulong; 1usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct seqcount_spinlock { + pub seqcount: seqcount_t, +} +pub type seqcount_spinlock_t = seqcount_spinlock; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct arch_tlbflush_unmap_batch { + pub cpumask: cpumask, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tlbflush_unmap_batch { + pub arch: arch_tlbflush_unmap_batch, + pub flush_required: bool_, + pub writable: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct page_frag { + pub page: *mut page, + pub offset: __u32, + pub size: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct kmap_ctrl {} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct timer_list { + pub entry: hlist_node, + pub expires: ::aya_ebpf::cty::c_ulong, + pub function: ::core::option::Option, + pub flags: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct llist_head { + pub first: *mut llist_node, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -1203,2325 +1104,2434 @@ impl desc_struct { __bindgen_bitfield_unit } } -pub type pteval_t = ::aya_bpf::cty::c_ulong; -pub type pmdval_t = ::aya_bpf::cty::c_ulong; -pub type pudval_t = ::aya_bpf::cty::c_ulong; -pub type pgdval_t = ::aya_bpf::cty::c_ulong; -pub type pgprotval_t = ::aya_bpf::cty::c_ulong; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pte_t { - pub pte: pteval_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pmd_t { - pub pmd: pmdval_t, -} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pgprot { - pub pgprot: pgprotval_t, +pub struct thread_shstk { + pub base: u64_, + pub size: u64_, } -pub type pgprot_t = pgprot; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pgd_t { - pub pgd: pgdval_t, +pub struct fpu_state_perm { + pub __state_perm: u64_, + pub __state_size: ::aya_ebpf::cty::c_uint, + pub __user_state_size: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pud_t { - pub pud: pudval_t, -} -pub type pgtable_t = *mut page; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct spinlock { - pub __bindgen_anon_1: spinlock__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union spinlock__bindgen_ty_1 { - pub rlock: raw_spinlock, -} -pub type spinlock_t = spinlock; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct page { - pub flags: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: page__bindgen_ty_1, - pub __bindgen_anon_2: page__bindgen_ty_2, - pub _refcount: atomic_t, - pub memcg_data: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union page__bindgen_ty_1 { - pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: page__bindgen_ty_1__bindgen_ty_2, - pub __bindgen_anon_3: page__bindgen_ty_1__bindgen_ty_3, - pub __bindgen_anon_4: page__bindgen_ty_1__bindgen_ty_4, - pub __bindgen_anon_5: page__bindgen_ty_1__bindgen_ty_5, - pub callback_head: callback_head, +pub struct fregs_state { + pub cwd: u32_, + pub swd: u32_, + pub twd: u32_, + pub fip: u32_, + pub fcs: u32_, + pub foo: u32_, + pub fos: u32_, + pub st_space: [u32_; 20usize], + pub status: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct page__bindgen_ty_1__bindgen_ty_1 { - pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub mapping: *mut address_space, - pub __bindgen_anon_2: page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, - pub private: ::aya_bpf::cty::c_ulong, +pub struct fxregs_state { + pub cwd: u16_, + pub swd: u16_, + pub twd: u16_, + pub fop: u16_, + pub __bindgen_anon_1: fxregs_state__bindgen_ty_1, + pub mxcsr: u32_, + pub mxcsr_mask: u32_, + pub st_space: [u32_; 32usize], + pub xmm_space: [u32_; 64usize], + pub padding: [u32_; 12usize], + pub __bindgen_anon_2: fxregs_state__bindgen_ty_2, } #[repr(C)] #[derive(Copy, Clone)] -pub union page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub lru: list_head, - pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub buddy_list: list_head, - pub pcp_list: list_head, +pub union fxregs_state__bindgen_ty_1 { + pub __bindgen_anon_1: fxregs_state__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: fxregs_state__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub __filler: *mut ::aya_bpf::cty::c_void, - pub mlock_count: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { - pub index: ::aya_bpf::cty::c_ulong, - pub share: ::aya_bpf::cty::c_ulong, +pub struct fxregs_state__bindgen_ty_1__bindgen_ty_1 { + pub rip: u64_, + pub rdp: u64_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct page__bindgen_ty_1__bindgen_ty_2 { - pub pp_magic: ::aya_bpf::cty::c_ulong, - pub pp: *mut page_pool, - pub _pp_mapping_pad: ::aya_bpf::cty::c_ulong, - pub dma_addr: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct fxregs_state__bindgen_ty_1__bindgen_ty_2 { + pub fip: u32_, + pub fcs: u32_, + pub foo: u32_, + pub fos: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub union page__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - pub dma_addr_upper: ::aya_bpf::cty::c_ulong, - pub pp_frag_count: atomic_long_t, +pub union fxregs_state__bindgen_ty_2 { + pub padding1: [u32_; 12usize], + pub sw_reserved: [u32_; 12usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct page__bindgen_ty_1__bindgen_ty_3 { - pub compound_head: ::aya_bpf::cty::c_ulong, +pub struct swregs_state { + pub cwd: u32_, + pub swd: u32_, + pub twd: u32_, + pub fip: u32_, + pub fcs: u32_, + pub foo: u32_, + pub fos: u32_, + pub st_space: [u32_; 20usize], + pub ftop: u8_, + pub changed: u8_, + pub lookahead: u8_, + pub no_update: u8_, + pub rm: u8_, + pub alimit: u8_, + pub info: *mut math_emu_info, + pub entry_eip: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct page__bindgen_ty_1__bindgen_ty_4 { - pub _pt_pad_1: ::aya_bpf::cty::c_ulong, - pub pmd_huge_pte: pgtable_t, - pub _pt_pad_2: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1, - pub ptl: spinlock_t, +#[derive(Debug, Copy, Clone)] +pub struct xstate_header { + pub xfeatures: u64_, + pub xcomp_bv: u64_, + pub reserved: [u64_; 6usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union page__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1 { - pub pt_mm: *mut mm_struct, - pub pt_frag_refcount: atomic_t, +pub struct xregs_state { + pub i387: fxregs_state, + pub header: xstate_header, + pub extended_state_area: __IncompleteArrayField, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct page__bindgen_ty_1__bindgen_ty_5 { - pub pgmap: *mut dev_pagemap, - pub zone_device_data: *mut ::aya_bpf::cty::c_void, +pub struct fpregs_state { + pub fsave: __BindgenUnionField, + pub fxsave: __BindgenUnionField, + pub soft: __BindgenUnionField, + pub xsave: __BindgenUnionField, + pub __padding: __BindgenUnionField<[u8_; 4096usize]>, + pub bindgen_union_field: [u64; 512usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union page__bindgen_ty_2 { - pub _mapcount: atomic_t, - pub page_type: ::aya_bpf::cty::c_uint, +pub struct fpstate { + pub size: ::aya_ebpf::cty::c_uint, + pub user_size: ::aya_ebpf::cty::c_uint, + pub xfeatures: u64_, + pub user_xfeatures: u64_, + pub xfd: u64_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, + pub regs: fpregs_state, } -#[repr(C, packed)] -#[derive(Debug, Copy, Clone)] -pub struct orc_entry { - pub sp_offset: s16, - pub bp_offset: s16, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, -} -impl orc_entry { +impl fpstate { #[inline] - pub fn sp_reg(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u32) } + pub fn is_valloc(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_sp_reg(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_is_valloc(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 4u8, val as u64) + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn bp_reg(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u32) } + pub fn is_guest(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_bp_reg(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_is_guest(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 4u8, val as u64) + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn type_(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 3u8) as u32) } + pub fn is_confidential(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_type(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_is_confidential(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 3u8, val as u64) + self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn signal(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) } + pub fn in_use(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_signal(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_in_use(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 1u8, val as u64) + self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - sp_reg: ::aya_bpf::cty::c_uint, - bp_reg: ::aya_bpf::cty::c_uint, - type_: ::aya_bpf::cty::c_uint, - signal: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 4u8, { - let sp_reg: u32 = unsafe { ::core::mem::transmute(sp_reg) }; - sp_reg as u64 + is_valloc: ::aya_ebpf::cty::c_uint, + is_guest: ::aya_ebpf::cty::c_uint, + is_confidential: ::aya_ebpf::cty::c_uint, + in_use: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_valloc: u32 = unsafe { ::core::mem::transmute(is_valloc) }; + is_valloc as u64 }); - __bindgen_bitfield_unit.set(4usize, 4u8, { - let bp_reg: u32 = unsafe { ::core::mem::transmute(bp_reg) }; - bp_reg as u64 + __bindgen_bitfield_unit.set(1usize, 1u8, { + let is_guest: u32 = unsafe { ::core::mem::transmute(is_guest) }; + is_guest as u64 }); - __bindgen_bitfield_unit.set(8usize, 3u8, { - let type_: u32 = unsafe { ::core::mem::transmute(type_) }; - type_ as u64 + __bindgen_bitfield_unit.set(2usize, 1u8, { + let is_confidential: u32 = unsafe { ::core::mem::transmute(is_confidential) }; + is_confidential as u64 }); - __bindgen_bitfield_unit.set(11usize, 1u8, { - let signal: u32 = unsafe { ::core::mem::transmute(signal) }; - signal as u64 + __bindgen_bitfield_unit.set(3usize, 1u8, { + let in_use: u32 = unsafe { ::core::mem::transmute(in_use) }; + in_use as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct static_call_site { - pub addr: s32, - pub key: s32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct static_call_mod { - pub next: *mut static_call_mod, - pub mod_: *mut module, - pub sites: *mut static_call_site, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct static_call_key { - pub func: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: static_call_key__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union static_call_key__bindgen_ty_1 { - pub type_: ::aya_bpf::cty::c_ulong, - pub mods: *mut static_call_mod, - pub sites: *mut static_call_site, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct thread_info { - pub flags: ::aya_bpf::cty::c_ulong, - pub syscall_work: ::aya_bpf::cty::c_ulong, - pub status: u32_, - pub cpu: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct llist_node { - pub next: *mut llist_node, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __call_single_node { - pub llist: llist_node, - pub __bindgen_anon_1: __call_single_node__bindgen_ty_1, - pub src: u16_, - pub dst: u16_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union __call_single_node__bindgen_ty_1 { - pub u_flags: ::aya_bpf::cty::c_uint, - pub a_flags: atomic_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct load_weight { - pub weight: ::aya_bpf::cty::c_ulong, - pub inv_weight: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct util_est { - pub enqueued: ::aya_bpf::cty::c_uint, - pub ewma: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sched_avg { - pub last_update_time: u64_, - pub load_sum: u64_, - pub runnable_sum: u64_, - pub util_sum: u32_, - pub period_contrib: u32_, - pub load_avg: ::aya_bpf::cty::c_ulong, - pub runnable_avg: ::aya_bpf::cty::c_ulong, - pub util_avg: ::aya_bpf::cty::c_ulong, - pub util_est: util_est, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sched_entity { - pub load: load_weight, - pub run_node: rb_node, - pub group_node: list_head, - pub on_rq: ::aya_bpf::cty::c_uint, - pub exec_start: u64_, - pub sum_exec_runtime: u64_, - pub vruntime: u64_, - pub prev_sum_exec_runtime: u64_, - pub nr_migrations: u64_, - pub depth: ::aya_bpf::cty::c_int, - pub parent: *mut sched_entity, - pub cfs_rq: *mut cfs_rq, - pub my_q: *mut cfs_rq, - pub runnable_weight: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, - pub avg: sched_avg, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sched_rt_entity { - pub run_list: list_head, - pub timeout: ::aya_bpf::cty::c_ulong, - pub watchdog_stamp: ::aya_bpf::cty::c_ulong, - pub time_slice: ::aya_bpf::cty::c_uint, - pub on_rq: ::aya_bpf::cty::c_ushort, - pub on_list: ::aya_bpf::cty::c_ushort, - pub back: *mut sched_rt_entity, -} -pub type ktime_t = s64; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timerqueue_node { - pub node: rb_node, - pub expires: ktime_t, -} -pub mod hrtimer_restart { - pub type Type = ::aya_bpf::cty::c_uint; - pub const HRTIMER_NORESTART: Type = 0; - pub const HRTIMER_RESTART: Type = 1; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct hrtimer { - pub node: timerqueue_node, - pub _softexpires: ktime_t, - pub function: - ::core::option::Option hrtimer_restart::Type>, - pub base: *mut hrtimer_clock_base, - pub state: u8_, - pub is_rel: u8_, - pub is_soft: u8_, - pub is_hard: u8_, +pub struct fpu { + pub last_cpu: ::aya_ebpf::cty::c_uint, + pub avx512_timestamp: ::aya_ebpf::cty::c_ulong, + pub fpstate: *mut fpstate, + pub __task_fpstate: *mut fpstate, + pub perm: fpu_state_perm, + pub guest_perm: fpu_state_perm, + pub __fpstate: fpstate, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sched_dl_entity { - pub rb_node: rb_node, - pub dl_runtime: u64_, - pub dl_deadline: u64_, - pub dl_period: u64_, - pub dl_bw: u64_, - pub dl_density: u64_, - pub runtime: s64, - pub deadline: u64_, - pub flags: ::aya_bpf::cty::c_uint, +pub struct thread_struct { + pub tls_array: [desc_struct; 3usize], + pub sp: ::aya_ebpf::cty::c_ulong, + pub es: ::aya_ebpf::cty::c_ushort, + pub ds: ::aya_ebpf::cty::c_ushort, + pub fsindex: ::aya_ebpf::cty::c_ushort, + pub gsindex: ::aya_ebpf::cty::c_ushort, + pub fsbase: ::aya_ebpf::cty::c_ulong, + pub gsbase: ::aya_ebpf::cty::c_ulong, + pub ptrace_bps: [*mut perf_event; 4usize], + pub virtual_dr6: ::aya_ebpf::cty::c_ulong, + pub ptrace_dr7: ::aya_ebpf::cty::c_ulong, + pub cr2: ::aya_ebpf::cty::c_ulong, + pub trap_nr: ::aya_ebpf::cty::c_ulong, + pub error_code: ::aya_ebpf::cty::c_ulong, + pub io_bitmap: *mut io_bitmap, + pub iopl_emul: ::aya_ebpf::cty::c_ulong, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub dl_timer: hrtimer, - pub inactive_timer: hrtimer, - pub pi_se: *mut sched_dl_entity, + pub pkru: u32_, + pub features: ::aya_ebpf::cty::c_ulong, + pub features_locked: ::aya_ebpf::cty::c_ulong, + pub shstk: thread_shstk, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 8usize]>, + pub fpu: fpu, } -impl sched_dl_entity { +impl thread_struct { #[inline] - pub fn dl_throttled(&self) -> ::aya_bpf::cty::c_uint { + pub fn iopl_warn(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_dl_throttled(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_iopl_warn(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn dl_yielded(&self) -> ::aya_bpf::cty::c_uint { + pub fn sig_on_uaccess_err(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_dl_yielded(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_sig_on_uaccess_err(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn dl_non_contending(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn new_bitfield_1( + iopl_warn: ::aya_ebpf::cty::c_uint, + sig_on_uaccess_err: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let iopl_warn: u32 = unsafe { ::core::mem::transmute(iopl_warn) }; + iopl_warn as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let sig_on_uaccess_err: u32 = unsafe { ::core::mem::transmute(sig_on_uaccess_err) }; + sig_on_uaccess_err as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +pub type kernel_siginfo_t = kernel_siginfo; +#[repr(C)] +pub struct task_struct { + pub thread_info: thread_info, + pub __state: ::aya_ebpf::cty::c_uint, + pub saved_state: ::aya_ebpf::cty::c_uint, + pub stack: *mut ::aya_ebpf::cty::c_void, + pub usage: refcount_t, + pub flags: ::aya_ebpf::cty::c_uint, + pub ptrace: ::aya_ebpf::cty::c_uint, + pub on_cpu: ::aya_ebpf::cty::c_int, + pub wake_entry: __call_single_node, + pub wakee_flips: ::aya_ebpf::cty::c_uint, + pub wakee_flip_decay_ts: ::aya_ebpf::cty::c_ulong, + pub last_wakee: *mut task_struct, + pub recent_used_cpu: ::aya_ebpf::cty::c_int, + pub wake_cpu: ::aya_ebpf::cty::c_int, + pub on_rq: ::aya_ebpf::cty::c_int, + pub prio: ::aya_ebpf::cty::c_int, + pub static_prio: ::aya_ebpf::cty::c_int, + pub normal_prio: ::aya_ebpf::cty::c_int, + pub rt_priority: ::aya_ebpf::cty::c_uint, + pub se: sched_entity, + pub rt: sched_rt_entity, + pub dl: sched_dl_entity, + pub dl_server: *mut sched_dl_entity, + pub sched_class: *const sched_class, + pub core_node: rb_node, + pub core_cookie: ::aya_ebpf::cty::c_ulong, + pub core_occupation: ::aya_ebpf::cty::c_uint, + pub sched_task_group: *mut task_group, + pub uclamp_req: [uclamp_se; 2usize], + pub uclamp: [uclamp_se; 2usize], + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub stats: sched_statistics, + pub preempt_notifiers: hlist_head, + pub btrace_seq: ::aya_ebpf::cty::c_uint, + pub policy: ::aya_ebpf::cty::c_uint, + pub nr_cpus_allowed: ::aya_ebpf::cty::c_int, + pub cpus_ptr: *const cpumask_t, + pub user_cpus_ptr: *mut cpumask_t, + pub cpus_mask: cpumask_t, + pub migration_pending: *mut ::aya_ebpf::cty::c_void, + pub migration_disabled: ::aya_ebpf::cty::c_ushort, + pub migration_flags: ::aya_ebpf::cty::c_ushort, + pub rcu_read_lock_nesting: ::aya_ebpf::cty::c_int, + pub rcu_read_unlock_special: rcu_special, + pub rcu_node_entry: list_head, + pub rcu_blocked_node: *mut rcu_node, + pub rcu_tasks_nvcsw: ::aya_ebpf::cty::c_ulong, + pub rcu_tasks_holdout: u8_, + pub rcu_tasks_idx: u8_, + pub rcu_tasks_idle_cpu: ::aya_ebpf::cty::c_int, + pub rcu_tasks_holdout_list: list_head, + pub trc_reader_nesting: ::aya_ebpf::cty::c_int, + pub trc_ipi_to_cpu: ::aya_ebpf::cty::c_int, + pub trc_reader_special: rcu_special, + pub trc_holdout_list: list_head, + pub trc_blkd_node: list_head, + pub trc_blkd_cpu: ::aya_ebpf::cty::c_int, + pub sched_info: sched_info, + pub tasks: list_head, + pub pushable_tasks: plist_node, + pub pushable_dl_tasks: rb_node, + pub mm: *mut mm_struct, + pub active_mm: *mut mm_struct, + pub faults_disabled_mapping: *mut address_space, + pub exit_state: ::aya_ebpf::cty::c_int, + pub exit_code: ::aya_ebpf::cty::c_int, + pub exit_signal: ::aya_ebpf::cty::c_int, + pub pdeath_signal: ::aya_ebpf::cty::c_int, + pub jobctl: ::aya_ebpf::cty::c_ulong, + pub personality: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 6usize]>, + pub atomic_flags: ::aya_ebpf::cty::c_ulong, + pub restart_block: restart_block, + pub pid: pid_t, + pub tgid: pid_t, + pub stack_canary: ::aya_ebpf::cty::c_ulong, + pub real_parent: *mut task_struct, + pub parent: *mut task_struct, + pub children: list_head, + pub sibling: list_head, + pub group_leader: *mut task_struct, + pub ptraced: list_head, + pub ptrace_entry: list_head, + pub thread_pid: *mut pid, + pub pid_links: [hlist_node; 4usize], + pub thread_node: list_head, + pub vfork_done: *mut completion, + pub set_child_tid: *mut ::aya_ebpf::cty::c_int, + pub clear_child_tid: *mut ::aya_ebpf::cty::c_int, + pub worker_private: *mut ::aya_ebpf::cty::c_void, + pub utime: u64_, + pub stime: u64_, + pub gtime: u64_, + pub prev_cputime: prev_cputime, + pub vtime: vtime, + pub tick_dep_mask: atomic_t, + pub nvcsw: ::aya_ebpf::cty::c_ulong, + pub nivcsw: ::aya_ebpf::cty::c_ulong, + pub start_time: u64_, + pub start_boottime: u64_, + pub min_flt: ::aya_ebpf::cty::c_ulong, + pub maj_flt: ::aya_ebpf::cty::c_ulong, + pub posix_cputimers: posix_cputimers, + pub posix_cputimers_work: posix_cputimers_work, + pub ptracer_cred: *const cred, + pub real_cred: *const cred, + pub cred: *const cred, + pub cached_requested_key: *mut key, + pub comm: [::aya_ebpf::cty::c_char; 16usize], + pub nameidata: *mut nameidata, + pub sysvsem: sysv_sem, + pub sysvshm: sysv_shm, + pub last_switch_count: ::aya_ebpf::cty::c_ulong, + pub last_switch_time: ::aya_ebpf::cty::c_ulong, + pub fs: *mut fs_struct, + pub files: *mut files_struct, + pub io_uring: *mut io_uring_task, + pub nsproxy: *mut nsproxy, + pub signal: *mut signal_struct, + pub sighand: *mut sighand_struct, + pub blocked: sigset_t, + pub real_blocked: sigset_t, + pub saved_sigmask: sigset_t, + pub pending: sigpending, + pub sas_ss_sp: ::aya_ebpf::cty::c_ulong, + pub sas_ss_size: usize, + pub sas_ss_flags: ::aya_ebpf::cty::c_uint, + pub task_works: *mut callback_head, + pub audit_context: *mut audit_context, + pub loginuid: kuid_t, + pub sessionid: ::aya_ebpf::cty::c_uint, + pub seccomp: seccomp, + pub syscall_dispatch: syscall_user_dispatch, + pub parent_exec_id: u64_, + pub self_exec_id: u64_, + pub alloc_lock: spinlock_t, + pub pi_lock: raw_spinlock_t, + pub wake_q: wake_q_node, + pub pi_waiters: rb_root_cached, + pub pi_top_task: *mut task_struct, + pub pi_blocked_on: *mut rt_mutex_waiter, + pub journal_info: *mut ::aya_ebpf::cty::c_void, + pub bio_list: *mut bio_list, + pub plug: *mut blk_plug, + pub reclaim_state: *mut reclaim_state, + pub io_context: *mut io_context, + pub capture_control: *mut capture_control, + pub ptrace_message: ::aya_ebpf::cty::c_ulong, + pub last_siginfo: *mut kernel_siginfo_t, + pub ioac: task_io_accounting, + pub psi_flags: ::aya_ebpf::cty::c_uint, + pub acct_rss_mem1: u64_, + pub acct_vm_mem1: u64_, + pub acct_timexpd: u64_, + pub mems_allowed: nodemask_t, + pub mems_allowed_seq: seqcount_spinlock_t, + pub cpuset_mem_spread_rotor: ::aya_ebpf::cty::c_int, + pub cpuset_slab_spread_rotor: ::aya_ebpf::cty::c_int, + pub cgroups: *mut css_set, + pub cg_list: list_head, + pub closid: u32_, + pub rmid: u32_, + pub robust_list: *mut robust_list_head, + pub compat_robust_list: *mut compat_robust_list_head, + pub pi_state_list: list_head, + pub pi_state_cache: *mut futex_pi_state, + pub futex_exit_mutex: mutex, + pub futex_state: ::aya_ebpf::cty::c_uint, + pub perf_event_ctxp: *mut perf_event_context, + pub perf_event_mutex: mutex, + pub perf_event_list: list_head, + pub mempolicy: *mut mempolicy, + pub il_prev: ::aya_ebpf::cty::c_short, + pub pref_node_fork: ::aya_ebpf::cty::c_short, + pub numa_scan_seq: ::aya_ebpf::cty::c_int, + pub numa_scan_period: ::aya_ebpf::cty::c_uint, + pub numa_scan_period_max: ::aya_ebpf::cty::c_uint, + pub numa_preferred_nid: ::aya_ebpf::cty::c_int, + pub numa_migrate_retry: ::aya_ebpf::cty::c_ulong, + pub node_stamp: u64_, + pub last_task_numa_placement: u64_, + pub last_sum_exec_runtime: u64_, + pub numa_work: callback_head, + pub numa_group: *mut numa_group, + pub numa_faults: *mut ::aya_ebpf::cty::c_ulong, + pub total_numa_faults: ::aya_ebpf::cty::c_ulong, + pub numa_faults_locality: [::aya_ebpf::cty::c_ulong; 3usize], + pub numa_pages_migrated: ::aya_ebpf::cty::c_ulong, + pub rseq: *mut rseq, + pub rseq_len: u32_, + pub rseq_sig: u32_, + pub rseq_event_mask: ::aya_ebpf::cty::c_ulong, + pub mm_cid: ::aya_ebpf::cty::c_int, + pub last_mm_cid: ::aya_ebpf::cty::c_int, + pub migrate_from_cpu: ::aya_ebpf::cty::c_int, + pub mm_cid_active: ::aya_ebpf::cty::c_int, + pub cid_work: callback_head, + pub tlb_ubc: tlbflush_unmap_batch, + pub splice_pipe: *mut pipe_inode_info, + pub task_frag: page_frag, + pub delays: *mut task_delay_info, + pub nr_dirtied: ::aya_ebpf::cty::c_int, + pub nr_dirtied_pause: ::aya_ebpf::cty::c_int, + pub dirty_paused_when: ::aya_ebpf::cty::c_ulong, + pub timer_slack_ns: u64_, + pub default_timer_slack_ns: u64_, + pub curr_ret_stack: ::aya_ebpf::cty::c_int, + pub curr_ret_depth: ::aya_ebpf::cty::c_int, + pub ret_stack: *mut ftrace_ret_stack, + pub ftrace_timestamp: ::aya_ebpf::cty::c_ulonglong, + pub trace_overrun: atomic_t, + pub tracing_graph_pause: atomic_t, + pub trace_recursion: ::aya_ebpf::cty::c_ulong, + pub memcg_in_oom: *mut mem_cgroup, + pub memcg_oom_gfp_mask: gfp_t, + pub memcg_oom_order: ::aya_ebpf::cty::c_int, + pub memcg_nr_pages_over_high: ::aya_ebpf::cty::c_uint, + pub active_memcg: *mut mem_cgroup, + pub objcg: *mut obj_cgroup, + pub throttle_disk: *mut gendisk, + pub utask: *mut uprobe_task, + pub sequential_io: ::aya_ebpf::cty::c_uint, + pub sequential_io_avg: ::aya_ebpf::cty::c_uint, + pub kmap_ctrl: kmap_ctrl, + pub rcu: callback_head, + pub rcu_users: refcount_t, + pub pagefault_disabled: ::aya_ebpf::cty::c_int, + pub oom_reaper_list: *mut task_struct, + pub oom_reaper_timer: timer_list, + pub stack_vm_area: *mut vm_struct, + pub stack_refcount: refcount_t, + pub security: *mut ::aya_ebpf::cty::c_void, + pub bpf_storage: *mut bpf_local_storage, + pub bpf_ctx: *mut bpf_run_ctx, + pub mce_vaddr: *mut ::aya_ebpf::cty::c_void, + pub mce_kflags: __u64, + pub mce_addr: u64_, + pub _bitfield_align_3: [u64; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 8usize]>, + pub mce_kill_me: callback_head, + pub mce_count: ::aya_ebpf::cty::c_int, + pub kretprobe_instances: llist_head, + pub rethooks: llist_head, + pub l1d_flush_kill: callback_head, + pub user_event_mm: *mut user_event_mm, + pub _bitfield_align_4: [u8; 0], + pub _bitfield_4: __BindgenBitfieldUnit<[u8; 24usize]>, + pub thread: thread_struct, +} +impl task_struct { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn sched_reset_on_fork(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_dl_non_contending(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_sched_reset_on_fork(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) + self._bitfield_2.set(0usize, 1u8, val as u64) } } #[inline] - pub fn dl_overrun(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + pub fn sched_contributes_to_load(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_dl_overrun(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_sched_contributes_to_load(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) + self._bitfield_2.set(1usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - dl_throttled: ::aya_bpf::cty::c_uint, - dl_yielded: ::aya_bpf::cty::c_uint, - dl_non_contending: ::aya_bpf::cty::c_uint, - dl_overrun: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let dl_throttled: u32 = unsafe { ::core::mem::transmute(dl_throttled) }; - dl_throttled as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let dl_yielded: u32 = unsafe { ::core::mem::transmute(dl_yielded) }; - dl_yielded as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let dl_non_contending: u32 = unsafe { ::core::mem::transmute(dl_non_contending) }; - dl_non_contending as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let dl_overrun: u32 = unsafe { ::core::mem::transmute(dl_overrun) }; - dl_overrun as u64 - }); - __bindgen_bitfield_unit + pub fn sched_migrated(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 1u8) as u32) } } -} -#[repr(C)] -#[repr(align(4))] -#[derive(Debug, Copy, Clone)] -pub struct uclamp_se { - pub _bitfield_align_1: [u16; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, - pub __bindgen_padding_0: u16, -} -impl uclamp_se { #[inline] - pub fn value(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 11u8) as u32) } + pub fn set_sched_migrated(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn sched_remote_wakeup(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(32usize, 1u8) as u32) } } #[inline] - pub fn set_value(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_sched_remote_wakeup(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 11u8, val as u64) + self._bitfield_2.set(32usize, 1u8, val as u64) } } #[inline] - pub fn bucket_id(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 3u8) as u32) } + pub fn sched_rt_mutex(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(33usize, 1u8) as u32) } } #[inline] - pub fn set_bucket_id(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_sched_rt_mutex(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 3u8, val as u64) + self._bitfield_2.set(33usize, 1u8, val as u64) } } #[inline] - pub fn active(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) } + pub fn in_execve(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(34usize, 1u8) as u32) } } #[inline] - pub fn set_active(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_in_execve(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(14usize, 1u8, val as u64) + self._bitfield_2.set(34usize, 1u8, val as u64) } } #[inline] - pub fn user_defined(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) } + pub fn in_iowait(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(35usize, 1u8) as u32) } } #[inline] - pub fn set_user_defined(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_in_iowait(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(15usize, 1u8, val as u64) + self._bitfield_2.set(35usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - value: ::aya_bpf::cty::c_uint, - bucket_id: ::aya_bpf::cty::c_uint, - active: ::aya_bpf::cty::c_uint, - user_defined: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 11u8, { - let value: u32 = unsafe { ::core::mem::transmute(value) }; - value as u64 - }); - __bindgen_bitfield_unit.set(11usize, 3u8, { - let bucket_id: u32 = unsafe { ::core::mem::transmute(bucket_id) }; - bucket_id as u64 - }); - __bindgen_bitfield_unit.set(14usize, 1u8, { - let active: u32 = unsafe { ::core::mem::transmute(active) }; - active as u64 - }); - __bindgen_bitfield_unit.set(15usize, 1u8, { - let user_defined: u32 = unsafe { ::core::mem::transmute(user_defined) }; - user_defined as u64 - }); - __bindgen_bitfield_unit + pub fn restore_sigmask(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(36usize, 1u8) as u32) } } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sched_statistics { - pub wait_start: u64_, - pub wait_max: u64_, - pub wait_count: u64_, - pub wait_sum: u64_, - pub iowait_count: u64_, - pub iowait_sum: u64_, - pub sleep_start: u64_, - pub sleep_max: u64_, - pub sum_sleep_runtime: s64, - pub block_start: u64_, - pub block_max: u64_, - pub sum_block_runtime: s64, - pub exec_max: u64_, - pub slice_max: u64_, - pub nr_migrations_cold: u64_, - pub nr_failed_migrations_affine: u64_, - pub nr_failed_migrations_running: u64_, - pub nr_failed_migrations_hot: u64_, - pub nr_forced_migrations: u64_, - pub nr_wakeups: u64_, - pub nr_wakeups_sync: u64_, - pub nr_wakeups_migrate: u64_, - pub nr_wakeups_local: u64_, - pub nr_wakeups_remote: u64_, - pub nr_wakeups_affine: u64_, - pub nr_wakeups_affine_attempts: u64_, - pub nr_wakeups_passive: u64_, - pub nr_wakeups_idle: u64_, - pub core_forceidle_sum: u64_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, -} -impl sched_statistics { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit + pub fn set_restore_sigmask(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(36usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_user_fault(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(37usize, 1u8) as u32) } + } + #[inline] + pub fn set_in_user_fault(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(37usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_lru_fault(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(38usize, 1u8) as u32) } + } + #[inline] + pub fn set_in_lru_fault(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(38usize, 1u8, val as u64) + } + } + #[inline] + pub fn no_cgroup_migration(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(39usize, 1u8) as u32) } + } + #[inline] + pub fn set_no_cgroup_migration(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(39usize, 1u8, val as u64) + } + } + #[inline] + pub fn frozen(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(40usize, 1u8) as u32) } + } + #[inline] + pub fn set_frozen(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(40usize, 1u8, val as u64) + } + } + #[inline] + pub fn use_memdelay(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(41usize, 1u8) as u32) } + } + #[inline] + pub fn set_use_memdelay(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(41usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_memstall(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(42usize, 1u8) as u32) } + } + #[inline] + pub fn set_in_memstall(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(42usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_eventfd(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(43usize, 1u8) as u32) } + } + #[inline] + pub fn set_in_eventfd(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(43usize, 1u8, val as u64) + } + } + #[inline] + pub fn pasid_activated(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(44usize, 1u8) as u32) } + } + #[inline] + pub fn set_pasid_activated(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(44usize, 1u8, val as u64) + } + } + #[inline] + pub fn reported_split_lock(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(45usize, 1u8) as u32) } + } + #[inline] + pub fn set_reported_split_lock(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(45usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_thrashing(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(46usize, 1u8) as u32) } + } + #[inline] + pub fn set_in_thrashing(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(46usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_2( + sched_reset_on_fork: ::aya_ebpf::cty::c_uint, + sched_contributes_to_load: ::aya_ebpf::cty::c_uint, + sched_migrated: ::aya_ebpf::cty::c_uint, + sched_remote_wakeup: ::aya_ebpf::cty::c_uint, + sched_rt_mutex: ::aya_ebpf::cty::c_uint, + in_execve: ::aya_ebpf::cty::c_uint, + in_iowait: ::aya_ebpf::cty::c_uint, + restore_sigmask: ::aya_ebpf::cty::c_uint, + in_user_fault: ::aya_ebpf::cty::c_uint, + in_lru_fault: ::aya_ebpf::cty::c_uint, + no_cgroup_migration: ::aya_ebpf::cty::c_uint, + frozen: ::aya_ebpf::cty::c_uint, + use_memdelay: ::aya_ebpf::cty::c_uint, + in_memstall: ::aya_ebpf::cty::c_uint, + in_eventfd: ::aya_ebpf::cty::c_uint, + pasid_activated: ::aya_ebpf::cty::c_uint, + reported_split_lock: ::aya_ebpf::cty::c_uint, + in_thrashing: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 6usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 6usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let sched_reset_on_fork: u32 = unsafe { ::core::mem::transmute(sched_reset_on_fork) }; + sched_reset_on_fork as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let sched_contributes_to_load: u32 = + unsafe { ::core::mem::transmute(sched_contributes_to_load) }; + sched_contributes_to_load as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let sched_migrated: u32 = unsafe { ::core::mem::transmute(sched_migrated) }; + sched_migrated as u64 + }); + __bindgen_bitfield_unit.set(32usize, 1u8, { + let sched_remote_wakeup: u32 = unsafe { ::core::mem::transmute(sched_remote_wakeup) }; + sched_remote_wakeup as u64 + }); + __bindgen_bitfield_unit.set(33usize, 1u8, { + let sched_rt_mutex: u32 = unsafe { ::core::mem::transmute(sched_rt_mutex) }; + sched_rt_mutex as u64 + }); + __bindgen_bitfield_unit.set(34usize, 1u8, { + let in_execve: u32 = unsafe { ::core::mem::transmute(in_execve) }; + in_execve as u64 + }); + __bindgen_bitfield_unit.set(35usize, 1u8, { + let in_iowait: u32 = unsafe { ::core::mem::transmute(in_iowait) }; + in_iowait as u64 + }); + __bindgen_bitfield_unit.set(36usize, 1u8, { + let restore_sigmask: u32 = unsafe { ::core::mem::transmute(restore_sigmask) }; + restore_sigmask as u64 + }); + __bindgen_bitfield_unit.set(37usize, 1u8, { + let in_user_fault: u32 = unsafe { ::core::mem::transmute(in_user_fault) }; + in_user_fault as u64 + }); + __bindgen_bitfield_unit.set(38usize, 1u8, { + let in_lru_fault: u32 = unsafe { ::core::mem::transmute(in_lru_fault) }; + in_lru_fault as u64 + }); + __bindgen_bitfield_unit.set(39usize, 1u8, { + let no_cgroup_migration: u32 = unsafe { ::core::mem::transmute(no_cgroup_migration) }; + no_cgroup_migration as u64 + }); + __bindgen_bitfield_unit.set(40usize, 1u8, { + let frozen: u32 = unsafe { ::core::mem::transmute(frozen) }; + frozen as u64 + }); + __bindgen_bitfield_unit.set(41usize, 1u8, { + let use_memdelay: u32 = unsafe { ::core::mem::transmute(use_memdelay) }; + use_memdelay as u64 + }); + __bindgen_bitfield_unit.set(42usize, 1u8, { + let in_memstall: u32 = unsafe { ::core::mem::transmute(in_memstall) }; + in_memstall as u64 + }); + __bindgen_bitfield_unit.set(43usize, 1u8, { + let in_eventfd: u32 = unsafe { ::core::mem::transmute(in_eventfd) }; + in_eventfd as u64 + }); + __bindgen_bitfield_unit.set(44usize, 1u8, { + let pasid_activated: u32 = unsafe { ::core::mem::transmute(pasid_activated) }; + pasid_activated as u64 + }); + __bindgen_bitfield_unit.set(45usize, 1u8, { + let reported_split_lock: u32 = unsafe { ::core::mem::transmute(reported_split_lock) }; + reported_split_lock as u64 + }); + __bindgen_bitfield_unit.set(46usize, 1u8, { + let in_thrashing: u32 = unsafe { ::core::mem::transmute(in_thrashing) }; + in_thrashing as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn mce_ripv(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_3.get(0usize, 1u8) as u64) } + } + #[inline] + pub fn set_mce_ripv(&mut self, val: __u64) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_3.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn mce_whole_page(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_3.get(1usize, 1u8) as u64) } + } + #[inline] + pub fn set_mce_whole_page(&mut self, val: __u64) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_3.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn __mce_reserved(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_3.get(2usize, 62u8) as u64) } + } + #[inline] + pub fn set___mce_reserved(&mut self, val: __u64) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_3.set(2usize, 62u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_3( + mce_ripv: __u64, + mce_whole_page: __u64, + __mce_reserved: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let mce_ripv: u64 = unsafe { ::core::mem::transmute(mce_ripv) }; + mce_ripv as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let mce_whole_page: u64 = unsafe { ::core::mem::transmute(mce_whole_page) }; + mce_whole_page as u64 + }); + __bindgen_bitfield_unit.set(2usize, 62u8, { + let __mce_reserved: u64 = unsafe { ::core::mem::transmute(__mce_reserved) }; + __mce_reserved as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_4() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cpumask { - pub bits: [::aya_bpf::cty::c_ulong; 5usize], -} -pub type cpumask_t = cpumask; -#[repr(C)] -#[derive(Copy, Clone)] -pub union rcu_special { - pub b: rcu_special__bindgen_ty_1, - pub s: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rcu_special__bindgen_ty_1 { - pub blocked: u8_, - pub need_qs: u8_, - pub exp_hint: u8_, - pub need_mb: u8_, -} +pub struct lock_class_key {} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sched_info { - pub pcount: ::aya_bpf::cty::c_ulong, - pub run_delay: ::aya_bpf::cty::c_ulonglong, - pub last_arrival: ::aya_bpf::cty::c_ulonglong, - pub last_queued: ::aya_bpf::cty::c_ulonglong, +pub struct file_system_type { + pub name: *const ::aya_ebpf::cty::c_char, + pub fs_flags: ::aya_ebpf::cty::c_int, + pub init_fs_context: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_ebpf::cty::c_int, + >, + pub parameters: *const fs_parameter_spec, + pub mount: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file_system_type, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const ::aya_ebpf::cty::c_char, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> *mut dentry, + >, + pub kill_sb: ::core::option::Option, + pub owner: *mut module, + pub next: *mut file_system_type, + pub fs_supers: hlist_head, + pub s_lock_key: lock_class_key, + pub s_umount_key: lock_class_key, + pub s_vfs_rename_key: lock_class_key, + pub s_writers_key: [lock_class_key; 3usize], + pub i_lock_key: lock_class_key, + pub i_mutex_key: lock_class_key, + pub invalidate_lock_key: lock_class_key, + pub i_mutex_dir_key: lock_class_key, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct plist_node { - pub prio: ::aya_bpf::cty::c_int, - pub prio_list: list_head, - pub node_list: list_head, +pub struct pt_regs { + pub r15: ::aya_ebpf::cty::c_ulong, + pub r14: ::aya_ebpf::cty::c_ulong, + pub r13: ::aya_ebpf::cty::c_ulong, + pub r12: ::aya_ebpf::cty::c_ulong, + pub bp: ::aya_ebpf::cty::c_ulong, + pub bx: ::aya_ebpf::cty::c_ulong, + pub r11: ::aya_ebpf::cty::c_ulong, + pub r10: ::aya_ebpf::cty::c_ulong, + pub r9: ::aya_ebpf::cty::c_ulong, + pub r8: ::aya_ebpf::cty::c_ulong, + pub ax: ::aya_ebpf::cty::c_ulong, + pub cx: ::aya_ebpf::cty::c_ulong, + pub dx: ::aya_ebpf::cty::c_ulong, + pub si: ::aya_ebpf::cty::c_ulong, + pub di: ::aya_ebpf::cty::c_ulong, + pub orig_ax: ::aya_ebpf::cty::c_ulong, + pub ip: ::aya_ebpf::cty::c_ulong, + pub cs: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, + pub sp: ::aya_ebpf::cty::c_ulong, + pub ss: ::aya_ebpf::cty::c_ulong, +} +pub type pteval_t = ::aya_ebpf::cty::c_ulong; +pub type pmdval_t = ::aya_ebpf::cty::c_ulong; +pub type pudval_t = ::aya_ebpf::cty::c_ulong; +pub type pgdval_t = ::aya_ebpf::cty::c_ulong; +pub type pgprotval_t = ::aya_ebpf::cty::c_ulong; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pte_t { + pub pte: pteval_t, } -pub mod timespec_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const TT_NONE: Type = 0; - pub const TT_NATIVE: Type = 1; - pub const TT_COMPAT: Type = 2; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pmd_t { + pub pmd: pmdval_t, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct restart_block { - pub arch_data: ::aya_bpf::cty::c_ulong, - pub fn_: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut restart_block) -> ::aya_bpf::cty::c_long, - >, - pub __bindgen_anon_1: restart_block__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct pgprot { + pub pgprot: pgprotval_t, } +pub type pgprot_t = pgprot; #[repr(C)] -#[derive(Copy, Clone)] -pub union restart_block__bindgen_ty_1 { - pub futex: restart_block__bindgen_ty_1__bindgen_ty_1, - pub nanosleep: restart_block__bindgen_ty_1__bindgen_ty_2, - pub poll: restart_block__bindgen_ty_1__bindgen_ty_3, +#[derive(Debug, Copy, Clone)] +pub struct pgd_t { + pub pgd: pgdval_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct restart_block__bindgen_ty_1__bindgen_ty_1 { - pub uaddr: *mut u32_, - pub val: u32_, - pub flags: u32_, - pub bitset: u32_, - pub time: u64_, - pub uaddr2: *mut u32_, +pub struct pud_t { + pub pud: pudval_t, } +pub type pgtable_t = *mut page; #[repr(C)] #[derive(Copy, Clone)] -pub struct restart_block__bindgen_ty_1__bindgen_ty_2 { - pub clockid: clockid_t, - pub type_: timespec_type::Type, - pub __bindgen_anon_1: restart_block__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, - pub expires: u64_, +pub struct page { + pub flags: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_1: page__bindgen_ty_1, + pub __bindgen_anon_2: page__bindgen_ty_2, + pub _refcount: atomic_t, + pub memcg_data: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] -pub union restart_block__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - pub rmtp: *mut __kernel_timespec, - pub compat_rmtp: *mut old_timespec32, +pub union page__bindgen_ty_1 { + pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: page__bindgen_ty_1__bindgen_ty_2, + pub __bindgen_anon_3: page__bindgen_ty_1__bindgen_ty_3, + pub __bindgen_anon_4: page__bindgen_ty_1__bindgen_ty_4, + pub callback_head: callback_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct restart_block__bindgen_ty_1__bindgen_ty_3 { - pub ufds: *mut pollfd, - pub nfds: ::aya_bpf::cty::c_int, - pub has_timeout: ::aya_bpf::cty::c_int, - pub tv_sec: ::aya_bpf::cty::c_ulong, - pub tv_nsec: ::aya_bpf::cty::c_ulong, +#[derive(Copy, Clone)] +pub struct page__bindgen_ty_1__bindgen_ty_1 { + pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub mapping: *mut address_space, + pub __bindgen_anon_2: page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, + pub private: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] -pub struct prev_cputime { - pub utime: u64_, - pub stime: u64_, - pub lock: raw_spinlock_t, +pub union page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub lru: list_head, + pub __bindgen_anon_1: page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub buddy_list: list_head, + pub pcp_list: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct seqcount { - pub sequence: ::aya_bpf::cty::c_uint, -} -pub type seqcount_t = seqcount; -pub mod vtime_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const VTIME_INACTIVE: Type = 0; - pub const VTIME_IDLE: Type = 1; - pub const VTIME_SYS: Type = 2; - pub const VTIME_USER: Type = 3; - pub const VTIME_GUEST: Type = 4; +pub struct page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub __filler: *mut ::aya_ebpf::cty::c_void, + pub mlock_count: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vtime { - pub seqcount: seqcount_t, - pub starttime: ::aya_bpf::cty::c_ulonglong, - pub state: vtime_state::Type, - pub cpu: ::aya_bpf::cty::c_uint, - pub utime: u64_, - pub stime: u64_, - pub gtime: u64_, +#[derive(Copy, Clone)] +pub union page__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { + pub index: ::aya_ebpf::cty::c_ulong, + pub share: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rb_root { - pub rb_node: *mut rb_node, +pub struct page__bindgen_ty_1__bindgen_ty_2 { + pub pp_magic: ::aya_ebpf::cty::c_ulong, + pub pp: *mut page_pool, + pub _pp_mapping_pad: ::aya_ebpf::cty::c_ulong, + pub dma_addr: ::aya_ebpf::cty::c_ulong, + pub pp_ref_count: atomic_long_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rb_root_cached { - pub rb_root: rb_root, - pub rb_leftmost: *mut rb_node, +pub struct page__bindgen_ty_1__bindgen_ty_3 { + pub compound_head: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct timerqueue_head { - pub rb_root: rb_root_cached, +pub struct page__bindgen_ty_1__bindgen_ty_4 { + pub pgmap: *mut dev_pagemap, + pub zone_device_data: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct posix_cputimer_base { - pub nextevt: u64_, - pub tqhead: timerqueue_head, +#[derive(Copy, Clone)] +pub union page__bindgen_ty_2 { + pub _mapcount: atomic_t, + pub page_type: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct posix_cputimers { - pub bases: [posix_cputimer_base; 3usize], - pub timers_active: ::aya_bpf::cty::c_uint, - pub expiry_active: ::aya_bpf::cty::c_uint, +pub struct jump_entry { + pub code: s32, + pub target: s32, + pub key: ::aya_ebpf::cty::c_long, } #[repr(C)] #[derive(Copy, Clone)] -pub struct posix_cputimers_work { - pub work: callback_head, - pub mutex: mutex, - pub scheduled: ::aya_bpf::cty::c_uint, +pub struct static_key { + pub enabled: atomic_t, + pub __bindgen_anon_1: static_key__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sysv_sem { - pub undo_list: *mut sem_undo_list, +#[derive(Copy, Clone)] +pub union static_key__bindgen_ty_1 { + pub type_: ::aya_ebpf::cty::c_ulong, + pub entries: *mut jump_entry, + pub next: *mut static_key_mod, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sysv_shm { - pub shm_clist: list_head, +#[derive(Copy, Clone)] +pub struct static_key_true { + pub key: static_key, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sigset_t { - pub sig: [::aya_bpf::cty::c_ulong; 1usize], +#[derive(Copy, Clone)] +pub struct static_key_false { + pub key: static_key, } -#[repr(C)] +#[repr(C, packed)] #[derive(Debug, Copy, Clone)] -pub struct sigpending { - pub list: list_head, - pub signal: sigset_t, +pub struct orc_entry { + pub sp_offset: s16, + pub bp_offset: s16, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kuid_t { - pub val: uid_t, +impl orc_entry { + #[inline] + pub fn sp_reg(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u32) } + } + #[inline] + pub fn set_sp_reg(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 4u8, val as u64) + } + } + #[inline] + pub fn bp_reg(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u32) } + } + #[inline] + pub fn set_bp_reg(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 4u8, val as u64) + } + } + #[inline] + pub fn type_(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 3u8) as u32) } + } + #[inline] + pub fn set_type(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 3u8, val as u64) + } + } + #[inline] + pub fn signal(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) } + } + #[inline] + pub fn set_signal(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + sp_reg: ::aya_ebpf::cty::c_uint, + bp_reg: ::aya_ebpf::cty::c_uint, + type_: ::aya_ebpf::cty::c_uint, + signal: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 4u8, { + let sp_reg: u32 = unsafe { ::core::mem::transmute(sp_reg) }; + sp_reg as u64 + }); + __bindgen_bitfield_unit.set(4usize, 4u8, { + let bp_reg: u32 = unsafe { ::core::mem::transmute(bp_reg) }; + bp_reg as u64 + }); + __bindgen_bitfield_unit.set(8usize, 3u8, { + let type_: u32 = unsafe { ::core::mem::transmute(type_) }; + type_ as u64 + }); + __bindgen_bitfield_unit.set(11usize, 1u8, { + let signal: u32 = unsafe { ::core::mem::transmute(signal) }; + signal as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct seccomp { - pub mode: ::aya_bpf::cty::c_int, - pub filter_count: atomic_t, - pub filter: *mut seccomp_filter, -} +pub struct lockdep_map_p {} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct syscall_user_dispatch { - pub selector: *mut ::aya_bpf::cty::c_char, - pub offset: ::aya_bpf::cty::c_ulong, - pub len: ::aya_bpf::cty::c_ulong, - pub on_dispatch: bool_, +#[derive(Copy, Clone)] +pub struct maple_tree { + pub __bindgen_anon_1: maple_tree__bindgen_ty_1, + pub ma_flags: ::aya_ebpf::cty::c_uint, + pub ma_root: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wake_q_node { - pub next: *mut wake_q_node, +#[derive(Copy, Clone)] +pub union maple_tree__bindgen_ty_1 { + pub ma_lock: spinlock_t, + pub ma_external_lock: lockdep_map_p, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct task_io_accounting { - pub rchar: u64_, - pub wchar: u64_, - pub syscr: u64_, - pub syscw: u64_, - pub read_bytes: u64_, - pub write_bytes: u64_, - pub cancelled_write_bytes: u64_, +#[derive(Copy, Clone)] +pub struct rw_semaphore { + pub count: atomic_long_t, + pub owner: atomic_long_t, + pub osq: optimistic_spin_queue, + pub wait_lock: raw_spinlock_t, + pub wait_list: list_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nodemask_t { - pub bits: [::aya_bpf::cty::c_ulong; 1usize], +#[derive(Copy, Clone)] +pub struct percpu_counter { + pub lock: raw_spinlock_t, + pub count: s64, + pub list: list_head, + pub counters: *mut s32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct seqcount_spinlock { - pub seqcount: seqcount_t, +#[derive(Copy, Clone)] +pub struct mm_context_t { + pub ctx_id: u64_, + pub tlb_gen: atomic64_t, + pub ldt_usr_sem: rw_semaphore, + pub ldt: *mut ldt_struct, + pub flags: ::aya_ebpf::cty::c_ulong, + pub lam_cr3_mask: ::aya_ebpf::cty::c_ulong, + pub untag_mask: u64_, + pub lock: mutex, + pub vdso: *mut ::aya_ebpf::cty::c_void, + pub vdso_image: *const vdso_image, + pub perf_rdpmc_allowed: atomic_t, + pub pkey_allocation_map: u16_, + pub execute_only_pkey: s16, } -pub type seqcount_spinlock_t = seqcount_spinlock; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct arch_tlbflush_unmap_batch { - pub cpumask: cpumask, +pub struct uprobes_state { + pub xol_area: *mut xol_area, } +pub type work_func_t = ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tlbflush_unmap_batch { - pub arch: arch_tlbflush_unmap_batch, - pub flush_required: bool_, - pub writable: bool_, +pub struct work_struct { + pub data: atomic_long_t, + pub entry: list_head, + pub func: work_func_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct page_frag { - pub page: *mut page, - pub offset: __u32, - pub size: __u32, +pub struct mm_struct { + pub __bindgen_anon_1: mm_struct__bindgen_ty_1, + pub cpu_bitmap: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct latency_record { - pub backtrace: [::aya_bpf::cty::c_ulong; 12usize], - pub count: ::aya_bpf::cty::c_uint, - pub time: ::aya_bpf::cty::c_ulong, - pub max: ::aya_bpf::cty::c_ulong, +#[derive(Copy, Clone)] +pub struct mm_struct__bindgen_ty_1 { + pub __bindgen_anon_1: mm_struct__bindgen_ty_1__bindgen_ty_1, + pub mm_mt: maple_tree, + pub get_unmapped_area: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_ulong, + >, + pub mmap_base: ::aya_ebpf::cty::c_ulong, + pub mmap_legacy_base: ::aya_ebpf::cty::c_ulong, + pub mmap_compat_base: ::aya_ebpf::cty::c_ulong, + pub mmap_compat_legacy_base: ::aya_ebpf::cty::c_ulong, + pub task_size: ::aya_ebpf::cty::c_ulong, + pub pgd: *mut pgd_t, + pub membarrier_state: atomic_t, + pub mm_users: atomic_t, + pub pcpu_cid: *mut mm_cid, + pub mm_cid_next_scan: ::aya_ebpf::cty::c_ulong, + pub pgtables_bytes: atomic_long_t, + pub map_count: ::aya_ebpf::cty::c_int, + pub page_table_lock: spinlock_t, + pub mmap_lock: rw_semaphore, + pub mmlist: list_head, + pub mm_lock_seq: ::aya_ebpf::cty::c_int, + pub hiwater_rss: ::aya_ebpf::cty::c_ulong, + pub hiwater_vm: ::aya_ebpf::cty::c_ulong, + pub total_vm: ::aya_ebpf::cty::c_ulong, + pub locked_vm: ::aya_ebpf::cty::c_ulong, + pub pinned_vm: atomic64_t, + pub data_vm: ::aya_ebpf::cty::c_ulong, + pub exec_vm: ::aya_ebpf::cty::c_ulong, + pub stack_vm: ::aya_ebpf::cty::c_ulong, + pub def_flags: ::aya_ebpf::cty::c_ulong, + pub write_protect_seq: seqcount_t, + pub arg_lock: spinlock_t, + pub start_code: ::aya_ebpf::cty::c_ulong, + pub end_code: ::aya_ebpf::cty::c_ulong, + pub start_data: ::aya_ebpf::cty::c_ulong, + pub end_data: ::aya_ebpf::cty::c_ulong, + pub start_brk: ::aya_ebpf::cty::c_ulong, + pub brk: ::aya_ebpf::cty::c_ulong, + pub start_stack: ::aya_ebpf::cty::c_ulong, + pub arg_start: ::aya_ebpf::cty::c_ulong, + pub arg_end: ::aya_ebpf::cty::c_ulong, + pub env_start: ::aya_ebpf::cty::c_ulong, + pub env_end: ::aya_ebpf::cty::c_ulong, + pub saved_auxv: [::aya_ebpf::cty::c_ulong; 52usize], + pub rss_stat: [percpu_counter; 4usize], + pub binfmt: *mut linux_binfmt, + pub context: mm_context_t, + pub flags: ::aya_ebpf::cty::c_ulong, + pub ioctx_lock: spinlock_t, + pub ioctx_table: *mut kioctx_table, + pub owner: *mut task_struct, + pub user_ns: *mut user_namespace, + pub exe_file: *mut file, + pub notifier_subscriptions: *mut mmu_notifier_subscriptions, + pub numa_next_scan: ::aya_ebpf::cty::c_ulong, + pub numa_scan_offset: ::aya_ebpf::cty::c_ulong, + pub numa_scan_seq: ::aya_ebpf::cty::c_int, + pub tlb_flush_pending: atomic_t, + pub tlb_flush_batched: atomic_t, + pub uprobes_state: uprobes_state, + pub hugetlb_usage: atomic_long_t, + pub async_put_work: work_struct, + pub iommu_mm: *mut iommu_mm_data, + pub ksm_merging_pages: ::aya_ebpf::cty::c_ulong, + pub ksm_rmap_items: ::aya_ebpf::cty::c_ulong, + pub ksm_zero_pages: ::aya_ebpf::cty::c_ulong, + pub lru_gen: mm_struct__bindgen_ty_1__bindgen_ty_2, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kmap_ctrl {} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timer_list { - pub entry: hlist_node, - pub expires: ::aya_bpf::cty::c_ulong, - pub function: ::core::option::Option, - pub flags: u32_, +pub struct mm_struct__bindgen_ty_1__bindgen_ty_1 { + pub mm_count: atomic_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub __bindgen_padding_0: u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct llist_head { - pub first: *mut llist_node, +pub struct mm_struct__bindgen_ty_1__bindgen_ty_2 { + pub list: list_head, + pub bitmap: ::aya_ebpf::cty::c_ulong, + pub memcg: *mut mem_cgroup, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fpu_state_perm { - pub __state_perm: u64_, - pub __state_size: ::aya_bpf::cty::c_uint, - pub __user_state_size: ::aya_bpf::cty::c_uint, +impl mm_struct__bindgen_ty_1 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } } +pub type vm_flags_t = ::aya_ebpf::cty::c_ulong; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fregs_state { - pub cwd: u32_, - pub swd: u32_, - pub twd: u32_, - pub fip: u32_, - pub fcs: u32_, - pub foo: u32_, - pub fos: u32_, - pub st_space: [u32_; 20usize], - pub status: u32_, +pub struct vm_userfaultfd_ctx { + pub ctx: *mut userfaultfd_ctx, } #[repr(C)] #[derive(Copy, Clone)] -pub struct fxregs_state { - pub cwd: u16_, - pub swd: u16_, - pub twd: u16_, - pub fop: u16_, - pub __bindgen_anon_1: fxregs_state__bindgen_ty_1, - pub mxcsr: u32_, - pub mxcsr_mask: u32_, - pub st_space: [u32_; 32usize], - pub xmm_space: [u32_; 64usize], - pub padding: [u32_; 12usize], - pub __bindgen_anon_2: fxregs_state__bindgen_ty_2, +pub struct vm_area_struct { + pub __bindgen_anon_1: vm_area_struct__bindgen_ty_1, + pub vm_mm: *mut mm_struct, + pub vm_page_prot: pgprot_t, + pub __bindgen_anon_2: vm_area_struct__bindgen_ty_2, + pub vm_lock_seq: ::aya_ebpf::cty::c_int, + pub vm_lock: *mut vma_lock, + pub detached: bool_, + pub shared: vm_area_struct__bindgen_ty_3, + pub anon_vma_chain: list_head, + pub anon_vma: *mut anon_vma, + pub vm_ops: *const vm_operations_struct, + pub vm_pgoff: ::aya_ebpf::cty::c_ulong, + pub vm_file: *mut file, + pub vm_private_data: *mut ::aya_ebpf::cty::c_void, + pub anon_name: *mut anon_vma_name, + pub swap_readahead_info: atomic_long_t, + pub vm_policy: *mut mempolicy, + pub numab_state: *mut vma_numab_state, + pub vm_userfaultfd_ctx: vm_userfaultfd_ctx, } #[repr(C)] #[derive(Copy, Clone)] -pub union fxregs_state__bindgen_ty_1 { - pub __bindgen_anon_1: fxregs_state__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: fxregs_state__bindgen_ty_1__bindgen_ty_2, +pub union vm_area_struct__bindgen_ty_1 { + pub __bindgen_anon_1: vm_area_struct__bindgen_ty_1__bindgen_ty_1, + pub vm_rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fxregs_state__bindgen_ty_1__bindgen_ty_1 { - pub rip: u64_, - pub rdp: u64_, +pub struct vm_area_struct__bindgen_ty_1__bindgen_ty_1 { + pub vm_start: ::aya_ebpf::cty::c_ulong, + pub vm_end: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union vm_area_struct__bindgen_ty_2 { + pub vm_flags: vm_flags_t, + pub __vm_flags: vm_flags_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fxregs_state__bindgen_ty_1__bindgen_ty_2 { - pub fip: u32_, - pub fcs: u32_, - pub foo: u32_, - pub fos: u32_, +pub struct vm_area_struct__bindgen_ty_3 { + pub rb: rb_node, + pub rb_subtree_last: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] -pub union fxregs_state__bindgen_ty_2 { - pub padding1: [u32_; 12usize], - pub sw_reserved: [u32_; 12usize], +pub struct qrwlock { + pub __bindgen_anon_1: qrwlock__bindgen_ty_1, + pub wait_lock: arch_spinlock_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union qrwlock__bindgen_ty_1 { + pub cnts: atomic_t, + pub __bindgen_anon_1: qrwlock__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct swregs_state { - pub cwd: u32_, - pub swd: u32_, - pub twd: u32_, - pub fip: u32_, - pub fcs: u32_, - pub foo: u32_, - pub fos: u32_, - pub st_space: [u32_; 20usize], - pub ftop: u8_, - pub changed: u8_, - pub lookahead: u8_, - pub no_update: u8_, - pub rm: u8_, - pub alimit: u8_, - pub info: *mut math_emu_info, - pub entry_eip: u32_, +pub struct qrwlock__bindgen_ty_1__bindgen_ty_1 { + pub wlocked: u8_, + pub __lstate: [u8_; 3usize], } +pub type arch_rwlock_t = qrwlock; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xstate_header { - pub xfeatures: u64_, - pub xcomp_bv: u64_, - pub reserved: [u64_; 6usize], +pub struct math_emu_info { + pub ___orig_eip: ::aya_ebpf::cty::c_long, + pub regs: *mut pt_regs, } #[repr(C)] -pub struct xregs_state { - pub i387: fxregs_state, - pub header: xstate_header, - pub extended_state_area: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct lockdep_map {} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ratelimit_state { + pub lock: raw_spinlock_t, + pub interval: ::aya_ebpf::cty::c_int, + pub burst: ::aya_ebpf::cty::c_int, + pub printed: ::aya_ebpf::cty::c_int, + pub missed: ::aya_ebpf::cty::c_int, + pub begin: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, +} +#[repr(C, packed)] +#[derive(Debug, Copy, Clone)] +pub struct pi_entry { + pub fmt: *const ::aya_ebpf::cty::c_char, + pub func: *const ::aya_ebpf::cty::c_char, + pub file: *const ::aya_ebpf::cty::c_char, + pub line: ::aya_ebpf::cty::c_uint, + pub level: *const ::aya_ebpf::cty::c_char, + pub subsys_fmt_prefix: *const ::aya_ebpf::cty::c_char, } #[repr(C)] -pub struct fpregs_state { - pub fsave: __BindgenUnionField, - pub fxsave: __BindgenUnionField, - pub soft: __BindgenUnionField, - pub xsave: __BindgenUnionField, - pub __padding: __BindgenUnionField<[u8_; 4096usize]>, - pub bindgen_union_field: [u64; 512usize], +#[derive(Copy, Clone)] +pub struct _ddebug { + pub modname: *const ::aya_ebpf::cty::c_char, + pub function: *const ::aya_ebpf::cty::c_char, + pub filename: *const ::aya_ebpf::cty::c_char, + pub format: *const ::aya_ebpf::cty::c_char, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, + pub key: _ddebug__bindgen_ty_1, } #[repr(C)] -pub struct fpstate { - pub size: ::aya_bpf::cty::c_uint, - pub user_size: ::aya_bpf::cty::c_uint, - pub xfeatures: u64_, - pub user_xfeatures: u64_, - pub xfd: u64_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, - pub regs: fpregs_state, +#[derive(Copy, Clone)] +pub union _ddebug__bindgen_ty_1 { + pub dd_key_true: static_key_true, + pub dd_key_false: static_key_false, } -impl fpstate { - #[inline] - pub fn is_valloc(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_valloc(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } +impl _ddebug { #[inline] - pub fn is_guest(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + pub fn lineno(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 18u8) as u32) } } #[inline] - pub fn set_is_guest(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_lineno(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) + self._bitfield_1.set(0usize, 18u8, val as u64) } } #[inline] - pub fn is_confidential(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn class_id(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 6u8) as u32) } } #[inline] - pub fn set_is_confidential(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_class_id(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) + self._bitfield_1.set(18usize, 6u8, val as u64) } } #[inline] - pub fn in_use(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + pub fn flags(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 8u8) as u32) } } #[inline] - pub fn set_in_use(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_flags(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) + self._bitfield_1.set(24usize, 8u8, val as u64) } } #[inline] pub fn new_bitfield_1( - is_valloc: ::aya_bpf::cty::c_uint, - is_guest: ::aya_bpf::cty::c_uint, - is_confidential: ::aya_bpf::cty::c_uint, - in_use: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_valloc: u32 = unsafe { ::core::mem::transmute(is_valloc) }; - is_valloc as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let is_guest: u32 = unsafe { ::core::mem::transmute(is_guest) }; - is_guest as u64 + lineno: ::aya_ebpf::cty::c_uint, + class_id: ::aya_ebpf::cty::c_uint, + flags: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 18u8, { + let lineno: u32 = unsafe { ::core::mem::transmute(lineno) }; + lineno as u64 }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let is_confidential: u32 = unsafe { ::core::mem::transmute(is_confidential) }; - is_confidential as u64 + __bindgen_bitfield_unit.set(18usize, 6u8, { + let class_id: u32 = unsafe { ::core::mem::transmute(class_id) }; + class_id as u64 }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let in_use: u32 = unsafe { ::core::mem::transmute(in_use) }; - in_use as u64 + __bindgen_bitfield_unit.set(24usize, 8u8, { + let flags: u32 = unsafe { ::core::mem::transmute(flags) }; + flags as u64 }); __bindgen_bitfield_unit } } +pub mod class_map_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DD_CLASS_TYPE_DISJOINT_BITS: Type = 0; + pub const DD_CLASS_TYPE_LEVEL_NUM: Type = 1; + pub const DD_CLASS_TYPE_DISJOINT_NAMES: Type = 2; + pub const DD_CLASS_TYPE_LEVEL_NAMES: Type = 3; +} #[repr(C)] -pub struct fpu { - pub last_cpu: ::aya_bpf::cty::c_uint, - pub avx512_timestamp: ::aya_bpf::cty::c_ulong, - pub fpstate: *mut fpstate, - pub __task_fpstate: *mut fpstate, - pub perm: fpu_state_perm, - pub guest_perm: fpu_state_perm, - pub __fpstate: fpstate, +#[derive(Debug, Copy, Clone)] +pub struct ddebug_class_map { + pub link: list_head, + pub mod_: *mut module, + pub mod_name: *const ::aya_ebpf::cty::c_char, + pub class_names: *mut *const ::aya_ebpf::cty::c_char, + pub length: ::aya_ebpf::cty::c_int, + pub base: ::aya_ebpf::cty::c_int, + pub map_type: class_map_type::Type, +} +pub mod module_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const MODULE_STATE_LIVE: Type = 0; + pub const MODULE_STATE_COMING: Type = 1; + pub const MODULE_STATE_GOING: Type = 2; + pub const MODULE_STATE_UNFORMED: Type = 3; } #[repr(C)] -pub struct thread_struct { - pub tls_array: [desc_struct; 3usize], - pub sp: ::aya_bpf::cty::c_ulong, - pub es: ::aya_bpf::cty::c_ushort, - pub ds: ::aya_bpf::cty::c_ushort, - pub fsindex: ::aya_bpf::cty::c_ushort, - pub gsindex: ::aya_bpf::cty::c_ushort, - pub fsbase: ::aya_bpf::cty::c_ulong, - pub gsbase: ::aya_bpf::cty::c_ulong, - pub ptrace_bps: [*mut perf_event; 4usize], - pub virtual_dr6: ::aya_bpf::cty::c_ulong, - pub ptrace_dr7: ::aya_bpf::cty::c_ulong, - pub cr2: ::aya_bpf::cty::c_ulong, - pub trap_nr: ::aya_bpf::cty::c_ulong, - pub error_code: ::aya_bpf::cty::c_ulong, - pub io_bitmap: *mut io_bitmap, - pub iopl_emul: ::aya_bpf::cty::c_ulong, +#[derive(Debug, Copy, Clone)] +pub struct kref { + pub refcount: refcount_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct kobject { + pub name: *const ::aya_ebpf::cty::c_char, + pub entry: list_head, + pub parent: *mut kobject, + pub kset: *mut kset, + pub ktype: *const kobj_type, + pub sd: *mut kernfs_node, + pub kref: kref, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub pkru: u32_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 40usize]>, - pub fpu: fpu, + pub __bindgen_padding_0: [u8; 3usize], } -impl thread_struct { +impl kobject { #[inline] - pub fn iopl_warn(&self) -> ::aya_bpf::cty::c_uint { + pub fn state_initialized(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_iopl_warn(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_state_initialized(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn sig_on_uaccess_err(&self) -> ::aya_bpf::cty::c_uint { + pub fn state_in_sysfs(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_sig_on_uaccess_err(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_state_in_sysfs(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] + pub fn state_add_uevent_sent(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_state_add_uevent_sent(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn state_remove_uevent_sent(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_state_remove_uevent_sent(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn uevent_suppress(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + } + #[inline] + pub fn set_uevent_suppress(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] pub fn new_bitfield_1( - iopl_warn: ::aya_bpf::cty::c_uint, - sig_on_uaccess_err: ::aya_bpf::cty::c_uint, + state_initialized: ::aya_ebpf::cty::c_uint, + state_in_sysfs: ::aya_ebpf::cty::c_uint, + state_add_uevent_sent: ::aya_ebpf::cty::c_uint, + state_remove_uevent_sent: ::aya_ebpf::cty::c_uint, + uevent_suppress: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let iopl_warn: u32 = unsafe { ::core::mem::transmute(iopl_warn) }; - iopl_warn as u64 + let state_initialized: u32 = unsafe { ::core::mem::transmute(state_initialized) }; + state_initialized as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let sig_on_uaccess_err: u32 = unsafe { ::core::mem::transmute(sig_on_uaccess_err) }; - sig_on_uaccess_err as u64 + let state_in_sysfs: u32 = unsafe { ::core::mem::transmute(state_in_sysfs) }; + state_in_sysfs as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let state_add_uevent_sent: u32 = + unsafe { ::core::mem::transmute(state_add_uevent_sent) }; + state_add_uevent_sent as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let state_remove_uevent_sent: u32 = + unsafe { ::core::mem::transmute(state_remove_uevent_sent) }; + state_remove_uevent_sent as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let uevent_suppress: u32 = unsafe { ::core::mem::transmute(uevent_suppress) }; + uevent_suppress as u64 }); __bindgen_bitfield_unit } } -pub type kernel_siginfo_t = kernel_siginfo; #[repr(C)] -pub struct task_struct { - pub thread_info: thread_info, - pub __state: ::aya_bpf::cty::c_uint, - pub stack: *mut ::aya_bpf::cty::c_void, - pub usage: refcount_t, - pub flags: ::aya_bpf::cty::c_uint, - pub ptrace: ::aya_bpf::cty::c_uint, - pub on_cpu: ::aya_bpf::cty::c_int, - pub wake_entry: __call_single_node, - pub wakee_flips: ::aya_bpf::cty::c_uint, - pub wakee_flip_decay_ts: ::aya_bpf::cty::c_ulong, - pub last_wakee: *mut task_struct, - pub recent_used_cpu: ::aya_bpf::cty::c_int, - pub wake_cpu: ::aya_bpf::cty::c_int, - pub on_rq: ::aya_bpf::cty::c_int, - pub prio: ::aya_bpf::cty::c_int, - pub static_prio: ::aya_bpf::cty::c_int, - pub normal_prio: ::aya_bpf::cty::c_int, - pub rt_priority: ::aya_bpf::cty::c_uint, - pub se: sched_entity, - pub rt: sched_rt_entity, - pub dl: sched_dl_entity, - pub sched_class: *const sched_class, - pub core_node: rb_node, - pub core_cookie: ::aya_bpf::cty::c_ulong, - pub core_occupation: ::aya_bpf::cty::c_uint, - pub sched_task_group: *mut task_group, - pub uclamp_req: [uclamp_se; 2usize], - pub uclamp: [uclamp_se; 2usize], +#[derive(Debug, Copy, Clone)] +pub struct module_kobject { + pub kobj: kobject, + pub mod_: *mut module, + pub drivers_dir: *mut kobject, + pub mp: *mut module_param_attrs, + pub kobj_completion: *mut completion, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct latch_tree_node { + pub node: [rb_node; 2usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mod_tree_node { + pub mod_: *mut module, + pub node: latch_tree_node, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct module_memory { + pub base: *mut ::aya_ebpf::cty::c_void, + pub size: ::aya_ebpf::cty::c_uint, + pub mtn: mod_tree_node, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mod_arch_specific { + pub num_orcs: ::aya_ebpf::cty::c_uint, + pub orc_unwind_ip: *mut ::aya_ebpf::cty::c_int, + pub orc_unwind: *mut orc_entry, +} +pub type Elf64_Sym = elf64_sym; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mod_kallsyms { + pub symtab: *mut Elf64_Sym, + pub num_symtab: ::aya_ebpf::cty::c_uint, + pub strtab: *mut ::aya_ebpf::cty::c_char, + pub typetab: *mut ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _ddebug_info { + pub descs: *mut _ddebug, + pub classes: *mut ddebug_class_map, + pub num_descs: ::aya_ebpf::cty::c_uint, + pub num_classes: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct module { + pub state: module_state::Type, + pub list: list_head, + pub name: [::aya_ebpf::cty::c_char; 56usize], + pub build_id: [::aya_ebpf::cty::c_uchar; 20usize], + pub mkobj: module_kobject, + pub modinfo_attrs: *mut module_attribute, + pub version: *const ::aya_ebpf::cty::c_char, + pub srcversion: *const ::aya_ebpf::cty::c_char, + pub holders_dir: *mut kobject, + pub syms: *const kernel_symbol, + pub crcs: *const s32, + pub num_syms: ::aya_ebpf::cty::c_uint, + pub param_lock: mutex, + pub kp: *mut kernel_param, + pub num_kp: ::aya_ebpf::cty::c_uint, + pub num_gpl_syms: ::aya_ebpf::cty::c_uint, + pub gpl_syms: *const kernel_symbol, + pub gpl_crcs: *const s32, + pub using_gplonly_symbols: bool_, + pub sig_ok: bool_, + pub async_probe_requested: bool_, + pub num_exentries: ::aya_ebpf::cty::c_uint, + pub extable: *mut exception_table_entry, + pub init: ::core::option::Option ::aya_ebpf::cty::c_int>, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, - pub stats: sched_statistics, - pub preempt_notifiers: hlist_head, - pub btrace_seq: ::aya_bpf::cty::c_uint, - pub policy: ::aya_bpf::cty::c_uint, - pub nr_cpus_allowed: ::aya_bpf::cty::c_int, - pub cpus_ptr: *const cpumask_t, - pub user_cpus_ptr: *mut cpumask_t, - pub cpus_mask: cpumask_t, - pub migration_pending: *mut ::aya_bpf::cty::c_void, - pub migration_disabled: ::aya_bpf::cty::c_ushort, - pub migration_flags: ::aya_bpf::cty::c_ushort, - pub rcu_read_lock_nesting: ::aya_bpf::cty::c_int, - pub rcu_read_unlock_special: rcu_special, - pub rcu_node_entry: list_head, - pub rcu_blocked_node: *mut rcu_node, - pub rcu_tasks_nvcsw: ::aya_bpf::cty::c_ulong, - pub rcu_tasks_holdout: u8_, - pub rcu_tasks_idx: u8_, - pub rcu_tasks_idle_cpu: ::aya_bpf::cty::c_int, - pub rcu_tasks_holdout_list: list_head, - pub trc_reader_nesting: ::aya_bpf::cty::c_int, - pub trc_ipi_to_cpu: ::aya_bpf::cty::c_int, - pub trc_reader_special: rcu_special, - pub trc_holdout_list: list_head, - pub trc_blkd_node: list_head, - pub trc_blkd_cpu: ::aya_bpf::cty::c_int, - pub sched_info: sched_info, - pub tasks: list_head, - pub pushable_tasks: plist_node, - pub pushable_dl_tasks: rb_node, - pub mm: *mut mm_struct, - pub active_mm: *mut mm_struct, - pub exit_state: ::aya_bpf::cty::c_int, - pub exit_code: ::aya_bpf::cty::c_int, - pub exit_signal: ::aya_bpf::cty::c_int, - pub pdeath_signal: ::aya_bpf::cty::c_int, - pub jobctl: ::aya_bpf::cty::c_ulong, - pub personality: ::aya_bpf::cty::c_uint, + pub mem: [module_memory; 7usize], + pub arch: mod_arch_specific, + pub taints: ::aya_ebpf::cty::c_ulong, + pub num_bugs: ::aya_ebpf::cty::c_uint, + pub bug_list: list_head, + pub bug_table: *mut bug_entry, + pub kallsyms: *mut mod_kallsyms, + pub core_kallsyms: mod_kallsyms, + pub sect_attrs: *mut module_sect_attrs, + pub notes_attrs: *mut module_notes_attrs, + pub args: *mut ::aya_ebpf::cty::c_char, + pub percpu: *mut ::aya_ebpf::cty::c_void, + pub percpu_size: ::aya_ebpf::cty::c_uint, + pub noinstr_text_start: *mut ::aya_ebpf::cty::c_void, + pub noinstr_text_size: ::aya_ebpf::cty::c_uint, + pub num_tracepoints: ::aya_ebpf::cty::c_uint, + pub tracepoints_ptrs: *const ::aya_ebpf::cty::c_int, + pub num_srcu_structs: ::aya_ebpf::cty::c_uint, + pub srcu_struct_ptrs: *mut *mut srcu_struct, + pub num_bpf_raw_events: ::aya_ebpf::cty::c_uint, + pub bpf_raw_events: *mut bpf_raw_event_map, + pub btf_data_size: ::aya_ebpf::cty::c_uint, + pub btf_data: *mut ::aya_ebpf::cty::c_void, + pub jump_entries: *mut jump_entry, + pub num_jump_entries: ::aya_ebpf::cty::c_uint, + pub num_trace_bprintk_fmt: ::aya_ebpf::cty::c_uint, + pub trace_bprintk_fmt_start: *mut *const ::aya_ebpf::cty::c_char, + pub trace_events: *mut *mut trace_event_call, + pub num_trace_events: ::aya_ebpf::cty::c_uint, + pub trace_evals: *mut *mut trace_eval_map, + pub num_trace_evals: ::aya_ebpf::cty::c_uint, + pub num_ftrace_callsites: ::aya_ebpf::cty::c_uint, + pub ftrace_callsites: *mut ::aya_ebpf::cty::c_ulong, + pub kprobes_text_start: *mut ::aya_ebpf::cty::c_void, + pub kprobes_text_size: ::aya_ebpf::cty::c_uint, + pub kprobe_blacklist: *mut ::aya_ebpf::cty::c_ulong, + pub num_kprobe_blacklist: ::aya_ebpf::cty::c_uint, + pub num_static_call_sites: ::aya_ebpf::cty::c_int, + pub static_call_sites: *mut static_call_site, + pub printk_index_size: ::aya_ebpf::cty::c_uint, + pub printk_index_start: *mut *mut pi_entry, + pub source_list: list_head, + pub target_list: list_head, + pub exit: ::core::option::Option, + pub refcnt: atomic_t, + pub ei_funcs: *mut error_injection_entry, + pub num_ei_funcs: ::aya_ebpf::cty::c_uint, + pub dyndbg_info: _ddebug_info, pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 6usize]>, - pub atomic_flags: ::aya_bpf::cty::c_ulong, - pub restart_block: restart_block, - pub pid: pid_t, - pub tgid: pid_t, - pub stack_canary: ::aya_bpf::cty::c_ulong, - pub real_parent: *mut task_struct, - pub parent: *mut task_struct, - pub children: list_head, - pub sibling: list_head, - pub group_leader: *mut task_struct, - pub ptraced: list_head, - pub ptrace_entry: list_head, - pub thread_pid: *mut pid, - pub pid_links: [hlist_node; 4usize], - pub thread_group: list_head, - pub thread_node: list_head, - pub vfork_done: *mut completion, - pub set_child_tid: *mut ::aya_bpf::cty::c_int, - pub clear_child_tid: *mut ::aya_bpf::cty::c_int, - pub worker_private: *mut ::aya_bpf::cty::c_void, - pub utime: u64_, - pub stime: u64_, - pub gtime: u64_, - pub prev_cputime: prev_cputime, - pub vtime: vtime, - pub tick_dep_mask: atomic_t, - pub nvcsw: ::aya_bpf::cty::c_ulong, - pub nivcsw: ::aya_bpf::cty::c_ulong, - pub start_time: u64_, - pub start_boottime: u64_, - pub min_flt: ::aya_bpf::cty::c_ulong, - pub maj_flt: ::aya_bpf::cty::c_ulong, - pub posix_cputimers: posix_cputimers, - pub posix_cputimers_work: posix_cputimers_work, - pub ptracer_cred: *const cred, - pub real_cred: *const cred, - pub cred: *const cred, - pub cached_requested_key: *mut key, - pub comm: [::aya_bpf::cty::c_char; 16usize], - pub nameidata: *mut nameidata, - pub sysvsem: sysv_sem, - pub sysvshm: sysv_shm, - pub last_switch_count: ::aya_bpf::cty::c_ulong, - pub last_switch_time: ::aya_bpf::cty::c_ulong, - pub fs: *mut fs_struct, - pub files: *mut files_struct, - pub io_uring: *mut io_uring_task, - pub nsproxy: *mut nsproxy, - pub signal: *mut signal_struct, - pub sighand: *mut sighand_struct, - pub blocked: sigset_t, - pub real_blocked: sigset_t, - pub saved_sigmask: sigset_t, - pub pending: sigpending, - pub sas_ss_sp: ::aya_bpf::cty::c_ulong, - pub sas_ss_size: usize, - pub sas_ss_flags: ::aya_bpf::cty::c_uint, - pub task_works: *mut callback_head, - pub audit_context: *mut audit_context, - pub loginuid: kuid_t, - pub sessionid: ::aya_bpf::cty::c_uint, - pub seccomp: seccomp, - pub syscall_dispatch: syscall_user_dispatch, - pub parent_exec_id: u64_, - pub self_exec_id: u64_, - pub alloc_lock: spinlock_t, - pub pi_lock: raw_spinlock_t, - pub wake_q: wake_q_node, - pub pi_waiters: rb_root_cached, - pub pi_top_task: *mut task_struct, - pub pi_blocked_on: *mut rt_mutex_waiter, - pub journal_info: *mut ::aya_bpf::cty::c_void, - pub bio_list: *mut bio_list, - pub plug: *mut blk_plug, - pub reclaim_state: *mut reclaim_state, - pub backing_dev_info: *mut backing_dev_info, - pub io_context: *mut io_context, - pub capture_control: *mut capture_control, - pub ptrace_message: ::aya_bpf::cty::c_ulong, - pub last_siginfo: *mut kernel_siginfo_t, - pub ioac: task_io_accounting, - pub psi_flags: ::aya_bpf::cty::c_uint, - pub acct_rss_mem1: u64_, - pub acct_vm_mem1: u64_, - pub acct_timexpd: u64_, - pub mems_allowed: nodemask_t, - pub mems_allowed_seq: seqcount_spinlock_t, - pub cpuset_mem_spread_rotor: ::aya_bpf::cty::c_int, - pub cpuset_slab_spread_rotor: ::aya_bpf::cty::c_int, - pub cgroups: *mut css_set, - pub cg_list: list_head, - pub closid: u32_, - pub rmid: u32_, - pub robust_list: *mut robust_list_head, - pub compat_robust_list: *mut compat_robust_list_head, - pub pi_state_list: list_head, - pub pi_state_cache: *mut futex_pi_state, - pub futex_exit_mutex: mutex, - pub futex_state: ::aya_bpf::cty::c_uint, - pub perf_event_ctxp: *mut perf_event_context, - pub perf_event_mutex: mutex, - pub perf_event_list: list_head, - pub mempolicy: *mut mempolicy, - pub il_prev: ::aya_bpf::cty::c_short, - pub pref_node_fork: ::aya_bpf::cty::c_short, - pub numa_scan_seq: ::aya_bpf::cty::c_int, - pub numa_scan_period: ::aya_bpf::cty::c_uint, - pub numa_scan_period_max: ::aya_bpf::cty::c_uint, - pub numa_preferred_nid: ::aya_bpf::cty::c_int, - pub numa_migrate_retry: ::aya_bpf::cty::c_ulong, - pub node_stamp: u64_, - pub last_task_numa_placement: u64_, - pub last_sum_exec_runtime: u64_, - pub numa_work: callback_head, - pub numa_group: *mut numa_group, - pub numa_faults: *mut ::aya_bpf::cty::c_ulong, - pub total_numa_faults: ::aya_bpf::cty::c_ulong, - pub numa_faults_locality: [::aya_bpf::cty::c_ulong; 3usize], - pub numa_pages_migrated: ::aya_bpf::cty::c_ulong, - pub rseq: *mut rseq, - pub rseq_len: u32_, - pub rseq_sig: u32_, - pub rseq_event_mask: ::aya_bpf::cty::c_ulong, - pub mm_cid: ::aya_bpf::cty::c_int, - pub last_mm_cid: ::aya_bpf::cty::c_int, - pub migrate_from_cpu: ::aya_bpf::cty::c_int, - pub mm_cid_active: ::aya_bpf::cty::c_int, - pub cid_work: callback_head, - pub tlb_ubc: tlbflush_unmap_batch, - pub splice_pipe: *mut pipe_inode_info, - pub task_frag: page_frag, - pub delays: *mut task_delay_info, - pub nr_dirtied: ::aya_bpf::cty::c_int, - pub nr_dirtied_pause: ::aya_bpf::cty::c_int, - pub dirty_paused_when: ::aya_bpf::cty::c_ulong, - pub latency_record_count: ::aya_bpf::cty::c_int, - pub latency_record: [latency_record; 32usize], - pub timer_slack_ns: u64_, - pub default_timer_slack_ns: u64_, - pub curr_ret_stack: ::aya_bpf::cty::c_int, - pub curr_ret_depth: ::aya_bpf::cty::c_int, - pub ret_stack: *mut ftrace_ret_stack, - pub ftrace_timestamp: ::aya_bpf::cty::c_ulonglong, - pub trace_overrun: atomic_t, - pub tracing_graph_pause: atomic_t, - pub trace_recursion: ::aya_bpf::cty::c_ulong, - pub memcg_in_oom: *mut mem_cgroup, - pub memcg_oom_gfp_mask: gfp_t, - pub memcg_oom_order: ::aya_bpf::cty::c_int, - pub memcg_nr_pages_over_high: ::aya_bpf::cty::c_uint, - pub active_memcg: *mut mem_cgroup, - pub throttle_disk: *mut gendisk, - pub utask: *mut uprobe_task, - pub sequential_io: ::aya_bpf::cty::c_uint, - pub sequential_io_avg: ::aya_bpf::cty::c_uint, - pub kmap_ctrl: kmap_ctrl, - pub rcu: callback_head, - pub rcu_users: refcount_t, - pub pagefault_disabled: ::aya_bpf::cty::c_int, - pub oom_reaper_list: *mut task_struct, - pub oom_reaper_timer: timer_list, - pub stack_vm_area: *mut vm_struct, - pub stack_refcount: refcount_t, - pub security: *mut ::aya_bpf::cty::c_void, - pub bpf_storage: *mut bpf_local_storage, - pub bpf_ctx: *mut bpf_run_ctx, - pub mce_vaddr: *mut ::aya_bpf::cty::c_void, - pub mce_kflags: __u64, - pub mce_addr: u64_, - pub _bitfield_align_3: [u64; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 8usize]>, - pub mce_kill_me: callback_head, - pub mce_count: ::aya_bpf::cty::c_int, - pub kretprobe_instances: llist_head, - pub rethooks: llist_head, - pub l1d_flush_kill: callback_head, - pub user_event_mm: *mut user_event_mm, - pub _bitfield_align_4: [u8; 0], - pub _bitfield_4: __BindgenBitfieldUnit<[u8; 8usize]>, - pub thread: thread_struct, + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, } -impl task_struct { +impl module { #[inline] - pub fn sched_reset_on_fork(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u32) } + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct kernel_param_ops { + pub flags: ::aya_ebpf::cty::c_uint, + pub set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_char, + arg2: *const kernel_param, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_char, + arg2: *const kernel_param, + ) -> ::aya_ebpf::cty::c_int, + >, + pub free: ::core::option::Option, +} +pub type fl_owner_t = *mut ::aya_ebpf::cty::c_void; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct file_operations { + pub owner: *mut module, + pub llseek: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: loff_t, arg3: ::aya_ebpf::cty::c_int) -> loff_t, + >, + pub read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: usize, + arg4: *mut loff_t, + ) -> isize, + >, + pub write: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: usize, + arg4: *mut loff_t, + ) -> isize, + >, + pub read_iter: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> isize, + >, + pub write_iter: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> isize, + >, + pub iopoll: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut kiocb, + arg2: *mut io_comp_batch, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub iterate_shared: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: *mut dir_context) -> ::aya_ebpf::cty::c_int, + >, + pub poll: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: *mut poll_table_struct) -> __poll_t, + >, + pub unlocked_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_long, + >, + pub compat_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_long, + >, + pub mmap: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: *mut vm_area_struct) -> ::aya_ebpf::cty::c_int, + >, + pub mmap_supported_flags: ::aya_ebpf::cty::c_ulong, + pub open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_ebpf::cty::c_int, + >, + pub flush: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: fl_owner_t) -> ::aya_ebpf::cty::c_int, + >, + pub release: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_ebpf::cty::c_int, + >, + pub fsync: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: loff_t, + arg3: loff_t, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub fasync: ::core::option::Option< + unsafe extern "C" fn( + arg1: ::aya_ebpf::cty::c_int, + arg2: *mut file, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lock: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut file_lock, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_unmapped_area: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_ulong, + >, + pub check_flags: ::core::option::Option< + unsafe extern "C" fn(arg1: ::aya_ebpf::cty::c_int) -> ::aya_ebpf::cty::c_int, + >, + pub flock: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut file_lock, + ) -> ::aya_ebpf::cty::c_int, + >, + pub splice_write: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut pipe_inode_info, + arg2: *mut file, + arg3: *mut loff_t, + arg4: usize, + arg5: ::aya_ebpf::cty::c_uint, + ) -> isize, + >, + pub splice_read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut loff_t, + arg3: *mut pipe_inode_info, + arg4: usize, + arg5: ::aya_ebpf::cty::c_uint, + ) -> isize, + >, + pub splice_eof: ::core::option::Option, + pub setlease: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut *mut file_lock, + arg4: *mut *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub fallocate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_int, + arg3: loff_t, + arg4: loff_t, + ) -> ::aya_ebpf::cty::c_long, + >, + pub show_fdinfo: + ::core::option::Option, + pub copy_file_range: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: loff_t, + arg3: *mut file, + arg4: loff_t, + arg5: usize, + arg6: ::aya_ebpf::cty::c_uint, + ) -> isize, + >, + pub remap_file_range: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: loff_t, + arg3: *mut file, + arg4: loff_t, + arg5: loff_t, + arg6: ::aya_ebpf::cty::c_uint, + ) -> loff_t, + >, + pub fadvise: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: loff_t, + arg3: loff_t, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub uring_cmd: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut io_uring_cmd, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub uring_cmd_iopoll: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut io_uring_cmd, + arg2: *mut io_comp_batch, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bug_entry { + pub bug_addr_disp: ::aya_ebpf::cty::c_int, + pub file_disp: ::aya_ebpf::cty::c_int, + pub line: ::aya_ebpf::cty::c_ushort, + pub flags: ::aya_ebpf::cty::c_ushort, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct static_call_site { + pub addr: s32, + pub key: s32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct static_call_mod { + pub next: *mut static_call_mod, + pub mod_: *mut module, + pub sites: *mut static_call_site, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct static_call_key { + pub func: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: static_call_key__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union static_call_key__bindgen_ty_1 { + pub type_: ::aya_ebpf::cty::c_ulong, + pub mods: *mut static_call_mod, + pub sites: *mut static_call_site, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct attribute_group { + pub name: *const ::aya_ebpf::cty::c_char, + pub is_visible: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut kobject, + arg2: *mut attribute, + arg3: ::aya_ebpf::cty::c_int, + ) -> umode_t, + >, + pub is_bin_visible: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut kobject, + arg2: *mut bin_attribute, + arg3: ::aya_ebpf::cty::c_int, + ) -> umode_t, + >, + pub attrs: *mut *mut attribute, + pub bin_attrs: *mut *mut bin_attribute, +} +pub type cpumask_var_t = [cpumask; 1usize]; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct range { + pub start: u64_, + pub end: u64_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tracepoint_func { + pub func: *mut ::aya_ebpf::cty::c_void, + pub data: *mut ::aya_ebpf::cty::c_void, + pub prio: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct tracepoint { + pub name: *const ::aya_ebpf::cty::c_char, + pub key: static_key, + pub static_call_key: *mut static_call_key, + pub static_call_tramp: *mut ::aya_ebpf::cty::c_void, + pub iterator: *mut ::aya_ebpf::cty::c_void, + pub probestub: *mut ::aya_ebpf::cty::c_void, + pub regfunc: ::core::option::Option ::aya_ebpf::cty::c_int>, + pub unregfunc: ::core::option::Option, + pub funcs: *mut tracepoint_func, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_raw_event_map { + pub tp: *mut tracepoint, + pub bpf_func: *mut ::aya_ebpf::cty::c_void, + pub num_args: u32_, + pub writable_size: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +} +impl bpf_raw_event_map { #[inline] - pub fn set_sched_reset_on_fork(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(0usize, 1u8, val as u64) - } + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct seq_operations { + pub start: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut loff_t, + ) -> *mut ::aya_ebpf::cty::c_void, + >, + pub stop: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub next: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut loff_t, + ) -> *mut ::aya_ebpf::cty::c_void, + >, + pub show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, +} +pub mod perf_event_state { + pub type Type = ::aya_ebpf::cty::c_int; + pub const PERF_EVENT_STATE_DEAD: Type = -4; + pub const PERF_EVENT_STATE_EXIT: Type = -3; + pub const PERF_EVENT_STATE_ERROR: Type = -2; + pub const PERF_EVENT_STATE_OFF: Type = -1; + pub const PERF_EVENT_STATE_INACTIVE: Type = 0; + pub const PERF_EVENT_STATE_ACTIVE: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct local_t { + pub a: atomic_long_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct local64_t { + pub a: local_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct perf_event_attr { + pub type_: __u32, + pub size: __u32, + pub config: __u64, + pub __bindgen_anon_1: perf_event_attr__bindgen_ty_1, + pub sample_type: __u64, + pub read_format: __u64, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub __bindgen_anon_2: perf_event_attr__bindgen_ty_2, + pub bp_type: __u32, + pub __bindgen_anon_3: perf_event_attr__bindgen_ty_3, + pub __bindgen_anon_4: perf_event_attr__bindgen_ty_4, + pub branch_sample_type: __u64, + pub sample_regs_user: __u64, + pub sample_stack_user: __u32, + pub clockid: __s32, + pub sample_regs_intr: __u64, + pub aux_watermark: __u32, + pub sample_max_stack: __u16, + pub __reserved_2: __u16, + pub aux_sample_size: __u32, + pub __reserved_3: __u32, + pub sig_data: __u64, + pub config3: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_1 { + pub sample_period: __u64, + pub sample_freq: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_2 { + pub wakeup_events: __u32, + pub wakeup_watermark: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_3 { + pub bp_addr: __u64, + pub kprobe_func: __u64, + pub uprobe_path: __u64, + pub config1: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_4 { + pub bp_len: __u64, + pub kprobe_addr: __u64, + pub probe_offset: __u64, + pub config2: __u64, +} +impl perf_event_attr { #[inline] - pub fn sched_contributes_to_load(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(1usize, 1u8) as u32) } + pub fn disabled(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } } #[inline] - pub fn set_sched_contributes_to_load(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_disabled(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(1usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn sched_migrated(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 1u8) as u32) } + pub fn inherit(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } } #[inline] - pub fn set_sched_migrated(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_inherit(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(2usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn sched_remote_wakeup(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(32usize, 1u8) as u32) } + pub fn pinned(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } } #[inline] - pub fn set_sched_remote_wakeup(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_pinned(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(32usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn in_execve(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(33usize, 1u8) as u32) } + pub fn exclusive(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } } #[inline] - pub fn set_in_execve(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_exclusive(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(33usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn in_iowait(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(34usize, 1u8) as u32) } + pub fn exclude_user(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u64) } } #[inline] - pub fn set_in_iowait(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_exclude_user(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(34usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] - pub fn restore_sigmask(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(35usize, 1u8) as u32) } + pub fn exclude_kernel(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u64) } } #[inline] - pub fn set_restore_sigmask(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_exclude_kernel(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(35usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] - pub fn in_user_fault(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(36usize, 1u8) as u32) } + pub fn exclude_hv(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u64) } } #[inline] - pub fn set_in_user_fault(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_exclude_hv(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(36usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] - pub fn in_lru_fault(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(37usize, 1u8) as u32) } + pub fn exclude_idle(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u64) } } #[inline] - pub fn set_in_lru_fault(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_exclude_idle(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(37usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) } } #[inline] - pub fn no_cgroup_migration(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(38usize, 1u8) as u32) } + pub fn mmap(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u64) } } #[inline] - pub fn set_no_cgroup_migration(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_mmap(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(38usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 1u8, val as u64) } } #[inline] - pub fn frozen(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(39usize, 1u8) as u32) } + pub fn comm(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u64) } } #[inline] - pub fn set_frozen(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_comm(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(39usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(9usize, 1u8, val as u64) } } #[inline] - pub fn use_memdelay(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(40usize, 1u8) as u32) } + pub fn freq(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u64) } } #[inline] - pub fn set_use_memdelay(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_freq(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(40usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(10usize, 1u8, val as u64) } } #[inline] - pub fn in_memstall(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(41usize, 1u8) as u32) } + pub fn inherit_stat(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u64) } } #[inline] - pub fn set_in_memstall(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_inherit_stat(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(41usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 1u8, val as u64) } } #[inline] - pub fn in_eventfd(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(42usize, 1u8) as u32) } + pub fn enable_on_exec(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u64) } } #[inline] - pub fn set_in_eventfd(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_enable_on_exec(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(42usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(12usize, 1u8, val as u64) } } #[inline] - pub fn pasid_activated(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(43usize, 1u8) as u32) } + pub fn task(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u64) } } #[inline] - pub fn set_pasid_activated(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_task(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(43usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(13usize, 1u8, val as u64) } } #[inline] - pub fn reported_split_lock(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(44usize, 1u8) as u32) } + pub fn watermark(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u64) } } #[inline] - pub fn set_reported_split_lock(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_watermark(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(44usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(14usize, 1u8, val as u64) } } #[inline] - pub fn in_thrashing(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(45usize, 1u8) as u32) } + pub fn precise_ip(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 2u8) as u64) } } #[inline] - pub fn set_in_thrashing(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_precise_ip(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(45usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(15usize, 2u8, val as u64) } } #[inline] - pub fn new_bitfield_2( - sched_reset_on_fork: ::aya_bpf::cty::c_uint, - sched_contributes_to_load: ::aya_bpf::cty::c_uint, - sched_migrated: ::aya_bpf::cty::c_uint, - sched_remote_wakeup: ::aya_bpf::cty::c_uint, - in_execve: ::aya_bpf::cty::c_uint, - in_iowait: ::aya_bpf::cty::c_uint, - restore_sigmask: ::aya_bpf::cty::c_uint, - in_user_fault: ::aya_bpf::cty::c_uint, - in_lru_fault: ::aya_bpf::cty::c_uint, - no_cgroup_migration: ::aya_bpf::cty::c_uint, - frozen: ::aya_bpf::cty::c_uint, - use_memdelay: ::aya_bpf::cty::c_uint, - in_memstall: ::aya_bpf::cty::c_uint, - in_eventfd: ::aya_bpf::cty::c_uint, - pasid_activated: ::aya_bpf::cty::c_uint, - reported_split_lock: ::aya_bpf::cty::c_uint, - in_thrashing: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 6usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 6usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let sched_reset_on_fork: u32 = unsafe { ::core::mem::transmute(sched_reset_on_fork) }; - sched_reset_on_fork as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let sched_contributes_to_load: u32 = - unsafe { ::core::mem::transmute(sched_contributes_to_load) }; - sched_contributes_to_load as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let sched_migrated: u32 = unsafe { ::core::mem::transmute(sched_migrated) }; - sched_migrated as u64 - }); - __bindgen_bitfield_unit.set(32usize, 1u8, { - let sched_remote_wakeup: u32 = unsafe { ::core::mem::transmute(sched_remote_wakeup) }; - sched_remote_wakeup as u64 - }); - __bindgen_bitfield_unit.set(33usize, 1u8, { - let in_execve: u32 = unsafe { ::core::mem::transmute(in_execve) }; - in_execve as u64 - }); - __bindgen_bitfield_unit.set(34usize, 1u8, { - let in_iowait: u32 = unsafe { ::core::mem::transmute(in_iowait) }; - in_iowait as u64 - }); - __bindgen_bitfield_unit.set(35usize, 1u8, { - let restore_sigmask: u32 = unsafe { ::core::mem::transmute(restore_sigmask) }; - restore_sigmask as u64 - }); - __bindgen_bitfield_unit.set(36usize, 1u8, { - let in_user_fault: u32 = unsafe { ::core::mem::transmute(in_user_fault) }; - in_user_fault as u64 - }); - __bindgen_bitfield_unit.set(37usize, 1u8, { - let in_lru_fault: u32 = unsafe { ::core::mem::transmute(in_lru_fault) }; - in_lru_fault as u64 - }); - __bindgen_bitfield_unit.set(38usize, 1u8, { - let no_cgroup_migration: u32 = unsafe { ::core::mem::transmute(no_cgroup_migration) }; - no_cgroup_migration as u64 - }); - __bindgen_bitfield_unit.set(39usize, 1u8, { - let frozen: u32 = unsafe { ::core::mem::transmute(frozen) }; - frozen as u64 - }); - __bindgen_bitfield_unit.set(40usize, 1u8, { - let use_memdelay: u32 = unsafe { ::core::mem::transmute(use_memdelay) }; - use_memdelay as u64 - }); - __bindgen_bitfield_unit.set(41usize, 1u8, { - let in_memstall: u32 = unsafe { ::core::mem::transmute(in_memstall) }; - in_memstall as u64 - }); - __bindgen_bitfield_unit.set(42usize, 1u8, { - let in_eventfd: u32 = unsafe { ::core::mem::transmute(in_eventfd) }; - in_eventfd as u64 - }); - __bindgen_bitfield_unit.set(43usize, 1u8, { - let pasid_activated: u32 = unsafe { ::core::mem::transmute(pasid_activated) }; - pasid_activated as u64 - }); - __bindgen_bitfield_unit.set(44usize, 1u8, { - let reported_split_lock: u32 = unsafe { ::core::mem::transmute(reported_split_lock) }; - reported_split_lock as u64 - }); - __bindgen_bitfield_unit.set(45usize, 1u8, { - let in_thrashing: u32 = unsafe { ::core::mem::transmute(in_thrashing) }; - in_thrashing as u64 - }); - __bindgen_bitfield_unit + pub fn mmap_data(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u64) } } #[inline] - pub fn mce_ripv(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_3.get(0usize, 1u8) as u64) } + pub fn set_mmap_data(&mut self, val: __u64) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(17usize, 1u8, val as u64) + } } #[inline] - pub fn set_mce_ripv(&mut self, val: __u64) { + pub fn sample_id_all(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 1u8) as u64) } + } + #[inline] + pub fn set_sample_id_all(&mut self, val: __u64) { unsafe { let val: u64 = ::core::mem::transmute(val); - self._bitfield_3.set(0usize, 1u8, val as u64) + self._bitfield_1.set(18usize, 1u8, val as u64) } } #[inline] - pub fn mce_whole_page(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_3.get(1usize, 1u8) as u64) } + pub fn exclude_host(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(19usize, 1u8) as u64) } } #[inline] - pub fn set_mce_whole_page(&mut self, val: __u64) { + pub fn set_exclude_host(&mut self, val: __u64) { unsafe { let val: u64 = ::core::mem::transmute(val); - self._bitfield_3.set(1usize, 1u8, val as u64) + self._bitfield_1.set(19usize, 1u8, val as u64) } } #[inline] - pub fn __mce_reserved(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_3.get(2usize, 62u8) as u64) } + pub fn exclude_guest(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 1u8) as u64) } } #[inline] - pub fn set___mce_reserved(&mut self, val: __u64) { + pub fn set_exclude_guest(&mut self, val: __u64) { unsafe { let val: u64 = ::core::mem::transmute(val); - self._bitfield_3.set(2usize, 62u8, val as u64) + self._bitfield_1.set(20usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_3( - mce_ripv: __u64, - mce_whole_page: __u64, - __mce_reserved: __u64, - ) -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let mce_ripv: u64 = unsafe { ::core::mem::transmute(mce_ripv) }; - mce_ripv as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let mce_whole_page: u64 = unsafe { ::core::mem::transmute(mce_whole_page) }; - mce_whole_page as u64 - }); - __bindgen_bitfield_unit.set(2usize, 62u8, { - let __mce_reserved: u64 = unsafe { ::core::mem::transmute(__mce_reserved) }; - __mce_reserved as u64 - }); - __bindgen_bitfield_unit + pub fn exclude_callchain_kernel(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(21usize, 1u8) as u64) } } #[inline] - pub fn new_bitfield_4() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit + pub fn set_exclude_callchain_kernel(&mut self, val: __u64) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(21usize, 1u8, val as u64) + } } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct lockdep_map_p {} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct maple_tree { - pub __bindgen_anon_1: maple_tree__bindgen_ty_1, - pub ma_root: *mut ::aya_bpf::cty::c_void, - pub ma_flags: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union maple_tree__bindgen_ty_1 { - pub ma_lock: spinlock_t, - pub ma_external_lock: lockdep_map_p, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rw_semaphore { - pub count: atomic_long_t, - pub owner: atomic_long_t, - pub osq: optimistic_spin_queue, - pub wait_lock: raw_spinlock_t, - pub wait_list: list_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct percpu_counter { - pub lock: raw_spinlock_t, - pub count: s64, - pub list: list_head, - pub counters: *mut s32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct mm_context_t { - pub ctx_id: u64_, - pub tlb_gen: atomic64_t, - pub ldt_usr_sem: rw_semaphore, - pub ldt: *mut ldt_struct, - pub flags: ::aya_bpf::cty::c_ulong, - pub lam_cr3_mask: ::aya_bpf::cty::c_ulong, - pub untag_mask: u64_, - pub lock: mutex, - pub vdso: *mut ::aya_bpf::cty::c_void, - pub vdso_image: *const vdso_image, - pub perf_rdpmc_allowed: atomic_t, - pub pkey_allocation_map: u16_, - pub execute_only_pkey: s16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uprobes_state { - pub xol_area: *mut xol_area, -} -pub type work_func_t = ::core::option::Option; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct work_struct { - pub data: atomic_long_t, - pub entry: list_head, - pub func: work_func_t, -} -#[repr(C)] -pub struct mm_struct { - pub __bindgen_anon_1: mm_struct__bindgen_ty_1, - pub cpu_bitmap: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct mm_struct__bindgen_ty_1 { - pub __bindgen_anon_1: mm_struct__bindgen_ty_1__bindgen_ty_1, - pub mm_mt: maple_tree, - pub get_unmapped_area: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_ulong, - arg5: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_ulong, - >, - pub mmap_base: ::aya_bpf::cty::c_ulong, - pub mmap_legacy_base: ::aya_bpf::cty::c_ulong, - pub mmap_compat_base: ::aya_bpf::cty::c_ulong, - pub mmap_compat_legacy_base: ::aya_bpf::cty::c_ulong, - pub task_size: ::aya_bpf::cty::c_ulong, - pub pgd: *mut pgd_t, - pub membarrier_state: atomic_t, - pub mm_users: atomic_t, - pub pcpu_cid: *mut mm_cid, - pub mm_cid_next_scan: ::aya_bpf::cty::c_ulong, - pub pgtables_bytes: atomic_long_t, - pub map_count: ::aya_bpf::cty::c_int, - pub page_table_lock: spinlock_t, - pub mmap_lock: rw_semaphore, - pub mmlist: list_head, - pub mm_lock_seq: ::aya_bpf::cty::c_int, - pub hiwater_rss: ::aya_bpf::cty::c_ulong, - pub hiwater_vm: ::aya_bpf::cty::c_ulong, - pub total_vm: ::aya_bpf::cty::c_ulong, - pub locked_vm: ::aya_bpf::cty::c_ulong, - pub pinned_vm: atomic64_t, - pub data_vm: ::aya_bpf::cty::c_ulong, - pub exec_vm: ::aya_bpf::cty::c_ulong, - pub stack_vm: ::aya_bpf::cty::c_ulong, - pub def_flags: ::aya_bpf::cty::c_ulong, - pub write_protect_seq: seqcount_t, - pub arg_lock: spinlock_t, - pub start_code: ::aya_bpf::cty::c_ulong, - pub end_code: ::aya_bpf::cty::c_ulong, - pub start_data: ::aya_bpf::cty::c_ulong, - pub end_data: ::aya_bpf::cty::c_ulong, - pub start_brk: ::aya_bpf::cty::c_ulong, - pub brk: ::aya_bpf::cty::c_ulong, - pub start_stack: ::aya_bpf::cty::c_ulong, - pub arg_start: ::aya_bpf::cty::c_ulong, - pub arg_end: ::aya_bpf::cty::c_ulong, - pub env_start: ::aya_bpf::cty::c_ulong, - pub env_end: ::aya_bpf::cty::c_ulong, - pub saved_auxv: [::aya_bpf::cty::c_ulong; 52usize], - pub rss_stat: [percpu_counter; 4usize], - pub binfmt: *mut linux_binfmt, - pub context: mm_context_t, - pub flags: ::aya_bpf::cty::c_ulong, - pub ioctx_lock: spinlock_t, - pub ioctx_table: *mut kioctx_table, - pub owner: *mut task_struct, - pub user_ns: *mut user_namespace, - pub exe_file: *mut file, - pub notifier_subscriptions: *mut mmu_notifier_subscriptions, - pub numa_next_scan: ::aya_bpf::cty::c_ulong, - pub numa_scan_offset: ::aya_bpf::cty::c_ulong, - pub numa_scan_seq: ::aya_bpf::cty::c_int, - pub tlb_flush_pending: atomic_t, - pub tlb_flush_batched: atomic_t, - pub uprobes_state: uprobes_state, - pub hugetlb_usage: atomic_long_t, - pub async_put_work: work_struct, - pub pasid: u32_, - pub ksm_merging_pages: ::aya_bpf::cty::c_ulong, - pub ksm_rmap_items: ::aya_bpf::cty::c_ulong, - pub lru_gen: mm_struct__bindgen_ty_1__bindgen_ty_2, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mm_struct__bindgen_ty_1__bindgen_ty_1 { - pub mm_count: atomic_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_0: u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mm_struct__bindgen_ty_1__bindgen_ty_2 { - pub list: list_head, - pub bitmap: ::aya_bpf::cty::c_ulong, - pub memcg: *mut mem_cgroup, -} -impl mm_struct__bindgen_ty_1 { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit + pub fn exclude_callchain_user(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(22usize, 1u8) as u64) } } -} -pub type vm_flags_t = ::aya_bpf::cty::c_ulong; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vm_userfaultfd_ctx { - pub ctx: *mut userfaultfd_ctx, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct vm_area_struct { - pub __bindgen_anon_1: vm_area_struct__bindgen_ty_1, - pub vm_mm: *mut mm_struct, - pub vm_page_prot: pgprot_t, - pub __bindgen_anon_2: vm_area_struct__bindgen_ty_2, - pub vm_lock_seq: ::aya_bpf::cty::c_int, - pub vm_lock: *mut vma_lock, - pub detached: bool_, - pub shared: vm_area_struct__bindgen_ty_3, - pub anon_vma_chain: list_head, - pub anon_vma: *mut anon_vma, - pub vm_ops: *const vm_operations_struct, - pub vm_pgoff: ::aya_bpf::cty::c_ulong, - pub vm_file: *mut file, - pub vm_private_data: *mut ::aya_bpf::cty::c_void, - pub anon_name: *mut anon_vma_name, - pub swap_readahead_info: atomic_long_t, - pub vm_policy: *mut mempolicy, - pub numab_state: *mut vma_numab_state, - pub vm_userfaultfd_ctx: vm_userfaultfd_ctx, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union vm_area_struct__bindgen_ty_1 { - pub __bindgen_anon_1: vm_area_struct__bindgen_ty_1__bindgen_ty_1, - pub vm_rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vm_area_struct__bindgen_ty_1__bindgen_ty_1 { - pub vm_start: ::aya_bpf::cty::c_ulong, - pub vm_end: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union vm_area_struct__bindgen_ty_2 { - pub vm_flags: vm_flags_t, - pub __vm_flags: vm_flags_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vm_area_struct__bindgen_ty_3 { - pub rb: rb_node, - pub rb_subtree_last: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct math_emu_info { - pub ___orig_eip: ::aya_bpf::cty::c_long, - pub regs: *mut pt_regs, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct attribute_group { - pub name: *const ::aya_bpf::cty::c_char, - pub is_visible: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut kobject, - arg2: *mut attribute, - arg3: ::aya_bpf::cty::c_int, - ) -> umode_t, - >, - pub is_bin_visible: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut kobject, - arg2: *mut bin_attribute, - arg3: ::aya_bpf::cty::c_int, - ) -> umode_t, - >, - pub attrs: *mut *mut attribute, - pub bin_attrs: *mut *mut bin_attribute, -} -pub type cpumask_var_t = [cpumask; 1usize]; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct range { - pub start: u64_, - pub end: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tracepoint_func { - pub func: *mut ::aya_bpf::cty::c_void, - pub data: *mut ::aya_bpf::cty::c_void, - pub prio: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct tracepoint { - pub name: *const ::aya_bpf::cty::c_char, - pub key: static_key, - pub static_call_key: *mut static_call_key, - pub static_call_tramp: *mut ::aya_bpf::cty::c_void, - pub iterator: *mut ::aya_bpf::cty::c_void, - pub regfunc: ::core::option::Option ::aya_bpf::cty::c_int>, - pub unregfunc: ::core::option::Option, - pub funcs: *mut tracepoint_func, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_raw_event_map { - pub tp: *mut tracepoint, - pub bpf_func: *mut ::aya_bpf::cty::c_void, - pub num_args: u32_, - pub writable_size: u32_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, -} -impl bpf_raw_event_map { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct seq_operations { - pub start: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut loff_t) -> *mut ::aya_bpf::cty::c_void, - >, - pub stop: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub next: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut loff_t, - ) -> *mut ::aya_bpf::cty::c_void, - >, - pub show: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, -} -pub mod perf_event_state { - pub type Type = ::aya_bpf::cty::c_int; - pub const PERF_EVENT_STATE_DEAD: Type = -4; - pub const PERF_EVENT_STATE_EXIT: Type = -3; - pub const PERF_EVENT_STATE_ERROR: Type = -2; - pub const PERF_EVENT_STATE_OFF: Type = -1; - pub const PERF_EVENT_STATE_INACTIVE: Type = 0; - pub const PERF_EVENT_STATE_ACTIVE: Type = 1; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct local_t { - pub a: atomic_long_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct local64_t { - pub a: local_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_event_attr { - pub type_: __u32, - pub size: __u32, - pub config: __u64, - pub __bindgen_anon_1: perf_event_attr__bindgen_ty_1, - pub sample_type: __u64, - pub read_format: __u64, - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, - pub __bindgen_anon_2: perf_event_attr__bindgen_ty_2, - pub bp_type: __u32, - pub __bindgen_anon_3: perf_event_attr__bindgen_ty_3, - pub __bindgen_anon_4: perf_event_attr__bindgen_ty_4, - pub branch_sample_type: __u64, - pub sample_regs_user: __u64, - pub sample_stack_user: __u32, - pub clockid: __s32, - pub sample_regs_intr: __u64, - pub aux_watermark: __u32, - pub sample_max_stack: __u16, - pub __reserved_2: __u16, - pub aux_sample_size: __u32, - pub __reserved_3: __u32, - pub sig_data: __u64, - pub config3: __u64, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_event_attr__bindgen_ty_1 { - pub sample_period: __u64, - pub sample_freq: __u64, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_event_attr__bindgen_ty_2 { - pub wakeup_events: __u32, - pub wakeup_watermark: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_event_attr__bindgen_ty_3 { - pub bp_addr: __u64, - pub kprobe_func: __u64, - pub uprobe_path: __u64, - pub config1: __u64, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_event_attr__bindgen_ty_4 { - pub bp_len: __u64, - pub kprobe_addr: __u64, - pub probe_offset: __u64, - pub config2: __u64, -} -impl perf_event_attr { - #[inline] - pub fn disabled(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } - } - #[inline] - pub fn set_disabled(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn inherit(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } - } - #[inline] - pub fn set_inherit(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn pinned(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } - } - #[inline] - pub fn set_pinned(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclusive(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclusive(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_user(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_user(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_kernel(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_kernel(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_hv(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_hv(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_idle(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_idle(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) - } - } - #[inline] - pub fn mmap(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u64) } - } - #[inline] - pub fn set_mmap(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 1u8, val as u64) - } - } - #[inline] - pub fn comm(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u64) } - } - #[inline] - pub fn set_comm(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(9usize, 1u8, val as u64) - } - } - #[inline] - pub fn freq(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u64) } - } - #[inline] - pub fn set_freq(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(10usize, 1u8, val as u64) - } - } - #[inline] - pub fn inherit_stat(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u64) } - } - #[inline] - pub fn set_inherit_stat(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 1u8, val as u64) - } - } - #[inline] - pub fn enable_on_exec(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u64) } - } - #[inline] - pub fn set_enable_on_exec(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(12usize, 1u8, val as u64) - } - } - #[inline] - pub fn task(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u64) } - } - #[inline] - pub fn set_task(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(13usize, 1u8, val as u64) - } - } - #[inline] - pub fn watermark(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u64) } - } - #[inline] - pub fn set_watermark(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(14usize, 1u8, val as u64) - } - } - #[inline] - pub fn precise_ip(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 2u8) as u64) } - } - #[inline] - pub fn set_precise_ip(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(15usize, 2u8, val as u64) - } - } - #[inline] - pub fn mmap_data(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u64) } - } - #[inline] - pub fn set_mmap_data(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(17usize, 1u8, val as u64) - } - } - #[inline] - pub fn sample_id_all(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 1u8) as u64) } - } - #[inline] - pub fn set_sample_id_all(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(18usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_host(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(19usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_host(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(19usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_guest(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_guest(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(20usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_callchain_kernel(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(21usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_callchain_kernel(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(21usize, 1u8, val as u64) - } - } - #[inline] - pub fn exclude_callchain_user(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(22usize, 1u8) as u64) } - } - #[inline] - pub fn set_exclude_callchain_user(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(22usize, 1u8, val as u64) - } + pub fn set_exclude_callchain_user(&mut self, val: __u64) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(22usize, 1u8, val as u64) + } } #[inline] pub fn mmap2(&self) -> __u64 { @@ -3902,15 +3912,15 @@ impl perf_event_attr { #[derive(Debug, Copy, Clone)] pub struct hw_perf_event_extra { pub config: u64_, - pub reg: ::aya_bpf::cty::c_uint, - pub alloc: ::aya_bpf::cty::c_int, - pub idx: ::aya_bpf::cty::c_int, + pub reg: ::aya_ebpf::cty::c_uint, + pub alloc: ::aya_ebpf::cty::c_int, + pub idx: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct arch_hw_breakpoint { - pub address: ::aya_bpf::cty::c_ulong, - pub mask: ::aya_bpf::cty::c_ulong, + pub address: ::aya_ebpf::cty::c_ulong, + pub mask: ::aya_ebpf::cty::c_ulong, pub len: u8_, pub type_: u8_, } @@ -3930,9 +3940,9 @@ pub struct rhlist_head { pub struct hw_perf_event { pub __bindgen_anon_1: hw_perf_event__bindgen_ty_1, pub target: *mut task_struct, - pub addr_filters: *mut ::aya_bpf::cty::c_void, - pub addr_filters_gen: ::aya_bpf::cty::c_ulong, - pub state: ::aya_bpf::cty::c_int, + pub addr_filters: *mut ::aya_ebpf::cty::c_void, + pub addr_filters_gen: ::aya_ebpf::cty::c_ulong, + pub state: ::aya_ebpf::cty::c_int, pub prev_count: local64_t, pub sample_period: u64_, pub __bindgen_anon_2: hw_perf_event__bindgen_ty_2, @@ -3956,12 +3966,12 @@ pub union hw_perf_event__bindgen_ty_1 { pub struct hw_perf_event__bindgen_ty_1__bindgen_ty_1 { pub config: u64_, pub last_tag: u64_, - pub config_base: ::aya_bpf::cty::c_ulong, - pub event_base: ::aya_bpf::cty::c_ulong, - pub event_base_rdpmc: ::aya_bpf::cty::c_int, - pub idx: ::aya_bpf::cty::c_int, - pub last_cpu: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, + pub config_base: ::aya_ebpf::cty::c_ulong, + pub event_base: ::aya_ebpf::cty::c_ulong, + pub event_base_rdpmc: ::aya_ebpf::cty::c_int, + pub idx: ::aya_ebpf::cty::c_int, + pub last_cpu: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, pub extra_reg: hw_perf_event_extra, pub branch_reg: hw_perf_event_extra, } @@ -4038,15 +4048,15 @@ pub struct irq_work { pub struct perf_addr_filters_head { pub list: list_head, pub lock: raw_spinlock_t, - pub nr_file_filters: ::aya_bpf::cty::c_uint, + pub nr_file_filters: ::aya_ebpf::cty::c_uint, } pub type perf_overflow_handler_t = ::core::option::Option< unsafe extern "C" fn(arg1: *mut perf_event, arg2: *mut perf_sample_data, arg3: *mut pt_regs), >; pub type ftrace_func_t = ::core::option::Option< unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_ulong, - arg2: ::aya_bpf::cty::c_ulong, + arg1: ::aya_ebpf::cty::c_ulong, + arg2: ::aya_ebpf::cty::c_ulong, arg3: *mut ftrace_ops, arg4: *mut ftrace_regs, ), @@ -4059,7 +4069,7 @@ pub struct ftrace_ops_hash { pub regex_lock: mutex, } pub mod ftrace_ops_cmd { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF: Type = 0; pub const FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER: Type = 1; pub const FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER: Type = 2; @@ -4068,24 +4078,24 @@ pub type ftrace_ops_func_t = ::core::option::Option< unsafe extern "C" fn( arg1: *mut ftrace_ops, arg2: ftrace_ops_cmd::Type, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >; #[repr(C)] #[derive(Copy, Clone)] pub struct ftrace_ops { pub func: ftrace_func_t, pub next: *mut ftrace_ops, - pub flags: ::aya_bpf::cty::c_ulong, - pub private: *mut ::aya_bpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_ulong, + pub private: *mut ::aya_ebpf::cty::c_void, pub saved_func: ftrace_func_t, pub local_hash: ftrace_ops_hash, pub func_hash: *mut ftrace_ops_hash, pub old_hash: ftrace_ops_hash, - pub trampoline: ::aya_bpf::cty::c_ulong, - pub trampoline_size: ::aya_bpf::cty::c_ulong, + pub trampoline: ::aya_ebpf::cty::c_ulong, + pub trampoline_size: ::aya_ebpf::cty::c_ulong, pub list: list_head, pub ops_func: ftrace_ops_func_t, - pub direct_call: ::aya_bpf::cty::c_ulong, + pub direct_call: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] @@ -4098,14 +4108,15 @@ pub struct perf_event { pub migrate_entry: list_head, pub hlist_entry: hlist_node, pub active_entry: list_head, - pub nr_siblings: ::aya_bpf::cty::c_int, - pub event_caps: ::aya_bpf::cty::c_int, - pub group_caps: ::aya_bpf::cty::c_int, + pub nr_siblings: ::aya_ebpf::cty::c_int, + pub event_caps: ::aya_ebpf::cty::c_int, + pub group_caps: ::aya_ebpf::cty::c_int, + pub group_generation: ::aya_ebpf::cty::c_uint, pub group_leader: *mut perf_event, pub pmu: *mut pmu, - pub pmu_private: *mut ::aya_bpf::cty::c_void, + pub pmu_private: *mut ::aya_ebpf::cty::c_void, pub state: perf_event_state::Type, - pub attach_state: ::aya_bpf::cty::c_uint, + pub attach_state: ::aya_ebpf::cty::c_uint, pub count: local64_t, pub child_count: atomic64_t, pub total_time_enabled: u64_, @@ -4124,30 +4135,30 @@ pub struct perf_event { pub child_mutex: mutex, pub child_list: list_head, pub parent: *mut perf_event, - pub oncpu: ::aya_bpf::cty::c_int, - pub cpu: ::aya_bpf::cty::c_int, + pub oncpu: ::aya_ebpf::cty::c_int, + pub cpu: ::aya_ebpf::cty::c_int, pub owner_entry: list_head, pub owner: *mut task_struct, pub mmap_mutex: mutex, pub mmap_count: atomic_t, pub rb: *mut perf_buffer, pub rb_entry: list_head, - pub rcu_batches: ::aya_bpf::cty::c_ulong, - pub rcu_pending: ::aya_bpf::cty::c_int, + pub rcu_batches: ::aya_ebpf::cty::c_ulong, + pub rcu_pending: ::aya_ebpf::cty::c_int, pub waitq: wait_queue_head_t, pub fasync: *mut fasync_struct, - pub pending_wakeup: ::aya_bpf::cty::c_uint, - pub pending_kill: ::aya_bpf::cty::c_uint, - pub pending_disable: ::aya_bpf::cty::c_uint, - pub pending_sigtrap: ::aya_bpf::cty::c_uint, - pub pending_addr: ::aya_bpf::cty::c_ulong, + pub pending_wakeup: ::aya_ebpf::cty::c_uint, + pub pending_kill: ::aya_ebpf::cty::c_uint, + pub pending_disable: ::aya_ebpf::cty::c_uint, + pub pending_sigtrap: ::aya_ebpf::cty::c_uint, + pub pending_addr: ::aya_ebpf::cty::c_ulong, pub pending_irq: irq_work, pub pending_task: callback_head, - pub pending_work: ::aya_bpf::cty::c_uint, + pub pending_work: ::aya_ebpf::cty::c_uint, pub event_limit: atomic_t, pub addr_filters: perf_addr_filters_head, pub addr_filter_ranges: *mut perf_addr_filter_range, - pub addr_filters_gen: ::aya_bpf::cty::c_ulong, + pub addr_filters_gen: ::aya_ebpf::cty::c_ulong, pub aux_event: *mut perf_event, pub destroy: ::core::option::Option, pub callback_head: callback_head, @@ -4156,7 +4167,7 @@ pub struct perf_event { pub lost_samples: atomic64_t, pub clock: ::core::option::Option u64_>, pub overflow_handler: perf_overflow_handler_t, - pub overflow_handler_context: *mut ::aya_bpf::cty::c_void, + pub overflow_handler_context: *mut ::aya_ebpf::cty::c_void, pub orig_overflow_handler: perf_overflow_handler_t, pub prog: *mut bpf_prog, pub bpf_cookie: u64_, @@ -4164,16 +4175,15 @@ pub struct perf_event { pub filter: *mut event_filter, pub ftrace_ops: ftrace_ops, pub cgrp: *mut perf_cgroup, - pub security: *mut ::aya_bpf::cty::c_void, + pub security: *mut ::aya_ebpf::cty::c_void, pub sb_list: list_head, + pub orig_type: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_bitmap { - pub sequence: u64_, - pub refcnt: refcount_t, - pub max: ::aya_bpf::cty::c_uint, - pub bitmap: [::aya_bpf::cty::c_ulong; 1024usize], +pub struct __kernel_timespec { + pub tv_sec: __kernel_time64_t, + pub tv_nsec: ::aya_ebpf::cty::c_longlong, } pub type old_time32_t = s32; #[repr(C)] @@ -4185,25 +4195,61 @@ pub struct old_timespec32 { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct pollfd { - pub fd: ::aya_bpf::cty::c_int, - pub events: ::aya_bpf::cty::c_short, - pub revents: ::aya_bpf::cty::c_short, + pub fd: ::aya_ebpf::cty::c_int, + pub events: ::aya_ebpf::cty::c_short, + pub revents: ::aya_ebpf::cty::c_short, +} +pub mod pid_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const PIDTYPE_PID: Type = 0; + pub const PIDTYPE_TGID: Type = 1; + pub const PIDTYPE_PGID: Type = 2; + pub const PIDTYPE_SID: Type = 3; + pub const PIDTYPE_MAX: Type = 4; } #[repr(C)] #[derive(Copy, Clone)] -pub struct rwlock_t { - pub raw_lock: arch_rwlock_t, +pub struct xarray { + pub xa_lock: spinlock_t, + pub xa_flags: gfp_t, + pub xa_head: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct hlist_bl_head { - pub first: *mut hlist_bl_node, +#[derive(Copy, Clone)] +pub struct idr { + pub idr_rt: xarray, + pub idr_base: ::aya_ebpf::cty::c_uint, + pub idr_next: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct hlist_bl_node { - pub next: *mut hlist_bl_node, - pub pprev: *mut *mut hlist_bl_node, +pub struct ns_common { + pub stashed: atomic_long_t, + pub ops: *const proc_ns_operations, + pub inum: ::aya_ebpf::cty::c_uint, + pub count: refcount_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct pid_namespace { + pub idr: idr, + pub rcu: callback_head, + pub pid_allocated: ::aya_ebpf::cty::c_uint, + pub child_reaper: *mut task_struct, + pub pid_cachep: *mut kmem_cache, + pub level: ::aya_ebpf::cty::c_uint, + pub parent: *mut pid_namespace, + pub bacct: *mut fs_pin, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub reboot: ::aya_ebpf::cty::c_int, + pub ns: ns_common, + pub memfd_noexec_scope: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rwlock_t { + pub raw_lock: arch_rwlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -4212,711 +4258,736 @@ pub struct seqcount_raw_spinlock { } pub type seqcount_raw_spinlock_t = seqcount_raw_spinlock; #[repr(C)] -#[derive(Copy, Clone)] -pub struct seqlock_t { - pub seqcount: seqcount_spinlock_t, - pub lock: spinlock_t, +#[derive(Debug, Copy, Clone)] +pub struct hrtimer_clock_base { + pub cpu_base: *mut hrtimer_cpu_base, + pub index: ::aya_ebpf::cty::c_uint, + pub clockid: clockid_t, + pub seq: seqcount_raw_spinlock_t, + pub running: *mut hrtimer, + pub active: timerqueue_head, + pub get_time: ::core::option::Option ktime_t>, + pub offset: ktime_t, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct lockref { - pub __bindgen_anon_1: lockref__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct rlimit { + pub rlim_cur: __kernel_ulong_t, + pub rlim_max: __kernel_ulong_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct task_cputime { + pub stime: u64_, + pub utime: u64_, + pub sum_exec_runtime: ::aya_ebpf::cty::c_ulonglong, } +pub type __signalfn_t = ::core::option::Option; +pub type __sighandler_t = __signalfn_t; +pub type __restorefn_t = ::core::option::Option; +pub type __sigrestore_t = __restorefn_t; #[repr(C)] #[derive(Copy, Clone)] -pub union lockref__bindgen_ty_1 { - pub lock_count: __u64, - pub __bindgen_anon_1: lockref__bindgen_ty_1__bindgen_ty_1, +pub union sigval { + pub sival_int: ::aya_ebpf::cty::c_int, + pub sival_ptr: *mut ::aya_ebpf::cty::c_void, } +pub type sigval_t = sigval; #[repr(C)] #[derive(Copy, Clone)] -pub struct lockref__bindgen_ty_1__bindgen_ty_1 { - pub lock: spinlock_t, - pub count: ::aya_bpf::cty::c_int, +pub union __sifields { + pub _kill: __sifields__bindgen_ty_1, + pub _timer: __sifields__bindgen_ty_2, + pub _rt: __sifields__bindgen_ty_3, + pub _sigchld: __sifields__bindgen_ty_4, + pub _sigfault: __sifields__bindgen_ty_5, + pub _sigpoll: __sifields__bindgen_ty_6, + pub _sigsys: __sifields__bindgen_ty_7, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct __sifields__bindgen_ty_1 { + pub _pid: __kernel_pid_t, + pub _uid: __kernel_uid32_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct qstr { - pub __bindgen_anon_1: qstr__bindgen_ty_1, - pub name: *const ::aya_bpf::cty::c_uchar, +pub struct __sifields__bindgen_ty_2 { + pub _tid: __kernel_timer_t, + pub _overrun: ::aya_ebpf::cty::c_int, + pub _sigval: sigval_t, + pub _sys_private: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub union qstr__bindgen_ty_1 { - pub __bindgen_anon_1: qstr__bindgen_ty_1__bindgen_ty_1, - pub hash_len: u64_, +pub struct __sifields__bindgen_ty_3 { + pub _pid: __kernel_pid_t, + pub _uid: __kernel_uid32_t, + pub _sigval: sigval_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct qstr__bindgen_ty_1__bindgen_ty_1 { - pub hash: u32_, - pub len: u32_, +pub struct __sifields__bindgen_ty_4 { + pub _pid: __kernel_pid_t, + pub _uid: __kernel_uid32_t, + pub _status: ::aya_ebpf::cty::c_int, + pub _utime: __kernel_clock_t, + pub _stime: __kernel_clock_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct dentry { - pub d_flags: ::aya_bpf::cty::c_uint, - pub d_seq: seqcount_spinlock_t, - pub d_hash: hlist_bl_node, - pub d_parent: *mut dentry, - pub d_name: qstr, - pub d_inode: *mut inode, - pub d_iname: [::aya_bpf::cty::c_uchar; 32usize], - pub d_lockref: lockref, - pub d_op: *const dentry_operations, - pub d_sb: *mut super_block, - pub d_time: ::aya_bpf::cty::c_ulong, - pub d_fsdata: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: dentry__bindgen_ty_1, - pub d_child: list_head, - pub d_subdirs: list_head, - pub d_u: dentry__bindgen_ty_2, +pub struct __sifields__bindgen_ty_5 { + pub _addr: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: __sifields__bindgen_ty_5__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union dentry__bindgen_ty_1 { - pub d_lru: list_head, - pub d_wait: *mut wait_queue_head_t, +pub union __sifields__bindgen_ty_5__bindgen_ty_1 { + pub _trapno: ::aya_ebpf::cty::c_int, + pub _addr_lsb: ::aya_ebpf::cty::c_short, + pub _addr_bnd: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1, + pub _addr_pkey: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2, + pub _perf: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3, } #[repr(C)] -#[derive(Copy, Clone)] -pub union dentry__bindgen_ty_2 { - pub d_alias: hlist_node, - pub d_in_lookup_hash: hlist_bl_node, - pub d_rcu: callback_head, +#[derive(Debug, Copy, Clone)] +pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1 { + pub _dummy_bnd: [::aya_ebpf::cty::c_char; 8usize], + pub _lower: *mut ::aya_ebpf::cty::c_void, + pub _upper: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kgid_t { - pub val: gid_t, +pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2 { + pub _dummy_pkey: [::aya_ebpf::cty::c_char; 8usize], + pub _pkey: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct xarray { - pub xa_lock: spinlock_t, - pub xa_flags: gfp_t, - pub xa_head: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3 { + pub _data: ::aya_ebpf::cty::c_ulong, + pub _type: __u32, + pub _flags: __u32, } -pub type errseq_t = u32_; #[repr(C)] -#[derive(Copy, Clone)] -pub struct address_space { - pub host: *mut inode, - pub i_pages: xarray, - pub invalidate_lock: rw_semaphore, - pub gfp_mask: gfp_t, - pub i_mmap_writable: atomic_t, - pub nr_thps: atomic_t, - pub i_mmap: rb_root_cached, - pub i_mmap_rwsem: rw_semaphore, - pub nrpages: ::aya_bpf::cty::c_ulong, - pub writeback_index: ::aya_bpf::cty::c_ulong, - pub a_ops: *const address_space_operations, - pub flags: ::aya_bpf::cty::c_ulong, - pub wb_err: errseq_t, - pub private_lock: spinlock_t, - pub private_list: list_head, - pub private_data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct __sifields__bindgen_ty_6 { + pub _band: ::aya_ebpf::cty::c_long, + pub _fd: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct inode { - pub i_mode: umode_t, - pub i_opflags: ::aya_bpf::cty::c_ushort, - pub i_uid: kuid_t, - pub i_gid: kgid_t, - pub i_flags: ::aya_bpf::cty::c_uint, - pub i_acl: *mut posix_acl, - pub i_default_acl: *mut posix_acl, - pub i_op: *const inode_operations, - pub i_sb: *mut super_block, - pub i_mapping: *mut address_space, - pub i_security: *mut ::aya_bpf::cty::c_void, - pub i_ino: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: inode__bindgen_ty_1, - pub i_rdev: dev_t, - pub i_size: loff_t, - pub i_atime: timespec64, - pub i_mtime: timespec64, - pub i_ctime: timespec64, - pub i_lock: spinlock_t, - pub i_bytes: ::aya_bpf::cty::c_ushort, - pub i_blkbits: u8_, - pub i_write_hint: u8_, - pub i_blocks: blkcnt_t, - pub i_state: ::aya_bpf::cty::c_ulong, - pub i_rwsem: rw_semaphore, - pub dirtied_when: ::aya_bpf::cty::c_ulong, - pub dirtied_time_when: ::aya_bpf::cty::c_ulong, - pub i_hash: hlist_node, - pub i_io_list: list_head, - pub i_wb: *mut bdi_writeback, - pub i_wb_frn_winner: ::aya_bpf::cty::c_int, - pub i_wb_frn_avg_time: u16_, - pub i_wb_frn_history: u16_, - pub i_lru: list_head, - pub i_sb_list: list_head, - pub i_wb_list: list_head, - pub __bindgen_anon_2: inode__bindgen_ty_2, - pub i_version: atomic64_t, - pub i_sequence: atomic64_t, - pub i_count: atomic_t, - pub i_dio_count: atomic_t, - pub i_writecount: atomic_t, - pub i_readcount: atomic_t, - pub __bindgen_anon_3: inode__bindgen_ty_3, - pub i_flctx: *mut file_lock_context, - pub i_data: address_space, - pub i_devices: list_head, - pub __bindgen_anon_4: inode__bindgen_ty_4, - pub i_generation: __u32, - pub i_fsnotify_mask: __u32, - pub i_fsnotify_marks: *mut fsnotify_mark_connector, - pub i_crypt_info: *mut fscrypt_info, - pub i_verity_info: *mut fsverity_info, - pub i_private: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct __sifields__bindgen_ty_7 { + pub _call_addr: *mut ::aya_ebpf::cty::c_void, + pub _syscall: ::aya_ebpf::cty::c_int, + pub _arch: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] -pub union inode__bindgen_ty_1 { - pub i_nlink: ::aya_bpf::cty::c_uint, - pub __i_nlink: ::aya_bpf::cty::c_uint, +pub struct kernel_siginfo { + pub __bindgen_anon_1: kernel_siginfo__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union inode__bindgen_ty_2 { - pub i_dentry: hlist_head, - pub i_rcu: callback_head, +pub struct kernel_siginfo__bindgen_ty_1 { + pub si_signo: ::aya_ebpf::cty::c_int, + pub si_errno: ::aya_ebpf::cty::c_int, + pub si_code: ::aya_ebpf::cty::c_int, + pub _sifields: __sifields, } #[repr(C)] -#[derive(Copy, Clone)] -pub union inode__bindgen_ty_3 { - pub i_fop: *const file_operations, - pub free_inode: ::core::option::Option, +#[derive(Debug, Copy, Clone)] +pub struct ucounts { + pub node: hlist_node, + pub ns: *mut user_namespace, + pub uid: kuid_t, + pub count: atomic_t, + pub ucount: [atomic_long_t; 12usize], + pub rlimit: [atomic_long_t; 4usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union inode__bindgen_ty_4 { - pub i_pipe: *mut pipe_inode_info, - pub i_cdev: *mut cdev, - pub i_link: *mut ::aya_bpf::cty::c_char, - pub i_dir_seq: ::aya_bpf::cty::c_uint, +#[derive(Debug, Copy, Clone)] +pub struct sigaction { + pub sa_handler: __sighandler_t, + pub sa_flags: ::aya_ebpf::cty::c_ulong, + pub sa_restorer: __sigrestore_t, + pub sa_mask: sigset_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dentry_operations { - pub d_revalidate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dentry, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub d_weak_revalidate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dentry, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub d_hash: ::core::option::Option< - unsafe extern "C" fn(arg1: *const dentry, arg2: *mut qstr) -> ::aya_bpf::cty::c_int, - >, - pub d_compare: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const dentry, - arg2: ::aya_bpf::cty::c_uint, - arg3: *const ::aya_bpf::cty::c_char, - arg4: *const qstr, - ) -> ::aya_bpf::cty::c_int, - >, - pub d_delete: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub d_init: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub d_release: ::core::option::Option, - pub d_prune: ::core::option::Option, - pub d_iput: ::core::option::Option, - pub d_dname: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dentry, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: ::aya_bpf::cty::c_int, - ) -> *mut ::aya_bpf::cty::c_char, - >, - pub d_automount: ::core::option::Option *mut vfsmount>, - pub d_manage: ::core::option::Option< - unsafe extern "C" fn(arg1: *const path, arg2: bool_) -> ::aya_bpf::cty::c_int, - >, - pub d_real: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dentry, arg2: *const inode) -> *mut dentry, - >, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, -} -impl dentry_operations { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mtd_info { - _unused: [u8; 0], -} -pub type qsize_t = ::aya_bpf::cty::c_longlong; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mem_dqinfo { - pub dqi_format: *mut quota_format_type, - pub dqi_fmt_id: ::aya_bpf::cty::c_int, - pub dqi_dirty_list: list_head, - pub dqi_flags: ::aya_bpf::cty::c_ulong, - pub dqi_bgrace: ::aya_bpf::cty::c_uint, - pub dqi_igrace: ::aya_bpf::cty::c_uint, - pub dqi_max_spc_limit: qsize_t, - pub dqi_max_ino_limit: qsize_t, - pub dqi_priv: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct quota_info { - pub flags: ::aya_bpf::cty::c_uint, - pub dqio_sem: rw_semaphore, - pub files: [*mut inode; 3usize], - pub info: [mem_dqinfo; 3usize], - pub ops: [*const quota_format_ops; 3usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rcu_sync { - pub gp_state: ::aya_bpf::cty::c_int, - pub gp_count: ::aya_bpf::cty::c_int, - pub gp_wait: wait_queue_head_t, - pub cb_head: callback_head, +pub struct k_sigaction { + pub sa: sigaction, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct percpu_rw_semaphore { - pub rss: rcu_sync, - pub read_count: *mut ::aya_bpf::cty::c_uint, - pub writer: rcuwait, - pub waiters: wait_queue_head_t, - pub block: atomic_t, +#[derive(Debug)] +pub struct rseq { + pub cpu_id_start: __u32, + pub cpu_id: __u32, + pub rseq_cs: __u64, + pub flags: __u32, + pub node_id: __u32, + pub mm_cid: __u32, + pub end: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] #[derive(Copy, Clone)] -pub struct sb_writers { - pub frozen: ::aya_bpf::cty::c_int, - pub wait_unfrozen: wait_queue_head_t, - pub rw_sem: [percpu_rw_semaphore; 3usize], +pub struct seqlock_t { + pub seqcount: seqcount_spinlock_t, + pub lock: spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct uuid_t { - pub b: [__u8; 16usize], +pub struct kgid_t { + pub val: gid_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct shrinker { - pub count_objects: ::core::option::Option< +pub struct sched_class { + pub uclamp_enabled: ::aya_ebpf::cty::c_int, + pub enqueue_task: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_ebpf::cty::c_int), + >, + pub dequeue_task: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_ebpf::cty::c_int), + >, + pub yield_task: ::core::option::Option, + pub yield_to_task: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct) -> bool_, + >, + pub wakeup_preempt: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_ebpf::cty::c_int), + >, + pub pick_next_task: + ::core::option::Option *mut task_struct>, + pub put_prev_task: + ::core::option::Option, + pub set_next_task: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: bool_), + >, + pub balance: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut shrinker, - arg2: *mut shrink_control, - ) -> ::aya_bpf::cty::c_ulong, + arg1: *mut rq, + arg2: *mut task_struct, + arg3: *mut rq_flags, + ) -> ::aya_ebpf::cty::c_int, >, - pub scan_objects: ::core::option::Option< + pub select_task_rq: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut shrinker, - arg2: *mut shrink_control, - ) -> ::aya_bpf::cty::c_ulong, + arg1: *mut task_struct, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pick_task: ::core::option::Option *mut task_struct>, + pub migrate_task_rq: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut task_struct, arg2: ::aya_ebpf::cty::c_int), + >, + pub task_woken: + ::core::option::Option, + pub set_cpus_allowed: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut task_struct, arg2: *mut affinity_context), + >, + pub rq_online: ::core::option::Option, + pub rq_offline: ::core::option::Option, + pub find_lock_rq: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut task_struct, arg2: *mut rq) -> *mut rq, + >, + pub task_tick: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_ebpf::cty::c_int), + >, + pub task_fork: ::core::option::Option, + pub task_dead: ::core::option::Option, + pub switched_from: + ::core::option::Option, + pub switched_to: + ::core::option::Option, + pub prio_changed: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_ebpf::cty::c_int), + >, + pub get_rr_interval: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct) -> ::aya_ebpf::cty::c_uint, + >, + pub update_curr: ::core::option::Option, + pub task_change_group: ::core::option::Option, + pub task_is_throttled: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut task_struct, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub batch: ::aya_bpf::cty::c_long, - pub seeks: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_uint, - pub list: list_head, - pub id: ::aya_bpf::cty::c_int, - pub debugfs_id: ::aya_bpf::cty::c_int, - pub name: *const ::aya_bpf::cty::c_char, - pub debugfs_entry: *mut dentry, - pub nr_deferred: *mut atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct list_lru { - pub node: *mut list_lru_node, - pub list: list_head, - pub shrinker_id: ::aya_bpf::cty::c_int, - pub memcg_aware: bool_, - pub xa: xarray, } +pub type errseq_t = u32_; #[repr(C)] #[derive(Copy, Clone)] -pub struct super_block { - pub s_list: list_head, - pub s_dev: dev_t, - pub s_blocksize_bits: ::aya_bpf::cty::c_uchar, - pub s_blocksize: ::aya_bpf::cty::c_ulong, - pub s_maxbytes: loff_t, - pub s_type: *mut file_system_type, - pub s_op: *const super_operations, - pub dq_op: *const dquot_operations, - pub s_qcop: *const quotactl_ops, - pub s_export_op: *const export_operations, - pub s_flags: ::aya_bpf::cty::c_ulong, - pub s_iflags: ::aya_bpf::cty::c_ulong, - pub s_magic: ::aya_bpf::cty::c_ulong, - pub s_root: *mut dentry, - pub s_umount: rw_semaphore, - pub s_count: ::aya_bpf::cty::c_int, - pub s_active: atomic_t, - pub s_security: *mut ::aya_bpf::cty::c_void, - pub s_xattr: *mut *const xattr_handler, - pub s_cop: *const fscrypt_operations, - pub s_master_keys: *mut fscrypt_keyring, - pub s_vop: *const fsverity_operations, - pub s_encoding: *mut unicode_map, - pub s_encoding_flags: __u16, - pub s_roots: hlist_bl_head, - pub s_mounts: list_head, - pub s_bdev: *mut block_device, - pub s_bdi: *mut backing_dev_info, - pub s_mtd: *mut mtd_info, - pub s_instances: hlist_node, - pub s_quota_types: ::aya_bpf::cty::c_uint, - pub s_dquot: quota_info, - pub s_writers: sb_writers, - pub s_fs_info: *mut ::aya_bpf::cty::c_void, - pub s_time_gran: u32_, - pub s_time_min: time64_t, - pub s_time_max: time64_t, - pub s_fsnotify_mask: __u32, - pub s_fsnotify_marks: *mut fsnotify_mark_connector, - pub s_id: [::aya_bpf::cty::c_char; 32usize], - pub s_uuid: uuid_t, - pub s_max_links: ::aya_bpf::cty::c_uint, - pub s_mode: fmode_t, - pub s_vfs_rename_mutex: mutex, - pub s_subtype: *const ::aya_bpf::cty::c_char, - pub s_d_op: *const dentry_operations, - pub s_shrink: shrinker, - pub s_remove_count: atomic_long_t, - pub s_fsnotify_connectors: atomic_long_t, - pub s_readonly_remount: ::aya_bpf::cty::c_int, - pub s_wb_err: errseq_t, - pub s_dio_done_wq: *mut workqueue_struct, - pub s_pins: hlist_head, - pub s_user_ns: *mut user_namespace, - pub s_dentry_lru: list_lru, - pub s_inode_lru: list_lru, - pub rcu: callback_head, - pub destroy_work: work_struct, - pub s_sync_lock: mutex, - pub s_stack_depth: ::aya_bpf::cty::c_int, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub __bindgen_padding_0: u32, - pub s_inode_list_lock: spinlock_t, - pub s_inodes: list_head, - pub s_inode_wblist_lock: spinlock_t, - pub s_inodes_wb: list_head, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, -} -impl super_block { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vfsmount { - pub mnt_root: *mut dentry, - pub mnt_sb: *mut super_block, - pub mnt_flags: ::aya_bpf::cty::c_int, - pub mnt_idmap: *mut mnt_idmap, +pub struct address_space { + pub host: *mut inode, + pub i_pages: xarray, + pub invalidate_lock: rw_semaphore, + pub gfp_mask: gfp_t, + pub i_mmap_writable: atomic_t, + pub nr_thps: atomic_t, + pub i_mmap: rb_root_cached, + pub nrpages: ::aya_ebpf::cty::c_ulong, + pub writeback_index: ::aya_ebpf::cty::c_ulong, + pub a_ops: *const address_space_operations, + pub flags: ::aya_ebpf::cty::c_ulong, + pub i_mmap_rwsem: rw_semaphore, + pub wb_err: errseq_t, + pub i_private_lock: spinlock_t, + pub i_private_list: list_head, + pub i_private_data: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct path { - pub mnt: *mut vfsmount, - pub dentry: *mut dentry, +pub struct upid { + pub nr: ::aya_ebpf::cty::c_int, + pub ns: *mut pid_namespace, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uid_gid_extent { - pub first: u32_, - pub lower_first: u32_, - pub count: u32_, +pub struct pid { + pub count: refcount_t, + pub level: ::aya_ebpf::cty::c_uint, + pub lock: spinlock_t, + pub tasks: [hlist_head; 4usize], + pub inodes: hlist_head, + pub wait_pidfd: wait_queue_head_t, + pub rcu: callback_head, + pub numbers: __IncompleteArrayField, } #[repr(C)] #[derive(Copy, Clone)] -pub struct uid_gid_map { - pub nr_extents: u32_, - pub __bindgen_anon_1: uid_gid_map__bindgen_ty_1, +pub struct swait_queue_head { + pub lock: raw_spinlock_t, + pub task_list: list_head, } #[repr(C)] #[derive(Copy, Clone)] -pub union uid_gid_map__bindgen_ty_1 { - pub extent: [uid_gid_extent; 5usize], - pub __bindgen_anon_1: uid_gid_map__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uid_gid_map__bindgen_ty_1__bindgen_ty_1 { - pub forward: *mut uid_gid_extent, - pub reverse: *mut uid_gid_extent, +pub struct completion { + pub done: ::aya_ebpf::cty::c_uint, + pub wait: swait_queue_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ns_common { - pub stashed: atomic_long_t, - pub ops: *const proc_ns_operations, - pub inum: ::aya_bpf::cty::c_uint, - pub count: refcount_t, +pub struct kernel_cap_t { + pub val: u64_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ctl_table_header { - pub __bindgen_anon_1: ctl_table_header__bindgen_ty_1, - pub unregistering: *mut completion, - pub ctl_table_arg: *mut ctl_table, - pub root: *mut ctl_table_root, - pub set: *mut ctl_table_set, - pub parent: *mut ctl_dir, - pub node: *mut ctl_node, - pub inodes: hlist_head, +pub struct cred { + pub usage: atomic_long_t, + pub uid: kuid_t, + pub gid: kgid_t, + pub suid: kuid_t, + pub sgid: kgid_t, + pub euid: kuid_t, + pub egid: kgid_t, + pub fsuid: kuid_t, + pub fsgid: kgid_t, + pub securebits: ::aya_ebpf::cty::c_uint, + pub cap_inheritable: kernel_cap_t, + pub cap_permitted: kernel_cap_t, + pub cap_effective: kernel_cap_t, + pub cap_bset: kernel_cap_t, + pub cap_ambient: kernel_cap_t, + pub jit_keyring: ::aya_ebpf::cty::c_uchar, + pub session_keyring: *mut key, + pub process_keyring: *mut key, + pub thread_keyring: *mut key, + pub request_key_auth: *mut key, + pub security: *mut ::aya_ebpf::cty::c_void, + pub user: *mut user_struct, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub group_info: *mut group_info, + pub __bindgen_anon_1: cred__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union ctl_table_header__bindgen_ty_1 { - pub __bindgen_anon_1: ctl_table_header__bindgen_ty_1__bindgen_ty_1, +pub union cred__bindgen_ty_1 { + pub non_rcu: ::aya_ebpf::cty::c_int, pub rcu: callback_head, } +pub type key_serial_t = i32; +pub type time64_t = __s64; +pub type key_perm_t = u32; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ctl_table_header__bindgen_ty_1__bindgen_ty_1 { - pub ctl_table: *mut ctl_table, - pub used: ::aya_bpf::cty::c_int, - pub count: ::aya_bpf::cty::c_int, - pub nreg: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub struct keyring_index_key { + pub hash: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_1: keyring_index_key__bindgen_ty_1, + pub type_: *mut key_type, + pub domain_tag: *mut key_tag, + pub description: *const ::aya_ebpf::cty::c_char, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ctl_dir { - pub header: ctl_table_header, - pub root: rb_root, +pub union keyring_index_key__bindgen_ty_1 { + pub __bindgen_anon_1: keyring_index_key__bindgen_ty_1__bindgen_ty_1, + pub x: ::aya_ebpf::cty::c_ulong, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ctl_table_set { - pub is_seen: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ctl_table_set) -> ::aya_bpf::cty::c_int, - >, - pub dir: ctl_dir, +#[derive(Debug, Copy, Clone)] +pub struct keyring_index_key__bindgen_ty_1__bindgen_ty_1 { + pub desc_len: u16_, + pub desc: [::aya_ebpf::cty::c_char; 6usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct user_namespace { - pub uid_map: uid_gid_map, - pub gid_map: uid_gid_map, - pub projid_map: uid_gid_map, - pub parent: *mut user_namespace, - pub level: ::aya_bpf::cty::c_int, - pub owner: kuid_t, - pub group: kgid_t, - pub ns: ns_common, - pub flags: ::aya_bpf::cty::c_ulong, - pub parent_could_setfcap: bool_, - pub keyring_name_list: list_head, - pub user_keyring_register: *mut key, - pub keyring_sem: rw_semaphore, - pub persistent_keyring_register: *mut key, - pub work: work_struct, - pub set: ctl_table_set, - pub sysctls: *mut ctl_table_header, - pub ucounts: *mut ucounts, - pub ucount_max: [::aya_bpf::cty::c_long; 12usize], - pub rlimit_max: [::aya_bpf::cty::c_long; 4usize], +pub union key_payload { + pub rcu_data0: *mut ::aya_ebpf::cty::c_void, + pub data: [*mut ::aya_ebpf::cty::c_void; 4usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kstat { - pub result_mask: u32_, - pub mode: umode_t, - pub nlink: ::aya_bpf::cty::c_uint, - pub blksize: u32, - pub attributes: u64_, - pub attributes_mask: u64_, - pub ino: u64_, - pub dev: dev_t, - pub rdev: dev_t, - pub uid: kuid_t, - pub gid: kgid_t, - pub size: loff_t, - pub atime: timespec64, - pub mtime: timespec64, - pub ctime: timespec64, - pub btime: timespec64, - pub blocks: u64_, - pub mnt_id: u64_, - pub dio_mem_align: u32_, - pub dio_offset_align: u32_, - pub change_cookie: u64_, +pub struct assoc_array_ptr { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct shrink_control { - pub gfp_mask: gfp_t, - pub nid: ::aya_bpf::cty::c_int, - pub nr_to_scan: ::aya_bpf::cty::c_ulong, - pub nr_scanned: ::aya_bpf::cty::c_ulong, - pub memcg: *mut mem_cgroup, +pub struct assoc_array { + pub root: *mut assoc_array_ptr, + pub nr_leaves_on_tree: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] -pub struct swait_queue_head { - pub lock: raw_spinlock_t, - pub task_list: list_head, +pub struct key { + pub usage: refcount_t, + pub serial: key_serial_t, + pub __bindgen_anon_1: key__bindgen_ty_1, + pub watchers: *mut watch_list, + pub sem: rw_semaphore, + pub user: *mut key_user, + pub security: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_2: key__bindgen_ty_2, + pub last_used_at: time64_t, + pub uid: kuid_t, + pub gid: kgid_t, + pub perm: key_perm_t, + pub quotalen: ::aya_ebpf::cty::c_ushort, + pub datalen: ::aya_ebpf::cty::c_ushort, + pub state: ::aya_ebpf::cty::c_short, + pub flags: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_3: key__bindgen_ty_3, + pub __bindgen_anon_4: key__bindgen_ty_4, + pub restrict_link: *mut key_restriction, } #[repr(C)] #[derive(Copy, Clone)] -pub struct completion { - pub done: ::aya_bpf::cty::c_uint, - pub wait: swait_queue_head, +pub union key__bindgen_ty_1 { + pub graveyard_link: list_head, + pub serial_node: rb_node, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct delayed_work { - pub work: work_struct, - pub timer: timer_list, - pub wq: *mut workqueue_struct, - pub cpu: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub union key__bindgen_ty_2 { + pub expiry: time64_t, + pub revoked_at: time64_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rcu_work { - pub work: work_struct, - pub rcu: callback_head, - pub wq: *mut workqueue_struct, +#[derive(Copy, Clone)] +pub union key__bindgen_ty_3 { + pub index_key: keyring_index_key, + pub __bindgen_anon_1: key__bindgen_ty_3__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rcu_segcblist { - pub head: *mut callback_head, - pub tails: [*mut *mut callback_head; 4usize], - pub gp_seq: [::aya_bpf::cty::c_ulong; 4usize], - pub len: atomic_long_t, - pub seglen: [::aya_bpf::cty::c_long; 4usize], - pub flags: u8_, +pub struct key__bindgen_ty_3__bindgen_ty_1 { + pub hash: ::aya_ebpf::cty::c_ulong, + pub len_desc: ::aya_ebpf::cty::c_ulong, + pub type_: *mut key_type, + pub domain_tag: *mut key_tag, + pub description: *mut ::aya_ebpf::cty::c_char, } #[repr(C)] #[derive(Copy, Clone)] -pub struct srcu_data { - pub srcu_lock_count: [atomic_long_t; 2usize], - pub srcu_unlock_count: [atomic_long_t; 2usize], - pub srcu_nmi_safety: ::aya_bpf::cty::c_int, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub __bindgen_padding_0: u32, - pub lock: spinlock_t, - pub srcu_cblist: rcu_segcblist, - pub srcu_gp_seq_needed: ::aya_bpf::cty::c_ulong, - pub srcu_gp_seq_needed_exp: ::aya_bpf::cty::c_ulong, - pub srcu_cblist_invoking: bool_, - pub delay_work: timer_list, - pub work: work_struct, - pub srcu_barrier_head: callback_head, - pub mynode: *mut srcu_node, - pub grpmask: ::aya_bpf::cty::c_ulong, - pub cpu: ::aya_bpf::cty::c_int, - pub ssp: *mut srcu_struct, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, -} -impl srcu_data { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub union key__bindgen_ty_4 { + pub payload: key_payload, + pub __bindgen_anon_1: key__bindgen_ty_4__bindgen_ty_1, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct srcu_node { - pub lock: spinlock_t, - pub srcu_have_cbs: [::aya_bpf::cty::c_ulong; 4usize], - pub srcu_data_have_cbs: [::aya_bpf::cty::c_ulong; 4usize], - pub srcu_gp_seq_needed_exp: ::aya_bpf::cty::c_ulong, - pub srcu_parent: *mut srcu_node, - pub grplo: ::aya_bpf::cty::c_int, - pub grphi: ::aya_bpf::cty::c_int, +#[derive(Debug, Copy, Clone)] +pub struct key__bindgen_ty_4__bindgen_ty_1 { + pub name_link: list_head, + pub keys: assoc_array, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct srcu_struct { - pub srcu_idx: ::aya_bpf::cty::c_uint, - pub sda: *mut srcu_data, - pub dep_map: lockdep_map, - pub srcu_sup: *mut srcu_usage, +pub struct nsproxy { + pub count: refcount_t, + pub uts_ns: *mut uts_namespace, + pub ipc_ns: *mut ipc_namespace, + pub mnt_ns: *mut mnt_namespace, + pub pid_ns_for_children: *mut pid_namespace, + pub net_ns: *mut net, + pub time_ns: *mut time_namespace, + pub time_ns_for_children: *mut time_namespace, + pub cgroup_ns: *mut cgroup_namespace, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct srcu_usage { - pub node: *mut srcu_node, - pub level: [*mut srcu_node; 3usize], - pub srcu_size_state: ::aya_bpf::cty::c_int, - pub srcu_cb_mutex: mutex, - pub lock: spinlock_t, - pub srcu_gp_mutex: mutex, - pub srcu_gp_seq: ::aya_bpf::cty::c_ulong, - pub srcu_gp_seq_needed: ::aya_bpf::cty::c_ulong, - pub srcu_gp_seq_needed_exp: ::aya_bpf::cty::c_ulong, - pub srcu_gp_start: ::aya_bpf::cty::c_ulong, - pub srcu_last_gp_end: ::aya_bpf::cty::c_ulong, - pub srcu_size_jiffies: ::aya_bpf::cty::c_ulong, - pub srcu_n_lock_retries: ::aya_bpf::cty::c_ulong, - pub srcu_n_exp_nodelay: ::aya_bpf::cty::c_ulong, - pub sda_is_static: bool_, - pub srcu_barrier_seq: ::aya_bpf::cty::c_ulong, - pub srcu_barrier_mutex: mutex, - pub srcu_barrier_completion: completion, - pub srcu_barrier_cpu_cnt: atomic_t, - pub reschedule_jiffies: ::aya_bpf::cty::c_ulong, - pub reschedule_count: ::aya_bpf::cty::c_ulong, - pub work: delayed_work, - pub srcu_ssp: *mut srcu_struct, +#[derive(Debug, Copy, Clone)] +pub struct cpu_itimer { + pub expires: u64_, + pub incr: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct arch_uprobe_task { - pub saved_scratch_register: ::aya_bpf::cty::c_ulong, - pub saved_trap_nr: ::aya_bpf::cty::c_uint, - pub saved_tf: ::aya_bpf::cty::c_uint, +pub struct task_cputime_atomic { + pub utime: atomic64_t, + pub stime: atomic64_t, + pub sum_exec_runtime: atomic64_t, } -pub mod uprobe_task_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const UTASK_RUNNING: Type = 0; - pub const UTASK_SSTEP: Type = 1; - pub const UTASK_SSTEP_ACK: Type = 2; - pub const UTASK_SSTEP_TRAPPED: Type = 3; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct thread_group_cputimer { + pub cputime_atomic: task_cputime_atomic, } #[repr(C)] -#[derive(Copy, Clone)] +#[derive(Debug, Copy, Clone)] +pub struct pacct_struct { + pub ac_flag: ::aya_ebpf::cty::c_int, + pub ac_exitcode: ::aya_ebpf::cty::c_long, + pub ac_mem: ::aya_ebpf::cty::c_ulong, + pub ac_utime: u64_, + pub ac_stime: u64_, + pub ac_minflt: ::aya_ebpf::cty::c_ulong, + pub ac_majflt: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct signal_struct { + pub sigcnt: refcount_t, + pub live: atomic_t, + pub nr_threads: ::aya_ebpf::cty::c_int, + pub quick_threads: ::aya_ebpf::cty::c_int, + pub thread_head: list_head, + pub wait_chldexit: wait_queue_head_t, + pub curr_target: *mut task_struct, + pub shared_pending: sigpending, + pub multiprocess: hlist_head, + pub group_exit_code: ::aya_ebpf::cty::c_int, + pub notify_count: ::aya_ebpf::cty::c_int, + pub group_exec_task: *mut task_struct, + pub group_stop_count: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_uint, + pub core_state: *mut core_state, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub next_posix_timer_id: ::aya_ebpf::cty::c_uint, + pub posix_timers: list_head, + pub real_timer: hrtimer, + pub it_real_incr: ktime_t, + pub it: [cpu_itimer; 2usize], + pub cputimer: thread_group_cputimer, + pub posix_cputimers: posix_cputimers, + pub pids: [*mut pid; 4usize], + pub tick_dep_mask: atomic_t, + pub tty_old_pgrp: *mut pid, + pub leader: ::aya_ebpf::cty::c_int, + pub tty: *mut tty_struct, + pub autogroup: *mut autogroup, + pub stats_lock: seqlock_t, + pub utime: u64_, + pub stime: u64_, + pub cutime: u64_, + pub cstime: u64_, + pub gtime: u64_, + pub cgtime: u64_, + pub prev_cputime: prev_cputime, + pub nvcsw: ::aya_ebpf::cty::c_ulong, + pub nivcsw: ::aya_ebpf::cty::c_ulong, + pub cnvcsw: ::aya_ebpf::cty::c_ulong, + pub cnivcsw: ::aya_ebpf::cty::c_ulong, + pub min_flt: ::aya_ebpf::cty::c_ulong, + pub maj_flt: ::aya_ebpf::cty::c_ulong, + pub cmin_flt: ::aya_ebpf::cty::c_ulong, + pub cmaj_flt: ::aya_ebpf::cty::c_ulong, + pub inblock: ::aya_ebpf::cty::c_ulong, + pub oublock: ::aya_ebpf::cty::c_ulong, + pub cinblock: ::aya_ebpf::cty::c_ulong, + pub coublock: ::aya_ebpf::cty::c_ulong, + pub maxrss: ::aya_ebpf::cty::c_ulong, + pub cmaxrss: ::aya_ebpf::cty::c_ulong, + pub ioac: task_io_accounting, + pub sum_sched_runtime: ::aya_ebpf::cty::c_ulonglong, + pub rlim: [rlimit; 16usize], + pub pacct: pacct_struct, + pub stats: *mut taskstats, + pub audit_tty: ::aya_ebpf::cty::c_uint, + pub tty_audit_buf: *mut tty_audit_buf, + pub oom_flag_origin: bool_, + pub oom_score_adj: ::aya_ebpf::cty::c_short, + pub oom_score_adj_min: ::aya_ebpf::cty::c_short, + pub oom_mm: *mut mm_struct, + pub cred_guard_mutex: mutex, + pub exec_update_lock: rw_semaphore, +} +impl signal_struct { + #[inline] + pub fn is_child_subreaper(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_child_subreaper(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn has_child_subreaper(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_has_child_subreaper(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + is_child_subreaper: ::aya_ebpf::cty::c_uint, + has_child_subreaper: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_child_subreaper: u32 = unsafe { ::core::mem::transmute(is_child_subreaper) }; + is_child_subreaper as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let has_child_subreaper: u32 = unsafe { ::core::mem::transmute(has_child_subreaper) }; + has_child_subreaper as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct sighand_struct { + pub siglock: spinlock_t, + pub count: refcount_t, + pub signalfd_wqh: wait_queue_head_t, + pub action: [k_sigaction; 64usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct io_context { + pub refcount: atomic_long_t, + pub active_ref: atomic_t, + pub ioprio: ::aya_ebpf::cty::c_ushort, + pub lock: spinlock_t, + pub icq_tree: xarray, + pub icq_hint: *mut io_cq, + pub icq_list: hlist_head, + pub release_work: work_struct, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct css_set { + pub subsys: [*mut cgroup_subsys_state; 14usize], + pub refcount: refcount_t, + pub dom_cset: *mut css_set, + pub dfl_cgrp: *mut cgroup, + pub nr_tasks: ::aya_ebpf::cty::c_int, + pub tasks: list_head, + pub mg_tasks: list_head, + pub dying_tasks: list_head, + pub task_iters: list_head, + pub e_cset_node: [list_head; 14usize], + pub threaded_csets: list_head, + pub threaded_csets_node: list_head, + pub hlist: hlist_node, + pub cgrp_links: list_head, + pub mg_src_preload_node: list_head, + pub mg_dst_preload_node: list_head, + pub mg_node: list_head, + pub mg_src_cgrp: *mut cgroup, + pub mg_dst_cgrp: *mut cgroup, + pub mg_dst_cset: *mut css_set, + pub dead: bool_, + pub callback_head: callback_head, +} +pub type compat_uptr_t = u32_; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct compat_robust_list { + pub next: compat_uptr_t, +} +pub type compat_long_t = s32; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct compat_robust_list_head { + pub list: compat_robust_list, + pub futex_offset: compat_long_t, + pub list_op_pending: compat_uptr_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct perf_event_groups { + pub tree: rb_root, + pub index: u64_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct perf_event_context { + pub lock: raw_spinlock_t, + pub mutex: mutex, + pub pmu_ctx_list: list_head, + pub pinned_groups: perf_event_groups, + pub flexible_groups: perf_event_groups, + pub event_list: list_head, + pub nr_events: ::aya_ebpf::cty::c_int, + pub nr_user: ::aya_ebpf::cty::c_int, + pub is_active: ::aya_ebpf::cty::c_int, + pub nr_task_data: ::aya_ebpf::cty::c_int, + pub nr_stat: ::aya_ebpf::cty::c_int, + pub nr_freq: ::aya_ebpf::cty::c_int, + pub rotate_disable: ::aya_ebpf::cty::c_int, + pub refcount: refcount_t, + pub task: *mut task_struct, + pub time: u64_, + pub timestamp: u64_, + pub timeoffset: u64_, + pub parent_ctx: *mut perf_event_context, + pub parent_gen: u64_, + pub generation: u64_, + pub pin_count: ::aya_ebpf::cty::c_int, + pub nr_cgroups: ::aya_ebpf::cty::c_int, + pub callback_head: callback_head, + pub nr_pending: local_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ftrace_ret_stack { + pub ret: ::aya_ebpf::cty::c_ulong, + pub func: ::aya_ebpf::cty::c_ulong, + pub calltime: ::aya_ebpf::cty::c_ulonglong, + pub subtime: ::aya_ebpf::cty::c_ulonglong, + pub retp: *mut ::aya_ebpf::cty::c_ulong, +} +pub mod uprobe_task_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const UTASK_RUNNING: Type = 0; + pub const UTASK_SSTEP: Type = 1; + pub const UTASK_SSTEP_ACK: Type = 2; + pub const UTASK_SSTEP_TRAPPED: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct arch_uprobe_task { + pub saved_scratch_register: ::aya_ebpf::cty::c_ulong, + pub saved_trap_nr: ::aya_ebpf::cty::c_uint, + pub saved_tf: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] pub struct uprobe_task { pub state: uprobe_task_state::Type, pub __bindgen_anon_1: uprobe_task__bindgen_ty_1, pub active_uprobe: *mut uprobe, - pub xol_vaddr: ::aya_bpf::cty::c_ulong, + pub xol_vaddr: ::aya_ebpf::cty::c_ulong, pub return_instances: *mut return_instance, - pub depth: ::aya_bpf::cty::c_uint, + pub depth: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] @@ -4928,65 +4999,173 @@ pub union uprobe_task__bindgen_ty_1 { #[derive(Debug, Copy, Clone)] pub struct uprobe_task__bindgen_ty_1__bindgen_ty_1 { pub autask: arch_uprobe_task, - pub vaddr: ::aya_bpf::cty::c_ulong, + pub vaddr: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct uprobe_task__bindgen_ty_1__bindgen_ty_2 { pub dup_xol_work: callback_head, - pub dup_xol_addr: ::aya_bpf::cty::c_ulong, + pub dup_xol_addr: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct timespec64 { + pub tv_sec: time64_t, + pub tv_nsec: ::aya_ebpf::cty::c_long, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct delayed_work { + pub work: work_struct, + pub timer: timer_list, + pub wq: *mut workqueue_struct, + pub cpu: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rcu_work { + pub work: work_struct, + pub rcu: callback_head, + pub wq: *mut workqueue_struct, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rcu_segcblist { + pub head: *mut callback_head, + pub tails: [*mut *mut callback_head; 4usize], + pub gp_seq: [::aya_ebpf::cty::c_ulong; 4usize], + pub len: atomic_long_t, + pub seglen: [::aya_ebpf::cty::c_long; 4usize], + pub flags: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct srcu_data { + pub srcu_lock_count: [atomic_long_t; 2usize], + pub srcu_unlock_count: [atomic_long_t; 2usize], + pub srcu_nmi_safety: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub __bindgen_padding_0: u32, + pub lock: spinlock_t, + pub srcu_cblist: rcu_segcblist, + pub srcu_gp_seq_needed: ::aya_ebpf::cty::c_ulong, + pub srcu_gp_seq_needed_exp: ::aya_ebpf::cty::c_ulong, + pub srcu_cblist_invoking: bool_, + pub delay_work: timer_list, + pub work: work_struct, + pub srcu_barrier_head: callback_head, + pub mynode: *mut srcu_node, + pub grpmask: ::aya_ebpf::cty::c_ulong, + pub cpu: ::aya_ebpf::cty::c_int, + pub ssp: *mut srcu_struct, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, +} +impl srcu_data { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct srcu_node { + pub lock: spinlock_t, + pub srcu_have_cbs: [::aya_ebpf::cty::c_ulong; 4usize], + pub srcu_data_have_cbs: [::aya_ebpf::cty::c_ulong; 4usize], + pub srcu_gp_seq_needed_exp: ::aya_ebpf::cty::c_ulong, + pub srcu_parent: *mut srcu_node, + pub grplo: ::aya_ebpf::cty::c_int, + pub grphi: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct srcu_struct { + pub srcu_idx: ::aya_ebpf::cty::c_uint, + pub sda: *mut srcu_data, + pub dep_map: lockdep_map, + pub srcu_sup: *mut srcu_usage, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct srcu_usage { + pub node: *mut srcu_node, + pub level: [*mut srcu_node; 3usize], + pub srcu_size_state: ::aya_ebpf::cty::c_int, + pub srcu_cb_mutex: mutex, + pub lock: spinlock_t, + pub srcu_gp_mutex: mutex, + pub srcu_gp_seq: ::aya_ebpf::cty::c_ulong, + pub srcu_gp_seq_needed: ::aya_ebpf::cty::c_ulong, + pub srcu_gp_seq_needed_exp: ::aya_ebpf::cty::c_ulong, + pub srcu_gp_start: ::aya_ebpf::cty::c_ulong, + pub srcu_last_gp_end: ::aya_ebpf::cty::c_ulong, + pub srcu_size_jiffies: ::aya_ebpf::cty::c_ulong, + pub srcu_n_lock_retries: ::aya_ebpf::cty::c_ulong, + pub srcu_n_exp_nodelay: ::aya_ebpf::cty::c_ulong, + pub sda_is_static: bool_, + pub srcu_barrier_seq: ::aya_ebpf::cty::c_ulong, + pub srcu_barrier_mutex: mutex, + pub srcu_barrier_completion: completion, + pub srcu_barrier_cpu_cnt: atomic_t, + pub reschedule_jiffies: ::aya_ebpf::cty::c_ulong, + pub reschedule_count: ::aya_ebpf::cty::c_ulong, + pub work: delayed_work, + pub srcu_ssp: *mut srcu_struct, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct return_instance { pub uprobe: *mut uprobe, - pub func: ::aya_bpf::cty::c_ulong, - pub stack: ::aya_bpf::cty::c_ulong, - pub orig_ret_vaddr: ::aya_bpf::cty::c_ulong, + pub func: ::aya_ebpf::cty::c_ulong, + pub stack: ::aya_ebpf::cty::c_ulong, + pub orig_ret_vaddr: ::aya_ebpf::cty::c_ulong, pub chained: bool_, pub next: *mut return_instance, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct vdso_image { - pub data: *mut ::aya_bpf::cty::c_void, - pub size: ::aya_bpf::cty::c_ulong, - pub alt: ::aya_bpf::cty::c_ulong, - pub alt_len: ::aya_bpf::cty::c_ulong, - pub extable_base: ::aya_bpf::cty::c_ulong, - pub extable_len: ::aya_bpf::cty::c_ulong, - pub extable: *const ::aya_bpf::cty::c_void, - pub sym_vvar_start: ::aya_bpf::cty::c_long, - pub sym_vvar_page: ::aya_bpf::cty::c_long, - pub sym_pvclock_page: ::aya_bpf::cty::c_long, - pub sym_hvclock_page: ::aya_bpf::cty::c_long, - pub sym_timens_page: ::aya_bpf::cty::c_long, - pub sym_VDSO32_NOTE_MASK: ::aya_bpf::cty::c_long, - pub sym___kernel_sigreturn: ::aya_bpf::cty::c_long, - pub sym___kernel_rt_sigreturn: ::aya_bpf::cty::c_long, - pub sym___kernel_vsyscall: ::aya_bpf::cty::c_long, - pub sym_int80_landing_pad: ::aya_bpf::cty::c_long, - pub sym_vdso32_sigreturn_landing_pad: ::aya_bpf::cty::c_long, - pub sym_vdso32_rt_sigreturn_landing_pad: ::aya_bpf::cty::c_long, + pub data: *mut ::aya_ebpf::cty::c_void, + pub size: ::aya_ebpf::cty::c_ulong, + pub alt: ::aya_ebpf::cty::c_ulong, + pub alt_len: ::aya_ebpf::cty::c_ulong, + pub extable_base: ::aya_ebpf::cty::c_ulong, + pub extable_len: ::aya_ebpf::cty::c_ulong, + pub extable: *const ::aya_ebpf::cty::c_void, + pub sym_vvar_start: ::aya_ebpf::cty::c_long, + pub sym_vvar_page: ::aya_ebpf::cty::c_long, + pub sym_pvclock_page: ::aya_ebpf::cty::c_long, + pub sym_hvclock_page: ::aya_ebpf::cty::c_long, + pub sym_timens_page: ::aya_ebpf::cty::c_long, + pub sym_VDSO32_NOTE_MASK: ::aya_ebpf::cty::c_long, + pub sym___kernel_sigreturn: ::aya_ebpf::cty::c_long, + pub sym___kernel_rt_sigreturn: ::aya_ebpf::cty::c_long, + pub sym___kernel_vsyscall: ::aya_ebpf::cty::c_long, + pub sym_int80_landing_pad: ::aya_ebpf::cty::c_long, + pub sym_vdso32_sigreturn_landing_pad: ::aya_ebpf::cty::c_long, + pub sym_vdso32_rt_sigreturn_landing_pad: ::aya_ebpf::cty::c_long, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct vmem_altmap { - pub base_pfn: ::aya_bpf::cty::c_ulong, - pub end_pfn: ::aya_bpf::cty::c_ulong, - pub reserve: ::aya_bpf::cty::c_ulong, - pub free: ::aya_bpf::cty::c_ulong, - pub align: ::aya_bpf::cty::c_ulong, - pub alloc: ::aya_bpf::cty::c_ulong, + pub base_pfn: ::aya_ebpf::cty::c_ulong, + pub end_pfn: ::aya_ebpf::cty::c_ulong, + pub reserve: ::aya_ebpf::cty::c_ulong, + pub free: ::aya_ebpf::cty::c_ulong, + pub align: ::aya_ebpf::cty::c_ulong, + pub alloc: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct percpu_ref { - pub percpu_count_ptr: ::aya_bpf::cty::c_ulong, + pub percpu_count_ptr: ::aya_ebpf::cty::c_ulong, pub data: *mut percpu_ref_data, } pub mod memory_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const MEMORY_DEVICE_PRIVATE: Type = 1; pub const MEMORY_DEVICE_COHERENT: Type = 2; pub const MEMORY_DEVICE_FS_DAX: Type = 3; @@ -4999,11 +5178,11 @@ pub struct dev_pagemap { pub ref_: percpu_ref, pub done: completion, pub type_: memory_type::Type, - pub flags: ::aya_bpf::cty::c_uint, - pub vmemmap_shift: ::aya_bpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_uint, + pub vmemmap_shift: ::aya_ebpf::cty::c_ulong, pub ops: *const dev_pagemap_ops, - pub owner: *mut ::aya_bpf::cty::c_void, - pub nr_range: ::aya_bpf::cty::c_int, + pub owner: *mut ::aya_ebpf::cty::c_void, + pub nr_range: ::aya_ebpf::cty::c_int, pub __bindgen_anon_1: dev_pagemap__bindgen_ty_1, } #[repr(C)] @@ -5022,6 +5201,11 @@ pub struct dev_pagemap__bindgen_ty_1__bindgen_ty_1 { #[derive(Debug, Copy, Clone)] pub struct dev_pagemap__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {} #[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct swp_entry_t { + pub val: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] #[derive(Copy, Clone)] pub struct folio { pub __bindgen_anon_1: folio__bindgen_ty_1, @@ -5037,14 +5221,14 @@ pub union folio__bindgen_ty_1 { #[repr(C)] #[derive(Copy, Clone)] pub struct folio__bindgen_ty_1__bindgen_ty_1 { - pub flags: ::aya_bpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, pub __bindgen_anon_1: folio__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, pub mapping: *mut address_space, - pub index: ::aya_bpf::cty::c_ulong, - pub private: *mut ::aya_bpf::cty::c_void, + pub index: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_2: folio__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, pub _mapcount: atomic_t, pub _refcount: atomic_t, - pub memcg_data: ::aya_bpf::cty::c_ulong, + pub memcg_data: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] @@ -5055,8 +5239,14 @@ pub union folio__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct folio__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub __filler: *mut ::aya_bpf::cty::c_void, - pub mlock_count: ::aya_bpf::cty::c_uint, + pub __filler: *mut ::aya_ebpf::cty::c_void, + pub mlock_count: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union folio__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { + pub private: *mut ::aya_ebpf::cty::c_void, + pub swap: swp_entry_t, } #[repr(C)] #[derive(Copy, Clone)] @@ -5067,14 +5257,13 @@ pub union folio__bindgen_ty_2 { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct folio__bindgen_ty_2__bindgen_ty_1 { - pub _flags_1: ::aya_bpf::cty::c_ulong, - pub _head_1: ::aya_bpf::cty::c_ulong, - pub _folio_dtor: ::aya_bpf::cty::c_uchar, - pub _folio_order: ::aya_bpf::cty::c_uchar, + pub _flags_1: ::aya_ebpf::cty::c_ulong, + pub _head_1: ::aya_ebpf::cty::c_ulong, + pub _folio_avail: ::aya_ebpf::cty::c_ulong, pub _entire_mapcount: atomic_t, pub _nr_pages_mapped: atomic_t, pub _pincount: atomic_t, - pub _folio_nr_pages: ::aya_bpf::cty::c_uint, + pub _folio_nr_pages: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] @@ -5086,28 +5275,20 @@ pub union folio__bindgen_ty_3 { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct folio__bindgen_ty_3__bindgen_ty_1 { - pub _flags_2: ::aya_bpf::cty::c_ulong, - pub _head_2: ::aya_bpf::cty::c_ulong, - pub _hugetlb_subpool: *mut ::aya_bpf::cty::c_void, - pub _hugetlb_cgroup: *mut ::aya_bpf::cty::c_void, - pub _hugetlb_cgroup_rsvd: *mut ::aya_bpf::cty::c_void, - pub _hugetlb_hwpoison: *mut ::aya_bpf::cty::c_void, + pub _flags_2: ::aya_ebpf::cty::c_ulong, + pub _head_2: ::aya_ebpf::cty::c_ulong, + pub _hugetlb_subpool: *mut ::aya_ebpf::cty::c_void, + pub _hugetlb_cgroup: *mut ::aya_ebpf::cty::c_void, + pub _hugetlb_cgroup_rsvd: *mut ::aya_ebpf::cty::c_void, + pub _hugetlb_hwpoison: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct folio__bindgen_ty_3__bindgen_ty_2 { - pub _flags_2a: ::aya_bpf::cty::c_ulong, - pub _head_2a: ::aya_bpf::cty::c_ulong, + pub _flags_2a: ::aya_ebpf::cty::c_ulong, + pub _head_2a: ::aya_ebpf::cty::c_ulong, pub _deferred_list: list_head, } -pub mod pid_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PIDTYPE_PID: Type = 0; - pub const PIDTYPE_TGID: Type = 1; - pub const PIDTYPE_PGID: Type = 2; - pub const PIDTYPE_SID: Type = 3; - pub const PIDTYPE_MAX: Type = 4; -} #[repr(C)] #[derive(Copy, Clone)] pub struct fown_struct { @@ -5116,37 +5297,43 @@ pub struct fown_struct { pub pid_type: pid_type::Type, pub uid: kuid_t, pub euid: kuid_t, - pub signum: ::aya_bpf::cty::c_int, + pub signum: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct file_ra_state { - pub start: ::aya_bpf::cty::c_ulong, - pub size: ::aya_bpf::cty::c_uint, - pub async_size: ::aya_bpf::cty::c_uint, - pub ra_pages: ::aya_bpf::cty::c_uint, - pub mmap_miss: ::aya_bpf::cty::c_uint, + pub start: ::aya_ebpf::cty::c_ulong, + pub size: ::aya_ebpf::cty::c_uint, + pub async_size: ::aya_ebpf::cty::c_uint, + pub ra_pages: ::aya_ebpf::cty::c_uint, + pub mmap_miss: ::aya_ebpf::cty::c_uint, pub prev_pos: loff_t, } #[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct path { + pub mnt: *mut vfsmount, + pub dentry: *mut dentry, +} +#[repr(C)] #[derive(Copy, Clone)] pub struct file { pub __bindgen_anon_1: file__bindgen_ty_1, - pub f_path: path, - pub f_inode: *mut inode, - pub f_op: *const file_operations, pub f_lock: spinlock_t, - pub f_count: atomic_long_t, - pub f_flags: ::aya_bpf::cty::c_uint, pub f_mode: fmode_t, + pub f_count: atomic_long_t, pub f_pos_lock: mutex, pub f_pos: loff_t, + pub f_flags: ::aya_ebpf::cty::c_uint, pub f_owner: fown_struct, pub f_cred: *const cred, pub f_ra: file_ra_state, + pub f_path: path, + pub f_inode: *mut inode, + pub f_op: *const file_operations, pub f_version: u64_, - pub f_security: *mut ::aya_bpf::cty::c_void, - pub private_data: *mut ::aya_bpf::cty::c_void, + pub f_security: *mut ::aya_ebpf::cty::c_void, + pub private_data: *mut ::aya_ebpf::cty::c_void, pub f_ep: *mut hlist_head, pub f_mapping: *mut address_space, pub f_wb_err: errseq_t, @@ -5155,15 +5342,15 @@ pub struct file { #[repr(C)] #[derive(Copy, Clone)] pub union file__bindgen_ty_1 { + pub f_task_work: callback_head, pub f_llist: llist_node, - pub f_rcuhead: callback_head, - pub f_iocb_flags: ::aya_bpf::cty::c_uint, + pub f_iocb_flags: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug)] pub struct anon_vma_name { pub kref: kref, - pub name: __IncompleteArrayField<::aya_bpf::cty::c_char>, + pub name: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] #[derive(Copy, Clone)] @@ -5173,17 +5360,13 @@ pub struct vma_lock { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct vma_numab_state { - pub next_scan: ::aya_bpf::cty::c_ulong, - pub next_pid_reset: ::aya_bpf::cty::c_ulong, - pub access_pids: [::aya_bpf::cty::c_ulong; 2usize], -} -pub type vm_fault_t = ::aya_bpf::cty::c_uint; -pub mod page_entry_size { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PE_SIZE_PTE: Type = 0; - pub const PE_SIZE_PMD: Type = 1; - pub const PE_SIZE_PUD: Type = 2; + pub next_scan: ::aya_ebpf::cty::c_ulong, + pub pids_active_reset: ::aya_ebpf::cty::c_ulong, + pub pids_active: [::aya_ebpf::cty::c_ulong; 2usize], + pub start_scan_seq: ::aya_ebpf::cty::c_int, + pub prev_scan_seq: ::aya_ebpf::cty::c_int, } +pub type vm_fault_t = ::aya_ebpf::cty::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct vm_operations_struct { @@ -5192,33 +5375,33 @@ pub struct vm_operations_struct { pub may_split: ::core::option::Option< unsafe extern "C" fn( arg1: *mut vm_area_struct, - arg2: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, pub mremap: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut vm_area_struct) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut vm_area_struct) -> ::aya_ebpf::cty::c_int, >, pub mprotect: ::core::option::Option< unsafe extern "C" fn( arg1: *mut vm_area_struct, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, pub fault: ::core::option::Option vm_fault_t>, pub huge_fault: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut vm_fault, arg2: page_entry_size::Type) -> vm_fault_t, + unsafe extern "C" fn(arg1: *mut vm_fault, arg2: ::aya_ebpf::cty::c_uint) -> vm_fault_t, >, pub map_pages: ::core::option::Option< unsafe extern "C" fn( arg1: *mut vm_fault, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, ) -> vm_fault_t, >, pub pagesize: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut vm_area_struct) -> ::aya_bpf::cty::c_ulong, + unsafe extern "C" fn(arg1: *mut vm_area_struct) -> ::aya_ebpf::cty::c_ulong, >, pub page_mkwrite: ::core::option::Option vm_fault_t>, @@ -5227,39 +5410,149 @@ pub struct vm_operations_struct { pub access: ::core::option::Option< unsafe extern "C" fn( arg1: *mut vm_area_struct, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: ::aya_bpf::cty::c_int, - arg5: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: ::aya_ebpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub name: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut vm_area_struct) -> *const ::aya_bpf::cty::c_char, + unsafe extern "C" fn(arg1: *mut vm_area_struct) -> *const ::aya_ebpf::cty::c_char, >, pub set_policy: ::core::option::Option< unsafe extern "C" fn( arg1: *mut vm_area_struct, arg2: *mut mempolicy, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_policy: ::core::option::Option< unsafe extern "C" fn( arg1: *mut vm_area_struct, - arg2: ::aya_bpf::cty::c_ulong, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_ulong, ) -> *mut mempolicy, >, pub find_special_page: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut vm_area_struct, arg2: ::aya_bpf::cty::c_ulong) -> *mut page, + unsafe extern "C" fn( + arg1: *mut vm_area_struct, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> *mut page, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct mm_cid { pub time: u64_, - pub cid: ::aya_bpf::cty::c_int, + pub cid: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct linux_binfmt { + pub lh: list_head, + pub module: *mut module, + pub load_binary: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut linux_binprm) -> ::aya_ebpf::cty::c_int, + >, + pub load_shlib: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub core_dump: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut coredump_params) -> ::aya_ebpf::cty::c_int, + >, + pub min_coredump: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct uid_gid_extent { + pub first: u32_, + pub lower_first: u32_, + pub count: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct uid_gid_map { + pub nr_extents: u32_, + pub __bindgen_anon_1: uid_gid_map__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union uid_gid_map__bindgen_ty_1 { + pub extent: [uid_gid_extent; 5usize], + pub __bindgen_anon_1: uid_gid_map__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct uid_gid_map__bindgen_ty_1__bindgen_ty_1 { + pub forward: *mut uid_gid_extent, + pub reverse: *mut uid_gid_extent, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ctl_table_header { + pub __bindgen_anon_1: ctl_table_header__bindgen_ty_1, + pub unregistering: *mut completion, + pub ctl_table_arg: *mut ctl_table, + pub root: *mut ctl_table_root, + pub set: *mut ctl_table_set, + pub parent: *mut ctl_dir, + pub node: *mut ctl_node, + pub inodes: hlist_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ctl_table_header__bindgen_ty_1 { + pub __bindgen_anon_1: ctl_table_header__bindgen_ty_1__bindgen_ty_1, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ctl_table_header__bindgen_ty_1__bindgen_ty_1 { + pub ctl_table: *mut ctl_table, + pub ctl_table_size: ::aya_ebpf::cty::c_int, + pub used: ::aya_ebpf::cty::c_int, + pub count: ::aya_ebpf::cty::c_int, + pub nreg: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ctl_dir { + pub header: ctl_table_header, + pub root: rb_root, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ctl_table_set { + pub is_seen: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ctl_table_set) -> ::aya_ebpf::cty::c_int, + >, + pub dir: ctl_dir, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct user_namespace { + pub uid_map: uid_gid_map, + pub gid_map: uid_gid_map, + pub projid_map: uid_gid_map, + pub parent: *mut user_namespace, + pub level: ::aya_ebpf::cty::c_int, + pub owner: kuid_t, + pub group: kgid_t, + pub ns: ns_common, + pub flags: ::aya_ebpf::cty::c_ulong, + pub parent_could_setfcap: bool_, + pub keyring_name_list: list_head, + pub user_keyring_register: *mut key, + pub keyring_sem: rw_semaphore, + pub persistent_keyring_register: *mut key, + pub work: work_struct, + pub set: ctl_table_set, + pub sysctls: *mut ctl_table_header, + pub ucounts: *mut ucounts, + pub ucount_max: [::aya_ebpf::cty::c_long; 12usize], + pub rlimit_max: [::aya_ebpf::cty::c_long; 4usize], + pub binfmt_misc: *mut binfmt_misc, } pub mod fault_flag { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const FAULT_FLAG_WRITE: Type = 1; pub const FAULT_FLAG_MKWRITE: Type = 2; pub const FAULT_FLAG_ALLOW_RETRY: Type = 4; @@ -5293,9 +5586,9 @@ pub struct vm_fault { pub struct vm_fault__bindgen_ty_1 { pub vma: *mut vm_area_struct, pub gfp_mask: gfp_t, - pub pgoff: ::aya_bpf::cty::c_ulong, - pub address: ::aya_bpf::cty::c_ulong, - pub real_address: ::aya_bpf::cty::c_ulong, + pub pgoff: ::aya_ebpf::cty::c_ulong, + pub address: ::aya_ebpf::cty::c_ulong, + pub real_address: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] @@ -5303,851 +5596,523 @@ pub union vm_fault__bindgen_ty_2 { pub orig_pte: pte_t, pub orig_pmd: pmd_t, } -pub mod irq_domain_bus_token { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DOMAIN_BUS_ANY: Type = 0; - pub const DOMAIN_BUS_WIRED: Type = 1; - pub const DOMAIN_BUS_GENERIC_MSI: Type = 2; - pub const DOMAIN_BUS_PCI_MSI: Type = 3; - pub const DOMAIN_BUS_PLATFORM_MSI: Type = 4; - pub const DOMAIN_BUS_NEXUS: Type = 5; - pub const DOMAIN_BUS_IPI: Type = 6; - pub const DOMAIN_BUS_FSL_MC_MSI: Type = 7; - pub const DOMAIN_BUS_TI_SCI_INTA_MSI: Type = 8; - pub const DOMAIN_BUS_WAKEUP: Type = 9; - pub const DOMAIN_BUS_VMD_MSI: Type = 10; - pub const DOMAIN_BUS_PCI_DEVICE_MSI: Type = 11; - pub const DOMAIN_BUS_PCI_DEVICE_MSIX: Type = 12; - pub const DOMAIN_BUS_DMAR: Type = 13; - pub const DOMAIN_BUS_AMDVI: Type = 14; - pub const DOMAIN_BUS_PCI_DEVICE_IMS: Type = 15; -} -#[repr(C)] -pub struct irq_domain { - pub link: list_head, - pub name: *const ::aya_bpf::cty::c_char, - pub ops: *const irq_domain_ops, - pub host_data: *mut ::aya_bpf::cty::c_void, - pub flags: ::aya_bpf::cty::c_uint, - pub mapcount: ::aya_bpf::cty::c_uint, - pub mutex: mutex, - pub root: *mut irq_domain, - pub fwnode: *mut fwnode_handle, - pub bus_token: irq_domain_bus_token::Type, - pub gc: *mut irq_domain_chip_generic, - pub dev: *mut device, - pub pm_dev: *mut device, - pub parent: *mut irq_domain, - pub msi_parent_ops: *const msi_parent_ops, - pub hwirq_max: irq_hw_number_t, - pub revmap_size: ::aya_bpf::cty::c_uint, - pub revmap_tree: xarray, - pub revmap: __IncompleteArrayField<*mut irq_data>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct upid { - pub nr: ::aya_bpf::cty::c_int, - pub ns: *mut pid_namespace, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct idr { - pub idr_rt: xarray, - pub idr_base: ::aya_bpf::cty::c_uint, - pub idr_next: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct pid_namespace { - pub idr: idr, - pub rcu: callback_head, - pub pid_allocated: ::aya_bpf::cty::c_uint, - pub child_reaper: *mut task_struct, - pub pid_cachep: *mut kmem_cache, - pub level: ::aya_bpf::cty::c_uint, - pub parent: *mut pid_namespace, - pub bacct: *mut fs_pin, - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub reboot: ::aya_bpf::cty::c_int, - pub ns: ns_common, - pub memfd_noexec_scope: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct pid { - pub count: refcount_t, - pub level: ::aya_bpf::cty::c_uint, - pub lock: spinlock_t, - pub tasks: [hlist_head; 4usize], - pub inodes: hlist_head, - pub wait_pidfd: wait_queue_head_t, - pub rcu: callback_head, - pub numbers: [upid; 1usize], -} +pub type percpu_ref_func_t = ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct hrtimer_clock_base { - pub cpu_base: *mut hrtimer_cpu_base, - pub index: ::aya_bpf::cty::c_uint, - pub clockid: clockid_t, - pub seq: seqcount_raw_spinlock_t, - pub running: *mut hrtimer, - pub active: timerqueue_head, - pub get_time: ::core::option::Option ktime_t>, - pub offset: ktime_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct hrtimer_cpu_base { - pub lock: raw_spinlock_t, - pub cpu: ::aya_bpf::cty::c_uint, - pub active_bases: ::aya_bpf::cty::c_uint, - pub clock_was_set_seq: ::aya_bpf::cty::c_uint, +pub struct percpu_ref_data { + pub count: atomic_long_t, + pub release: percpu_ref_func_t, + pub confirm_switch: percpu_ref_func_t, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub nr_events: ::aya_bpf::cty::c_uint, - pub nr_retries: ::aya_bpf::cty::c_ushort, - pub nr_hangs: ::aya_bpf::cty::c_ushort, - pub max_hang_time: ::aya_bpf::cty::c_uint, - pub expires_next: ktime_t, - pub next_timer: *mut hrtimer, - pub softirq_expires_next: ktime_t, - pub softirq_next_timer: *mut hrtimer, - pub clock_base: [hrtimer_clock_base; 8usize], + pub rcu: callback_head, + pub ref_: *mut percpu_ref, } -impl hrtimer_cpu_base { +impl percpu_ref_data { #[inline] - pub fn hres_active(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn force_atomic(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_hres_active(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_force_atomic(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn in_hrtirq(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + pub fn allow_reinit(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } } #[inline] - pub fn set_in_hrtirq(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_allow_reinit(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn hang_detected(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } - } - #[inline] - pub fn set_hang_detected(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn softirq_activated(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } - } - #[inline] - pub fn set_softirq_activated(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] pub fn new_bitfield_1( - hres_active: ::aya_bpf::cty::c_uint, - in_hrtirq: ::aya_bpf::cty::c_uint, - hang_detected: ::aya_bpf::cty::c_uint, - softirq_activated: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + force_atomic: bool_, + allow_reinit: bool_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let hres_active: u32 = unsafe { ::core::mem::transmute(hres_active) }; - hres_active as u64 + let force_atomic: u8 = unsafe { ::core::mem::transmute(force_atomic) }; + force_atomic as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let in_hrtirq: u32 = unsafe { ::core::mem::transmute(in_hrtirq) }; - in_hrtirq as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let hang_detected: u32 = unsafe { ::core::mem::transmute(hang_detected) }; - hang_detected as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let softirq_activated: u32 = unsafe { ::core::mem::transmute(softirq_activated) }; - softirq_activated as u64 + let allow_reinit: u8 = unsafe { ::core::mem::transmute(allow_reinit) }; + allow_reinit as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rlimit { - pub rlim_cur: __kernel_ulong_t, - pub rlim_max: __kernel_ulong_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct task_cputime { - pub stime: u64_, - pub utime: u64_, - pub sum_exec_runtime: ::aya_bpf::cty::c_ulonglong, -} -pub type __signalfn_t = ::core::option::Option; -pub type __sighandler_t = __signalfn_t; -pub type __restorefn_t = ::core::option::Option; -pub type __sigrestore_t = __restorefn_t; -#[repr(C)] -#[derive(Copy, Clone)] -pub union sigval { - pub sival_int: ::aya_bpf::cty::c_int, - pub sival_ptr: *mut ::aya_bpf::cty::c_void, +pub struct shrink_control { + pub gfp_mask: gfp_t, + pub nid: ::aya_ebpf::cty::c_int, + pub nr_to_scan: ::aya_ebpf::cty::c_ulong, + pub nr_scanned: ::aya_ebpf::cty::c_ulong, + pub memcg: *mut mem_cgroup, } -pub type sigval_t = sigval; #[repr(C)] #[derive(Copy, Clone)] -pub union __sifields { - pub _kill: __sifields__bindgen_ty_1, - pub _timer: __sifields__bindgen_ty_2, - pub _rt: __sifields__bindgen_ty_3, - pub _sigchld: __sifields__bindgen_ty_4, - pub _sigfault: __sifields__bindgen_ty_5, - pub _sigpoll: __sifields__bindgen_ty_6, - pub _sigsys: __sifields__bindgen_ty_7, +pub struct shrinker { + pub count_objects: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut shrinker, + arg2: *mut shrink_control, + ) -> ::aya_ebpf::cty::c_ulong, + >, + pub scan_objects: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut shrinker, + arg2: *mut shrink_control, + ) -> ::aya_ebpf::cty::c_ulong, + >, + pub batch: ::aya_ebpf::cty::c_long, + pub seeks: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_uint, + pub refcount: refcount_t, + pub done: completion, + pub rcu: callback_head, + pub private_data: *mut ::aya_ebpf::cty::c_void, + pub list: list_head, + pub id: ::aya_ebpf::cty::c_int, + pub debugfs_id: ::aya_ebpf::cty::c_int, + pub name: *const ::aya_ebpf::cty::c_char, + pub debugfs_entry: *mut dentry, + pub nr_deferred: *mut atomic_long_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_1 { - pub _pid: __kernel_pid_t, - pub _uid: __kernel_uid32_t, +pub struct hlist_bl_node { + pub next: *mut hlist_bl_node, + pub pprev: *mut *mut hlist_bl_node, } #[repr(C)] #[derive(Copy, Clone)] -pub struct __sifields__bindgen_ty_2 { - pub _tid: __kernel_timer_t, - pub _overrun: ::aya_bpf::cty::c_int, - pub _sigval: sigval_t, - pub _sys_private: ::aya_bpf::cty::c_int, +pub struct qstr { + pub __bindgen_anon_1: qstr__bindgen_ty_1, + pub name: *const ::aya_ebpf::cty::c_uchar, } #[repr(C)] #[derive(Copy, Clone)] -pub struct __sifields__bindgen_ty_3 { - pub _pid: __kernel_pid_t, - pub _uid: __kernel_uid32_t, - pub _sigval: sigval_t, +pub union qstr__bindgen_ty_1 { + pub __bindgen_anon_1: qstr__bindgen_ty_1__bindgen_ty_1, + pub hash_len: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_4 { - pub _pid: __kernel_pid_t, - pub _uid: __kernel_uid32_t, - pub _status: ::aya_bpf::cty::c_int, - pub _utime: __kernel_clock_t, - pub _stime: __kernel_clock_t, +pub struct qstr__bindgen_ty_1__bindgen_ty_1 { + pub hash: u32_, + pub len: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct __sifields__bindgen_ty_5 { - pub _addr: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: __sifields__bindgen_ty_5__bindgen_ty_1, +pub struct lockref { + pub __bindgen_anon_1: lockref__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union __sifields__bindgen_ty_5__bindgen_ty_1 { - pub _trapno: ::aya_bpf::cty::c_int, - pub _addr_lsb: ::aya_bpf::cty::c_short, - pub _addr_bnd: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1, - pub _addr_pkey: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2, - pub _perf: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1 { - pub _dummy_bnd: [::aya_bpf::cty::c_char; 8usize], - pub _lower: *mut ::aya_bpf::cty::c_void, - pub _upper: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2 { - pub _dummy_pkey: [::aya_bpf::cty::c_char; 8usize], - pub _pkey: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3 { - pub _data: ::aya_bpf::cty::c_ulong, - pub _type: __u32, - pub _flags: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_6 { - pub _band: ::aya_bpf::cty::c_long, - pub _fd: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_7 { - pub _call_addr: *mut ::aya_bpf::cty::c_void, - pub _syscall: ::aya_bpf::cty::c_int, - pub _arch: ::aya_bpf::cty::c_uint, +pub union lockref__bindgen_ty_1 { + pub lock_count: __u64, + pub __bindgen_anon_1: lockref__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct kernel_siginfo { - pub __bindgen_anon_1: kernel_siginfo__bindgen_ty_1, +pub struct lockref__bindgen_ty_1__bindgen_ty_1 { + pub lock: spinlock_t, + pub count: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub struct kernel_siginfo__bindgen_ty_1 { - pub si_signo: ::aya_bpf::cty::c_int, - pub si_errno: ::aya_bpf::cty::c_int, - pub si_code: ::aya_bpf::cty::c_int, - pub _sifields: __sifields, +pub struct dentry { + pub d_flags: ::aya_ebpf::cty::c_uint, + pub d_seq: seqcount_spinlock_t, + pub d_hash: hlist_bl_node, + pub d_parent: *mut dentry, + pub d_name: qstr, + pub d_inode: *mut inode, + pub d_iname: [::aya_ebpf::cty::c_uchar; 40usize], + pub d_lockref: lockref, + pub d_op: *const dentry_operations, + pub d_sb: *mut super_block, + pub d_time: ::aya_ebpf::cty::c_ulong, + pub d_fsdata: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: dentry__bindgen_ty_1, + pub d_sib: hlist_node, + pub d_children: hlist_head, + pub d_u: dentry__bindgen_ty_2, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ucounts { - pub node: hlist_node, - pub ns: *mut user_namespace, - pub uid: kuid_t, - pub count: atomic_t, - pub ucount: [atomic_long_t; 12usize], - pub rlimit: [atomic_long_t; 4usize], +#[derive(Copy, Clone)] +pub union dentry__bindgen_ty_1 { + pub d_lru: list_head, + pub d_wait: *mut wait_queue_head_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sigaction { - pub sa_handler: __sighandler_t, - pub sa_flags: ::aya_bpf::cty::c_ulong, - pub sa_restorer: __sigrestore_t, - pub sa_mask: sigset_t, +#[derive(Copy, Clone)] +pub union dentry__bindgen_ty_2 { + pub d_alias: hlist_node, + pub d_in_lookup_hash: hlist_bl_node, + pub d_rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct k_sigaction { - pub sa: sigaction, +pub struct dev_pagemap_ops { + pub page_free: ::core::option::Option, + pub migrate_to_ram: + ::core::option::Option vm_fault_t>, + pub memory_failure: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dev_pagemap, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cpu_itimer { - pub expires: u64_, - pub incr: u64_, +pub struct hlist_bl_head { + pub first: *mut hlist_bl_node, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct task_cputime_atomic { - pub utime: atomic64_t, - pub stime: atomic64_t, - pub sum_exec_runtime: atomic64_t, +#[derive(Copy, Clone)] +pub struct inode { + pub i_mode: umode_t, + pub i_opflags: ::aya_ebpf::cty::c_ushort, + pub i_uid: kuid_t, + pub i_gid: kgid_t, + pub i_flags: ::aya_ebpf::cty::c_uint, + pub i_acl: *mut posix_acl, + pub i_default_acl: *mut posix_acl, + pub i_op: *const inode_operations, + pub i_sb: *mut super_block, + pub i_mapping: *mut address_space, + pub i_security: *mut ::aya_ebpf::cty::c_void, + pub i_ino: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_1: inode__bindgen_ty_1, + pub i_rdev: dev_t, + pub i_size: loff_t, + pub __i_atime: timespec64, + pub __i_mtime: timespec64, + pub __i_ctime: timespec64, + pub i_lock: spinlock_t, + pub i_bytes: ::aya_ebpf::cty::c_ushort, + pub i_blkbits: u8_, + pub i_write_hint: u8_, + pub i_blocks: blkcnt_t, + pub i_state: ::aya_ebpf::cty::c_ulong, + pub i_rwsem: rw_semaphore, + pub dirtied_when: ::aya_ebpf::cty::c_ulong, + pub dirtied_time_when: ::aya_ebpf::cty::c_ulong, + pub i_hash: hlist_node, + pub i_io_list: list_head, + pub i_wb: *mut bdi_writeback, + pub i_wb_frn_winner: ::aya_ebpf::cty::c_int, + pub i_wb_frn_avg_time: u16_, + pub i_wb_frn_history: u16_, + pub i_lru: list_head, + pub i_sb_list: list_head, + pub i_wb_list: list_head, + pub __bindgen_anon_2: inode__bindgen_ty_2, + pub i_version: atomic64_t, + pub i_sequence: atomic64_t, + pub i_count: atomic_t, + pub i_dio_count: atomic_t, + pub i_writecount: atomic_t, + pub i_readcount: atomic_t, + pub __bindgen_anon_3: inode__bindgen_ty_3, + pub i_flctx: *mut file_lock_context, + pub i_data: address_space, + pub i_devices: list_head, + pub __bindgen_anon_4: inode__bindgen_ty_4, + pub i_generation: __u32, + pub i_fsnotify_mask: __u32, + pub i_fsnotify_marks: *mut fsnotify_mark_connector, + pub i_crypt_info: *mut fscrypt_inode_info, + pub i_verity_info: *mut fsverity_info, + pub i_private: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct thread_group_cputimer { - pub cputime_atomic: task_cputime_atomic, +#[derive(Copy, Clone)] +pub union inode__bindgen_ty_1 { + pub i_nlink: ::aya_ebpf::cty::c_uint, + pub __i_nlink: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pacct_struct { - pub ac_flag: ::aya_bpf::cty::c_int, - pub ac_exitcode: ::aya_bpf::cty::c_long, - pub ac_mem: ::aya_bpf::cty::c_ulong, - pub ac_utime: u64_, - pub ac_stime: u64_, - pub ac_minflt: ::aya_bpf::cty::c_ulong, - pub ac_majflt: ::aya_bpf::cty::c_ulong, +#[derive(Copy, Clone)] +pub union inode__bindgen_ty_2 { + pub i_dentry: hlist_head, + pub i_rcu: callback_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct signal_struct { - pub sigcnt: refcount_t, - pub live: atomic_t, - pub nr_threads: ::aya_bpf::cty::c_int, - pub quick_threads: ::aya_bpf::cty::c_int, - pub thread_head: list_head, - pub wait_chldexit: wait_queue_head_t, - pub curr_target: *mut task_struct, - pub shared_pending: sigpending, - pub multiprocess: hlist_head, - pub group_exit_code: ::aya_bpf::cty::c_int, - pub notify_count: ::aya_bpf::cty::c_int, - pub group_exec_task: *mut task_struct, - pub group_stop_count: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_uint, - pub core_state: *mut core_state, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub next_posix_timer_id: ::aya_bpf::cty::c_uint, - pub posix_timers: list_head, - pub real_timer: hrtimer, - pub it_real_incr: ktime_t, - pub it: [cpu_itimer; 2usize], - pub cputimer: thread_group_cputimer, - pub posix_cputimers: posix_cputimers, - pub pids: [*mut pid; 4usize], - pub tick_dep_mask: atomic_t, - pub tty_old_pgrp: *mut pid, - pub leader: ::aya_bpf::cty::c_int, - pub tty: *mut tty_struct, - pub autogroup: *mut autogroup, - pub stats_lock: seqlock_t, - pub utime: u64_, - pub stime: u64_, - pub cutime: u64_, - pub cstime: u64_, - pub gtime: u64_, - pub cgtime: u64_, - pub prev_cputime: prev_cputime, - pub nvcsw: ::aya_bpf::cty::c_ulong, - pub nivcsw: ::aya_bpf::cty::c_ulong, - pub cnvcsw: ::aya_bpf::cty::c_ulong, - pub cnivcsw: ::aya_bpf::cty::c_ulong, - pub min_flt: ::aya_bpf::cty::c_ulong, - pub maj_flt: ::aya_bpf::cty::c_ulong, - pub cmin_flt: ::aya_bpf::cty::c_ulong, - pub cmaj_flt: ::aya_bpf::cty::c_ulong, - pub inblock: ::aya_bpf::cty::c_ulong, - pub oublock: ::aya_bpf::cty::c_ulong, - pub cinblock: ::aya_bpf::cty::c_ulong, - pub coublock: ::aya_bpf::cty::c_ulong, - pub maxrss: ::aya_bpf::cty::c_ulong, - pub cmaxrss: ::aya_bpf::cty::c_ulong, - pub ioac: task_io_accounting, - pub sum_sched_runtime: ::aya_bpf::cty::c_ulonglong, - pub rlim: [rlimit; 16usize], - pub pacct: pacct_struct, - pub stats: *mut taskstats, - pub audit_tty: ::aya_bpf::cty::c_uint, - pub tty_audit_buf: *mut tty_audit_buf, - pub oom_flag_origin: bool_, - pub oom_score_adj: ::aya_bpf::cty::c_short, - pub oom_score_adj_min: ::aya_bpf::cty::c_short, - pub oom_mm: *mut mm_struct, - pub cred_guard_mutex: mutex, - pub exec_update_lock: rw_semaphore, -} -impl signal_struct { - #[inline] - pub fn is_child_subreaper(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_child_subreaper(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn has_child_subreaper(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_has_child_subreaper(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - is_child_subreaper: ::aya_bpf::cty::c_uint, - has_child_subreaper: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_child_subreaper: u32 = unsafe { ::core::mem::transmute(is_child_subreaper) }; - is_child_subreaper as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let has_child_subreaper: u32 = unsafe { ::core::mem::transmute(has_child_subreaper) }; - has_child_subreaper as u64 - }); - __bindgen_bitfield_unit - } +pub union inode__bindgen_ty_3 { + pub i_fop: *const file_operations, + pub free_inode: ::core::option::Option, } #[repr(C)] -#[derive(Debug)] -pub struct rseq { - pub cpu_id_start: __u32, - pub cpu_id: __u32, - pub rseq_cs: __u64, - pub flags: __u32, - pub node_id: __u32, - pub mm_cid: __u32, - pub end: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Copy, Clone)] +pub union inode__bindgen_ty_4 { + pub i_pipe: *mut pipe_inode_info, + pub i_cdev: *mut cdev, + pub i_link: *mut ::aya_ebpf::cty::c_char, + pub i_dir_seq: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sched_class { - pub uclamp_enabled: ::aya_bpf::cty::c_int, - pub enqueue_task: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_bpf::cty::c_int), - >, - pub dequeue_task: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_bpf::cty::c_int), - >, - pub yield_task: ::core::option::Option, - pub yield_to_task: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct) -> bool_, - >, - pub check_preempt_curr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_bpf::cty::c_int), - >, - pub pick_next_task: - ::core::option::Option *mut task_struct>, - pub put_prev_task: - ::core::option::Option, - pub set_next_task: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: bool_), - >, - pub balance: ::core::option::Option< +pub struct dentry_operations { + pub d_revalidate: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rq, - arg2: *mut task_struct, - arg3: *mut rq_flags, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dentry, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub select_task_rq: ::core::option::Option< + pub d_weak_revalidate: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut task_struct, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub pick_task: ::core::option::Option *mut task_struct>, - pub migrate_task_rq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut task_struct, arg2: ::aya_bpf::cty::c_int), - >, - pub task_woken: - ::core::option::Option, - pub set_cpus_allowed: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut task_struct, arg2: *mut affinity_context), + arg1: *mut dentry, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub rq_online: ::core::option::Option, - pub rq_offline: ::core::option::Option, - pub find_lock_rq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut task_struct, arg2: *mut rq) -> *mut rq, + pub d_hash: ::core::option::Option< + unsafe extern "C" fn(arg1: *const dentry, arg2: *mut qstr) -> ::aya_ebpf::cty::c_int, >, - pub task_tick: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_bpf::cty::c_int), + pub d_compare: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const dentry, + arg2: ::aya_ebpf::cty::c_uint, + arg3: *const ::aya_ebpf::cty::c_char, + arg4: *const qstr, + ) -> ::aya_ebpf::cty::c_int, >, - pub task_fork: ::core::option::Option, - pub task_dead: ::core::option::Option, - pub switched_from: - ::core::option::Option, - pub switched_to: - ::core::option::Option, - pub prio_changed: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct, arg3: ::aya_bpf::cty::c_int), + pub d_delete: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub d_init: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub d_release: ::core::option::Option, + pub d_prune: ::core::option::Option, + pub d_iput: ::core::option::Option, + pub d_dname: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dentry, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: ::aya_ebpf::cty::c_int, + ) -> *mut ::aya_ebpf::cty::c_char, >, - pub get_rr_interval: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq, arg2: *mut task_struct) -> ::aya_bpf::cty::c_uint, + pub d_automount: ::core::option::Option *mut vfsmount>, + pub d_manage: ::core::option::Option< + unsafe extern "C" fn(arg1: *const path, arg2: bool_) -> ::aya_ebpf::cty::c_int, >, - pub update_curr: ::core::option::Option, - pub task_change_group: ::core::option::Option, - pub task_is_throttled: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut task_struct, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + pub d_real: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dentry, arg2: *const inode) -> *mut dentry, >, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl dentry_operations { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kernel_cap_t { - pub val: u64_, +pub struct mtd_info { + _unused: [u8; 0], } +pub type qsize_t = ::aya_ebpf::cty::c_longlong; #[repr(C)] -#[derive(Copy, Clone)] -pub struct cred { - pub usage: atomic_t, - pub uid: kuid_t, - pub gid: kgid_t, - pub suid: kuid_t, - pub sgid: kgid_t, - pub euid: kuid_t, - pub egid: kgid_t, - pub fsuid: kuid_t, - pub fsgid: kgid_t, - pub securebits: ::aya_bpf::cty::c_uint, - pub cap_inheritable: kernel_cap_t, - pub cap_permitted: kernel_cap_t, - pub cap_effective: kernel_cap_t, - pub cap_bset: kernel_cap_t, - pub cap_ambient: kernel_cap_t, - pub jit_keyring: ::aya_bpf::cty::c_uchar, - pub session_keyring: *mut key, - pub process_keyring: *mut key, - pub thread_keyring: *mut key, - pub request_key_auth: *mut key, - pub security: *mut ::aya_bpf::cty::c_void, - pub user: *mut user_struct, - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub group_info: *mut group_info, - pub __bindgen_anon_1: cred__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct mem_dqinfo { + pub dqi_format: *mut quota_format_type, + pub dqi_fmt_id: ::aya_ebpf::cty::c_int, + pub dqi_dirty_list: list_head, + pub dqi_flags: ::aya_ebpf::cty::c_ulong, + pub dqi_bgrace: ::aya_ebpf::cty::c_uint, + pub dqi_igrace: ::aya_ebpf::cty::c_uint, + pub dqi_max_spc_limit: qsize_t, + pub dqi_max_ino_limit: qsize_t, + pub dqi_priv: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Copy, Clone)] -pub union cred__bindgen_ty_1 { - pub non_rcu: ::aya_bpf::cty::c_int, - pub rcu: callback_head, +pub struct quota_info { + pub flags: ::aya_ebpf::cty::c_uint, + pub dqio_sem: rw_semaphore, + pub files: [*mut inode; 3usize], + pub info: [mem_dqinfo; 3usize], + pub ops: [*const quota_format_ops; 3usize], } -pub type key_serial_t = i32; -pub type key_perm_t = u32; #[repr(C)] #[derive(Copy, Clone)] -pub struct keyring_index_key { - pub hash: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: keyring_index_key__bindgen_ty_1, - pub type_: *mut key_type, - pub domain_tag: *mut key_tag, - pub description: *const ::aya_bpf::cty::c_char, +pub struct rcu_sync { + pub gp_state: ::aya_ebpf::cty::c_int, + pub gp_count: ::aya_ebpf::cty::c_int, + pub gp_wait: wait_queue_head_t, + pub cb_head: callback_head, } #[repr(C)] #[derive(Copy, Clone)] -pub union keyring_index_key__bindgen_ty_1 { - pub __bindgen_anon_1: keyring_index_key__bindgen_ty_1__bindgen_ty_1, - pub x: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct keyring_index_key__bindgen_ty_1__bindgen_ty_1 { - pub desc_len: u16_, - pub desc: [::aya_bpf::cty::c_char; 6usize], +pub struct percpu_rw_semaphore { + pub rss: rcu_sync, + pub read_count: *mut ::aya_ebpf::cty::c_uint, + pub writer: rcuwait, + pub waiters: wait_queue_head_t, + pub block: atomic_t, } #[repr(C)] #[derive(Copy, Clone)] -pub union key_payload { - pub rcu_data0: *mut ::aya_bpf::cty::c_void, - pub data: [*mut ::aya_bpf::cty::c_void; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct assoc_array_ptr { - _unused: [u8; 0], +pub struct sb_writers { + pub frozen: ::aya_ebpf::cty::c_ushort, + pub freeze_kcount: ::aya_ebpf::cty::c_int, + pub freeze_ucount: ::aya_ebpf::cty::c_int, + pub rw_sem: [percpu_rw_semaphore; 3usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct assoc_array { - pub root: *mut assoc_array_ptr, - pub nr_leaves_on_tree: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct key { - pub usage: refcount_t, - pub serial: key_serial_t, - pub __bindgen_anon_1: key__bindgen_ty_1, - pub watchers: *mut watch_list, - pub sem: rw_semaphore, - pub user: *mut key_user, - pub security: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_2: key__bindgen_ty_2, - pub last_used_at: time64_t, - pub uid: kuid_t, - pub gid: kgid_t, - pub perm: key_perm_t, - pub quotalen: ::aya_bpf::cty::c_ushort, - pub datalen: ::aya_bpf::cty::c_ushort, - pub state: ::aya_bpf::cty::c_short, - pub flags: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_3: key__bindgen_ty_3, - pub __bindgen_anon_4: key__bindgen_ty_4, - pub restrict_link: *mut key_restriction, +pub struct uuid_t { + pub b: [__u8; 16usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union key__bindgen_ty_1 { - pub graveyard_link: list_head, - pub serial_node: rb_node, +pub struct list_lru { + pub node: *mut list_lru_node, + pub list: list_head, + pub shrinker_id: ::aya_ebpf::cty::c_int, + pub memcg_aware: bool_, + pub xa: xarray, } #[repr(C)] #[derive(Copy, Clone)] -pub union key__bindgen_ty_2 { - pub expiry: time64_t, - pub revoked_at: time64_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union key__bindgen_ty_3 { - pub index_key: keyring_index_key, - pub __bindgen_anon_1: key__bindgen_ty_3__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct key__bindgen_ty_3__bindgen_ty_1 { - pub hash: ::aya_bpf::cty::c_ulong, - pub len_desc: ::aya_bpf::cty::c_ulong, - pub type_: *mut key_type, - pub domain_tag: *mut key_tag, - pub description: *mut ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union key__bindgen_ty_4 { - pub payload: key_payload, - pub __bindgen_anon_1: key__bindgen_ty_4__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct key__bindgen_ty_4__bindgen_ty_1 { - pub name_link: list_head, - pub keys: assoc_array, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nsproxy { - pub count: atomic_t, - pub uts_ns: *mut uts_namespace, - pub ipc_ns: *mut ipc_namespace, - pub mnt_ns: *mut mnt_namespace, - pub pid_ns_for_children: *mut pid_namespace, - pub net_ns: *mut net, - pub time_ns: *mut time_namespace, - pub time_ns_for_children: *mut time_namespace, - pub cgroup_ns: *mut cgroup_namespace, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct sighand_struct { - pub siglock: spinlock_t, - pub count: refcount_t, - pub signalfd_wqh: wait_queue_head_t, - pub action: [k_sigaction; 64usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_context { - pub refcount: atomic_long_t, - pub active_ref: atomic_t, - pub ioprio: ::aya_bpf::cty::c_ushort, - pub lock: spinlock_t, - pub icq_tree: xarray, - pub icq_hint: *mut io_cq, - pub icq_list: hlist_head, - pub release_work: work_struct, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct css_set { - pub subsys: [*mut cgroup_subsys_state; 14usize], - pub refcount: refcount_t, - pub dom_cset: *mut css_set, - pub dfl_cgrp: *mut cgroup, - pub nr_tasks: ::aya_bpf::cty::c_int, - pub tasks: list_head, - pub mg_tasks: list_head, - pub dying_tasks: list_head, - pub task_iters: list_head, - pub e_cset_node: [list_head; 14usize], - pub threaded_csets: list_head, - pub threaded_csets_node: list_head, - pub hlist: hlist_node, - pub cgrp_links: list_head, - pub mg_src_preload_node: list_head, - pub mg_dst_preload_node: list_head, - pub mg_node: list_head, - pub mg_src_cgrp: *mut cgroup, - pub mg_dst_cgrp: *mut cgroup, - pub mg_dst_cset: *mut css_set, - pub dead: bool_, - pub callback_head: callback_head, -} -pub type compat_uptr_t = u32_; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct compat_robust_list { - pub next: compat_uptr_t, -} -pub type compat_long_t = s32; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct compat_robust_list_head { - pub list: compat_robust_list, - pub futex_offset: compat_long_t, - pub list_op_pending: compat_uptr_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_event_groups { - pub tree: rb_root, - pub index: u64_, +pub struct super_block { + pub s_list: list_head, + pub s_dev: dev_t, + pub s_blocksize_bits: ::aya_ebpf::cty::c_uchar, + pub s_blocksize: ::aya_ebpf::cty::c_ulong, + pub s_maxbytes: loff_t, + pub s_type: *mut file_system_type, + pub s_op: *const super_operations, + pub dq_op: *const dquot_operations, + pub s_qcop: *const quotactl_ops, + pub s_export_op: *const export_operations, + pub s_flags: ::aya_ebpf::cty::c_ulong, + pub s_iflags: ::aya_ebpf::cty::c_ulong, + pub s_magic: ::aya_ebpf::cty::c_ulong, + pub s_root: *mut dentry, + pub s_umount: rw_semaphore, + pub s_count: ::aya_ebpf::cty::c_int, + pub s_active: atomic_t, + pub s_security: *mut ::aya_ebpf::cty::c_void, + pub s_xattr: *const *const xattr_handler, + pub s_cop: *const fscrypt_operations, + pub s_master_keys: *mut fscrypt_keyring, + pub s_vop: *const fsverity_operations, + pub s_encoding: *mut unicode_map, + pub s_encoding_flags: __u16, + pub s_roots: hlist_bl_head, + pub s_mounts: list_head, + pub s_bdev: *mut block_device, + pub s_bdev_handle: *mut bdev_handle, + pub s_bdi: *mut backing_dev_info, + pub s_mtd: *mut mtd_info, + pub s_instances: hlist_node, + pub s_quota_types: ::aya_ebpf::cty::c_uint, + pub s_dquot: quota_info, + pub s_writers: sb_writers, + pub s_fs_info: *mut ::aya_ebpf::cty::c_void, + pub s_time_gran: u32_, + pub s_time_min: time64_t, + pub s_time_max: time64_t, + pub s_fsnotify_mask: __u32, + pub s_fsnotify_marks: *mut fsnotify_mark_connector, + pub s_id: [::aya_ebpf::cty::c_char; 32usize], + pub s_uuid: uuid_t, + pub s_max_links: ::aya_ebpf::cty::c_uint, + pub s_vfs_rename_mutex: mutex, + pub s_subtype: *const ::aya_ebpf::cty::c_char, + pub s_d_op: *const dentry_operations, + pub s_shrink: *mut shrinker, + pub s_remove_count: atomic_long_t, + pub s_fsnotify_connectors: atomic_long_t, + pub s_readonly_remount: ::aya_ebpf::cty::c_int, + pub s_wb_err: errseq_t, + pub s_dio_done_wq: *mut workqueue_struct, + pub s_pins: hlist_head, + pub s_user_ns: *mut user_namespace, + pub s_dentry_lru: list_lru, + pub s_inode_lru: list_lru, + pub rcu: callback_head, + pub destroy_work: work_struct, + pub s_sync_lock: mutex, + pub s_stack_depth: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, + pub __bindgen_padding_0: u32, + pub s_inode_list_lock: spinlock_t, + pub s_inodes: list_head, + pub s_inode_wblist_lock: spinlock_t, + pub s_inodes_wb: list_head, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_event_context { - pub lock: raw_spinlock_t, - pub mutex: mutex, - pub pmu_ctx_list: list_head, - pub pinned_groups: perf_event_groups, - pub flexible_groups: perf_event_groups, - pub event_list: list_head, - pub nr_events: ::aya_bpf::cty::c_int, - pub nr_user: ::aya_bpf::cty::c_int, - pub is_active: ::aya_bpf::cty::c_int, - pub nr_task_data: ::aya_bpf::cty::c_int, - pub nr_stat: ::aya_bpf::cty::c_int, - pub nr_freq: ::aya_bpf::cty::c_int, - pub rotate_disable: ::aya_bpf::cty::c_int, - pub refcount: refcount_t, - pub task: *mut task_struct, - pub time: u64_, - pub timestamp: u64_, - pub timeoffset: u64_, - pub parent_ctx: *mut perf_event_context, - pub parent_gen: u64_, - pub generation: u64_, - pub pin_count: ::aya_bpf::cty::c_int, - pub nr_cgroups: ::aya_bpf::cty::c_int, - pub callback_head: callback_head, - pub nr_pending: local_t, +impl super_block { + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ftrace_ret_stack { - pub ret: ::aya_bpf::cty::c_ulong, - pub func: ::aya_bpf::cty::c_ulong, - pub calltime: ::aya_bpf::cty::c_ulonglong, - pub subtime: ::aya_bpf::cty::c_ulonglong, - pub retp: *mut ::aya_bpf::cty::c_ulong, +pub struct vfsmount { + pub mnt_root: *mut dentry, + pub mnt_sb: *mut super_block, + pub mnt_flags: ::aya_ebpf::cty::c_int, + pub mnt_idmap: *mut mnt_idmap, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct vm_struct { - pub next: *mut vm_struct, - pub addr: *mut ::aya_bpf::cty::c_void, - pub size: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_ulong, - pub pages: *mut *mut page, - pub page_order: ::aya_bpf::cty::c_uint, - pub nr_pages: ::aya_bpf::cty::c_uint, - pub phys_addr: phys_addr_t, - pub caller: *const ::aya_bpf::cty::c_void, +pub struct kstat { + pub result_mask: u32_, + pub mode: umode_t, + pub nlink: ::aya_ebpf::cty::c_uint, + pub blksize: u32, + pub attributes: u64_, + pub attributes_mask: u64_, + pub ino: u64_, + pub dev: dev_t, + pub rdev: dev_t, + pub uid: kuid_t, + pub gid: kgid_t, + pub size: loff_t, + pub atime: timespec64, + pub mtime: timespec64, + pub ctime: timespec64, + pub btime: timespec64, + pub blocks: u64_, + pub mnt_id: u64_, + pub dio_mem_align: u32_, + pub dio_offset_align: u32_, + pub change_cookie: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct list_lru_one { pub list: list_head, - pub nr_items: ::aya_bpf::cty::c_long, + pub nr_items: ::aya_ebpf::cty::c_long, } #[repr(C)] #[derive(Copy, Clone)] pub struct list_lru_node { pub lock: spinlock_t, pub lru: list_lru_one, - pub nr_items: ::aya_bpf::cty::c_long, + pub nr_items: ::aya_ebpf::cty::c_long, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, } @@ -6159,7 +6124,7 @@ impl list_lru_node { } } pub mod migrate_mode { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const MIGRATE_ASYNC: Type = 0; pub const MIGRATE_SYNC_LIGHT: Type = 1; pub const MIGRATE_SYNC: Type = 2; @@ -6168,9 +6133,9 @@ pub mod migrate_mode { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct exception_table_entry { - pub insn: ::aya_bpf::cty::c_int, - pub fixup: ::aya_bpf::cty::c_int, - pub data: ::aya_bpf::cty::c_int, + pub insn: ::aya_ebpf::cty::c_int, + pub fixup: ::aya_ebpf::cty::c_int, + pub data: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -6181,8 +6146,8 @@ pub struct cgroup_subsys_state { pub sibling: list_head, pub children: list_head, pub rstat_css_node: list_head, - pub id: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_uint, + pub id: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_uint, pub serial_nr: u64_, pub online_cnt: atomic_t, pub destroy_work: work_struct, @@ -6193,7 +6158,7 @@ pub struct cgroup_subsys_state { #[derive(Debug, Copy, Clone)] pub struct cgroup_file { pub kn: *mut kernfs_node, - pub notified_at: ::aya_bpf::cty::c_ulong, + pub notified_at: ::aya_ebpf::cty::c_ulong, pub notify_timer: timer_list, } #[repr(C)] @@ -6205,9 +6170,9 @@ pub struct cgroup_base_stat { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct cgroup_bpf { - pub effective: [*mut bpf_prog_array; 33usize], - pub progs: [hlist_head; 33usize], - pub flags: [u8_; 33usize], + pub effective: [*mut bpf_prog_array; 38usize], + pub progs: [hlist_head; 38usize], + pub flags: [u8_; 38usize], pub storages: list_head, pub inactive: *mut bpf_prog_array, pub refcnt: percpu_ref, @@ -6217,23 +6182,23 @@ pub struct cgroup_bpf { #[derive(Debug, Copy, Clone)] pub struct cgroup_freezer_state { pub freeze: bool_, - pub e_freeze: ::aya_bpf::cty::c_int, - pub nr_frozen_descendants: ::aya_bpf::cty::c_int, - pub nr_frozen_tasks: ::aya_bpf::cty::c_int, + pub e_freeze: ::aya_ebpf::cty::c_int, + pub nr_frozen_descendants: ::aya_ebpf::cty::c_int, + pub nr_frozen_tasks: ::aya_ebpf::cty::c_int, } #[repr(C)] pub struct cgroup { pub self_: cgroup_subsys_state, - pub flags: ::aya_bpf::cty::c_ulong, - pub level: ::aya_bpf::cty::c_int, - pub max_depth: ::aya_bpf::cty::c_int, - pub nr_descendants: ::aya_bpf::cty::c_int, - pub nr_dying_descendants: ::aya_bpf::cty::c_int, - pub max_descendants: ::aya_bpf::cty::c_int, - pub nr_populated_csets: ::aya_bpf::cty::c_int, - pub nr_populated_domain_children: ::aya_bpf::cty::c_int, - pub nr_populated_threaded_children: ::aya_bpf::cty::c_int, - pub nr_threaded_children: ::aya_bpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_ulong, + pub level: ::aya_ebpf::cty::c_int, + pub max_depth: ::aya_ebpf::cty::c_int, + pub nr_descendants: ::aya_ebpf::cty::c_int, + pub nr_dying_descendants: ::aya_ebpf::cty::c_int, + pub max_descendants: ::aya_ebpf::cty::c_int, + pub nr_populated_csets: ::aya_ebpf::cty::c_int, + pub nr_populated_domain_children: ::aya_ebpf::cty::c_int, + pub nr_populated_threaded_children: ::aya_ebpf::cty::c_int, + pub nr_threaded_children: ::aya_ebpf::cty::c_int, pub kn: *mut kernfs_node, pub procs_file: cgroup_file, pub events_file: cgroup_file, @@ -6250,6 +6215,10 @@ pub struct cgroup { pub old_dom_cgrp: *mut cgroup, pub rstat_cpu: *mut cgroup_rstat_cpu, pub rstat_css_list: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub _pad_: cacheline_padding, + pub rstat_flush_next: *mut cgroup, pub last_bstat: cgroup_base_stat, pub bstat: cgroup_base_stat, pub prev_cputime: prev_cputime, @@ -6264,27 +6233,39 @@ pub struct cgroup { pub bpf_cgrp_storage: *mut bpf_local_storage, pub ancestors: __IncompleteArrayField<*mut cgroup>, } +impl cgroup { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} pub type proc_handler = ::core::option::Option< unsafe extern "C" fn( arg1: *mut ctl_table, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ::aya_bpf::cty::c_void, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: *mut usize, arg5: *mut loff_t, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ctl_table { - pub procname: *const ::aya_bpf::cty::c_char, - pub data: *mut ::aya_bpf::cty::c_void, - pub maxlen: ::aya_bpf::cty::c_int, + pub procname: *const ::aya_ebpf::cty::c_char, + pub data: *mut ::aya_ebpf::cty::c_void, + pub maxlen: ::aya_ebpf::cty::c_int, pub mode: umode_t, - pub child: *mut ctl_table, + pub type_: ctl_table__bindgen_ty_1::Type, pub proc_handler: proc_handler, pub poll: *mut ctl_table_poll, - pub extra1: *mut ::aya_bpf::cty::c_void, - pub extra2: *mut ::aya_bpf::cty::c_void, + pub extra1: *mut ::aya_ebpf::cty::c_void, + pub extra2: *mut ::aya_ebpf::cty::c_void, +} +pub mod ctl_table__bindgen_ty_1 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const SYSCTL_TABLE_TYPE_DEFAULT: Type = 0; + pub const SYSCTL_TABLE_TYPE_PERMANENTLY_EMPTY: Type = 1; } #[repr(C)] #[derive(Copy, Clone)] @@ -6317,7 +6298,7 @@ pub struct ctl_table_root { unsafe extern "C" fn( arg1: *mut ctl_table_header, arg2: *mut ctl_table, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] @@ -6330,20 +6311,20 @@ pub struct key_tag { pub type request_key_actor_t = ::core::option::Option< unsafe extern "C" fn( arg1: *mut key, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct key_type { - pub name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, pub def_datalen: usize, - pub flags: ::aya_bpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, pub vet_description: ::core::option::Option< - unsafe extern "C" fn(arg1: *const ::aya_bpf::cty::c_char) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *const ::aya_ebpf::cty::c_char) -> ::aya_ebpf::cty::c_int, >, pub preparse: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut key_preparsed_payload) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut key_preparsed_payload) -> ::aya_ebpf::cty::c_int, >, pub free_preparse: ::core::option::Option, @@ -6351,16 +6332,16 @@ pub struct key_type { unsafe extern "C" fn( arg1: *mut key, arg2: *mut key_preparsed_payload, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub update: ::core::option::Option< unsafe extern "C" fn( arg1: *mut key, arg2: *mut key_preparsed_payload, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub match_preparse: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut key_match_data) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut key_match_data) -> ::aya_ebpf::cty::c_int, >, pub match_free: ::core::option::Option, pub revoke: ::core::option::Option, @@ -6370,33 +6351,33 @@ pub struct key_type { pub read: ::core::option::Option< unsafe extern "C" fn( arg1: *const key, - arg2: *mut ::aya_bpf::cty::c_char, + arg2: *mut ::aya_ebpf::cty::c_char, arg3: usize, - ) -> ::aya_bpf::cty::c_long, + ) -> ::aya_ebpf::cty::c_long, >, pub request_key: request_key_actor_t, pub lookup_restriction: ::core::option::Option< - unsafe extern "C" fn(arg1: *const ::aya_bpf::cty::c_char) -> *mut key_restriction, + unsafe extern "C" fn(arg1: *const ::aya_ebpf::cty::c_char) -> *mut key_restriction, >, pub asym_query: ::core::option::Option< unsafe extern "C" fn( arg1: *const kernel_pkey_params, arg2: *mut kernel_pkey_query, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub asym_eds_op: ::core::option::Option< unsafe extern "C" fn( arg1: *mut kernel_pkey_params, - arg2: *const ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub asym_verify_signature: ::core::option::Option< unsafe extern "C" fn( arg1: *mut kernel_pkey_params, - arg2: *const ::aya_bpf::cty::c_void, - arg3: *const ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ::aya_ebpf::cty::c_void, + arg3: *const ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub link: list_head, pub lock_class: lock_class_key, @@ -6407,7 +6388,7 @@ pub type key_restrict_link_func_t = ::core::option::Option< arg2: *const key_type, arg3: *const key_payload, arg4: *mut key, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >; #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -6421,7 +6402,7 @@ pub struct key_restriction { pub struct user_struct { pub __count: refcount_t, pub epoll_watches: percpu_counter, - pub unix_inflight: ::aya_bpf::cty::c_ulong, + pub unix_inflight: ::aya_ebpf::cty::c_ulong, pub pipe_bufs: atomic_long_t, pub uidhash_node: hlist_node, pub uid: kuid_t, @@ -6432,11 +6413,118 @@ pub struct user_struct { #[repr(C)] #[derive(Debug)] pub struct group_info { - pub usage: atomic_t, - pub ngroups: ::aya_bpf::cty::c_int, + pub usage: refcount_t, + pub ngroups: ::aya_ebpf::cty::c_int, pub gid: __IncompleteArrayField, } #[repr(C)] +#[derive(Copy, Clone)] +pub struct hrtimer_cpu_base { + pub lock: raw_spinlock_t, + pub cpu: ::aya_ebpf::cty::c_uint, + pub active_bases: ::aya_ebpf::cty::c_uint, + pub clock_was_set_seq: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub nr_events: ::aya_ebpf::cty::c_uint, + pub nr_retries: ::aya_ebpf::cty::c_ushort, + pub nr_hangs: ::aya_ebpf::cty::c_ushort, + pub max_hang_time: ::aya_ebpf::cty::c_uint, + pub expires_next: ktime_t, + pub next_timer: *mut hrtimer, + pub softirq_expires_next: ktime_t, + pub softirq_next_timer: *mut hrtimer, + pub clock_base: [hrtimer_clock_base; 8usize], +} +impl hrtimer_cpu_base { + #[inline] + pub fn hres_active(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_hres_active(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_hrtirq(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_in_hrtirq(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn hang_detected(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_hang_detected(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn softirq_activated(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_softirq_activated(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn online(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + } + #[inline] + pub fn set_online(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + hres_active: ::aya_ebpf::cty::c_uint, + in_hrtirq: ::aya_ebpf::cty::c_uint, + hang_detected: ::aya_ebpf::cty::c_uint, + softirq_activated: ::aya_ebpf::cty::c_uint, + online: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let hres_active: u32 = unsafe { ::core::mem::transmute(hres_active) }; + hres_active as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let in_hrtirq: u32 = unsafe { ::core::mem::transmute(in_hrtirq) }; + in_hrtirq as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let hang_detected: u32 = unsafe { ::core::mem::transmute(hang_detected) }; + hang_detected as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let softirq_activated: u32 = unsafe { ::core::mem::transmute(softirq_activated) }; + softirq_activated as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let online: u32 = unsafe { ::core::mem::transmute(online) }; + online as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] #[derive(Debug, Copy, Clone)] pub struct core_thread { pub task: *mut task_struct, @@ -6464,7 +6552,7 @@ pub struct taskstats { pub swapin_delay_total: __u64, pub cpu_run_real_total: __u64, pub cpu_run_virtual_total: __u64, - pub ac_comm: [::aya_bpf::cty::c_char; 32usize], + pub ac_comm: [::aya_ebpf::cty::c_char; 32usize], pub ac_sched: __u8, pub ac_pad: [__u8; 3usize], pub __bindgen_padding_0: u32, @@ -6513,8 +6601,8 @@ pub struct taskstats { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct delayed_call { - pub fn_: ::core::option::Option, - pub arg: *mut ::aya_bpf::cty::c_void, + pub fn_: ::core::option::Option, + pub arg: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Copy, Clone)] @@ -6523,7 +6611,7 @@ pub struct io_cq { pub ioc: *mut io_context, pub __bindgen_anon_1: io_cq__bindgen_ty_1, pub __bindgen_anon_2: io_cq__bindgen_ty_2, - pub flags: ::aya_bpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] @@ -6547,75 +6635,30 @@ pub struct vfsuid_t { pub struct vfsgid_t { pub val: gid_t, } -pub type percpu_ref_func_t = ::core::option::Option; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct percpu_ref_data { - pub count: atomic_long_t, - pub release: percpu_ref_func_t, - pub confirm_switch: percpu_ref_func_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub rcu: callback_head, - pub ref_: *mut percpu_ref, -} -impl percpu_ref_data { - #[inline] - pub fn force_atomic(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_force_atomic(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn allow_reinit(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_allow_reinit(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - force_atomic: bool_, - allow_reinit: bool_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let force_atomic: u8 = unsafe { ::core::mem::transmute(force_atomic) }; - force_atomic as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let allow_reinit: u8 = unsafe { ::core::mem::transmute(allow_reinit) }; - allow_reinit as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Copy, Clone)] pub struct kiocb { pub ki_filp: *mut file, pub ki_pos: loff_t, pub ki_complete: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kiocb, arg2: ::aya_bpf::cty::c_long), + unsafe extern "C" fn(arg1: *mut kiocb, arg2: ::aya_ebpf::cty::c_long), >, - pub private: *mut ::aya_bpf::cty::c_void, - pub ki_flags: ::aya_bpf::cty::c_int, + pub private: *mut ::aya_ebpf::cty::c_void, + pub ki_flags: ::aya_ebpf::cty::c_int, pub ki_ioprio: u16_, + pub __bindgen_anon_1: kiocb__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union kiocb__bindgen_ty_1 { pub ki_waitq: *mut wait_page_queue, + pub dio_complete: + ::core::option::Option isize>, } #[repr(C)] #[derive(Copy, Clone)] pub struct iattr { - pub ia_valid: ::aya_bpf::cty::c_uint, + pub ia_valid: ::aya_ebpf::cty::c_uint, pub ia_mode: umode_t, pub __bindgen_anon_1: iattr__bindgen_ty_1, pub __bindgen_anon_2: iattr__bindgen_ty_2, @@ -6644,7 +6687,7 @@ pub struct kprojid_t { pub val: projid_t, } pub mod quota_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const USRQUOTA: Type = 0; pub const GRPQUOTA: Type = 1; pub const PRJQUOTA: Type = 2; @@ -6688,13 +6731,13 @@ pub struct dquot { pub dq_sb: *mut super_block, pub dq_id: kqid, pub dq_off: loff_t, - pub dq_flags: ::aya_bpf::cty::c_ulong, + pub dq_flags: ::aya_ebpf::cty::c_ulong, pub dq_dqb: mem_dqblk, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct quota_format_type { - pub qf_fmt_id: ::aya_bpf::cty::c_int, + pub qf_fmt_id: ::aya_ebpf::cty::c_int, pub qf_ops: *const quota_format_ops, pub qf_owner: *mut module, pub qf_next: *mut quota_format_type, @@ -6705,74 +6748,74 @@ pub struct quota_format_ops { pub check_quota_file: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub read_file_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub write_file_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub free_file_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub read_dqblk: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub commit_dqblk: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub release_dqblk: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub get_next_id: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block, arg2: *mut kqid) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut super_block, arg2: *mut kqid) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct dquot_operations { pub write_dquot: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub alloc_dquot: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block, arg2: ::aya_bpf::cty::c_int) -> *mut dquot, + unsafe extern "C" fn(arg1: *mut super_block, arg2: ::aya_ebpf::cty::c_int) -> *mut dquot, >, pub destroy_dquot: ::core::option::Option, pub acquire_dquot: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub release_dquot: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub mark_dirty: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub write_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_reserved_space: ::core::option::Option *mut qsize_t>, pub get_projid: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut kprojid_t) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut kprojid_t) -> ::aya_ebpf::cty::c_int, >, pub get_inode_usage: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut qsize_t) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut qsize_t) -> ::aya_ebpf::cty::c_int, >, pub get_next_id: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block, arg2: *mut kqid) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut super_block, arg2: *mut kqid) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct qc_dqblk { - pub d_fieldmask: ::aya_bpf::cty::c_int, + pub d_fieldmask: ::aya_ebpf::cty::c_int, pub d_spc_hardlimit: u64_, pub d_spc_softlimit: u64_, pub d_ino_hardlimit: u64_, @@ -6781,45 +6824,45 @@ pub struct qc_dqblk { pub d_ino_count: u64_, pub d_ino_timer: s64, pub d_spc_timer: s64, - pub d_ino_warns: ::aya_bpf::cty::c_int, - pub d_spc_warns: ::aya_bpf::cty::c_int, + pub d_ino_warns: ::aya_ebpf::cty::c_int, + pub d_spc_warns: ::aya_ebpf::cty::c_int, pub d_rt_spc_hardlimit: u64_, pub d_rt_spc_softlimit: u64_, pub d_rt_space: u64_, pub d_rt_spc_timer: s64, - pub d_rt_spc_warns: ::aya_bpf::cty::c_int, + pub d_rt_spc_warns: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct qc_type_state { - pub flags: ::aya_bpf::cty::c_uint, - pub spc_timelimit: ::aya_bpf::cty::c_uint, - pub ino_timelimit: ::aya_bpf::cty::c_uint, - pub rt_spc_timelimit: ::aya_bpf::cty::c_uint, - pub spc_warnlimit: ::aya_bpf::cty::c_uint, - pub ino_warnlimit: ::aya_bpf::cty::c_uint, - pub rt_spc_warnlimit: ::aya_bpf::cty::c_uint, - pub ino: ::aya_bpf::cty::c_ulonglong, + pub flags: ::aya_ebpf::cty::c_uint, + pub spc_timelimit: ::aya_ebpf::cty::c_uint, + pub ino_timelimit: ::aya_ebpf::cty::c_uint, + pub rt_spc_timelimit: ::aya_ebpf::cty::c_uint, + pub spc_warnlimit: ::aya_ebpf::cty::c_uint, + pub ino_warnlimit: ::aya_ebpf::cty::c_uint, + pub rt_spc_warnlimit: ::aya_ebpf::cty::c_uint, + pub ino: ::aya_ebpf::cty::c_ulonglong, pub blocks: blkcnt_t, pub nextents: blkcnt_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct qc_state { - pub s_incoredqs: ::aya_bpf::cty::c_uint, + pub s_incoredqs: ::aya_ebpf::cty::c_uint, pub s_state: [qc_type_state; 3usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct qc_info { - pub i_fieldmask: ::aya_bpf::cty::c_int, - pub i_flags: ::aya_bpf::cty::c_uint, - pub i_spc_timelimit: ::aya_bpf::cty::c_uint, - pub i_ino_timelimit: ::aya_bpf::cty::c_uint, - pub i_rt_spc_timelimit: ::aya_bpf::cty::c_uint, - pub i_spc_warnlimit: ::aya_bpf::cty::c_uint, - pub i_ino_warnlimit: ::aya_bpf::cty::c_uint, - pub i_rt_spc_warnlimit: ::aya_bpf::cty::c_uint, + pub i_fieldmask: ::aya_ebpf::cty::c_int, + pub i_flags: ::aya_ebpf::cty::c_uint, + pub i_spc_timelimit: ::aya_ebpf::cty::c_uint, + pub i_ino_timelimit: ::aya_ebpf::cty::c_uint, + pub i_rt_spc_timelimit: ::aya_ebpf::cty::c_uint, + pub i_spc_warnlimit: ::aya_ebpf::cty::c_uint, + pub i_ino_warnlimit: ::aya_ebpf::cty::c_uint, + pub i_rt_spc_warnlimit: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -6827,71 +6870,71 @@ pub struct quotactl_ops { pub quota_on: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: *const path, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub quota_off: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub quota_enable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, pub quota_disable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, pub quota_sync: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub set_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: *mut qc_info, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_dqblk: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: kqid, arg3: *mut qc_dqblk, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_nextdqblk: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: *mut kqid, arg3: *mut qc_dqblk, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub set_dqblk: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: kqid, arg3: *mut qc_dqblk, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_state: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block, arg2: *mut qc_state) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut super_block, arg2: *mut qc_state) -> ::aya_ebpf::cty::c_int, >, pub rm_xquota: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] @@ -6901,16 +6944,16 @@ pub struct address_space_operations { unsafe extern "C" fn( arg1: *mut page, arg2: *mut writeback_control, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub read_folio: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut folio) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut file, arg2: *mut folio) -> ::aya_ebpf::cty::c_int, >, pub writepages: ::core::option::Option< unsafe extern "C" fn( arg1: *mut address_space, arg2: *mut writeback_control, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub dirty_folio: ::core::option::Option< unsafe extern "C" fn(arg1: *mut address_space, arg2: *mut folio) -> bool_, @@ -6921,21 +6964,21 @@ pub struct address_space_operations { arg1: *mut file, arg2: *mut address_space, arg3: loff_t, - arg4: ::aya_bpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_uint, arg5: *mut *mut page, - arg6: *mut *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg6: *mut *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub write_end: ::core::option::Option< unsafe extern "C" fn( arg1: *mut file, arg2: *mut address_space, arg3: loff_t, - arg4: ::aya_bpf::cty::c_uint, - arg5: ::aya_bpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_uint, + arg5: ::aya_ebpf::cty::c_uint, arg6: *mut page, - arg7: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg7: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub bmap: ::core::option::Option< unsafe extern "C" fn(arg1: *mut address_space, arg2: sector_t) -> sector_t, @@ -6954,108 +6997,82 @@ pub struct address_space_operations { arg2: *mut folio, arg3: *mut folio, arg4: migrate_mode::Type, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub launder_folio: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub is_partially_uptodate: ::core::option::Option< unsafe extern "C" fn(arg1: *mut folio, arg2: usize, arg3: usize) -> bool_, >, pub is_dirty_writeback: ::core::option::Option< unsafe extern "C" fn(arg1: *mut folio, arg2: *mut bool_, arg3: *mut bool_), >, - pub error_remove_page: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut address_space, arg2: *mut page) -> ::aya_bpf::cty::c_int, + pub error_remove_folio: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut address_space, arg2: *mut folio) -> ::aya_ebpf::cty::c_int, >, pub swap_activate: ::core::option::Option< unsafe extern "C" fn( arg1: *mut swap_info_struct, arg2: *mut file, arg3: *mut sector_t, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub swap_deactivate: ::core::option::Option, pub swap_rw: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct iovec { - pub iov_base: *mut ::aya_bpf::cty::c_void, + pub iov_base: *mut ::aya_ebpf::cty::c_void, pub iov_len: __kernel_size_t, } #[repr(C)] #[derive(Copy, Clone)] pub struct iov_iter { pub iter_type: u8_, - pub copy_mc: bool_, pub nofault: bool_, pub data_source: bool_, - pub user_backed: bool_, + pub iov_offset: usize, pub __bindgen_anon_1: iov_iter__bindgen_ty_1, pub __bindgen_anon_2: iov_iter__bindgen_ty_2, - pub __bindgen_anon_3: iov_iter__bindgen_ty_3, } #[repr(C)] #[derive(Copy, Clone)] pub union iov_iter__bindgen_ty_1 { - pub iov_offset: usize, - pub last_offset: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union iov_iter__bindgen_ty_2 { pub __ubuf_iovec: iovec, - pub __bindgen_anon_1: iov_iter__bindgen_ty_2__bindgen_ty_1, + pub __bindgen_anon_1: iov_iter__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct iov_iter__bindgen_ty_2__bindgen_ty_1 { - pub __bindgen_anon_1: iov_iter__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, +pub struct iov_iter__bindgen_ty_1__bindgen_ty_1 { + pub __bindgen_anon_1: iov_iter__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, pub count: usize, } #[repr(C)] #[derive(Copy, Clone)] -pub union iov_iter__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 { +pub union iov_iter__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { pub __iov: *const iovec, pub kvec: *const kvec, pub bvec: *const bio_vec, pub xarray: *mut xarray, - pub pipe: *mut pipe_inode_info, - pub ubuf: *mut ::aya_bpf::cty::c_void, + pub ubuf: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Copy, Clone)] -pub union iov_iter__bindgen_ty_3 { - pub nr_segs: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: iov_iter__bindgen_ty_3__bindgen_ty_1, +pub union iov_iter__bindgen_ty_2 { + pub nr_segs: ::aya_ebpf::cty::c_ulong, pub xarray_start: loff_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iov_iter__bindgen_ty_3__bindgen_ty_1 { - pub head: ::aya_bpf::cty::c_uint, - pub start_head: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cdev { - pub kobj: kobject, - pub owner: *mut module, - pub ops: *const file_operations, - pub list: list_head, - pub dev: dev_t, - pub count: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct inode_operations { pub lookup: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, arg2: *mut dentry, - arg3: ::aya_bpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, ) -> *mut dentry, >, pub get_link: ::core::option::Option< @@ -7063,28 +7080,28 @@ pub struct inode_operations { arg1: *mut dentry, arg2: *mut inode, arg3: *mut delayed_call, - ) -> *const ::aya_bpf::cty::c_char, + ) -> *const ::aya_ebpf::cty::c_char, >, pub permission: ::core::option::Option< unsafe extern "C" fn( arg1: *mut mnt_idmap, arg2: *mut inode, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_inode_acl: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: bool_, ) -> *mut posix_acl, >, pub readlink: ::core::option::Option< unsafe extern "C" fn( arg1: *mut dentry, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub create: ::core::option::Option< unsafe extern "C" fn( @@ -7093,25 +7110,25 @@ pub struct inode_operations { arg3: *mut dentry, arg4: umode_t, arg5: bool_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub link: ::core::option::Option< unsafe extern "C" fn( arg1: *mut dentry, arg2: *mut inode, arg3: *mut dentry, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub unlink: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, >, pub symlink: ::core::option::Option< unsafe extern "C" fn( arg1: *mut mnt_idmap, arg2: *mut inode, arg3: *mut dentry, - arg4: *const ::aya_bpf::cty::c_char, - ) -> ::aya_bpf::cty::c_int, + arg4: *const ::aya_ebpf::cty::c_char, + ) -> ::aya_ebpf::cty::c_int, >, pub mkdir: ::core::option::Option< unsafe extern "C" fn( @@ -7119,10 +7136,10 @@ pub struct inode_operations { arg2: *mut inode, arg3: *mut dentry, arg4: umode_t, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub rmdir: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, >, pub mknod: ::core::option::Option< unsafe extern "C" fn( @@ -7131,7 +7148,7 @@ pub struct inode_operations { arg3: *mut dentry, arg4: umode_t, arg5: dev_t, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub rename: ::core::option::Option< unsafe extern "C" fn( @@ -7140,15 +7157,15 @@ pub struct inode_operations { arg3: *mut dentry, arg4: *mut inode, arg5: *mut dentry, - arg6: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg6: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, pub setattr: ::core::option::Option< unsafe extern "C" fn( arg1: *mut mnt_idmap, arg2: *mut dentry, arg3: *mut iattr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub getattr: ::core::option::Option< unsafe extern "C" fn( @@ -7156,13 +7173,13 @@ pub struct inode_operations { arg2: *const path, arg3: *mut kstat, arg4: u32_, - arg5: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, pub listxattr: ::core::option::Option< unsafe extern "C" fn( arg1: *mut dentry, - arg2: *mut ::aya_bpf::cty::c_char, + arg2: *mut ::aya_ebpf::cty::c_char, arg3: usize, ) -> isize, >, @@ -7172,23 +7189,22 @@ pub struct inode_operations { arg2: *mut fiemap_extent_info, arg3: u64_, arg4: u64_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub update_time: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: *mut timespec64, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub atomic_open: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, arg2: *mut dentry, arg3: *mut file, - arg4: ::aya_bpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_uint, arg5: umode_t, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub tmpfile: ::core::option::Option< unsafe extern "C" fn( @@ -7196,13 +7212,13 @@ pub struct inode_operations { arg2: *mut inode, arg3: *mut file, arg4: umode_t, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_acl: ::core::option::Option< unsafe extern "C" fn( arg1: *mut mnt_idmap, arg2: *mut dentry, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, ) -> *mut posix_acl, >, pub set_acl: ::core::option::Option< @@ -7210,30 +7226,40 @@ pub struct inode_operations { arg1: *mut mnt_idmap, arg2: *mut dentry, arg3: *mut posix_acl, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub fileattr_set: ::core::option::Option< unsafe extern "C" fn( arg1: *mut mnt_idmap, arg2: *mut dentry, arg3: *mut fileattr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub fileattr_get: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dentry, arg2: *mut fileattr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut dentry, arg2: *mut fileattr) -> ::aya_ebpf::cty::c_int, >, + pub get_offset_ctx: + ::core::option::Option *mut offset_ctx>, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, } #[repr(C)] #[derive(Copy, Clone)] pub struct fasync_struct { pub fa_lock: rwlock_t, - pub magic: ::aya_bpf::cty::c_int, - pub fa_fd: ::aya_bpf::cty::c_int, + pub magic: ::aya_ebpf::cty::c_int, + pub fa_fd: ::aya_ebpf::cty::c_int, pub fa_next: *mut fasync_struct, pub fa_file: *mut file, pub fa_rcu: callback_head, } +pub mod freeze_holder { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FREEZE_HOLDER_KERNEL: Type = 1; + pub const FREEZE_HOLDER_USERSPACE: Type = 2; + pub const FREEZE_MAY_NEST: Type = 4; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct super_operations { @@ -7241,64 +7267,71 @@ pub struct super_operations { ::core::option::Option *mut inode>, pub destroy_inode: ::core::option::Option, pub free_inode: ::core::option::Option, - pub dirty_inode: - ::core::option::Option, + pub dirty_inode: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: ::aya_ebpf::cty::c_int), + >, pub write_inode: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, arg2: *mut writeback_control, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub drop_inode: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub evict_inode: ::core::option::Option, pub put_super: ::core::option::Option, pub sync_fs: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub freeze_super: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn( + arg1: *mut super_block, + arg2: freeze_holder::Type, + ) -> ::aya_ebpf::cty::c_int, >, pub freeze_fs: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut super_block) -> ::aya_ebpf::cty::c_int, >, pub thaw_super: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn( + arg1: *mut super_block, + arg2: freeze_holder::Type, + ) -> ::aya_ebpf::cty::c_int, >, pub unfreeze_fs: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut super_block) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut super_block) -> ::aya_ebpf::cty::c_int, >, pub statfs: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dentry, arg2: *mut kstatfs) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut dentry, arg2: *mut kstatfs) -> ::aya_ebpf::cty::c_int, >, pub remount_fs: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: *mut ::aya_bpf::cty::c_int, - arg3: *mut ::aya_bpf::cty::c_char, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_char, + ) -> ::aya_ebpf::cty::c_int, >, pub umount_begin: ::core::option::Option, pub show_options: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, >, pub show_devname: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, >, pub show_path: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, >, pub show_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, >, pub quota_read: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ::aya_bpf::cty::c_char, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_char, arg4: usize, arg5: loff_t, ) -> isize, @@ -7306,8 +7339,8 @@ pub struct super_operations { pub quota_write: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: ::aya_bpf::cty::c_int, - arg3: *const ::aya_bpf::cty::c_char, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const ::aya_ebpf::cty::c_char, arg4: usize, arg5: loff_t, ) -> isize, @@ -7318,14 +7351,15 @@ pub struct super_operations { unsafe extern "C" fn( arg1: *mut super_block, arg2: *mut shrink_control, - ) -> ::aya_bpf::cty::c_long, + ) -> ::aya_ebpf::cty::c_long, >, pub free_cached_objects: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: *mut shrink_control, - ) -> ::aya_bpf::cty::c_long, + ) -> ::aya_ebpf::cty::c_long, >, + pub shutdown: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -7334,43 +7368,43 @@ pub struct export_operations { unsafe extern "C" fn( arg1: *mut inode, arg2: *mut __u32, - arg3: *mut ::aya_bpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_int, arg4: *mut inode, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub fh_to_dentry: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: *mut fid, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, ) -> *mut dentry, >, pub fh_to_parent: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: *mut fid, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, ) -> *mut dentry, >, pub get_name: ::core::option::Option< unsafe extern "C" fn( arg1: *mut dentry, - arg2: *mut ::aya_bpf::cty::c_char, + arg2: *mut ::aya_ebpf::cty::c_char, arg3: *mut dentry, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_parent: ::core::option::Option *mut dentry>, pub commit_metadata: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub get_uuid: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, arg2: *mut u8_, arg3: *mut u32_, arg4: *mut u64_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_blocks: ::core::option::Option< unsafe extern "C" fn( @@ -7380,34 +7414,34 @@ pub struct export_operations { arg4: *mut iomap, arg5: bool_, arg6: *mut u32_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub commit_blocks: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, arg2: *mut iomap, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: *mut iattr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub flags: ::aya_bpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct xattr_handler { - pub name: *const ::aya_bpf::cty::c_char, - pub prefix: *const ::aya_bpf::cty::c_char, - pub flags: ::aya_bpf::cty::c_int, + pub name: *const ::aya_ebpf::cty::c_char, + pub prefix: *const ::aya_ebpf::cty::c_char, + pub flags: ::aya_ebpf::cty::c_int, pub list: ::core::option::Option bool_>, pub get: ::core::option::Option< unsafe extern "C" fn( arg1: *const xattr_handler, arg2: *mut dentry, arg3: *mut inode, - arg4: *const ::aya_bpf::cty::c_char, - arg5: *mut ::aya_bpf::cty::c_void, + arg4: *const ::aya_ebpf::cty::c_char, + arg5: *mut ::aya_ebpf::cty::c_void, arg6: usize, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub set: ::core::option::Option< unsafe extern "C" fn( @@ -7415,32 +7449,33 @@ pub struct xattr_handler { arg2: *mut mnt_idmap, arg3: *mut dentry, arg4: *mut inode, - arg5: *const ::aya_bpf::cty::c_char, - arg6: *const ::aya_bpf::cty::c_void, + arg5: *const ::aya_ebpf::cty::c_char, + arg6: *const ::aya_ebpf::cty::c_void, arg7: usize, - arg8: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg8: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct fscrypt_operations { - pub flags: ::aya_bpf::cty::c_uint, - pub key_prefix: *const ::aya_bpf::cty::c_char, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub legacy_key_prefix: *const ::aya_ebpf::cty::c_char, pub get_context: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: usize, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub set_context: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: *const ::aya_bpf::cty::c_void, + arg2: *const ::aya_ebpf::cty::c_void, arg3: usize, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub get_dummy_policy: ::core::option::Option< unsafe extern "C" fn(arg1: *mut super_block) -> *const fscrypt_policy, @@ -7448,64 +7483,114 @@ pub struct fscrypt_operations { pub empty_dir: ::core::option::Option bool_>, pub has_stable_inodes: ::core::option::Option bool_>, - pub get_ino_and_lblk_bits: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut super_block, - arg2: *mut ::aya_bpf::cty::c_int, - arg3: *mut ::aya_bpf::cty::c_int, - ), - >, pub get_devices: ::core::option::Option< unsafe extern "C" fn( arg1: *mut super_block, - arg2: *mut ::aya_bpf::cty::c_uint, + arg2: *mut ::aya_ebpf::cty::c_uint, ) -> *mut *mut block_device, >, } +impl fscrypt_operations { + #[inline] + pub fn needs_bounce_pages(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_needs_bounce_pages(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn has_32bit_inodes(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_has_32bit_inodes(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn supports_subblock_data_units(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_supports_subblock_data_units(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + needs_bounce_pages: ::aya_ebpf::cty::c_uint, + has_32bit_inodes: ::aya_ebpf::cty::c_uint, + supports_subblock_data_units: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let needs_bounce_pages: u32 = unsafe { ::core::mem::transmute(needs_bounce_pages) }; + needs_bounce_pages as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let has_32bit_inodes: u32 = unsafe { ::core::mem::transmute(has_32bit_inodes) }; + has_32bit_inodes as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let supports_subblock_data_units: u32 = + unsafe { ::core::mem::transmute(supports_subblock_data_units) }; + supports_subblock_data_units as u64 + }); + __bindgen_bitfield_unit + } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct fsverity_operations { pub begin_enable_verity: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub end_enable_verity: ::core::option::Option< unsafe extern "C" fn( arg1: *mut file, - arg2: *const ::aya_bpf::cty::c_void, + arg2: *const ::aya_ebpf::cty::c_void, arg3: usize, arg4: u64_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_verity_descriptor: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: usize, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub read_merkle_tree_page: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, ) -> *mut page, >, pub write_merkle_tree_block: ::core::option::Option< unsafe extern "C" fn( arg1: *mut inode, - arg2: *const ::aya_bpf::cty::c_void, + arg2: *const ::aya_ebpf::cty::c_void, arg3: u64_, - arg4: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, } pub type filldir_t = ::core::option::Option< unsafe extern "C" fn( arg1: *mut dir_context, - arg2: *const ::aya_bpf::cty::c_char, - arg3: ::aya_bpf::cty::c_int, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: ::aya_ebpf::cty::c_int, arg4: loff_t, arg5: u64_, - arg6: ::aya_bpf::cty::c_uint, + arg6: ::aya_ebpf::cty::c_uint, ) -> bool_, >; #[repr(C)] @@ -7530,7 +7615,7 @@ pub struct poll_table_struct { #[repr(C)] #[derive(Copy, Clone)] pub struct seq_file { - pub buf: *mut ::aya_bpf::cty::c_char, + pub buf: *mut ::aya_ebpf::cty::c_char, pub size: usize, pub from: usize, pub count: usize, @@ -7539,9 +7624,15 @@ pub struct seq_file { pub read_pos: loff_t, pub lock: mutex, pub op: *const seq_operations, - pub poll_event: ::aya_bpf::cty::c_int, + pub poll_event: ::aya_ebpf::cty::c_int, pub file: *const file, - pub private: *mut ::aya_bpf::cty::c_void, + pub private: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct offset_ctx { + pub xa: xarray, + pub next_offset: u32_, } pub type fs_param_type = ::core::option::Option< unsafe extern "C" fn( @@ -7549,113 +7640,144 @@ pub type fs_param_type = ::core::option::Option< arg2: *const fs_parameter_spec, arg3: *mut fs_parameter, arg4: *mut fs_parse_result, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct fs_parameter_spec { - pub name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, pub type_: fs_param_type, pub opt: u8_, - pub flags: ::aya_bpf::cty::c_ushort, - pub data: *const ::aya_bpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_ushort, + pub data: *const ::aya_ebpf::cty::c_void, } -pub mod irqreturn { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IRQ_NONE: Type = 0; - pub const IRQ_HANDLED: Type = 1; - pub const IRQ_WAKE_THREAD: Type = 2; -} -pub use self::irqreturn::Type as irqreturn_t; -pub type irq_handler_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_int, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> irqreturn_t, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct irqaction { - pub handler: irq_handler_t, - pub dev_id: *mut ::aya_bpf::cty::c_void, - pub percpu_dev_id: *mut ::aya_bpf::cty::c_void, - pub next: *mut irqaction, - pub thread_fn: irq_handler_t, - pub thread: *mut task_struct, - pub secondary: *mut irqaction, - pub irq: ::aya_bpf::cty::c_uint, - pub flags: ::aya_bpf::cty::c_uint, - pub thread_flags: ::aya_bpf::cty::c_ulong, - pub thread_mask: ::aya_bpf::cty::c_ulong, - pub name: *const ::aya_bpf::cty::c_char, - pub dir: *mut proc_dir_entry, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl irqaction { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub struct kvec { + pub iov_base: *mut ::aya_ebpf::cty::c_void, + pub iov_len: usize, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct irq_affinity_notify { - pub irq: ::aya_bpf::cty::c_uint, - pub kref: kref, - pub work: work_struct, - pub notify: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut irq_affinity_notify, arg2: *const cpumask_t), - >, - pub release: ::core::option::Option, +pub struct bio_vec { + pub bv_page: *mut page, + pub bv_len: ::aya_ebpf::cty::c_uint, + pub bv_offset: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct irq_affinity_desc { - pub mask: cpumask, +pub struct linux_binprm { + pub vma: *mut vm_area_struct, + pub vma_pages: ::aya_ebpf::cty::c_ulong, + pub mm: *mut mm_struct, + pub p: ::aya_ebpf::cty::c_ulong, + pub argmin: ::aya_ebpf::cty::c_ulong, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 7usize], + pub executable: *mut file, + pub interpreter: *mut file, + pub file: *mut file, + pub cred: *mut cred, + pub unsafe_: ::aya_ebpf::cty::c_int, + pub per_clear: ::aya_ebpf::cty::c_uint, + pub argc: ::aya_ebpf::cty::c_int, + pub envc: ::aya_ebpf::cty::c_int, + pub filename: *const ::aya_ebpf::cty::c_char, + pub interp: *const ::aya_ebpf::cty::c_char, + pub fdpath: *const ::aya_ebpf::cty::c_char, + pub interp_flags: ::aya_ebpf::cty::c_uint, + pub execfd: ::aya_ebpf::cty::c_int, + pub loader: ::aya_ebpf::cty::c_ulong, + pub exec: ::aya_ebpf::cty::c_ulong, + pub rlim_stack: rlimit, + pub buf: [::aya_ebpf::cty::c_char; 256usize], } -impl irq_affinity_desc { +impl linux_binprm { #[inline] - pub fn is_managed(&self) -> ::aya_bpf::cty::c_uint { + pub fn have_execfd(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_is_managed(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_have_execfd(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] + pub fn execfd_creds(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_execfd_creds(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn secureexec(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_secureexec(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn point_of_no_return(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_point_of_no_return(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] pub fn new_bitfield_1( - is_managed: ::aya_bpf::cty::c_uint, + have_execfd: ::aya_ebpf::cty::c_uint, + execfd_creds: ::aya_ebpf::cty::c_uint, + secureexec: ::aya_ebpf::cty::c_uint, + point_of_no_return: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_managed: u32 = unsafe { ::core::mem::transmute(is_managed) }; - is_managed as u64 + let have_execfd: u32 = unsafe { ::core::mem::transmute(have_execfd) }; + have_execfd as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let execfd_creds: u32 = unsafe { ::core::mem::transmute(execfd_creds) }; + execfd_creds as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let secureexec: u32 = unsafe { ::core::mem::transmute(secureexec) }; + secureexec as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let point_of_no_return: u32 = unsafe { ::core::mem::transmute(point_of_no_return) }; + point_of_no_return as u64 }); __bindgen_bitfield_unit } } -pub mod irqchip_irq_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IRQCHIP_STATE_PENDING: Type = 0; - pub const IRQCHIP_STATE_ACTIVE: Type = 1; - pub const IRQCHIP_STATE_MASKED: Type = 2; - pub const IRQCHIP_STATE_LINE_LEVEL: Type = 3; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct binfmt_misc { + pub entries: list_head, + pub entries_lock: rwlock_t, + pub enabled: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct kernfs_elem_dir { - pub subdirs: ::aya_bpf::cty::c_ulong, + pub subdirs: ::aya_ebpf::cty::c_ulong, pub children: rb_root, pub root: *mut kernfs_root, - pub rev: ::aya_bpf::cty::c_ulong, + pub rev: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -7676,14 +7798,14 @@ pub struct kernfs_node { pub count: atomic_t, pub active: atomic_t, pub parent: *mut kernfs_node, - pub name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, pub rb: rb_node, - pub ns: *const ::aya_bpf::cty::c_void, - pub hash: ::aya_bpf::cty::c_uint, + pub ns: *const ::aya_ebpf::cty::c_void, + pub hash: ::aya_ebpf::cty::c_uint, pub __bindgen_anon_1: kernfs_node__bindgen_ty_1, - pub priv_: *mut ::aya_bpf::cty::c_void, + pub priv_: *mut ::aya_ebpf::cty::c_void, pub id: u64_, - pub flags: ::aya_bpf::cty::c_ushort, + pub flags: ::aya_ebpf::cty::c_ushort, pub mode: umode_t, pub iattr: *mut kernfs_iattrs, } @@ -7698,32 +7820,35 @@ pub union kernfs_node__bindgen_ty_1 { #[derive(Debug, Copy, Clone)] pub struct kernfs_ops { pub open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kernfs_open_file) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut kernfs_open_file) -> ::aya_ebpf::cty::c_int, >, pub release: ::core::option::Option, pub seq_show: ::core::option::Option< unsafe extern "C" fn( arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub seq_start: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut loff_t) -> *mut ::aya_bpf::cty::c_void, + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut loff_t, + ) -> *mut ::aya_ebpf::cty::c_void, >, pub seq_next: ::core::option::Option< unsafe extern "C" fn( arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: *mut loff_t, - ) -> *mut ::aya_bpf::cty::c_void, + ) -> *mut ::aya_ebpf::cty::c_void, >, pub seq_stop: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut ::aya_bpf::cty::c_void), + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut ::aya_ebpf::cty::c_void), >, pub read: ::core::option::Option< unsafe extern "C" fn( arg1: *mut kernfs_open_file, - arg2: *mut ::aya_bpf::cty::c_char, + arg2: *mut ::aya_ebpf::cty::c_char, arg3: usize, arg4: loff_t, ) -> isize, @@ -7733,7 +7858,7 @@ pub struct kernfs_ops { pub write: ::core::option::Option< unsafe extern "C" fn( arg1: *mut kernfs_open_file, - arg2: *mut ::aya_bpf::cty::c_char, + arg2: *mut ::aya_ebpf::cty::c_char, arg3: usize, arg4: loff_t, ) -> isize, @@ -7745,7 +7870,14 @@ pub struct kernfs_ops { unsafe extern "C" fn( arg1: *mut kernfs_open_file, arg2: *mut vm_area_struct, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub llseek: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut kernfs_open_file, + arg2: loff_t, + arg3: ::aya_ebpf::cty::c_int, + ) -> loff_t, >, } #[repr(C)] @@ -7754,12 +7886,12 @@ pub struct kernfs_open_file { pub kn: *mut kernfs_node, pub file: *mut file, pub seq_file: *mut seq_file, - pub priv_: *mut ::aya_bpf::cty::c_void, + pub priv_: *mut ::aya_ebpf::cty::c_void, pub mutex: mutex, pub prealloc_mutex: mutex, - pub event: ::aya_bpf::cty::c_int, + pub event: ::aya_ebpf::cty::c_int, pub list: list_head, - pub prealloc_buf: *mut ::aya_bpf::cty::c_char, + pub prealloc_buf: *mut ::aya_ebpf::cty::c_char, pub atomic_write_len: usize, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, @@ -7803,7 +7935,7 @@ impl kernfs_open_file { } } pub mod kobj_ns_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const KOBJ_NS_TYPE_NONE: Type = 0; pub const KOBJ_NS_TYPE_NET: Type = 1; pub const KOBJ_NS_TYPES: Type = 2; @@ -7814,17 +7946,18 @@ pub struct kobj_ns_type_operations { pub type_: kobj_ns_type::Type, pub current_may_mount: ::core::option::Option bool_>, pub grab_current_ns: - ::core::option::Option *mut ::aya_bpf::cty::c_void>, + ::core::option::Option *mut ::aya_ebpf::cty::c_void>, pub netlink_ns: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock) -> *const ::aya_bpf::cty::c_void, + unsafe extern "C" fn(arg1: *mut sock) -> *const ::aya_ebpf::cty::c_void, >, - pub initial_ns: ::core::option::Option *const ::aya_bpf::cty::c_void>, - pub drop_ns: ::core::option::Option, + pub initial_ns: + ::core::option::Option *const ::aya_ebpf::cty::c_void>, + pub drop_ns: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct attribute { - pub name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, pub mode: umode_t, } #[repr(C)] @@ -7832,14 +7965,14 @@ pub struct attribute { pub struct bin_attribute { pub attr: attribute, pub size: usize, - pub private: *mut ::aya_bpf::cty::c_void, + pub private: *mut ::aya_ebpf::cty::c_void, pub f_mapping: ::core::option::Option *mut address_space>, pub read: ::core::option::Option< unsafe extern "C" fn( arg1: *mut file, arg2: *mut kobject, arg3: *mut bin_attribute, - arg4: *mut ::aya_bpf::cty::c_char, + arg4: *mut ::aya_ebpf::cty::c_char, arg5: loff_t, arg6: usize, ) -> isize, @@ -7849,18 +7982,27 @@ pub struct bin_attribute { arg1: *mut file, arg2: *mut kobject, arg3: *mut bin_attribute, - arg4: *mut ::aya_bpf::cty::c_char, + arg4: *mut ::aya_ebpf::cty::c_char, arg5: loff_t, arg6: usize, ) -> isize, >, + pub llseek: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut kobject, + arg3: *mut bin_attribute, + arg4: loff_t, + arg5: ::aya_ebpf::cty::c_int, + ) -> loff_t, + >, pub mmap: ::core::option::Option< unsafe extern "C" fn( arg1: *mut file, arg2: *mut kobject, arg3: *mut bin_attribute, arg4: *mut vm_area_struct, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] @@ -7870,14 +8012,14 @@ pub struct sysfs_ops { unsafe extern "C" fn( arg1: *mut kobject, arg2: *mut attribute, - arg3: *mut ::aya_bpf::cty::c_char, + arg3: *mut ::aya_ebpf::cty::c_char, ) -> isize, >, pub store: ::core::option::Option< unsafe extern "C" fn( arg1: *mut kobject, arg2: *mut attribute, - arg3: *const ::aya_bpf::cty::c_char, + arg3: *const ::aya_ebpf::cty::c_char, arg4: usize, ) -> isize, >, @@ -7900,7 +8042,7 @@ pub struct kobj_type { unsafe extern "C" fn(arg1: *const kobject) -> *const kobj_ns_type_operations, >, pub namespace: ::core::option::Option< - unsafe extern "C" fn(arg1: *const kobject) -> *const ::aya_bpf::cty::c_void, + unsafe extern "C" fn(arg1: *const kobject) -> *const ::aya_ebpf::cty::c_void, >, pub get_ownership: ::core::option::Option< unsafe extern "C" fn(arg1: *const kobject, arg2: *mut kuid_t, arg3: *mut kgid_t), @@ -7909,84 +8051,46 @@ pub struct kobj_type { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct kobj_uevent_env { - pub argv: [*mut ::aya_bpf::cty::c_char; 3usize], - pub envp: [*mut ::aya_bpf::cty::c_char; 64usize], - pub envp_idx: ::aya_bpf::cty::c_int, - pub buf: [::aya_bpf::cty::c_char; 2048usize], - pub buflen: ::aya_bpf::cty::c_int, + pub argv: [*mut ::aya_ebpf::cty::c_char; 3usize], + pub envp: [*mut ::aya_ebpf::cty::c_char; 64usize], + pub envp_idx: ::aya_ebpf::cty::c_int, + pub buf: [::aya_ebpf::cty::c_char; 2048usize], + pub buflen: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct kset_uevent_ops { - pub filter: - ::core::option::Option ::aya_bpf::cty::c_int>, + pub filter: ::core::option::Option< + unsafe extern "C" fn(arg1: *const kobject) -> ::aya_ebpf::cty::c_int, + >, pub name: ::core::option::Option< - unsafe extern "C" fn(arg1: *const kobject) -> *const ::aya_bpf::cty::c_char, + unsafe extern "C" fn(arg1: *const kobject) -> *const ::aya_ebpf::cty::c_char, >, pub uevent: ::core::option::Option< unsafe extern "C" fn( arg1: *const kobject, arg2: *mut kobj_uevent_env, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pm_message { - pub event: ::aya_bpf::cty::c_int, +pub struct em_perf_state { + pub frequency: ::aya_ebpf::cty::c_ulong, + pub power: ::aya_ebpf::cty::c_ulong, + pub cost: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, } -pub type pm_message_t = pm_message; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dev_pm_ops { - pub prepare: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub complete: ::core::option::Option, - pub suspend: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub resume: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub freeze: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub thaw: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub poweroff: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub restore: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub suspend_late: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub resume_early: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub freeze_late: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub thaw_early: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub poweroff_late: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub restore_early: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub suspend_noirq: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub resume_noirq: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub freeze_noirq: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub thaw_noirq: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub poweroff_noirq: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub restore_noirq: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub runtime_suspend: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub runtime_resume: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub runtime_idle: - ::core::option::Option ::aya_bpf::cty::c_int>, +#[derive(Debug)] +pub struct em_perf_domain { + pub table: *mut em_perf_state, + pub nr_perf_states: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_ulong, + pub cpus: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } pub mod dl_dev_state { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const DL_DEV_NO_DRIVER: Type = 0; pub const DL_DEV_PROBING: Type = 1; pub const DL_DEV_DRIVER_BOUND: Type = 2; @@ -8000,8 +8104,14 @@ pub struct dev_links_info { pub defer_sync: list_head, pub status: dl_dev_state::Type, } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pm_message { + pub event: ::aya_ebpf::cty::c_int, +} +pub type pm_message_t = pm_message; pub mod rpm_request { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const RPM_REQ_NONE: Type = 0; pub const RPM_REQ_IDLE: Type = 1; pub const RPM_REQ_SUSPEND: Type = 2; @@ -8009,7 +8119,7 @@ pub mod rpm_request { pub const RPM_REQ_RESUME: Type = 4; } pub mod rpm_status { - pub type Type = ::aya_bpf::cty::c_int; + pub type Type = ::aya_ebpf::cty::c_int; pub const RPM_INVALID: Type = -1; pub const RPM_ACTIVE: Type = 0; pub const RPM_RESUMING: Type = 1; @@ -8038,12 +8148,12 @@ pub struct dev_pm_info { pub child_count: atomic_t, pub _bitfield_align_3: [u8; 0], pub _bitfield_3: __BindgenBitfieldUnit<[u8; 2usize]>, - pub links_count: ::aya_bpf::cty::c_uint, + pub links_count: ::aya_ebpf::cty::c_uint, pub request: rpm_request::Type, pub runtime_status: rpm_status::Type, pub last_status: rpm_status::Type, - pub runtime_error: ::aya_bpf::cty::c_int, - pub autosuspend_delay: ::aya_bpf::cty::c_int, + pub runtime_error: ::aya_ebpf::cty::c_int, + pub autosuspend_delay: ::aya_ebpf::cty::c_int, pub last_busy: u64_, pub active_time: u64_, pub suspended_time: u64_, @@ -8055,22 +8165,22 @@ pub struct dev_pm_info { } impl dev_pm_info { #[inline] - pub fn can_wakeup(&self) -> ::aya_bpf::cty::c_uint { + pub fn can_wakeup(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_can_wakeup(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_can_wakeup(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn async_suspend(&self) -> ::aya_bpf::cty::c_uint { + pub fn async_suspend(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_async_suspend(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_async_suspend(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) @@ -8166,8 +8276,8 @@ impl dev_pm_info { } #[inline] pub fn new_bitfield_1( - can_wakeup: ::aya_bpf::cty::c_uint, - async_suspend: ::aya_bpf::cty::c_uint, + can_wakeup: ::aya_ebpf::cty::c_uint, + async_suspend: ::aya_ebpf::cty::c_uint, in_dpm_list: bool_, is_prepared: bool_, is_suspended: bool_, @@ -8254,34 +8364,46 @@ impl dev_pm_info { } } #[inline] - pub fn must_resume(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_2.get(3usize, 1u8) as u32) } + pub fn async_in_progress(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_2.get(3usize, 1u8) as u8) } } #[inline] - pub fn set_must_resume(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_async_in_progress(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_2.set(3usize, 1u8, val as u64) } } #[inline] - pub fn may_skip_resume(&self) -> ::aya_bpf::cty::c_uint { + pub fn must_resume(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_2.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_may_skip_resume(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_must_resume(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_2.set(4usize, 1u8, val as u64) } } #[inline] + pub fn may_skip_resume(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_2.get(5usize, 1u8) as u32) } + } + #[inline] + pub fn set_may_skip_resume(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(5usize, 1u8, val as u64) + } + } + #[inline] pub fn new_bitfield_2( wakeup_path: bool_, syscore: bool_, no_pm_callbacks: bool_, - must_resume: ::aya_bpf::cty::c_uint, - may_skip_resume: ::aya_bpf::cty::c_uint, + async_in_progress: bool_, + must_resume: ::aya_ebpf::cty::c_uint, + may_skip_resume: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { @@ -8297,76 +8419,80 @@ impl dev_pm_info { no_pm_callbacks as u64 }); __bindgen_bitfield_unit.set(3usize, 1u8, { + let async_in_progress: u8 = unsafe { ::core::mem::transmute(async_in_progress) }; + async_in_progress as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { let must_resume: u32 = unsafe { ::core::mem::transmute(must_resume) }; must_resume as u64 }); - __bindgen_bitfield_unit.set(4usize, 1u8, { + __bindgen_bitfield_unit.set(5usize, 1u8, { let may_skip_resume: u32 = unsafe { ::core::mem::transmute(may_skip_resume) }; may_skip_resume as u64 }); __bindgen_bitfield_unit } #[inline] - pub fn disable_depth(&self) -> ::aya_bpf::cty::c_uint { + pub fn disable_depth(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(0usize, 3u8) as u32) } } #[inline] - pub fn set_disable_depth(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_disable_depth(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(0usize, 3u8, val as u64) } } #[inline] - pub fn idle_notification(&self) -> ::aya_bpf::cty::c_uint { + pub fn idle_notification(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_idle_notification(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_idle_notification(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(3usize, 1u8, val as u64) } } #[inline] - pub fn request_pending(&self) -> ::aya_bpf::cty::c_uint { + pub fn request_pending(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_request_pending(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_request_pending(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(4usize, 1u8, val as u64) } } #[inline] - pub fn deferred_resume(&self) -> ::aya_bpf::cty::c_uint { + pub fn deferred_resume(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(5usize, 1u8) as u32) } } #[inline] - pub fn set_deferred_resume(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_deferred_resume(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(5usize, 1u8, val as u64) } } #[inline] - pub fn needs_force_resume(&self) -> ::aya_bpf::cty::c_uint { + pub fn needs_force_resume(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(6usize, 1u8) as u32) } } #[inline] - pub fn set_needs_force_resume(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_needs_force_resume(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(6usize, 1u8, val as u64) } } #[inline] - pub fn runtime_auto(&self) -> ::aya_bpf::cty::c_uint { + pub fn runtime_auto(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(7usize, 1u8) as u32) } } #[inline] - pub fn set_runtime_auto(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_runtime_auto(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(7usize, 1u8, val as u64) @@ -8384,55 +8510,55 @@ impl dev_pm_info { } } #[inline] - pub fn no_callbacks(&self) -> ::aya_bpf::cty::c_uint { + pub fn no_callbacks(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(9usize, 1u8) as u32) } } #[inline] - pub fn set_no_callbacks(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_no_callbacks(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(9usize, 1u8, val as u64) } } #[inline] - pub fn irq_safe(&self) -> ::aya_bpf::cty::c_uint { + pub fn irq_safe(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(10usize, 1u8) as u32) } } #[inline] - pub fn set_irq_safe(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_irq_safe(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(10usize, 1u8, val as u64) } } #[inline] - pub fn use_autosuspend(&self) -> ::aya_bpf::cty::c_uint { + pub fn use_autosuspend(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(11usize, 1u8) as u32) } } #[inline] - pub fn set_use_autosuspend(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_use_autosuspend(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(11usize, 1u8, val as u64) } } #[inline] - pub fn timer_autosuspends(&self) -> ::aya_bpf::cty::c_uint { + pub fn timer_autosuspends(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(12usize, 1u8) as u32) } } #[inline] - pub fn set_timer_autosuspends(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_timer_autosuspends(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(12usize, 1u8, val as u64) } } #[inline] - pub fn memalloc_noio(&self) -> ::aya_bpf::cty::c_uint { + pub fn memalloc_noio(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_3.get(13usize, 1u8) as u32) } } #[inline] - pub fn set_memalloc_noio(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_memalloc_noio(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_3.set(13usize, 1u8, val as u64) @@ -8440,18 +8566,18 @@ impl dev_pm_info { } #[inline] pub fn new_bitfield_3( - disable_depth: ::aya_bpf::cty::c_uint, - idle_notification: ::aya_bpf::cty::c_uint, - request_pending: ::aya_bpf::cty::c_uint, - deferred_resume: ::aya_bpf::cty::c_uint, - needs_force_resume: ::aya_bpf::cty::c_uint, - runtime_auto: ::aya_bpf::cty::c_uint, + disable_depth: ::aya_ebpf::cty::c_uint, + idle_notification: ::aya_ebpf::cty::c_uint, + request_pending: ::aya_ebpf::cty::c_uint, + deferred_resume: ::aya_ebpf::cty::c_uint, + needs_force_resume: ::aya_ebpf::cty::c_uint, + runtime_auto: ::aya_ebpf::cty::c_uint, ignore_children: bool_, - no_callbacks: ::aya_bpf::cty::c_uint, - irq_safe: ::aya_bpf::cty::c_uint, - use_autosuspend: ::aya_bpf::cty::c_uint, - timer_autosuspends: ::aya_bpf::cty::c_uint, - memalloc_noio: ::aya_bpf::cty::c_uint, + no_callbacks: ::aya_ebpf::cty::c_uint, + irq_safe: ::aya_ebpf::cty::c_uint, + use_autosuspend: ::aya_ebpf::cty::c_uint, + timer_autosuspends: ::aya_ebpf::cty::c_uint, + memalloc_noio: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 2usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 3u8, { @@ -8515,7 +8641,7 @@ pub struct dev_msi_info { #[derive(Debug, Copy, Clone)] pub struct dev_archdata {} pub mod device_removable { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const DEVICE_REMOVABLE_NOT_SUPPORTED: Type = 0; pub const DEVICE_REMOVABLE_UNKNOWN: Type = 1; pub const DEVICE_FIXED: Type = 2; @@ -8527,12 +8653,12 @@ pub struct device { pub kobj: kobject, pub parent: *mut device, pub p: *mut device_private, - pub init_name: *const ::aya_bpf::cty::c_char, + pub init_name: *const ::aya_ebpf::cty::c_char, pub type_: *const device_type, pub bus: *const bus_type, pub driver: *mut device_driver, - pub platform_data: *mut ::aya_bpf::cty::c_void, - pub driver_data: *mut ::aya_bpf::cty::c_void, + pub platform_data: *mut ::aya_ebpf::cty::c_void, + pub driver_data: *mut ::aya_ebpf::cty::c_void, pub mutex: mutex, pub links: dev_links_info, pub power: dev_pm_info, @@ -8552,7 +8678,7 @@ pub struct device { pub archdata: dev_archdata, pub of_node: *mut device_node, pub fwnode: *mut fwnode_handle, - pub numa_node: ::aya_bpf::cty::c_int, + pub numa_node: ::aya_ebpf::cty::c_int, pub devt: dev_t, pub id: u32_, pub devres_lock: spinlock_t, @@ -8657,11 +8783,60 @@ impl device { } } #[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct dev_pm_ops { + pub prepare: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub complete: ::core::option::Option, + pub suspend: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub resume: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub freeze: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub thaw: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub poweroff: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub restore: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub suspend_late: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub resume_early: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub freeze_late: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub thaw_early: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub poweroff_late: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub restore_early: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub suspend_noirq: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub resume_noirq: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub freeze_noirq: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub thaw_noirq: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub poweroff_noirq: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub restore_noirq: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub runtime_suspend: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub runtime_resume: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub runtime_idle: + ::core::option::Option ::aya_ebpf::cty::c_int>, +} +#[repr(C)] #[derive(Copy, Clone)] pub struct pm_subsys_data { pub lock: spinlock_t, - pub refcount: ::aya_bpf::cty::c_uint, - pub clock_op_might_sleep: ::aya_bpf::cty::c_uint, + pub refcount: ::aya_ebpf::cty::c_uint, + pub clock_op_might_sleep: ::aya_ebpf::cty::c_uint, pub clock_mutex: mutex, pub clock_list: list_head, pub domain_data: *mut pm_domain_data, @@ -8669,23 +8844,23 @@ pub struct pm_subsys_data { #[repr(C)] #[derive(Copy, Clone)] pub struct wakeup_source { - pub name: *const ::aya_bpf::cty::c_char, - pub id: ::aya_bpf::cty::c_int, + pub name: *const ::aya_ebpf::cty::c_char, + pub id: ::aya_ebpf::cty::c_int, pub entry: list_head, pub lock: spinlock_t, pub wakeirq: *mut wake_irq, pub timer: timer_list, - pub timer_expires: ::aya_bpf::cty::c_ulong, + pub timer_expires: ::aya_ebpf::cty::c_ulong, pub total_time: ktime_t, pub max_time: ktime_t, pub last_time: ktime_t, pub start_prevent_time: ktime_t, pub prevent_sleep_time: ktime_t, - pub event_count: ::aya_bpf::cty::c_ulong, - pub active_count: ::aya_bpf::cty::c_ulong, - pub relax_count: ::aya_bpf::cty::c_ulong, - pub expire_count: ::aya_bpf::cty::c_ulong, - pub wakeup_count: ::aya_bpf::cty::c_ulong, + pub event_count: ::aya_ebpf::cty::c_ulong, + pub active_count: ::aya_ebpf::cty::c_ulong, + pub relax_count: ::aya_ebpf::cty::c_ulong, + pub expire_count: ::aya_ebpf::cty::c_ulong, + pub wakeup_count: ::aya_ebpf::cty::c_ulong, pub dev: *mut device, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, @@ -8736,55 +8911,60 @@ impl wakeup_source { pub struct dev_pm_domain { pub ops: dev_pm_ops, pub start: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub detach: ::core::option::Option, pub activate: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub sync: ::core::option::Option, pub dismiss: ::core::option::Option, + pub set_performance_state: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct bus_type { - pub name: *const ::aya_bpf::cty::c_char, - pub dev_name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, + pub dev_name: *const ::aya_ebpf::cty::c_char, pub bus_groups: *mut *const attribute_group, pub dev_groups: *mut *const attribute_group, pub drv_groups: *mut *const attribute_group, pub match_: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut device, arg2: *mut device_driver) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut device, arg2: *mut device_driver) -> ::aya_ebpf::cty::c_int, >, pub uevent: ::core::option::Option< unsafe extern "C" fn( arg1: *const device, arg2: *mut kobj_uevent_env, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub probe: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub sync_state: ::core::option::Option, pub remove: ::core::option::Option, pub shutdown: ::core::option::Option, pub online: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub offline: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub suspend: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut device, arg2: pm_message_t) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut device, arg2: pm_message_t) -> ::aya_ebpf::cty::c_int, >, pub resume: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub num_vf: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub dma_configure: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub dma_cleanup: ::core::option::Option, pub pm: *const dev_pm_ops, - pub iommu_ops: *const iommu_ops, pub need_parent_lock: bool_, } pub mod probe_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const PROBE_DEFAULT_STRATEGY: Type = 0; pub const PROBE_PREFER_ASYNCHRONOUS: Type = 1; pub const PROBE_FORCE_SYNCHRONOUS: Type = 2; @@ -8792,96 +8972,83 @@ pub mod probe_type { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct device_driver { - pub name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, pub bus: *const bus_type, pub owner: *mut module, - pub mod_name: *const ::aya_bpf::cty::c_char, + pub mod_name: *const ::aya_ebpf::cty::c_char, pub suppress_bind_attrs: bool_, pub probe_type: probe_type::Type, pub of_match_table: *const of_device_id, pub acpi_match_table: *const acpi_device_id, pub probe: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub sync_state: ::core::option::Option, pub remove: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub shutdown: ::core::option::Option, pub suspend: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut device, arg2: pm_message_t) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut device, arg2: pm_message_t) -> ::aya_ebpf::cty::c_int, >, pub resume: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub groups: *mut *const attribute_group, pub dev_groups: *mut *const attribute_group, pub pm: *const dev_pm_ops, pub coredump: ::core::option::Option, pub p: *mut driver_private, } -pub mod iommu_cap { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IOMMU_CAP_CACHE_COHERENCY: Type = 0; - pub const IOMMU_CAP_NOEXEC: Type = 1; - pub const IOMMU_CAP_PRE_BOOT_PROTECTION: Type = 2; - pub const IOMMU_CAP_ENFORCE_CACHE_COHERENCY: Type = 3; -} -pub mod iommu_dev_features { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IOMMU_DEV_FEAT_SVA: Type = 0; - pub const IOMMU_DEV_FEAT_IOPF: Type = 1; -} -pub type ioasid_t = ::aya_bpf::cty::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_ops { - pub capable: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut device, arg2: iommu_cap::Type) -> bool_, - >, - pub domain_alloc: ::core::option::Option< - unsafe extern "C" fn(arg1: ::aya_bpf::cty::c_uint) -> *mut iommu_domain, - >, - pub probe_device: - ::core::option::Option *mut iommu_device>, - pub release_device: ::core::option::Option, - pub probe_finalize: ::core::option::Option, - pub set_platform_dma_ops: ::core::option::Option, - pub device_group: - ::core::option::Option *mut iommu_group>, - pub get_resv_regions: - ::core::option::Option, - pub of_xlate: ::core::option::Option< +pub struct class { + pub name: *const ::aya_ebpf::cty::c_char, + pub class_groups: *mut *const attribute_group, + pub dev_groups: *mut *const attribute_group, + pub dev_uevent: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut device, - arg2: *mut of_phandle_args, - ) -> ::aya_bpf::cty::c_int, + arg1: *const device, + arg2: *mut kobj_uevent_env, + ) -> ::aya_ebpf::cty::c_int, >, - pub is_attach_deferred: - ::core::option::Option bool_>, - pub dev_enable_feat: ::core::option::Option< + pub devnode: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut device, - arg2: iommu_dev_features::Type, - ) -> ::aya_bpf::cty::c_int, + arg1: *const device, + arg2: *mut umode_t, + ) -> *mut ::aya_ebpf::cty::c_char, >, - pub dev_disable_feat: ::core::option::Option< + pub class_release: ::core::option::Option, + pub dev_release: ::core::option::Option, + pub shutdown_pre: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub ns_type: *const kobj_ns_type_operations, + pub namespace: ::core::option::Option< + unsafe extern "C" fn(arg1: *const device) -> *const ::aya_ebpf::cty::c_void, + >, + pub get_ownership: ::core::option::Option< + unsafe extern "C" fn(arg1: *const device, arg2: *mut kuid_t, arg3: *mut kgid_t), + >, + pub pm: *const dev_pm_ops, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct device_type { + pub name: *const ::aya_ebpf::cty::c_char, + pub groups: *mut *const attribute_group, + pub uevent: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut device, - arg2: iommu_dev_features::Type, - ) -> ::aya_bpf::cty::c_int, + arg1: *const device, + arg2: *mut kobj_uevent_env, + ) -> ::aya_ebpf::cty::c_int, >, - pub page_response: ::core::option::Option< + pub devnode: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut device, - arg2: *mut iommu_fault_event, - arg3: *mut iommu_page_response, - ) -> ::aya_bpf::cty::c_int, + arg1: *const device, + arg2: *mut umode_t, + arg3: *mut kuid_t, + arg4: *mut kgid_t, + ) -> *mut ::aya_ebpf::cty::c_char, >, - pub def_domain_type: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub remove_dev_pasid: - ::core::option::Option, - pub default_domain_ops: *const iommu_domain_ops, - pub pgsize_bitmap: ::aya_bpf::cty::c_ulong, - pub owner: *mut module, + pub release: ::core::option::Option, + pub pm: *const dev_pm_ops, } pub type Elf64_Addr = __u64; pub type Elf64_Half = __u16; @@ -8891,8 +9058,8 @@ pub type Elf64_Xword = __u64; #[derive(Debug, Copy, Clone)] pub struct elf64_sym { pub st_name: Elf64_Word, - pub st_info: ::aya_bpf::cty::c_uchar, - pub st_other: ::aya_bpf::cty::c_uchar, + pub st_info: ::aya_ebpf::cty::c_uchar, + pub st_other: ::aya_ebpf::cty::c_uchar, pub st_shndx: Elf64_Half, pub st_value: Elf64_Addr, pub st_size: Elf64_Xword, @@ -8900,7 +9067,7 @@ pub struct elf64_sym { #[repr(C)] #[derive(Copy, Clone)] pub struct kernel_param { - pub name: *const ::aya_bpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, pub mod_: *mut module, pub ops: *const kernel_param_ops, pub perm: u16_, @@ -8911,30 +9078,30 @@ pub struct kernel_param { #[repr(C)] #[derive(Copy, Clone)] pub union kernel_param__bindgen_ty_1 { - pub arg: *mut ::aya_bpf::cty::c_void, + pub arg: *mut ::aya_ebpf::cty::c_void, pub str_: *const kparam_string, pub arr: *const kparam_array, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct kparam_string { - pub maxlen: ::aya_bpf::cty::c_uint, - pub string: *mut ::aya_bpf::cty::c_char, + pub maxlen: ::aya_ebpf::cty::c_uint, + pub string: *mut ::aya_ebpf::cty::c_char, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct kparam_array { - pub max: ::aya_bpf::cty::c_uint, - pub elemsize: ::aya_bpf::cty::c_uint, - pub num: *mut ::aya_bpf::cty::c_uint, + pub max: ::aya_ebpf::cty::c_uint, + pub elemsize: ::aya_ebpf::cty::c_uint, + pub num: *mut ::aya_ebpf::cty::c_uint, pub ops: *const kernel_param_ops, - pub elem: *mut ::aya_bpf::cty::c_void, + pub elem: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct error_injection_entry { - pub addr: ::aya_bpf::cty::c_ulong, - pub etype: ::aya_bpf::cty::c_int, + pub addr: ::aya_ebpf::cty::c_ulong, + pub etype: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -8944,29 +9111,36 @@ pub struct module_attribute { unsafe extern "C" fn( arg1: *mut module_attribute, arg2: *mut module_kobject, - arg3: *mut ::aya_bpf::cty::c_char, + arg3: *mut ::aya_ebpf::cty::c_char, ) -> isize, >, pub store: ::core::option::Option< unsafe extern "C" fn( arg1: *mut module_attribute, arg2: *mut module_kobject, - arg3: *const ::aya_bpf::cty::c_char, + arg3: *const ::aya_ebpf::cty::c_char, arg4: usize, ) -> isize, >, pub setup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut module, arg2: *const ::aya_bpf::cty::c_char), + unsafe extern "C" fn(arg1: *mut module, arg2: *const ::aya_ebpf::cty::c_char), >, pub test: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub free: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] +pub struct kernel_symbol { + pub value_offset: ::aya_ebpf::cty::c_int, + pub name_offset: ::aya_ebpf::cty::c_int, + pub namespace_offset: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct trace_event { pub node: hlist_node, - pub type_: ::aya_bpf::cty::c_int, + pub type_: ::aya_ebpf::cty::c_int, pub funcs: *mut trace_event_functions, } #[repr(C)] @@ -8976,49 +9150,49 @@ pub struct trace_event_call { pub class: *mut trace_event_class, pub __bindgen_anon_1: trace_event_call__bindgen_ty_1, pub event: trace_event, - pub print_fmt: *mut ::aya_bpf::cty::c_char, + pub print_fmt: *mut ::aya_ebpf::cty::c_char, pub filter: *mut event_filter, pub __bindgen_anon_2: trace_event_call__bindgen_ty_2, - pub data: *mut ::aya_bpf::cty::c_void, - pub flags: ::aya_bpf::cty::c_int, - pub perf_refcount: ::aya_bpf::cty::c_int, + pub data: *mut ::aya_ebpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_int, + pub perf_refcount: ::aya_ebpf::cty::c_int, pub perf_events: *mut hlist_head, pub prog_array: *mut bpf_prog_array, pub perf_perm: ::core::option::Option< unsafe extern "C" fn( arg1: *mut trace_event_call, arg2: *mut perf_event, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Copy, Clone)] pub union trace_event_call__bindgen_ty_1 { - pub name: *mut ::aya_bpf::cty::c_char, + pub name: *mut ::aya_ebpf::cty::c_char, pub tp: *mut tracepoint, } #[repr(C)] #[derive(Copy, Clone)] pub union trace_event_call__bindgen_ty_2 { - pub module: *mut ::aya_bpf::cty::c_void, + pub module: *mut ::aya_ebpf::cty::c_void, pub refcnt: atomic_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct trace_eval_map { - pub system: *const ::aya_bpf::cty::c_char, - pub eval_string: *const ::aya_bpf::cty::c_char, - pub eval_value: ::aya_bpf::cty::c_ulong, + pub system: *const ::aya_ebpf::cty::c_char, + pub eval_string: *const ::aya_ebpf::cty::c_char, + pub eval_value: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct of_device_id { - pub name: [::aya_bpf::cty::c_char; 32usize], - pub type_: [::aya_bpf::cty::c_char; 32usize], - pub compatible: [::aya_bpf::cty::c_char; 128usize], - pub data: *const ::aya_bpf::cty::c_void, + pub name: [::aya_ebpf::cty::c_char; 32usize], + pub type_: [::aya_ebpf::cty::c_char; 32usize], + pub compatible: [::aya_ebpf::cty::c_char; 128usize], + pub data: *const ::aya_ebpf::cty::c_void, } -pub type kernel_ulong_t = ::aya_bpf::cty::c_ulong; +pub type kernel_ulong_t = ::aya_ebpf::cty::c_ulong; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct acpi_device_id { @@ -9027,145 +9201,15 @@ pub struct acpi_device_id { pub cls: __u32, pub cls_msk: __u32, } -pub type phandle = u32_; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fwnode_handle { - pub secondary: *mut fwnode_handle, - pub ops: *const fwnode_operations, - pub dev: *mut device, - pub suppliers: list_head, - pub consumers: list_head, - pub flags: u8_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct device_node { - pub name: *const ::aya_bpf::cty::c_char, - pub phandle: phandle, - pub full_name: *const ::aya_bpf::cty::c_char, - pub fwnode: fwnode_handle, - pub properties: *mut property, - pub deadprops: *mut property, - pub parent: *mut device_node, - pub child: *mut device_node, - pub sibling: *mut device_node, - pub _flags: ::aya_bpf::cty::c_ulong, - pub data: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct em_perf_state { - pub frequency: ::aya_bpf::cty::c_ulong, - pub power: ::aya_bpf::cty::c_ulong, - pub cost: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug)] -pub struct em_perf_domain { - pub table: *mut em_perf_state, - pub nr_perf_states: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_ulong, - pub cpus: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct class { - pub name: *const ::aya_bpf::cty::c_char, - pub class_groups: *mut *const attribute_group, - pub dev_groups: *mut *const attribute_group, - pub dev_uevent: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const device, - arg2: *mut kobj_uevent_env, - ) -> ::aya_bpf::cty::c_int, - >, - pub devnode: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const device, - arg2: *mut umode_t, - ) -> *mut ::aya_bpf::cty::c_char, - >, - pub class_release: ::core::option::Option, - pub dev_release: ::core::option::Option, - pub shutdown_pre: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub ns_type: *const kobj_ns_type_operations, - pub namespace: ::core::option::Option< - unsafe extern "C" fn(arg1: *const device) -> *const ::aya_bpf::cty::c_void, - >, - pub get_ownership: ::core::option::Option< - unsafe extern "C" fn(arg1: *const device, arg2: *mut kuid_t, arg3: *mut kgid_t), - >, - pub pm: *const dev_pm_ops, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct device_type { - pub name: *const ::aya_bpf::cty::c_char, - pub groups: *mut *const attribute_group, - pub uevent: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const device, - arg2: *mut kobj_uevent_env, - ) -> ::aya_bpf::cty::c_int, - >, - pub devnode: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const device, - arg2: *mut umode_t, - arg3: *mut kuid_t, - arg4: *mut kgid_t, - ) -> *mut ::aya_bpf::cty::c_char, - >, - pub release: ::core::option::Option, - pub pm: *const dev_pm_ops, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct device_attribute { - pub attr: attribute, - pub show: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut device, - arg2: *mut device_attribute, - arg3: *mut ::aya_bpf::cty::c_char, - ) -> isize, - >, - pub store: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut device, - arg2: *mut device_attribute, - arg3: *const ::aya_bpf::cty::c_char, - arg4: usize, - ) -> isize, - >, -} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct device_dma_parameters { - pub max_segment_size: ::aya_bpf::cty::c_uint, - pub min_align_mask: ::aya_bpf::cty::c_uint, - pub segment_boundary_mask: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct msi_dev_domain { - pub store: xarray, - pub domain: *mut irq_domain, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct msi_device_data { - pub properties: ::aya_bpf::cty::c_ulong, - pub platform_data: *mut platform_msi_priv_data, - pub mutex: mutex, - pub __domains: [msi_dev_domain; 2usize], - pub __iter_idx: ::aya_bpf::cty::c_ulong, + pub max_segment_size: ::aya_ebpf::cty::c_uint, + pub min_align_mask: ::aya_ebpf::cty::c_uint, + pub segment_boundary_mask: ::aya_ebpf::cty::c_ulong, } pub mod device_physical_location_panel { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const DEVICE_PANEL_TOP: Type = 0; pub const DEVICE_PANEL_BOTTOM: Type = 1; pub const DEVICE_PANEL_LEFT: Type = 2; @@ -9175,13 +9219,13 @@ pub mod device_physical_location_panel { pub const DEVICE_PANEL_UNKNOWN: Type = 6; } pub mod device_physical_location_vertical_position { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const DEVICE_VERT_POS_UPPER: Type = 0; pub const DEVICE_VERT_POS_CENTER: Type = 1; pub const DEVICE_VERT_POS_LOWER: Type = 2; } pub mod device_physical_location_horizontal_position { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const DEVICE_HORI_POS_LEFT: Type = 0; pub const DEVICE_HORI_POS_CENTER: Type = 1; pub const DEVICE_HORI_POS_RIGHT: Type = 2; @@ -9197,7 +9241,7 @@ pub struct device_physical_location { } pub type dma_addr_t = u64_; pub mod dma_data_direction { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const DMA_BIDIRECTIONAL: Type = 0; pub const DMA_TO_DEVICE: Type = 1; pub const DMA_FROM_DEVICE: Type = 2; @@ -9206,23 +9250,23 @@ pub mod dma_data_direction { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct dma_map_ops { - pub flags: ::aya_bpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, pub alloc: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, arg2: usize, arg3: *mut dma_addr_t, arg4: gfp_t, - arg5: ::aya_bpf::cty::c_ulong, - ) -> *mut ::aya_bpf::cty::c_void, + arg5: ::aya_ebpf::cty::c_ulong, + ) -> *mut ::aya_ebpf::cty::c_void, >, pub free: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, arg2: usize, - arg3: *mut ::aya_bpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: dma_addr_t, - arg5: ::aya_bpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, ), >, pub alloc_pages: ::core::option::Option< @@ -9249,7 +9293,7 @@ pub struct dma_map_ops { arg2: usize, arg3: dma_data_direction::Type, arg4: gfp_t, - arg5: ::aya_bpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, ) -> *mut sg_table, >, pub free_noncontiguous: ::core::option::Option< @@ -9264,30 +9308,30 @@ pub struct dma_map_ops { unsafe extern "C" fn( arg1: *mut device, arg2: *mut vm_area_struct, - arg3: *mut ::aya_bpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: dma_addr_t, arg5: usize, - arg6: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg6: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, pub get_sgtable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, arg2: *mut sg_table, - arg3: *mut ::aya_bpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: dma_addr_t, arg5: usize, - arg6: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg6: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, pub map_page: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, arg2: *mut page, - arg3: ::aya_bpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, arg4: usize, arg5: dma_data_direction::Type, - arg6: ::aya_bpf::cty::c_ulong, + arg6: ::aya_ebpf::cty::c_ulong, ) -> dma_addr_t, >, pub unmap_page: ::core::option::Option< @@ -9296,25 +9340,25 @@ pub struct dma_map_ops { arg2: dma_addr_t, arg3: usize, arg4: dma_data_direction::Type, - arg5: ::aya_bpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, ), >, pub map_sg: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, arg2: *mut scatterlist, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: dma_data_direction::Type, - arg5: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, pub unmap_sg: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, arg2: *mut scatterlist, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: dma_data_direction::Type, - arg5: ::aya_bpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, ), >, pub map_resource: ::core::option::Option< @@ -9323,7 +9367,7 @@ pub struct dma_map_ops { arg2: phys_addr_t, arg3: usize, arg4: dma_data_direction::Type, - arg5: ::aya_bpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, ) -> dma_addr_t, >, pub unmap_resource: ::core::option::Option< @@ -9332,7 +9376,7 @@ pub struct dma_map_ops { arg2: dma_addr_t, arg3: usize, arg4: dma_data_direction::Type, - arg5: ::aya_bpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, ), >, pub sync_single_for_cpu: ::core::option::Option< @@ -9355,7 +9399,7 @@ pub struct dma_map_ops { unsafe extern "C" fn( arg1: *mut device, arg2: *mut scatterlist, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: dma_data_direction::Type, ), >, @@ -9363,26 +9407,26 @@ pub struct dma_map_ops { unsafe extern "C" fn( arg1: *mut device, arg2: *mut scatterlist, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: dma_data_direction::Type, ), >, pub cache_sync: ::core::option::Option< unsafe extern "C" fn( arg1: *mut device, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: usize, arg4: dma_data_direction::Type, ), >, pub dma_supported: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut device, arg2: u64_) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut device, arg2: u64_) -> ::aya_ebpf::cty::c_int, >, pub get_required_mask: ::core::option::Option u64_>, pub max_mapping_size: ::core::option::Option usize>, pub opt_mapping_size: ::core::option::Option usize>, pub get_merge_boundary: - ::core::option::Option ::aya_bpf::cty::c_ulong>, + ::core::option::Option ::aya_ebpf::cty::c_ulong>, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -9390,2189 +9434,964 @@ pub struct bus_dma_region { pub cpu_start: phys_addr_t, pub dma_start: dma_addr_t, pub size: u64_, - pub offset: u64_, -} -pub mod dev_dma_attr { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEV_DMA_NOT_SUPPORTED: Type = 0; - pub const DEV_DMA_NON_COHERENT: Type = 1; - pub const DEV_DMA_COHERENT: Type = 2; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fwnode_operations { - pub get: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fwnode_handle) -> *mut fwnode_handle, - >, - pub put: ::core::option::Option, - pub device_is_available: - ::core::option::Option bool_>, - pub device_get_match_data: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *const device, - ) -> *const ::aya_bpf::cty::c_void, - >, - pub device_dma_supported: - ::core::option::Option bool_>, - pub device_get_dma_attr: ::core::option::Option< - unsafe extern "C" fn(arg1: *const fwnode_handle) -> dev_dma_attr::Type, - >, - pub property_present: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *const ::aya_bpf::cty::c_char, - ) -> bool_, - >, - pub property_read_int_array: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *const ::aya_bpf::cty::c_char, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut ::aya_bpf::cty::c_void, - arg5: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub property_read_string_array: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *const ::aya_bpf::cty::c_char, - arg3: *mut *const ::aya_bpf::cty::c_char, - arg4: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_name: ::core::option::Option< - unsafe extern "C" fn(arg1: *const fwnode_handle) -> *const ::aya_bpf::cty::c_char, - >, - pub get_name_prefix: ::core::option::Option< - unsafe extern "C" fn(arg1: *const fwnode_handle) -> *const ::aya_bpf::cty::c_char, - >, - pub get_parent: ::core::option::Option< - unsafe extern "C" fn(arg1: *const fwnode_handle) -> *mut fwnode_handle, - >, - pub get_next_child_node: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *mut fwnode_handle, - ) -> *mut fwnode_handle, - >, - pub get_named_child_node: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *const ::aya_bpf::cty::c_char, - ) -> *mut fwnode_handle, - >, - pub get_reference_args: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *const ::aya_bpf::cty::c_char, - arg3: *const ::aya_bpf::cty::c_char, - arg4: ::aya_bpf::cty::c_uint, - arg5: ::aya_bpf::cty::c_uint, - arg6: *mut fwnode_reference_args, - ) -> ::aya_bpf::cty::c_int, - >, - pub graph_get_next_endpoint: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *mut fwnode_handle, - ) -> *mut fwnode_handle, - >, - pub graph_get_remote_endpoint: ::core::option::Option< - unsafe extern "C" fn(arg1: *const fwnode_handle) -> *mut fwnode_handle, - >, - pub graph_get_port_parent: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fwnode_handle) -> *mut fwnode_handle, - >, - pub graph_parse_endpoint: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: *mut fwnode_endpoint, - ) -> ::aya_bpf::cty::c_int, - >, - pub iomap: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fwnode_handle, - arg2: ::aya_bpf::cty::c_int, - ) -> *mut ::aya_bpf::cty::c_void, - >, - pub irq_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const fwnode_handle, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub add_links: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fwnode_handle) -> ::aya_bpf::cty::c_int, - >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fwnode_endpoint { - pub port: ::aya_bpf::cty::c_uint, - pub id: ::aya_bpf::cty::c_uint, - pub local_fwnode: *const fwnode_handle, +pub struct seq_buf { + pub buffer: *mut ::aya_ebpf::cty::c_char, + pub size: usize, + pub len: usize, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fwnode_reference_args { - pub fwnode: *mut fwnode_handle, - pub nargs: ::aya_bpf::cty::c_uint, - pub args: [u64_; 8usize], +pub struct trace_seq { + pub buffer: [::aya_ebpf::cty::c_char; 8156usize], + pub seq: seq_buf, + pub readpos: usize, + pub full: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub union msi_instance_cookie { - pub value: u64_, - pub ptr: *mut ::aya_bpf::cty::c_void, -} -pub type irq_flow_handler_t = ::core::option::Option; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct irq_common_data { - pub state_use_accessors: ::aya_bpf::cty::c_uint, - pub node: ::aya_bpf::cty::c_uint, - pub handler_data: *mut ::aya_bpf::cty::c_void, - pub msi_desc: *mut msi_desc, - pub affinity: cpumask_var_t, - pub effective_affinity: cpumask_var_t, +pub union perf_mem_data_src { + pub val: __u64, + pub __bindgen_anon_1: perf_mem_data_src__bindgen_ty_1, } #[repr(C)] +#[repr(align(8))] #[derive(Debug, Copy, Clone)] -pub struct irq_data { - pub mask: u32_, - pub irq: ::aya_bpf::cty::c_uint, - pub hwirq: ::aya_bpf::cty::c_ulong, - pub common: *mut irq_common_data, - pub chip: *mut irq_chip, - pub domain: *mut irq_domain, - pub parent_data: *mut irq_data, - pub chip_data: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct irq_desc { - pub irq_common_data: irq_common_data, - pub irq_data: irq_data, - pub kstat_irqs: *mut ::aya_bpf::cty::c_uint, - pub handle_irq: irq_flow_handler_t, - pub action: *mut irqaction, - pub status_use_accessors: ::aya_bpf::cty::c_uint, - pub core_internal_state__do_not_mess_with_it: ::aya_bpf::cty::c_uint, - pub depth: ::aya_bpf::cty::c_uint, - pub wake_depth: ::aya_bpf::cty::c_uint, - pub tot_count: ::aya_bpf::cty::c_uint, - pub irq_count: ::aya_bpf::cty::c_uint, - pub last_unhandled: ::aya_bpf::cty::c_ulong, - pub irqs_unhandled: ::aya_bpf::cty::c_uint, - pub threads_handled: atomic_t, - pub threads_handled_last: ::aya_bpf::cty::c_int, - pub lock: raw_spinlock_t, - pub percpu_enabled: *mut cpumask, - pub percpu_affinity: *const cpumask, - pub affinity_hint: *const cpumask, - pub affinity_notify: *mut irq_affinity_notify, - pub pending_mask: cpumask_var_t, - pub threads_oneshot: ::aya_bpf::cty::c_ulong, - pub threads_active: atomic_t, - pub wait_for_threads: wait_queue_head_t, - pub nr_actions: ::aya_bpf::cty::c_uint, - pub no_suspend_depth: ::aya_bpf::cty::c_uint, - pub cond_suspend_depth: ::aya_bpf::cty::c_uint, - pub force_resume_depth: ::aya_bpf::cty::c_uint, - pub dir: *mut proc_dir_entry, - pub rcu: callback_head, - pub kobj: kobject, - pub request_mutex: mutex, - pub parent_irq: ::aya_bpf::cty::c_int, - pub owner: *mut module, - pub name: *const ::aya_bpf::cty::c_char, - pub _bitfield_align_1: [u8; 0], +pub struct perf_mem_data_src__bindgen_ty_1 { + pub _bitfield_align_1: [u32; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } -impl irq_desc { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct x86_msi_addr_lo { - pub __bindgen_anon_1: x86_msi_addr_lo__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union x86_msi_addr_lo__bindgen_ty_1 { - pub __bindgen_anon_1: x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[repr(align(4))] -#[derive(Debug, Copy, Clone)] -pub struct x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_1 { - pub _bitfield_align_1: [u16; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, -} -impl x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_1 { +impl perf_mem_data_src__bindgen_ty_1 { #[inline] - pub fn reserved_0(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u32) } + pub fn mem_op(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 5u8) as u64) } } #[inline] - pub fn set_reserved_0(&mut self, val: u32_) { + pub fn set_mem_op(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 2u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 5u8, val as u64) } } #[inline] - pub fn dest_mode_logical(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn mem_lvl(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 14u8) as u64) } } #[inline] - pub fn set_dest_mode_logical(&mut self, val: u32_) { + pub fn set_mem_lvl(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 14u8, val as u64) } } #[inline] - pub fn redirect_hint(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + pub fn mem_snoop(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(19usize, 5u8) as u64) } } #[inline] - pub fn set_redirect_hint(&mut self, val: u32_) { + pub fn set_mem_snoop(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(19usize, 5u8, val as u64) } } #[inline] - pub fn reserved_1(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + pub fn mem_lock(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 2u8) as u64) } } #[inline] - pub fn set_reserved_1(&mut self, val: u32_) { + pub fn set_mem_lock(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(24usize, 2u8, val as u64) } } #[inline] - pub fn virt_destid_8_14(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 7u8) as u32) } + pub fn mem_dtlb(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(26usize, 7u8) as u64) } } #[inline] - pub fn set_virt_destid_8_14(&mut self, val: u32_) { + pub fn set_mem_dtlb(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 7u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(26usize, 7u8, val as u64) } } #[inline] - pub fn destid_0_7(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 8u8) as u32) } + pub fn mem_lvl_num(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(33usize, 4u8) as u64) } } #[inline] - pub fn set_destid_0_7(&mut self, val: u32_) { + pub fn set_mem_lvl_num(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(12usize, 8u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(33usize, 4u8, val as u64) } } #[inline] - pub fn base_address(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 12u8) as u32) } + pub fn mem_remote(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(37usize, 1u8) as u64) } } #[inline] - pub fn set_base_address(&mut self, val: u32_) { + pub fn set_mem_remote(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(20usize, 12u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(37usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - reserved_0: u32_, - dest_mode_logical: u32_, - redirect_hint: u32_, - reserved_1: u32_, - virt_destid_8_14: u32_, - destid_0_7: u32_, - base_address: u32_, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 2u8, { - let reserved_0: u32 = unsafe { ::core::mem::transmute(reserved_0) }; - reserved_0 as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let dest_mode_logical: u32 = unsafe { ::core::mem::transmute(dest_mode_logical) }; - dest_mode_logical as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let redirect_hint: u32 = unsafe { ::core::mem::transmute(redirect_hint) }; - redirect_hint as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let reserved_1: u32 = unsafe { ::core::mem::transmute(reserved_1) }; - reserved_1 as u64 - }); - __bindgen_bitfield_unit.set(5usize, 7u8, { - let virt_destid_8_14: u32 = unsafe { ::core::mem::transmute(virt_destid_8_14) }; - virt_destid_8_14 as u64 - }); - __bindgen_bitfield_unit.set(12usize, 8u8, { - let destid_0_7: u32 = unsafe { ::core::mem::transmute(destid_0_7) }; - destid_0_7 as u64 - }); - __bindgen_bitfield_unit.set(20usize, 12u8, { - let base_address: u32 = unsafe { ::core::mem::transmute(base_address) }; - base_address as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[repr(align(4))] -#[derive(Debug, Copy, Clone)] -pub struct x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_2 { - pub _bitfield_align_1: [u16; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, -} -impl x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_2 { - #[inline] - pub fn dmar_reserved_0(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u32) } + pub fn mem_snoopx(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(38usize, 2u8) as u64) } } #[inline] - pub fn set_dmar_reserved_0(&mut self, val: u32_) { + pub fn set_mem_snoopx(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 2u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(38usize, 2u8, val as u64) } } #[inline] - pub fn dmar_index_15(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn mem_blk(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(40usize, 3u8) as u64) } } #[inline] - pub fn set_dmar_index_15(&mut self, val: u32_) { + pub fn set_mem_blk(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(40usize, 3u8, val as u64) } } #[inline] - pub fn dmar_subhandle_valid(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + pub fn mem_hops(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(43usize, 3u8) as u64) } } #[inline] - pub fn set_dmar_subhandle_valid(&mut self, val: u32_) { + pub fn set_mem_hops(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn dmar_format(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } - } - #[inline] - pub fn set_dmar_format(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn dmar_index_0_14(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 15u8) as u32) } - } - #[inline] - pub fn set_dmar_index_0_14(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 15u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(43usize, 3u8, val as u64) } } #[inline] - pub fn dmar_base_address(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 12u8) as u32) } + pub fn mem_rsvd(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(46usize, 18u8) as u64) } } #[inline] - pub fn set_dmar_base_address(&mut self, val: u32_) { + pub fn set_mem_rsvd(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(20usize, 12u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(46usize, 18u8, val as u64) } } #[inline] pub fn new_bitfield_1( - dmar_reserved_0: u32_, - dmar_index_15: u32_, - dmar_subhandle_valid: u32_, - dmar_format: u32_, - dmar_index_0_14: u32_, - dmar_base_address: u32_, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 2u8, { - let dmar_reserved_0: u32 = unsafe { ::core::mem::transmute(dmar_reserved_0) }; - dmar_reserved_0 as u64 + mem_op: __u64, + mem_lvl: __u64, + mem_snoop: __u64, + mem_lock: __u64, + mem_dtlb: __u64, + mem_lvl_num: __u64, + mem_remote: __u64, + mem_snoopx: __u64, + mem_blk: __u64, + mem_hops: __u64, + mem_rsvd: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 5u8, { + let mem_op: u64 = unsafe { ::core::mem::transmute(mem_op) }; + mem_op as u64 }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let dmar_index_15: u32 = unsafe { ::core::mem::transmute(dmar_index_15) }; - dmar_index_15 as u64 + __bindgen_bitfield_unit.set(5usize, 14u8, { + let mem_lvl: u64 = unsafe { ::core::mem::transmute(mem_lvl) }; + mem_lvl as u64 }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let dmar_subhandle_valid: u32 = unsafe { ::core::mem::transmute(dmar_subhandle_valid) }; - dmar_subhandle_valid as u64 + __bindgen_bitfield_unit.set(19usize, 5u8, { + let mem_snoop: u64 = unsafe { ::core::mem::transmute(mem_snoop) }; + mem_snoop as u64 }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let dmar_format: u32 = unsafe { ::core::mem::transmute(dmar_format) }; - dmar_format as u64 + __bindgen_bitfield_unit.set(24usize, 2u8, { + let mem_lock: u64 = unsafe { ::core::mem::transmute(mem_lock) }; + mem_lock as u64 }); - __bindgen_bitfield_unit.set(5usize, 15u8, { - let dmar_index_0_14: u32 = unsafe { ::core::mem::transmute(dmar_index_0_14) }; - dmar_index_0_14 as u64 + __bindgen_bitfield_unit.set(26usize, 7u8, { + let mem_dtlb: u64 = unsafe { ::core::mem::transmute(mem_dtlb) }; + mem_dtlb as u64 }); - __bindgen_bitfield_unit.set(20usize, 12u8, { - let dmar_base_address: u32 = unsafe { ::core::mem::transmute(dmar_base_address) }; - dmar_base_address as u64 + __bindgen_bitfield_unit.set(33usize, 4u8, { + let mem_lvl_num: u64 = unsafe { ::core::mem::transmute(mem_lvl_num) }; + mem_lvl_num as u64 }); - __bindgen_bitfield_unit - } -} -pub type arch_msi_msg_addr_lo_t = x86_msi_addr_lo; -#[repr(C)] -#[repr(align(4))] -#[derive(Debug, Copy, Clone)] -pub struct x86_msi_addr_hi { - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, -} -impl x86_msi_addr_hi { - #[inline] - pub fn reserved(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } - } - #[inline] - pub fn set_reserved(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 8u8, val as u64) - } - } - #[inline] - pub fn destid_8_31(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 24u8) as u32) } - } - #[inline] - pub fn set_destid_8_31(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 24u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - reserved: u32_, - destid_8_31: u32_, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 8u8, { - let reserved: u32 = unsafe { ::core::mem::transmute(reserved) }; - reserved as u64 + __bindgen_bitfield_unit.set(37usize, 1u8, { + let mem_remote: u64 = unsafe { ::core::mem::transmute(mem_remote) }; + mem_remote as u64 }); - __bindgen_bitfield_unit.set(8usize, 24u8, { - let destid_8_31: u32 = unsafe { ::core::mem::transmute(destid_8_31) }; - destid_8_31 as u64 + __bindgen_bitfield_unit.set(38usize, 2u8, { + let mem_snoopx: u64 = unsafe { ::core::mem::transmute(mem_snoopx) }; + mem_snoopx as u64 + }); + __bindgen_bitfield_unit.set(40usize, 3u8, { + let mem_blk: u64 = unsafe { ::core::mem::transmute(mem_blk) }; + mem_blk as u64 + }); + __bindgen_bitfield_unit.set(43usize, 3u8, { + let mem_hops: u64 = unsafe { ::core::mem::transmute(mem_hops) }; + mem_hops as u64 + }); + __bindgen_bitfield_unit.set(46usize, 18u8, { + let mem_rsvd: u64 = unsafe { ::core::mem::transmute(mem_rsvd) }; + mem_rsvd as u64 }); __bindgen_bitfield_unit } } -pub type arch_msi_msg_addr_hi_t = x86_msi_addr_hi; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct x86_msi_data { - pub __bindgen_anon_1: x86_msi_data__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union x86_msi_data__bindgen_ty_1 { - pub __bindgen_anon_1: x86_msi_data__bindgen_ty_1__bindgen_ty_1, - pub dmar_subhandle: u32_, -} #[repr(C)] -#[repr(align(4))] #[derive(Debug, Copy, Clone)] -pub struct x86_msi_data__bindgen_ty_1__bindgen_ty_1 { - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, - pub __bindgen_padding_0: u16, +pub struct perf_branch_entry { + pub from: __u64, + pub to: __u64, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } -impl x86_msi_data__bindgen_ty_1__bindgen_ty_1 { - #[inline] - pub fn vector(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } - } - #[inline] - pub fn set_vector(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 8u8, val as u64) - } - } - #[inline] - pub fn delivery_mode(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 3u8) as u32) } - } - #[inline] - pub fn set_delivery_mode(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 3u8, val as u64) - } - } +impl perf_branch_entry { #[inline] - pub fn dest_mode_logical(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) } + pub fn mispred(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } } #[inline] - pub fn set_dest_mode_logical(&mut self, val: u32_) { + pub fn set_mispred(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn reserved(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 2u8) as u32) } + pub fn predicted(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } } #[inline] - pub fn set_reserved(&mut self, val: u32_) { + pub fn set_predicted(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(12usize, 2u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn active_low(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) } + pub fn in_tx(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } } #[inline] - pub fn set_active_low(&mut self, val: u32_) { + pub fn set_in_tx(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(14usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn is_level(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) } + pub fn abort(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } } #[inline] - pub fn set_is_level(&mut self, val: u32_) { + pub fn set_abort(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(15usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - vector: u32_, - delivery_mode: u32_, - dest_mode_logical: u32_, - reserved: u32_, - active_low: u32_, - is_level: u32_, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 8u8, { - let vector: u32 = unsafe { ::core::mem::transmute(vector) }; - vector as u64 - }); - __bindgen_bitfield_unit.set(8usize, 3u8, { - let delivery_mode: u32 = unsafe { ::core::mem::transmute(delivery_mode) }; - delivery_mode as u64 - }); - __bindgen_bitfield_unit.set(11usize, 1u8, { - let dest_mode_logical: u32 = unsafe { ::core::mem::transmute(dest_mode_logical) }; - dest_mode_logical as u64 - }); - __bindgen_bitfield_unit.set(12usize, 2u8, { - let reserved: u32 = unsafe { ::core::mem::transmute(reserved) }; - reserved as u64 - }); - __bindgen_bitfield_unit.set(14usize, 1u8, { - let active_low: u32 = unsafe { ::core::mem::transmute(active_low) }; - active_low as u64 - }); - __bindgen_bitfield_unit.set(15usize, 1u8, { - let is_level: u32 = unsafe { ::core::mem::transmute(is_level) }; - is_level as u64 - }); - __bindgen_bitfield_unit - } -} -pub type arch_msi_msg_data_t = x86_msi_data; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct msi_msg { - pub __bindgen_anon_1: msi_msg__bindgen_ty_1, - pub __bindgen_anon_2: msi_msg__bindgen_ty_2, - pub __bindgen_anon_3: msi_msg__bindgen_ty_3, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union msi_msg__bindgen_ty_1 { - pub address_lo: u32_, - pub arch_addr_lo: arch_msi_msg_addr_lo_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union msi_msg__bindgen_ty_2 { - pub address_hi: u32_, - pub arch_addr_hi: arch_msi_msg_addr_hi_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union msi_msg__bindgen_ty_3 { - pub data: u32_, - pub arch_data: arch_msi_msg_data_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct pci_msi_desc { - pub __bindgen_anon_1: pci_msi_desc__bindgen_ty_1, - pub msi_attrib: pci_msi_desc__bindgen_ty_2, - pub __bindgen_anon_2: pci_msi_desc__bindgen_ty_3, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union pci_msi_desc__bindgen_ty_1 { - pub msi_mask: u32_, - pub msix_ctrl: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pci_msi_desc__bindgen_ty_2 { - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, - pub default_irq: ::aya_bpf::cty::c_uint, -} -impl pci_msi_desc__bindgen_ty_2 { - #[inline] - pub fn is_msix(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn cycles(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 16u8) as u64) } } #[inline] - pub fn set_is_msix(&mut self, val: u8_) { + pub fn set_cycles(&mut self, val: __u64) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 16u8, val as u64) } } #[inline] - pub fn multiple(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 3u8) as u8) } + pub fn type_(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 4u8) as u64) } } #[inline] - pub fn set_multiple(&mut self, val: u8_) { + pub fn set_type(&mut self, val: __u64) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 3u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(20usize, 4u8, val as u64) } } #[inline] - pub fn multi_cap(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 3u8) as u8) } + pub fn spec(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 2u8) as u64) } } #[inline] - pub fn set_multi_cap(&mut self, val: u8_) { + pub fn set_spec(&mut self, val: __u64) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 3u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(24usize, 2u8, val as u64) } } #[inline] - pub fn can_mask(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + pub fn new_type(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(26usize, 4u8) as u64) } } #[inline] - pub fn set_can_mask(&mut self, val: u8_) { + pub fn set_new_type(&mut self, val: __u64) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(26usize, 4u8, val as u64) } } #[inline] - pub fn is_64(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u8) } + pub fn priv_(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(30usize, 3u8) as u64) } } #[inline] - pub fn set_is_64(&mut self, val: u8_) { + pub fn set_priv(&mut self, val: __u64) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(30usize, 3u8, val as u64) } } #[inline] - pub fn is_virtual(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u8) } + pub fn reserved(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(33usize, 31u8) as u64) } } #[inline] - pub fn set_is_virtual(&mut self, val: u8_) { + pub fn set_reserved(&mut self, val: __u64) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(9usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(33usize, 31u8, val as u64) } } #[inline] pub fn new_bitfield_1( - is_msix: u8_, - multiple: u8_, - multi_cap: u8_, - can_mask: u8_, - is_64: u8_, - is_virtual: u8_, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + mispred: __u64, + predicted: __u64, + in_tx: __u64, + abort: __u64, + cycles: __u64, + type_: __u64, + spec: __u64, + new_type: __u64, + priv_: __u64, + reserved: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_msix: u8 = unsafe { ::core::mem::transmute(is_msix) }; - is_msix as u64 + let mispred: u64 = unsafe { ::core::mem::transmute(mispred) }; + mispred as u64 }); - __bindgen_bitfield_unit.set(1usize, 3u8, { - let multiple: u8 = unsafe { ::core::mem::transmute(multiple) }; - multiple as u64 + __bindgen_bitfield_unit.set(1usize, 1u8, { + let predicted: u64 = unsafe { ::core::mem::transmute(predicted) }; + predicted as u64 }); - __bindgen_bitfield_unit.set(4usize, 3u8, { - let multi_cap: u8 = unsafe { ::core::mem::transmute(multi_cap) }; - multi_cap as u64 + __bindgen_bitfield_unit.set(2usize, 1u8, { + let in_tx: u64 = unsafe { ::core::mem::transmute(in_tx) }; + in_tx as u64 }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let can_mask: u8 = unsafe { ::core::mem::transmute(can_mask) }; - can_mask as u64 + __bindgen_bitfield_unit.set(3usize, 1u8, { + let abort: u64 = unsafe { ::core::mem::transmute(abort) }; + abort as u64 }); - __bindgen_bitfield_unit.set(8usize, 1u8, { - let is_64: u8 = unsafe { ::core::mem::transmute(is_64) }; - is_64 as u64 + __bindgen_bitfield_unit.set(4usize, 16u8, { + let cycles: u64 = unsafe { ::core::mem::transmute(cycles) }; + cycles as u64 }); - __bindgen_bitfield_unit.set(9usize, 1u8, { - let is_virtual: u8 = unsafe { ::core::mem::transmute(is_virtual) }; - is_virtual as u64 + __bindgen_bitfield_unit.set(20usize, 4u8, { + let type_: u64 = unsafe { ::core::mem::transmute(type_) }; + type_ as u64 + }); + __bindgen_bitfield_unit.set(24usize, 2u8, { + let spec: u64 = unsafe { ::core::mem::transmute(spec) }; + spec as u64 + }); + __bindgen_bitfield_unit.set(26usize, 4u8, { + let new_type: u64 = unsafe { ::core::mem::transmute(new_type) }; + new_type as u64 + }); + __bindgen_bitfield_unit.set(30usize, 3u8, { + let priv_: u64 = unsafe { ::core::mem::transmute(priv_) }; + priv_ as u64 + }); + __bindgen_bitfield_unit.set(33usize, 31u8, { + let reserved: u64 = unsafe { ::core::mem::transmute(reserved) }; + reserved as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Copy, Clone)] -pub union pci_msi_desc__bindgen_ty_3 { - pub mask_pos: u8_, - pub mask_base: *mut ::aya_bpf::cty::c_void, +pub union perf_sample_weight { + pub full: __u64, + pub __bindgen_anon_1: perf_sample_weight__bindgen_ty_1, } #[repr(C)] -#[derive(Copy, Clone)] -pub union msi_domain_cookie { - pub value: u64_, - pub ptr: *mut ::aya_bpf::cty::c_void, - pub iobase: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct perf_sample_weight__bindgen_ty_1 { + pub var1_dw: __u32, + pub var2_w: __u16, + pub var3_w: __u16, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct msi_desc_data { - pub dcookie: msi_domain_cookie, - pub icookie: msi_instance_cookie, +#[derive(Debug, Copy, Clone)] +pub struct cgroup_namespace { + pub ns: ns_common, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub root_cset: *mut css_set, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct msi_desc { - pub irq: ::aya_bpf::cty::c_uint, - pub nvec_used: ::aya_bpf::cty::c_uint, - pub dev: *mut device, - pub msg: msi_msg, - pub affinity: *mut irq_affinity_desc, - pub iommu_cookie: *const ::aya_bpf::cty::c_void, - pub sysfs_attrs: *mut device_attribute, - pub write_msi_msg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut msi_desc, arg2: *mut ::aya_bpf::cty::c_void), +#[derive(Debug, Copy, Clone)] +pub struct proc_ns_operations { + pub name: *const ::aya_ebpf::cty::c_char, + pub real_ns_name: *const ::aya_ebpf::cty::c_char, + pub type_: ::aya_ebpf::cty::c_int, + pub get: ::core::option::Option *mut ns_common>, + pub put: ::core::option::Option, + pub install: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nsset, arg2: *mut ns_common) -> ::aya_ebpf::cty::c_int, >, - pub write_msi_msg_data: *mut ::aya_bpf::cty::c_void, - pub msi_index: u16_, - pub __bindgen_anon_1: msi_desc__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union msi_desc__bindgen_ty_1 { - pub pci: pci_msi_desc, - pub data: msi_desc_data, + pub owner: + ::core::option::Option *mut user_namespace>, + pub get_parent: + ::core::option::Option *mut ns_common>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct irq_chip { - pub name: *const ::aya_bpf::cty::c_char, - pub irq_startup: - ::core::option::Option ::aya_bpf::cty::c_uint>, - pub irq_shutdown: ::core::option::Option, - pub irq_enable: ::core::option::Option, - pub irq_disable: ::core::option::Option, - pub irq_ack: ::core::option::Option, - pub irq_mask: ::core::option::Option, - pub irq_mask_ack: ::core::option::Option, - pub irq_unmask: ::core::option::Option, - pub irq_eoi: ::core::option::Option, - pub irq_set_affinity: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_data, - arg2: *const cpumask, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, +pub struct pmu { + pub entry: list_head, + pub module: *mut module, + pub dev: *mut device, + pub parent: *mut device, + pub attr_groups: *mut *const attribute_group, + pub attr_update: *mut *const attribute_group, + pub name: *const ::aya_ebpf::cty::c_char, + pub type_: ::aya_ebpf::cty::c_int, + pub capabilities: ::aya_ebpf::cty::c_int, + pub pmu_disable_count: *mut ::aya_ebpf::cty::c_int, + pub cpu_pmu_context: *mut perf_cpu_pmu_context, + pub exclusive_cnt: atomic_t, + pub task_ctx_nr: ::aya_ebpf::cty::c_int, + pub hrtimer_interval_ms: ::aya_ebpf::cty::c_int, + pub nr_addr_filters: ::aya_ebpf::cty::c_uint, + pub pmu_enable: ::core::option::Option, + pub pmu_disable: ::core::option::Option, + pub event_init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event) -> ::aya_ebpf::cty::c_int, >, - pub irq_retrigger: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub irq_set_type: ::core::option::Option< + pub event_mapped: + ::core::option::Option, + pub event_unmapped: + ::core::option::Option, + pub add: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_data, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut perf_event, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub irq_set_wake: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_data, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + pub del: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event, arg2: ::aya_ebpf::cty::c_int), >, - pub irq_bus_lock: ::core::option::Option, - pub irq_bus_sync_unlock: ::core::option::Option, - pub irq_suspend: ::core::option::Option, - pub irq_resume: ::core::option::Option, - pub irq_pm_shutdown: ::core::option::Option, - pub irq_calc_mask: ::core::option::Option, - pub irq_print_chip: - ::core::option::Option, - pub irq_request_resources: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub irq_release_resources: ::core::option::Option, - pub irq_compose_msi_msg: - ::core::option::Option, - pub irq_write_msi_msg: - ::core::option::Option, - pub irq_get_irqchip_state: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_data, - arg2: irqchip_irq_state::Type, - arg3: *mut bool_, - ) -> ::aya_bpf::cty::c_int, + pub start: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event, arg2: ::aya_ebpf::cty::c_int), >, - pub irq_set_irqchip_state: ::core::option::Option< + pub stop: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event, arg2: ::aya_ebpf::cty::c_int), + >, + pub read: ::core::option::Option, + pub start_txn: + ::core::option::Option, + pub commit_txn: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub cancel_txn: ::core::option::Option, + pub event_idx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event) -> ::aya_ebpf::cty::c_int, + >, + pub sched_task: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event_pmu_context, arg2: bool_), + >, + pub task_ctx_cache: *mut kmem_cache, + pub swap_task_ctx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event_pmu_context, arg2: *mut perf_event_pmu_context), + >, + pub setup_aux: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_data, - arg2: irqchip_irq_state::Type, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut perf_event, + arg2: *mut *mut ::aya_ebpf::cty::c_void, + arg3: ::aya_ebpf::cty::c_int, + arg4: bool_, + ) -> *mut ::aya_ebpf::cty::c_void, >, - pub irq_set_vcpu_affinity: ::core::option::Option< + pub free_aux: ::core::option::Option, + pub snapshot_aux: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_data, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut perf_event, + arg2: *mut perf_output_handle, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_long, >, - pub ipi_send_single: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut irq_data, arg2: ::aya_bpf::cty::c_uint), + pub addr_filters_validate: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut list_head) -> ::aya_ebpf::cty::c_int, + >, + pub addr_filters_sync: ::core::option::Option, + pub aux_output_match: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event) -> ::aya_ebpf::cty::c_int, + >, + pub filter: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut pmu, arg2: ::aya_ebpf::cty::c_int) -> bool_, + >, + pub check_period: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut perf_event, arg2: u64_) -> ::aya_ebpf::cty::c_int, >, - pub ipi_send_mask: - ::core::option::Option, - pub irq_nmi_setup: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub irq_nmi_teardown: ::core::option::Option, - pub flags: ::aya_bpf::cty::c_ulong, } -pub mod irq_alloc_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const X86_IRQ_ALLOC_TYPE_IOAPIC: Type = 1; - pub const X86_IRQ_ALLOC_TYPE_HPET: Type = 2; - pub const X86_IRQ_ALLOC_TYPE_PCI_MSI: Type = 3; - pub const X86_IRQ_ALLOC_TYPE_PCI_MSIX: Type = 4; - pub const X86_IRQ_ALLOC_TYPE_DMAR: Type = 5; - pub const X86_IRQ_ALLOC_TYPE_AMDVI: Type = 6; - pub const X86_IRQ_ALLOC_TYPE_UV: Type = 7; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ftrace_regs { + pub regs: pt_regs, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ioapic_alloc_info { - pub pin: ::aya_bpf::cty::c_int, - pub node: ::aya_bpf::cty::c_int, +pub struct perf_regs { + pub abi: __u64, + pub regs: *mut pt_regs, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct u64_stats_sync {} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct psi_group_cpu { + pub seq: seqcount_t, + pub tasks: [::aya_ebpf::cty::c_uint; 4usize], + pub state_mask: u32_, + pub times: [u32_; 8usize], + pub state_start: u64_, + pub times_prev: [u32_; 16usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct psi_group { + pub parent: *mut psi_group, + pub enabled: bool_, + pub avgs_lock: mutex, + pub pcpu: *mut psi_group_cpu, + pub avg_total: [u64_; 7usize], + pub avg_last_update: u64_, + pub avg_next_update: u64_, + pub avgs_work: delayed_work, + pub avg_triggers: list_head, + pub avg_nr_triggers: [u32_; 7usize], + pub total: [u64_; 14usize], + pub avg: [::aya_ebpf::cty::c_ulong; 21usize], + pub rtpoll_task: *mut task_struct, + pub rtpoll_timer: timer_list, + pub rtpoll_wait: wait_queue_head_t, + pub rtpoll_wakeup: atomic_t, + pub rtpoll_scheduled: atomic_t, + pub rtpoll_trigger_lock: mutex, + pub rtpoll_triggers: list_head, + pub rtpoll_nr_triggers: [u32_; 7usize], + pub rtpoll_states: u32_, + pub rtpoll_min_period: u64_, + pub rtpoll_total: [u64_; 7usize], + pub rtpoll_next_update: u64_, + pub rtpoll_until: u64_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cgroup_subsys { + pub css_alloc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cgroup_subsys_state) -> *mut cgroup_subsys_state, + >, + pub css_online: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cgroup_subsys_state) -> ::aya_ebpf::cty::c_int, + >, + pub css_offline: ::core::option::Option, + pub css_released: ::core::option::Option, + pub css_free: ::core::option::Option, + pub css_reset: ::core::option::Option, + pub css_rstat_flush: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cgroup_subsys_state, arg2: ::aya_ebpf::cty::c_int), + >, + pub css_extra_stat_show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut cgroup_subsys_state, + ) -> ::aya_ebpf::cty::c_int, + >, + pub css_local_stat_show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut cgroup_subsys_state, + ) -> ::aya_ebpf::cty::c_int, + >, + pub can_attach: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cgroup_taskset) -> ::aya_ebpf::cty::c_int, + >, + pub cancel_attach: ::core::option::Option, + pub attach: ::core::option::Option, + pub post_attach: ::core::option::Option, + pub can_fork: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut task_struct, arg2: *mut css_set) -> ::aya_ebpf::cty::c_int, + >, + pub cancel_fork: + ::core::option::Option, + pub fork: ::core::option::Option, + pub exit: ::core::option::Option, + pub release: ::core::option::Option, + pub bind: ::core::option::Option, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 3usize], + pub id: ::aya_ebpf::cty::c_int, + pub name: *const ::aya_ebpf::cty::c_char, + pub legacy_name: *const ::aya_ebpf::cty::c_char, + pub root: *mut cgroup_root, + pub css_idr: idr, + pub cfts: list_head, + pub dfl_cftypes: *mut cftype, + pub legacy_cftypes: *mut cftype, + pub depends_on: ::aya_ebpf::cty::c_uint, } -impl ioapic_alloc_info { +impl cgroup_subsys { #[inline] - pub fn is_level(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn early_init(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_is_level(&mut self, val: u32_) { + pub fn set_early_init(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn active_low(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + pub fn implicit_on_dfl(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } } #[inline] - pub fn set_active_low(&mut self, val: u32_) { + pub fn set_implicit_on_dfl(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn valid(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn threaded(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } } #[inline] - pub fn set_valid(&mut self, val: u32_) { + pub fn set_threaded(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - is_level: u32_, - active_low: u32_, - valid: u32_, + early_init: bool_, + implicit_on_dfl: bool_, + threaded: bool_, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_level: u32 = unsafe { ::core::mem::transmute(is_level) }; - is_level as u64 + let early_init: u8 = unsafe { ::core::mem::transmute(early_init) }; + early_init as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let active_low: u32 = unsafe { ::core::mem::transmute(active_low) }; - active_low as u64 + let implicit_on_dfl: u8 = unsafe { ::core::mem::transmute(implicit_on_dfl) }; + implicit_on_dfl as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { - let valid: u32 = unsafe { ::core::mem::transmute(valid) }; - valid as u64 + let threaded: u8 = unsafe { ::core::mem::transmute(threaded) }; + threaded as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct uv_alloc_info { - pub limit: ::aya_bpf::cty::c_int, - pub blade: ::aya_bpf::cty::c_int, - pub offset: ::aya_bpf::cty::c_ulong, - pub name: *mut ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct irq_alloc_info { - pub type_: irq_alloc_type::Type, - pub flags: u32_, - pub devid: u32_, - pub hwirq: irq_hw_number_t, - pub mask: *const cpumask, - pub desc: *mut msi_desc, - pub data: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: irq_alloc_info__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union irq_alloc_info__bindgen_ty_1 { - pub ioapic: ioapic_alloc_info, - pub uv: uv_alloc_info, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct irq_chip_regs { - pub enable: ::aya_bpf::cty::c_ulong, - pub disable: ::aya_bpf::cty::c_ulong, - pub mask: ::aya_bpf::cty::c_ulong, - pub ack: ::aya_bpf::cty::c_ulong, - pub eoi: ::aya_bpf::cty::c_ulong, - pub type_: ::aya_bpf::cty::c_ulong, - pub polarity: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct irq_chip_type { - pub chip: irq_chip, - pub regs: irq_chip_regs, - pub handler: irq_flow_handler_t, - pub type_: u32_, - pub mask_cache_priv: u32_, - pub mask_cache: *mut u32_, -} -#[repr(C)] -pub struct irq_chip_generic { - pub lock: raw_spinlock_t, - pub reg_base: *mut ::aya_bpf::cty::c_void, - pub reg_readl: - ::core::option::Option u32_>, - pub reg_writel: - ::core::option::Option, - pub suspend: ::core::option::Option, - pub resume: ::core::option::Option, - pub irq_base: ::aya_bpf::cty::c_uint, - pub irq_cnt: ::aya_bpf::cty::c_uint, - pub mask_cache: u32_, - pub type_cache: u32_, - pub polarity_cache: u32_, - pub wake_enabled: u32_, - pub wake_active: u32_, - pub num_ct: ::aya_bpf::cty::c_uint, - pub private: *mut ::aya_bpf::cty::c_void, - pub installed: ::aya_bpf::cty::c_ulong, - pub unused: ::aya_bpf::cty::c_ulong, - pub domain: *mut irq_domain, - pub list: list_head, - pub chip_types: __IncompleteArrayField, -} -pub mod irq_gc_flags { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IRQ_GC_INIT_MASK_CACHE: Type = 1; - pub const IRQ_GC_INIT_NESTED_LOCK: Type = 2; - pub const IRQ_GC_MASK_CACHE_PER_TYPE: Type = 4; - pub const IRQ_GC_NO_MASK: Type = 8; - pub const IRQ_GC_BE_IO: Type = 16; -} -#[repr(C)] -#[derive(Debug)] -pub struct irq_domain_chip_generic { - pub irqs_per_chip: ::aya_bpf::cty::c_uint, - pub num_chips: ::aya_bpf::cty::c_uint, - pub irq_flags_to_clear: ::aya_bpf::cty::c_uint, - pub irq_flags_to_set: ::aya_bpf::cty::c_uint, - pub gc_flags: irq_gc_flags::Type, - pub gc: __IncompleteArrayField<*mut irq_chip_generic>, +pub struct cgroup_rstat_cpu { + pub bsync: u64_stats_sync, + pub bstat: cgroup_base_stat, + pub last_bstat: cgroup_base_stat, + pub subtree_bstat: cgroup_base_stat, + pub last_subtree_bstat: cgroup_base_stat, + pub updated_children: *mut cgroup, + pub updated_next: *mut cgroup, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct property { - pub name: *mut ::aya_bpf::cty::c_char, - pub length: ::aya_bpf::cty::c_int, - pub value: *mut ::aya_bpf::cty::c_void, - pub next: *mut property, +pub struct cgroup_root { + pub kf_root: *mut kernfs_root, + pub subsys_mask: ::aya_ebpf::cty::c_uint, + pub hierarchy_id: ::aya_ebpf::cty::c_int, + pub root_list: list_head, + pub rcu: callback_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub cgrp: cgroup, + pub cgrp_ancestor_storage: *mut cgroup, + pub nr_cgrps: atomic_t, + pub flags: ::aya_ebpf::cty::c_uint, + pub release_agent_path: [::aya_ebpf::cty::c_char; 4096usize], + pub name: [::aya_ebpf::cty::c_char; 64usize], + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct irq_fwspec { - pub fwnode: *mut fwnode_handle, - pub param_count: ::aya_bpf::cty::c_int, - pub param: [u32_; 16usize], +impl cgroup_root { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct irq_domain_ops { - pub match_: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut device_node, - arg3: irq_domain_bus_token::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub select: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut irq_fwspec, - arg3: irq_domain_bus_token::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub map: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: ::aya_bpf::cty::c_uint, - arg3: irq_hw_number_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub unmap: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut irq_domain, arg2: ::aya_bpf::cty::c_uint), - >, - pub xlate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut device_node, - arg3: *const u32_, - arg4: ::aya_bpf::cty::c_uint, - arg5: *mut ::aya_bpf::cty::c_ulong, - arg6: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub alloc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, +pub struct cftype { + pub name: [::aya_ebpf::cty::c_char; 64usize], + pub private: ::aya_ebpf::cty::c_ulong, + pub max_write_len: usize, + pub flags: ::aya_ebpf::cty::c_uint, + pub file_offset: ::aya_ebpf::cty::c_uint, + pub ss: *mut cgroup_subsys, + pub node: list_head, + pub kf_ops: *mut kernfs_ops, + pub open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut kernfs_open_file) -> ::aya_ebpf::cty::c_int, >, - pub free: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_uint, - ), + pub release: ::core::option::Option, + pub read_u64: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cgroup_subsys_state, arg2: *mut cftype) -> u64_, >, - pub activate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut irq_data, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, + pub read_s64: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cgroup_subsys_state, arg2: *mut cftype) -> s64, >, - pub deactivate: - ::core::option::Option, - pub translate: ::core::option::Option< + pub seq_show: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut irq_fwspec, - arg3: *mut ::aya_bpf::cty::c_ulong, - arg4: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut seq_file, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct msi_parent_ops { - pub supported_flags: u32_, - pub prefix: *const ::aya_bpf::cty::c_char, - pub init_dev_msi_info: ::core::option::Option< + pub seq_start: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut device, - arg2: *mut irq_domain, - arg3: *mut irq_domain, - arg4: *mut msi_domain_info, - ) -> bool_, + arg1: *mut seq_file, + arg2: *mut loff_t, + ) -> *mut ::aya_ebpf::cty::c_void, >, -} -pub type msi_alloc_info_t = irq_alloc_info; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct msi_domain_ops { - pub get_hwirq: ::core::option::Option< + pub seq_next: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut msi_domain_info, - arg2: *mut msi_alloc_info_t, - ) -> irq_hw_number_t, + arg1: *mut seq_file, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut loff_t, + ) -> *mut ::aya_ebpf::cty::c_void, >, - pub msi_init: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut msi_domain_info, - arg3: ::aya_bpf::cty::c_uint, - arg4: irq_hw_number_t, - arg5: *mut msi_alloc_info_t, - ) -> ::aya_bpf::cty::c_int, + pub seq_stop: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut ::aya_ebpf::cty::c_void), >, - pub msi_free: ::core::option::Option< + pub write_u64: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut msi_domain_info, - arg3: ::aya_bpf::cty::c_uint, - ), + arg1: *mut cgroup_subsys_state, + arg2: *mut cftype, + arg3: u64_, + ) -> ::aya_ebpf::cty::c_int, >, - pub msi_prepare: ::core::option::Option< + pub write_s64: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut device, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut msi_alloc_info_t, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut cgroup_subsys_state, + arg2: *mut cftype, + arg3: s64, + ) -> ::aya_ebpf::cty::c_int, >, - pub prepare_desc: ::core::option::Option< + pub write: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut msi_alloc_info_t, - arg3: *mut msi_desc, - ), - >, - pub set_desc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut msi_alloc_info_t, arg2: *mut msi_desc), + arg1: *mut kernfs_open_file, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: usize, + arg4: loff_t, + ) -> isize, >, - pub domain_alloc_irqs: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut irq_domain, - arg2: *mut device, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + pub poll: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut kernfs_open_file, arg2: *mut poll_table_struct) -> __poll_t, >, - pub domain_free_irqs: - ::core::option::Option, - pub msi_post_free: - ::core::option::Option, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct msi_domain_info { - pub flags: u32_, - pub bus_token: irq_domain_bus_token::Type, - pub hwsize: ::aya_bpf::cty::c_uint, - pub ops: *mut msi_domain_ops, - pub chip: *mut irq_chip, - pub chip_data: *mut ::aya_bpf::cty::c_void, - pub handler: irq_flow_handler_t, - pub handler_data: *mut ::aya_bpf::cty::c_void, - pub handler_name: *const ::aya_bpf::cty::c_char, - pub data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug)] +pub struct perf_callchain_entry { + pub nr: __u64, + pub ip: __IncompleteArrayField<__u64>, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dev_pagemap_ops { - pub page_free: ::core::option::Option, - pub migrate_to_ram: - ::core::option::Option vm_fault_t>, - pub memory_failure: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dev_pagemap, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, +pub type perf_copy_f = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: *const ::aya_ebpf::cty::c_void, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_ulong, +>; +#[repr(C, packed)] +#[derive(Copy, Clone)] +pub struct perf_raw_frag { + pub __bindgen_anon_1: perf_raw_frag__bindgen_ty_1, + pub copy: perf_copy_f, + pub data: *mut ::aya_ebpf::cty::c_void, + pub size: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cgroup_namespace { - pub ns: ns_common, - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub root_cset: *mut css_set, +#[derive(Copy, Clone)] +pub union perf_raw_frag__bindgen_ty_1 { + pub next: *mut perf_raw_frag, + pub pad: ::aya_ebpf::cty::c_ulong, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct proc_ns_operations { - pub name: *const ::aya_bpf::cty::c_char, - pub real_ns_name: *const ::aya_bpf::cty::c_char, - pub type_: ::aya_bpf::cty::c_int, - pub get: ::core::option::Option *mut ns_common>, - pub put: ::core::option::Option, - pub install: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nsset, arg2: *mut ns_common) -> ::aya_bpf::cty::c_int, - >, - pub owner: - ::core::option::Option *mut user_namespace>, - pub get_parent: - ::core::option::Option *mut ns_common>, +#[derive(Copy, Clone)] +pub struct perf_raw_record { + pub frag: perf_raw_frag, + pub size: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct seq_buf { - pub buffer: *mut ::aya_bpf::cty::c_char, - pub size: usize, - pub len: usize, - pub readpos: loff_t, +#[derive(Debug)] +pub struct perf_branch_stack { + pub nr: __u64, + pub hw_idx: __u64, + pub entries: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct trace_seq { - pub buffer: [::aya_bpf::cty::c_char; 4096usize], - pub seq: seq_buf, - pub full: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_mem_data_src { - pub val: __u64, - pub __bindgen_anon_1: perf_mem_data_src__bindgen_ty_1, -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct perf_mem_data_src__bindgen_ty_1 { - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, -} -impl perf_mem_data_src__bindgen_ty_1 { - #[inline] - pub fn mem_op(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 5u8) as u64) } - } - #[inline] - pub fn set_mem_op(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 5u8, val as u64) - } - } - #[inline] - pub fn mem_lvl(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 14u8) as u64) } - } - #[inline] - pub fn set_mem_lvl(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 14u8, val as u64) - } - } - #[inline] - pub fn mem_snoop(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(19usize, 5u8) as u64) } - } - #[inline] - pub fn set_mem_snoop(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(19usize, 5u8, val as u64) - } - } - #[inline] - pub fn mem_lock(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 2u8) as u64) } - } - #[inline] - pub fn set_mem_lock(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(24usize, 2u8, val as u64) - } - } - #[inline] - pub fn mem_dtlb(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(26usize, 7u8) as u64) } - } - #[inline] - pub fn set_mem_dtlb(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(26usize, 7u8, val as u64) - } - } - #[inline] - pub fn mem_lvl_num(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(33usize, 4u8) as u64) } - } - #[inline] - pub fn set_mem_lvl_num(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(33usize, 4u8, val as u64) - } - } - #[inline] - pub fn mem_remote(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(37usize, 1u8) as u64) } - } - #[inline] - pub fn set_mem_remote(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(37usize, 1u8, val as u64) - } - } - #[inline] - pub fn mem_snoopx(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(38usize, 2u8) as u64) } - } - #[inline] - pub fn set_mem_snoopx(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(38usize, 2u8, val as u64) - } - } - #[inline] - pub fn mem_blk(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(40usize, 3u8) as u64) } - } - #[inline] - pub fn set_mem_blk(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(40usize, 3u8, val as u64) - } - } - #[inline] - pub fn mem_hops(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(43usize, 3u8) as u64) } - } - #[inline] - pub fn set_mem_hops(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(43usize, 3u8, val as u64) - } - } - #[inline] - pub fn mem_rsvd(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(46usize, 18u8) as u64) } - } - #[inline] - pub fn set_mem_rsvd(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(46usize, 18u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - mem_op: __u64, - mem_lvl: __u64, - mem_snoop: __u64, - mem_lock: __u64, - mem_dtlb: __u64, - mem_lvl_num: __u64, - mem_remote: __u64, - mem_snoopx: __u64, - mem_blk: __u64, - mem_hops: __u64, - mem_rsvd: __u64, - ) -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 5u8, { - let mem_op: u64 = unsafe { ::core::mem::transmute(mem_op) }; - mem_op as u64 - }); - __bindgen_bitfield_unit.set(5usize, 14u8, { - let mem_lvl: u64 = unsafe { ::core::mem::transmute(mem_lvl) }; - mem_lvl as u64 - }); - __bindgen_bitfield_unit.set(19usize, 5u8, { - let mem_snoop: u64 = unsafe { ::core::mem::transmute(mem_snoop) }; - mem_snoop as u64 - }); - __bindgen_bitfield_unit.set(24usize, 2u8, { - let mem_lock: u64 = unsafe { ::core::mem::transmute(mem_lock) }; - mem_lock as u64 - }); - __bindgen_bitfield_unit.set(26usize, 7u8, { - let mem_dtlb: u64 = unsafe { ::core::mem::transmute(mem_dtlb) }; - mem_dtlb as u64 - }); - __bindgen_bitfield_unit.set(33usize, 4u8, { - let mem_lvl_num: u64 = unsafe { ::core::mem::transmute(mem_lvl_num) }; - mem_lvl_num as u64 - }); - __bindgen_bitfield_unit.set(37usize, 1u8, { - let mem_remote: u64 = unsafe { ::core::mem::transmute(mem_remote) }; - mem_remote as u64 - }); - __bindgen_bitfield_unit.set(38usize, 2u8, { - let mem_snoopx: u64 = unsafe { ::core::mem::transmute(mem_snoopx) }; - mem_snoopx as u64 - }); - __bindgen_bitfield_unit.set(40usize, 3u8, { - let mem_blk: u64 = unsafe { ::core::mem::transmute(mem_blk) }; - mem_blk as u64 - }); - __bindgen_bitfield_unit.set(43usize, 3u8, { - let mem_hops: u64 = unsafe { ::core::mem::transmute(mem_hops) }; - mem_hops as u64 - }); - __bindgen_bitfield_unit.set(46usize, 18u8, { - let mem_rsvd: u64 = unsafe { ::core::mem::transmute(mem_rsvd) }; - mem_rsvd as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_branch_entry { - pub from: __u64, - pub to: __u64, - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +pub struct perf_event_pmu_context { + pub pmu: *mut pmu, + pub ctx: *mut perf_event_context, + pub pmu_ctx_entry: list_head, + pub pinned_active: list_head, + pub flexible_active: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub nr_events: ::aya_ebpf::cty::c_uint, + pub nr_cgroups: ::aya_ebpf::cty::c_uint, + pub refcount: atomic_t, + pub callback_head: callback_head, + pub task_ctx_data: *mut ::aya_ebpf::cty::c_void, + pub rotate_necessary: ::aya_ebpf::cty::c_int, } -impl perf_branch_entry { +impl perf_event_pmu_context { #[inline] - pub fn mispred(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } + pub fn embedded(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_mispred(&mut self, val: __u64) { + pub fn set_embedded(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn predicted(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } - } - #[inline] - pub fn set_predicted(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn in_tx(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } - } - #[inline] - pub fn set_in_tx(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn abort(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } - } - #[inline] - pub fn set_abort(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn cycles(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 16u8) as u64) } - } - #[inline] - pub fn set_cycles(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 16u8, val as u64) - } - } - #[inline] - pub fn type_(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 4u8) as u64) } - } - #[inline] - pub fn set_type(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(20usize, 4u8, val as u64) - } - } - #[inline] - pub fn spec(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 2u8) as u64) } - } - #[inline] - pub fn set_spec(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(24usize, 2u8, val as u64) - } - } - #[inline] - pub fn new_type(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(26usize, 4u8) as u64) } - } - #[inline] - pub fn set_new_type(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(26usize, 4u8, val as u64) - } - } - #[inline] - pub fn priv_(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(30usize, 3u8) as u64) } - } - #[inline] - pub fn set_priv(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(30usize, 3u8, val as u64) - } - } - #[inline] - pub fn reserved(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(33usize, 31u8) as u64) } - } - #[inline] - pub fn set_reserved(&mut self, val: __u64) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(33usize, 31u8, val as u64) - } - } - #[inline] pub fn new_bitfield_1( - mispred: __u64, - predicted: __u64, - in_tx: __u64, - abort: __u64, - cycles: __u64, - type_: __u64, - spec: __u64, - new_type: __u64, - priv_: __u64, - reserved: __u64, - ) -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + embedded: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let mispred: u64 = unsafe { ::core::mem::transmute(mispred) }; - mispred as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let predicted: u64 = unsafe { ::core::mem::transmute(predicted) }; - predicted as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let in_tx: u64 = unsafe { ::core::mem::transmute(in_tx) }; - in_tx as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let abort: u64 = unsafe { ::core::mem::transmute(abort) }; - abort as u64 - }); - __bindgen_bitfield_unit.set(4usize, 16u8, { - let cycles: u64 = unsafe { ::core::mem::transmute(cycles) }; - cycles as u64 - }); - __bindgen_bitfield_unit.set(20usize, 4u8, { - let type_: u64 = unsafe { ::core::mem::transmute(type_) }; - type_ as u64 - }); - __bindgen_bitfield_unit.set(24usize, 2u8, { - let spec: u64 = unsafe { ::core::mem::transmute(spec) }; - spec as u64 - }); - __bindgen_bitfield_unit.set(26usize, 4u8, { - let new_type: u64 = unsafe { ::core::mem::transmute(new_type) }; - new_type as u64 - }); - __bindgen_bitfield_unit.set(30usize, 3u8, { - let priv_: u64 = unsafe { ::core::mem::transmute(priv_) }; - priv_ as u64 - }); - __bindgen_bitfield_unit.set(33usize, 31u8, { - let reserved: u64 = unsafe { ::core::mem::transmute(reserved) }; - reserved as u64 + let embedded: u32 = unsafe { ::core::mem::transmute(embedded) }; + embedded as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Copy, Clone)] -pub union perf_sample_weight { - pub full: __u64, - pub __bindgen_anon_1: perf_sample_weight__bindgen_ty_1, +pub struct perf_cpu_pmu_context { + pub epc: perf_event_pmu_context, + pub task_epc: *mut perf_event_pmu_context, + pub sched_cb_entry: list_head, + pub sched_cb_usage: ::aya_ebpf::cty::c_int, + pub active_oncpu: ::aya_ebpf::cty::c_int, + pub exclusive: ::aya_ebpf::cty::c_int, + pub hrtimer_lock: raw_spinlock_t, + pub hrtimer: hrtimer, + pub hrtimer_interval: ktime_t, + pub hrtimer_active: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_sample_weight__bindgen_ty_1 { - pub var1_dw: __u32, - pub var2_w: __u16, - pub var3_w: __u16, +#[derive(Copy, Clone)] +pub struct perf_output_handle { + pub event: *mut perf_event, + pub rb: *mut perf_buffer, + pub wakeup: ::aya_ebpf::cty::c_ulong, + pub size: ::aya_ebpf::cty::c_ulong, + pub aux_flags: u64_, + pub __bindgen_anon_1: perf_output_handle__bindgen_ty_1, + pub page: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pmu { - pub entry: list_head, - pub module: *mut module, - pub dev: *mut device, - pub attr_groups: *mut *const attribute_group, - pub attr_update: *mut *const attribute_group, - pub name: *const ::aya_bpf::cty::c_char, - pub type_: ::aya_bpf::cty::c_int, - pub capabilities: ::aya_bpf::cty::c_int, - pub pmu_disable_count: *mut ::aya_bpf::cty::c_int, - pub cpu_pmu_context: *mut perf_cpu_pmu_context, - pub exclusive_cnt: atomic_t, - pub task_ctx_nr: ::aya_bpf::cty::c_int, - pub hrtimer_interval_ms: ::aya_bpf::cty::c_int, - pub nr_addr_filters: ::aya_bpf::cty::c_uint, - pub pmu_enable: ::core::option::Option, - pub pmu_disable: ::core::option::Option, - pub event_init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event) -> ::aya_bpf::cty::c_int, - >, - pub event_mapped: - ::core::option::Option, - pub event_unmapped: - ::core::option::Option, - pub add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut perf_event, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub del: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event, arg2: ::aya_bpf::cty::c_int), - >, - pub start: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event, arg2: ::aya_bpf::cty::c_int), - >, - pub stop: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event, arg2: ::aya_bpf::cty::c_int), - >, - pub read: ::core::option::Option, - pub start_txn: - ::core::option::Option, - pub commit_txn: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub cancel_txn: ::core::option::Option, - pub event_idx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event) -> ::aya_bpf::cty::c_int, - >, - pub sched_task: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event_pmu_context, arg2: bool_), - >, - pub task_ctx_cache: *mut kmem_cache, - pub swap_task_ctx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event_pmu_context, arg2: *mut perf_event_pmu_context), - >, - pub setup_aux: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut perf_event, - arg2: *mut *mut ::aya_bpf::cty::c_void, - arg3: ::aya_bpf::cty::c_int, - arg4: bool_, - ) -> *mut ::aya_bpf::cty::c_void, - >, - pub free_aux: ::core::option::Option, - pub snapshot_aux: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut perf_event, - arg2: *mut perf_output_handle, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_long, - >, - pub addr_filters_validate: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub addr_filters_sync: ::core::option::Option, - pub aux_output_match: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event) -> ::aya_bpf::cty::c_int, - >, - pub filter: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut pmu, arg2: ::aya_bpf::cty::c_int) -> bool_, - >, - pub check_period: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut perf_event, arg2: u64_) -> ::aya_bpf::cty::c_int, - >, +#[derive(Copy, Clone)] +pub union perf_output_handle__bindgen_ty_1 { + pub addr: *mut ::aya_ebpf::cty::c_void, + pub head: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ftrace_regs { - pub regs: pt_regs, +pub struct perf_addr_filter_range { + pub start: ::aya_ebpf::cty::c_ulong, + pub size: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct perf_sample_data { + pub sample_flags: u64_, + pub period: u64_, + pub dyn_size: u64_, + pub type_: u64_, + pub tid_entry: perf_sample_data__bindgen_ty_1, + pub time: u64_, + pub id: u64_, + pub cpu_entry: perf_sample_data__bindgen_ty_2, + pub ip: u64_, + pub callchain: *mut perf_callchain_entry, + pub raw: *mut perf_raw_record, + pub br_stack: *mut perf_branch_stack, + pub br_stack_cntr: *mut u64_, + pub weight: perf_sample_weight, + pub data_src: perf_mem_data_src, + pub txn: u64_, + pub regs_user: perf_regs, + pub regs_intr: perf_regs, + pub stack_user_size: u64_, + pub stream_id: u64_, + pub cgroup: u64_, + pub addr: u64_, + pub phys_addr: u64_, + pub data_page_size: u64_, + pub code_page_size: u64_, + pub aux_size: u64_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kvec { - pub iov_base: *mut ::aya_bpf::cty::c_void, - pub iov_len: usize, +pub struct perf_sample_data__bindgen_ty_1 { + pub pid: u32_, + pub tid: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bio_vec { - pub bv_page: *mut page, - pub bv_len: ::aya_bpf::cty::c_uint, - pub bv_offset: ::aya_bpf::cty::c_uint, +pub struct perf_sample_data__bindgen_ty_2 { + pub cpu: u32_, + pub reserved: u32_, +} +impl perf_sample_data { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct perf_regs { - pub abi: __u64, - pub regs: *mut pt_regs, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct u64_stats_sync {} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct psi_group_cpu { - pub seq: seqcount_t, - pub tasks: [::aya_bpf::cty::c_uint; 4usize], - pub state_mask: u32_, - pub times: [u32_; 8usize], - pub state_start: u64_, - pub times_prev: [u32_; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct psi_group { - pub parent: *mut psi_group, - pub enabled: bool_, - pub avgs_lock: mutex, - pub pcpu: *mut psi_group_cpu, - pub avg_total: [u64_; 7usize], - pub avg_last_update: u64_, - pub avg_next_update: u64_, - pub avgs_work: delayed_work, - pub avg_triggers: list_head, - pub avg_nr_triggers: [u32_; 7usize], - pub total: [u64_; 14usize], - pub avg: [::aya_bpf::cty::c_ulong; 21usize], - pub rtpoll_task: *mut task_struct, - pub rtpoll_timer: timer_list, - pub rtpoll_wait: wait_queue_head_t, - pub rtpoll_wakeup: atomic_t, - pub rtpoll_scheduled: atomic_t, - pub rtpoll_trigger_lock: mutex, - pub rtpoll_triggers: list_head, - pub rtpoll_nr_triggers: [u32_; 7usize], - pub rtpoll_states: u32_, - pub rtpoll_min_period: u64_, - pub rtpoll_total: [u64_; 7usize], - pub rtpoll_next_update: u64_, - pub rtpoll_until: u64_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cgroup_subsys { - pub css_alloc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cgroup_subsys_state) -> *mut cgroup_subsys_state, - >, - pub css_online: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cgroup_subsys_state) -> ::aya_bpf::cty::c_int, - >, - pub css_offline: ::core::option::Option, - pub css_released: ::core::option::Option, - pub css_free: ::core::option::Option, - pub css_reset: ::core::option::Option, - pub css_rstat_flush: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cgroup_subsys_state, arg2: ::aya_bpf::cty::c_int), - >, - pub css_extra_stat_show: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut cgroup_subsys_state, - ) -> ::aya_bpf::cty::c_int, - >, - pub can_attach: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cgroup_taskset) -> ::aya_bpf::cty::c_int, - >, - pub cancel_attach: ::core::option::Option, - pub attach: ::core::option::Option, - pub post_attach: ::core::option::Option, - pub can_fork: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut task_struct, arg2: *mut css_set) -> ::aya_bpf::cty::c_int, - >, - pub cancel_fork: - ::core::option::Option, - pub fork: ::core::option::Option, - pub exit: ::core::option::Option, - pub release: ::core::option::Option, - pub bind: ::core::option::Option, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub id: ::aya_bpf::cty::c_int, - pub name: *const ::aya_bpf::cty::c_char, - pub legacy_name: *const ::aya_bpf::cty::c_char, - pub root: *mut cgroup_root, - pub css_idr: idr, - pub cfts: list_head, - pub dfl_cftypes: *mut cftype, - pub legacy_cftypes: *mut cftype, - pub depends_on: ::aya_bpf::cty::c_uint, -} -impl cgroup_subsys { - #[inline] - pub fn early_init(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_early_init(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn implicit_on_dfl(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_implicit_on_dfl(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn threaded(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_threaded(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - early_init: bool_, - implicit_on_dfl: bool_, - threaded: bool_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let early_init: u8 = unsafe { ::core::mem::transmute(early_init) }; - early_init as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let implicit_on_dfl: u8 = unsafe { ::core::mem::transmute(implicit_on_dfl) }; - implicit_on_dfl as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let threaded: u8 = unsafe { ::core::mem::transmute(threaded) }; - threaded as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cgroup_rstat_cpu { - pub bsync: u64_stats_sync, - pub bstat: cgroup_base_stat, - pub last_bstat: cgroup_base_stat, - pub updated_children: *mut cgroup, - pub updated_next: *mut cgroup, -} -#[repr(C)] -pub struct cgroup_root { - pub kf_root: *mut kernfs_root, - pub subsys_mask: ::aya_bpf::cty::c_uint, - pub hierarchy_id: ::aya_bpf::cty::c_int, - pub cgrp: cgroup, - pub cgrp_ancestor_storage: *mut cgroup, - pub nr_cgrps: atomic_t, - pub root_list: list_head, - pub flags: ::aya_bpf::cty::c_uint, - pub release_agent_path: [::aya_bpf::cty::c_char; 4096usize], - pub name: [::aya_bpf::cty::c_char; 64usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cftype { - pub name: [::aya_bpf::cty::c_char; 64usize], - pub private: ::aya_bpf::cty::c_ulong, - pub max_write_len: usize, - pub flags: ::aya_bpf::cty::c_uint, - pub file_offset: ::aya_bpf::cty::c_uint, - pub ss: *mut cgroup_subsys, - pub node: list_head, - pub kf_ops: *mut kernfs_ops, - pub open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kernfs_open_file) -> ::aya_bpf::cty::c_int, - >, - pub release: ::core::option::Option, - pub read_u64: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cgroup_subsys_state, arg2: *mut cftype) -> u64_, - >, - pub read_s64: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cgroup_subsys_state, arg2: *mut cftype) -> s64, - >, - pub seq_show: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub seq_start: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut loff_t) -> *mut ::aya_bpf::cty::c_void, - >, - pub seq_next: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut loff_t, - ) -> *mut ::aya_bpf::cty::c_void, - >, - pub seq_stop: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub write_u64: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cgroup_subsys_state, - arg2: *mut cftype, - arg3: u64_, - ) -> ::aya_bpf::cty::c_int, - >, - pub write_s64: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cgroup_subsys_state, - arg2: *mut cftype, - arg3: s64, - ) -> ::aya_bpf::cty::c_int, - >, - pub write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut kernfs_open_file, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: usize, - arg4: loff_t, - ) -> isize, - >, - pub poll: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kernfs_open_file, arg2: *mut poll_table_struct) -> __poll_t, - >, -} -#[repr(C)] -#[derive(Debug)] -pub struct perf_callchain_entry { - pub nr: __u64, - pub ip: __IncompleteArrayField<__u64>, -} -pub type perf_copy_f = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: *const ::aya_bpf::cty::c_void, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_ulong, ->; -#[repr(C, packed)] -#[derive(Copy, Clone)] -pub struct perf_raw_frag { - pub __bindgen_anon_1: perf_raw_frag__bindgen_ty_1, - pub copy: perf_copy_f, - pub data: *mut ::aya_bpf::cty::c_void, - pub size: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_raw_frag__bindgen_ty_1 { - pub next: *mut perf_raw_frag, - pub pad: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_raw_record { - pub frag: perf_raw_frag, - pub size: u32_, -} -#[repr(C)] -#[derive(Debug)] -pub struct perf_branch_stack { - pub nr: __u64, - pub hw_idx: __u64, - pub entries: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_event_pmu_context { - pub pmu: *mut pmu, - pub ctx: *mut perf_event_context, - pub pmu_ctx_entry: list_head, - pub pinned_active: list_head, - pub flexible_active: list_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub nr_events: ::aya_bpf::cty::c_uint, - pub refcount: atomic_t, - pub callback_head: callback_head, - pub task_ctx_data: *mut ::aya_bpf::cty::c_void, - pub rotate_necessary: ::aya_bpf::cty::c_int, -} -impl perf_event_pmu_context { - #[inline] - pub fn embedded(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_embedded(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(embedded: ::aya_bpf::cty::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let embedded: u32 = unsafe { ::core::mem::transmute(embedded) }; - embedded as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_cpu_pmu_context { - pub epc: perf_event_pmu_context, - pub task_epc: *mut perf_event_pmu_context, - pub sched_cb_entry: list_head, - pub sched_cb_usage: ::aya_bpf::cty::c_int, - pub active_oncpu: ::aya_bpf::cty::c_int, - pub exclusive: ::aya_bpf::cty::c_int, - pub hrtimer_lock: raw_spinlock_t, - pub hrtimer: hrtimer, - pub hrtimer_interval: ktime_t, - pub hrtimer_active: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_output_handle { - pub event: *mut perf_event, - pub rb: *mut perf_buffer, - pub wakeup: ::aya_bpf::cty::c_ulong, - pub size: ::aya_bpf::cty::c_ulong, - pub aux_flags: u64_, - pub __bindgen_anon_1: perf_output_handle__bindgen_ty_1, - pub page: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_output_handle__bindgen_ty_1 { - pub addr: *mut ::aya_bpf::cty::c_void, - pub head: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_addr_filter_range { - pub start: ::aya_bpf::cty::c_ulong, - pub size: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_sample_data { - pub sample_flags: u64_, - pub period: u64_, - pub dyn_size: u64_, - pub type_: u64_, - pub tid_entry: perf_sample_data__bindgen_ty_1, - pub time: u64_, - pub id: u64_, - pub cpu_entry: perf_sample_data__bindgen_ty_2, - pub ip: u64_, - pub callchain: *mut perf_callchain_entry, - pub raw: *mut perf_raw_record, - pub br_stack: *mut perf_branch_stack, - pub weight: perf_sample_weight, - pub data_src: perf_mem_data_src, - pub txn: u64_, - pub regs_user: perf_regs, - pub regs_intr: perf_regs, - pub stack_user_size: u64_, - pub stream_id: u64_, - pub cgroup: u64_, - pub addr: u64_, - pub phys_addr: u64_, - pub data_page_size: u64_, - pub code_page_size: u64_, - pub aux_size: u64_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_sample_data__bindgen_ty_1 { - pub pid: u32_, - pub tid: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_sample_data__bindgen_ty_2 { - pub cpu: u32_, - pub reserved: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_cgroup { - pub css: cgroup_subsys_state, - pub info: *mut perf_cgroup_info, +pub struct perf_cgroup { + pub css: cgroup_subsys_state, + pub info: *mut perf_cgroup_info, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -11580,15 +10399,15 @@ pub struct perf_cgroup_info { pub time: u64_, pub timestamp: u64_, pub timeoffset: u64_, - pub active: ::aya_bpf::cty::c_int, + pub active: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct trace_entry { - pub type_: ::aya_bpf::cty::c_ushort, - pub flags: ::aya_bpf::cty::c_uchar, - pub preempt_count: ::aya_bpf::cty::c_uchar, - pub pid: ::aya_bpf::cty::c_int, + pub type_: ::aya_ebpf::cty::c_ushort, + pub flags: ::aya_ebpf::cty::c_uchar, + pub preempt_count: ::aya_ebpf::cty::c_uchar, + pub pid: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] @@ -11596,31 +10415,31 @@ pub struct trace_iterator { pub tr: *mut trace_array, pub trace: *mut tracer, pub array_buffer: *mut array_buffer, - pub private: *mut ::aya_bpf::cty::c_void, - pub cpu_file: ::aya_bpf::cty::c_int, + pub private: *mut ::aya_ebpf::cty::c_void, + pub cpu_file: ::aya_ebpf::cty::c_int, pub mutex: mutex, pub buffer_iter: *mut *mut ring_buffer_iter, - pub iter_flags: ::aya_bpf::cty::c_ulong, - pub temp: *mut ::aya_bpf::cty::c_void, - pub temp_size: ::aya_bpf::cty::c_uint, - pub fmt: *mut ::aya_bpf::cty::c_char, - pub fmt_size: ::aya_bpf::cty::c_uint, - pub wait_index: ::aya_bpf::cty::c_long, + pub iter_flags: ::aya_ebpf::cty::c_ulong, + pub temp: *mut ::aya_ebpf::cty::c_void, + pub temp_size: ::aya_ebpf::cty::c_uint, + pub fmt: *mut ::aya_ebpf::cty::c_char, + pub fmt_size: ::aya_ebpf::cty::c_uint, + pub wait_index: ::aya_ebpf::cty::c_long, pub tmp_seq: trace_seq, pub started: cpumask_var_t, pub snapshot: bool_, pub seq: trace_seq, pub ent: *mut trace_entry, - pub lost_events: ::aya_bpf::cty::c_ulong, - pub leftover: ::aya_bpf::cty::c_int, - pub ent_size: ::aya_bpf::cty::c_int, - pub cpu: ::aya_bpf::cty::c_int, + pub lost_events: ::aya_ebpf::cty::c_ulong, + pub leftover: ::aya_ebpf::cty::c_int, + pub ent_size: ::aya_ebpf::cty::c_int, + pub cpu: ::aya_ebpf::cty::c_int, pub ts: u64_, pub pos: loff_t, - pub idx: ::aya_bpf::cty::c_long, + pub idx: ::aya_ebpf::cty::c_long, } pub mod print_line_t { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const TRACE_TYPE_PARTIAL_LINE: Type = 0; pub const TRACE_TYPE_HANDLED: Type = 1; pub const TRACE_TYPE_UNHANDLED: Type = 2; @@ -11629,7 +10448,7 @@ pub mod print_line_t { pub type trace_print_func = ::core::option::Option< unsafe extern "C" fn( arg1: *mut trace_iterator, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: *mut trace_event, ) -> print_line_t::Type, >; @@ -11642,7 +10461,7 @@ pub struct trace_event_functions { pub binary: trace_print_func, } pub mod trace_reg { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const TRACE_REG_REGISTER: Type = 0; pub const TRACE_REG_UNREGISTER: Type = 1; pub const TRACE_REG_PERF_REGISTER: Type = 2; @@ -11655,7 +10474,7 @@ pub mod trace_reg { #[repr(C)] #[derive(Copy, Clone)] pub struct trace_event_fields { - pub type_: *const ::aya_bpf::cty::c_char, + pub type_: *const ::aya_ebpf::cty::c_char, pub __bindgen_anon_1: trace_event_fields__bindgen_ty_1, } #[repr(C)] @@ -11663,228 +10482,725 @@ pub struct trace_event_fields { pub union trace_event_fields__bindgen_ty_1 { pub __bindgen_anon_1: trace_event_fields__bindgen_ty_1__bindgen_ty_1, pub define_fields: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut trace_event_call) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut trace_event_call) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct trace_event_fields__bindgen_ty_1__bindgen_ty_1 { - pub name: *const ::aya_bpf::cty::c_char, - pub size: ::aya_bpf::cty::c_int, - pub align: ::aya_bpf::cty::c_int, - pub is_signed: ::aya_bpf::cty::c_int, - pub filter_type: ::aya_bpf::cty::c_int, - pub len: ::aya_bpf::cty::c_int, + pub name: *const ::aya_ebpf::cty::c_char, + pub size: ::aya_ebpf::cty::c_int, + pub align: ::aya_ebpf::cty::c_int, + pub is_signed: ::aya_ebpf::cty::c_int, + pub filter_type: ::aya_ebpf::cty::c_int, + pub len: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct trace_event_class { - pub system: *const ::aya_bpf::cty::c_char, - pub probe: *mut ::aya_bpf::cty::c_void, - pub perf_probe: *mut ::aya_bpf::cty::c_void, + pub system: *const ::aya_ebpf::cty::c_char, + pub probe: *mut ::aya_ebpf::cty::c_void, + pub perf_probe: *mut ::aya_ebpf::cty::c_void, pub reg: ::core::option::Option< unsafe extern "C" fn( arg1: *mut trace_event_call, arg2: trace_reg::Type, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub fields_array: *mut trace_event_fields, pub get_fields: ::core::option::Option *mut list_head>, pub fields: list_head, pub raw_init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut trace_event_call) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut trace_event_call) -> ::aya_ebpf::cty::c_int, >, } -pub type smp_call_func_t = - ::core::option::Option; -#[repr(C)] -#[derive(Debug)] -pub struct cacheline_padding { - pub x: __IncompleteArrayField<::aya_bpf::cty::c_char>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct hlist_nulls_head { - pub first: *mut hlist_nulls_node, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct hlist_nulls_node { - pub next: *mut hlist_nulls_node, - pub pprev: *mut *mut hlist_nulls_node, -} pub type wait_queue_func_t = ::core::option::Option< unsafe extern "C" fn( arg1: *mut wait_queue_entry, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct wait_queue_entry { - pub flags: ::aya_bpf::cty::c_uint, - pub private: *mut ::aya_bpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_uint, + pub private: *mut ::aya_ebpf::cty::c_void, pub func: wait_queue_func_t, pub entry: list_head, } pub type wait_queue_entry_t = wait_queue_entry; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ldt_struct { - pub entries: *mut desc_struct, - pub nr_entries: ::aya_bpf::cty::c_uint, - pub slot: ::aya_bpf::cty::c_int, +pub struct wait_page_queue { + pub folio: *mut folio, + pub bit_nr: ::aya_ebpf::cty::c_int, + pub wait: wait_queue_entry_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mem_cgroup_id { - pub id: ::aya_bpf::cty::c_int, - pub ref_: refcount_t, -} -#[repr(C)] -#[derive(Debug)] -pub struct page_counter { - pub usage: atomic_long_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub _pad1_: cacheline_padding, - pub emin: ::aya_bpf::cty::c_ulong, - pub min_usage: atomic_long_t, - pub children_min_usage: atomic_long_t, - pub elow: ::aya_bpf::cty::c_ulong, - pub low_usage: atomic_long_t, - pub children_low_usage: atomic_long_t, - pub watermark: ::aya_bpf::cty::c_ulong, - pub failcnt: ::aya_bpf::cty::c_ulong, - pub _pad2_: cacheline_padding, - pub min: ::aya_bpf::cty::c_ulong, - pub low: ::aya_bpf::cty::c_ulong, - pub high: ::aya_bpf::cty::c_ulong, - pub max: ::aya_bpf::cty::c_ulong, - pub parent: *mut page_counter, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, -} -impl page_counter { - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub struct readahead_control { + pub file: *mut file, + pub mapping: *mut address_space, + pub ra: *mut file_ra_state, + pub _index: ::aya_ebpf::cty::c_ulong, + pub _nr_pages: ::aya_ebpf::cty::c_uint, + pub _batch_count: ::aya_ebpf::cty::c_uint, + pub _workingset: bool_, + pub _pflags: ::aya_ebpf::cty::c_ulong, } +pub type slab_flags_t = ::aya_ebpf::cty::c_uint; #[repr(C)] #[derive(Copy, Clone)] -pub struct vmpressure { - pub scanned: ::aya_bpf::cty::c_ulong, - pub reclaimed: ::aya_bpf::cty::c_ulong, - pub tree_scanned: ::aya_bpf::cty::c_ulong, - pub tree_reclaimed: ::aya_bpf::cty::c_ulong, - pub sr_lock: spinlock_t, - pub events: list_head, - pub events_lock: mutex, - pub work: work_struct, +pub struct task_delay_info { + pub lock: raw_spinlock_t, + pub blkio_start: u64_, + pub blkio_delay: u64_, + pub swapin_start: u64_, + pub swapin_delay: u64_, + pub blkio_count: u32_, + pub swapin_count: u32_, + pub freepages_start: u64_, + pub freepages_delay: u64_, + pub thrashing_start: u64_, + pub thrashing_delay: u64_, + pub compact_start: u64_, + pub compact_delay: u64_, + pub wpcopy_start: u64_, + pub wpcopy_delay: u64_, + pub irq_delay: u64_, + pub freepages_count: u32_, + pub thrashing_count: u32_, + pub compact_count: u32_, + pub wpcopy_count: u32_, + pub irq_count: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mem_cgroup_thresholds { - pub primary: *mut mem_cgroup_threshold_ary, - pub spare: *mut mem_cgroup_threshold_ary, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fprop_global { - pub events: percpu_counter, - pub period: ::aya_bpf::cty::c_uint, - pub sequence: seqcount_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct wb_domain { - pub lock: spinlock_t, - pub completions: fprop_global, - pub period_timer: timer_list, - pub period_time: ::aya_bpf::cty::c_ulong, - pub dirty_limit_tstamp: ::aya_bpf::cty::c_ulong, - pub dirty_limit: ::aya_bpf::cty::c_ulong, +pub struct vm_struct { + pub next: *mut vm_struct, + pub addr: *mut ::aya_ebpf::cty::c_void, + pub size: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, + pub pages: *mut *mut page, + pub page_order: ::aya_ebpf::cty::c_uint, + pub nr_pages: ::aya_ebpf::cty::c_uint, + pub phys_addr: phys_addr_t, + pub caller: *const ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wb_completion { - pub cnt: atomic_t, - pub waitq: *mut wait_queue_head_t, +pub struct ftrace_hash { + pub size_bits: ::aya_ebpf::cty::c_ulong, + pub buckets: *mut hlist_head, + pub count: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct memcg_cgwb_frn { - pub bdi_id: u64_, - pub memcg_id: ::aya_bpf::cty::c_int, - pub at: u64_, - pub done: wb_completion, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct deferred_split { - pub split_queue_lock: spinlock_t, - pub split_queue: list_head, - pub split_queue_len: ::aya_bpf::cty::c_ulong, +pub struct fwnode_handle { + pub secondary: *mut fwnode_handle, + pub ops: *const fwnode_operations, + pub dev: *mut device, + pub suppliers: list_head, + pub consumers: list_head, + pub flags: u8_, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct lru_gen_mm_list { - pub fifo: list_head, - pub lock: spinlock_t, +pub mod dev_dma_attr { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEV_DMA_NOT_SUPPORTED: Type = 0; + pub const DEV_DMA_NON_COHERENT: Type = 1; + pub const DEV_DMA_COHERENT: Type = 2; } #[repr(C)] -pub struct mem_cgroup { - pub css: cgroup_subsys_state, - pub id: mem_cgroup_id, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, - pub memory: page_counter, - pub __bindgen_anon_1: mem_cgroup__bindgen_ty_1, - pub kmem: page_counter, - pub tcpmem: page_counter, - pub high_work: work_struct, - pub zswap_max: ::aya_bpf::cty::c_ulong, - pub soft_limit: ::aya_bpf::cty::c_ulong, - pub vmpressure: vmpressure, - pub oom_group: bool_, - pub oom_lock: bool_, - pub under_oom: ::aya_bpf::cty::c_int, - pub swappiness: ::aya_bpf::cty::c_int, - pub oom_kill_disable: ::aya_bpf::cty::c_int, - pub events_file: cgroup_file, - pub events_local_file: cgroup_file, - pub swap_events_file: cgroup_file, - pub thresholds_lock: mutex, - pub thresholds: mem_cgroup_thresholds, - pub memsw_thresholds: mem_cgroup_thresholds, - pub oom_notify: list_head, - pub move_charge_at_immigrate: ::aya_bpf::cty::c_ulong, - pub move_lock: spinlock_t, - pub move_lock_flags: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, - pub _pad1_: cacheline_padding, - pub vmstats: *mut memcg_vmstats, - pub memory_events: [atomic_long_t; 9usize], - pub memory_events_local: [atomic_long_t; 9usize], - pub socket_pressure: ::aya_bpf::cty::c_ulong, - pub tcpmem_active: bool_, - pub tcpmem_pressure: ::aya_bpf::cty::c_int, - pub kmemcg_id: ::aya_bpf::cty::c_int, - pub objcg: *mut obj_cgroup, - pub objcg_list: list_head, - pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 56usize]>, - pub _pad2_: cacheline_padding, - pub moving_account: atomic_t, - pub move_lock_task: *mut task_struct, - pub vmstats_percpu: *mut memcg_vmstats_percpu, +#[derive(Debug, Copy, Clone)] +pub struct fwnode_operations { + pub get: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fwnode_handle) -> *mut fwnode_handle, + >, + pub put: ::core::option::Option, + pub device_is_available: + ::core::option::Option bool_>, + pub device_get_match_data: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *const device, + ) -> *const ::aya_ebpf::cty::c_void, + >, + pub device_dma_supported: + ::core::option::Option bool_>, + pub device_get_dma_attr: ::core::option::Option< + unsafe extern "C" fn(arg1: *const fwnode_handle) -> dev_dma_attr::Type, + >, + pub property_present: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *const ::aya_ebpf::cty::c_char, + ) -> bool_, + >, + pub property_read_int_array: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut ::aya_ebpf::cty::c_void, + arg5: usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub property_read_string_array: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: *mut *const ::aya_ebpf::cty::c_char, + arg4: usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_name: ::core::option::Option< + unsafe extern "C" fn(arg1: *const fwnode_handle) -> *const ::aya_ebpf::cty::c_char, + >, + pub get_name_prefix: ::core::option::Option< + unsafe extern "C" fn(arg1: *const fwnode_handle) -> *const ::aya_ebpf::cty::c_char, + >, + pub get_parent: ::core::option::Option< + unsafe extern "C" fn(arg1: *const fwnode_handle) -> *mut fwnode_handle, + >, + pub get_next_child_node: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *mut fwnode_handle, + ) -> *mut fwnode_handle, + >, + pub get_named_child_node: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *const ::aya_ebpf::cty::c_char, + ) -> *mut fwnode_handle, + >, + pub get_reference_args: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: *const ::aya_ebpf::cty::c_char, + arg4: ::aya_ebpf::cty::c_uint, + arg5: ::aya_ebpf::cty::c_uint, + arg6: *mut fwnode_reference_args, + ) -> ::aya_ebpf::cty::c_int, + >, + pub graph_get_next_endpoint: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *mut fwnode_handle, + ) -> *mut fwnode_handle, + >, + pub graph_get_remote_endpoint: ::core::option::Option< + unsafe extern "C" fn(arg1: *const fwnode_handle) -> *mut fwnode_handle, + >, + pub graph_get_port_parent: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fwnode_handle) -> *mut fwnode_handle, + >, + pub graph_parse_endpoint: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: *mut fwnode_endpoint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub iomap: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fwnode_handle, + arg2: ::aya_ebpf::cty::c_int, + ) -> *mut ::aya_ebpf::cty::c_void, + >, + pub irq_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const fwnode_handle, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub add_links: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fwnode_handle) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fwnode_endpoint { + pub port: ::aya_ebpf::cty::c_uint, + pub id: ::aya_ebpf::cty::c_uint, + pub local_fwnode: *const fwnode_handle, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fwnode_reference_args { + pub fwnode: *mut fwnode_handle, + pub nargs: ::aya_ebpf::cty::c_uint, + pub args: [u64_; 8usize], +} +pub type phandle = u32_; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct property { + pub name: *mut ::aya_ebpf::cty::c_char, + pub length: ::aya_ebpf::cty::c_int, + pub value: *mut ::aya_ebpf::cty::c_void, + pub next: *mut property, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct device_node { + pub name: *const ::aya_ebpf::cty::c_char, + pub phandle: phandle, + pub full_name: *const ::aya_ebpf::cty::c_char, + pub fwnode: fwnode_handle, + pub properties: *mut property, + pub deadprops: *mut property, + pub parent: *mut device_node, + pub child: *mut device_node, + pub sibling: *mut device_node, + pub _flags: ::aya_ebpf::cty::c_ulong, + pub data: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct event_filter { + pub prog: *mut prog_entry, + pub filter_string: *mut ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct array_buffer { + pub tr: *mut trace_array, + pub buffer: *mut trace_buffer, + pub data: *mut trace_array_cpu, + pub time_start: u64_, + pub cpu: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct trace_array { + pub list: list_head, + pub name: *mut ::aya_ebpf::cty::c_char, + pub array_buffer: array_buffer, + pub max_buffer: array_buffer, + pub allocated_snapshot: bool_, + pub max_latency: ::aya_ebpf::cty::c_ulong, + pub d_max_latency: *mut dentry, + pub fsnotify_work: work_struct, + pub fsnotify_irqwork: irq_work, + pub filtered_pids: *mut trace_pid_list, + pub filtered_no_pids: *mut trace_pid_list, + pub max_lock: arch_spinlock_t, + pub buffer_disabled: ::aya_ebpf::cty::c_int, + pub sys_refcount_enter: ::aya_ebpf::cty::c_int, + pub sys_refcount_exit: ::aya_ebpf::cty::c_int, + pub enter_syscall_files: [*mut trace_event_file; 462usize], + pub exit_syscall_files: [*mut trace_event_file; 462usize], + pub stop_count: ::aya_ebpf::cty::c_int, + pub clock_id: ::aya_ebpf::cty::c_int, + pub nr_topts: ::aya_ebpf::cty::c_int, + pub clear_trace: bool_, + pub buffer_percent: ::aya_ebpf::cty::c_int, + pub n_err_log_entries: ::aya_ebpf::cty::c_uint, + pub current_trace: *mut tracer, + pub trace_flags: ::aya_ebpf::cty::c_uint, + pub trace_flags_index: [::aya_ebpf::cty::c_uchar; 32usize], + pub flags: ::aya_ebpf::cty::c_uint, + pub start_lock: raw_spinlock_t, + pub system_names: *const ::aya_ebpf::cty::c_char, + pub err_log: list_head, + pub dir: *mut dentry, + pub options: *mut dentry, + pub percpu_dir: *mut dentry, + pub event_dir: *mut eventfs_inode, + pub topts: *mut trace_options, + pub systems: list_head, + pub events: list_head, + pub trace_marker_file: *mut trace_event_file, + pub tracing_cpumask: cpumask_var_t, + pub pipe_cpumask: cpumask_var_t, + pub ref_: ::aya_ebpf::cty::c_int, + pub trace_ref: ::aya_ebpf::cty::c_int, + pub ops: *mut ftrace_ops, + pub function_pids: *mut trace_pid_list, + pub function_no_pids: *mut trace_pid_list, + pub func_probes: list_head, + pub mod_trace: list_head, + pub mod_notrace: list_head, + pub function_enabled: ::aya_ebpf::cty::c_int, + pub no_filter_buffering_ref: ::aya_ebpf::cty::c_int, + pub hist_vars: list_head, + pub cond_snapshot: *mut cond_snapshot, + pub last_func_repeats: *mut trace_func_repeats, + pub ring_buffer_expanded: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tracer { + pub name: *const ::aya_ebpf::cty::c_char, + pub init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut trace_array) -> ::aya_ebpf::cty::c_int, + >, + pub reset: ::core::option::Option, + pub start: ::core::option::Option, + pub stop: ::core::option::Option, + pub update_thresh: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut trace_array) -> ::aya_ebpf::cty::c_int, + >, + pub open: ::core::option::Option, + pub pipe_open: ::core::option::Option, + pub close: ::core::option::Option, + pub pipe_close: ::core::option::Option, + pub read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut trace_iterator, + arg2: *mut file, + arg3: *mut ::aya_ebpf::cty::c_char, + arg4: usize, + arg5: *mut loff_t, + ) -> isize, + >, + pub splice_read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut trace_iterator, + arg2: *mut file, + arg3: *mut loff_t, + arg4: *mut pipe_inode_info, + arg5: usize, + arg6: ::aya_ebpf::cty::c_uint, + ) -> isize, + >, + pub print_header: ::core::option::Option, + pub print_line: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut trace_iterator) -> print_line_t::Type, + >, + pub set_flag: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut trace_array, + arg2: u32_, + arg3: u32_, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub flag_changed: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut trace_array, + arg2: u32_, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub next: *mut tracer, + pub flags: *mut tracer_flags, + pub enabled: ::aya_ebpf::cty::c_int, + pub print_max: bool_, + pub allow_instances: bool_, + pub use_max_tr: bool_, + pub noboot: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct trace_event_file { + pub list: list_head, + pub event_call: *mut trace_event_call, + pub filter: *mut event_filter, + pub ei: *mut eventfs_inode, + pub tr: *mut trace_array, + pub system: *mut trace_subsystem_dir, + pub triggers: list_head, + pub flags: ::aya_ebpf::cty::c_ulong, + pub ref_: atomic_t, + pub sm_ref: atomic_t, + pub tm_ref: atomic_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct trace_subsystem_dir { + pub list: list_head, + pub subsystem: *mut event_subsystem, + pub tr: *mut trace_array, + pub ei: *mut eventfs_inode, + pub ref_count: ::aya_ebpf::cty::c_int, + pub nr_events: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union lower_chunk { + pub next: *mut lower_chunk, + pub data: [::aya_ebpf::cty::c_ulong; 256usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union upper_chunk { + pub next: *mut upper_chunk, + pub data: [*mut lower_chunk; 256usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct trace_pid_list { + pub lock: raw_spinlock_t, + pub refill_irqwork: irq_work, + pub upper: [*mut upper_chunk; 256usize], + pub upper_list: *mut upper_chunk, + pub lower_list: *mut lower_chunk, + pub free_upper_chunks: ::aya_ebpf::cty::c_int, + pub free_lower_chunks: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct trace_array_cpu { + pub disabled: atomic_t, + pub buffer_page: *mut ::aya_ebpf::cty::c_void, + pub entries: ::aya_ebpf::cty::c_ulong, + pub saved_latency: ::aya_ebpf::cty::c_ulong, + pub critical_start: ::aya_ebpf::cty::c_ulong, + pub critical_end: ::aya_ebpf::cty::c_ulong, + pub critical_sequence: ::aya_ebpf::cty::c_ulong, + pub nice: ::aya_ebpf::cty::c_ulong, + pub policy: ::aya_ebpf::cty::c_ulong, + pub rt_priority: ::aya_ebpf::cty::c_ulong, + pub skipped_entries: ::aya_ebpf::cty::c_ulong, + pub preempt_timestamp: u64_, + pub pid: pid_t, + pub uid: kuid_t, + pub comm: [::aya_ebpf::cty::c_char; 16usize], + pub ftrace_ignore_pid: ::aya_ebpf::cty::c_int, + pub ignore_pid: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct trace_options { + pub tracer: *mut tracer, + pub topts: *mut trace_option_dentry, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct trace_option_dentry { + pub opt: *mut tracer_opt, + pub flags: *mut tracer_flags, + pub tr: *mut trace_array, + pub entry: *mut dentry, +} +pub type cond_update_fn_t = ::core::option::Option< + unsafe extern "C" fn(arg1: *mut trace_array, arg2: *mut ::aya_ebpf::cty::c_void) -> bool_, +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cond_snapshot { + pub cond_data: *mut ::aya_ebpf::cty::c_void, + pub update: cond_update_fn_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct trace_func_repeats { + pub ip: ::aya_ebpf::cty::c_ulong, + pub parent_ip: ::aya_ebpf::cty::c_ulong, + pub count: ::aya_ebpf::cty::c_ulong, + pub ts_last_call: u64_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tracer_opt { + pub name: *const ::aya_ebpf::cty::c_char, + pub bit: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tracer_flags { + pub val: u32_, + pub opts: *mut tracer_opt, + pub trace: *mut tracer, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct event_subsystem { + pub list: list_head, + pub name: *const ::aya_ebpf::cty::c_char, + pub filter: *mut event_filter, + pub ref_count: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bio_list { + pub head: *mut bio, + pub tail: *mut bio, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct reclaim_state { + pub reclaimed: ::aya_ebpf::cty::c_ulong, + pub mm_walk: *mut lru_gen_mm_walk, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct capture_control { + pub cc: *mut compact_control, + pub page: *mut page, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mempolicy { + pub refcnt: atomic_t, + pub mode: ::aya_ebpf::cty::c_ushort, + pub flags: ::aya_ebpf::cty::c_ushort, + pub nodes: nodemask_t, + pub home_node: ::aya_ebpf::cty::c_int, + pub w: mempolicy__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union mempolicy__bindgen_ty_1 { + pub cpuset_mems_allowed: nodemask_t, + pub user_nodemask: nodemask_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mem_cgroup_id { + pub id: ::aya_ebpf::cty::c_int, + pub ref_: refcount_t, +} +#[repr(C)] +#[derive(Debug)] +pub struct page_counter { + pub usage: atomic_long_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub _pad1_: cacheline_padding, + pub emin: ::aya_ebpf::cty::c_ulong, + pub min_usage: atomic_long_t, + pub children_min_usage: atomic_long_t, + pub elow: ::aya_ebpf::cty::c_ulong, + pub low_usage: atomic_long_t, + pub children_low_usage: atomic_long_t, + pub watermark: ::aya_ebpf::cty::c_ulong, + pub failcnt: ::aya_ebpf::cty::c_ulong, + pub _pad2_: cacheline_padding, + pub min: ::aya_ebpf::cty::c_ulong, + pub low: ::aya_ebpf::cty::c_ulong, + pub high: ::aya_ebpf::cty::c_ulong, + pub max: ::aya_ebpf::cty::c_ulong, + pub parent: *mut page_counter, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl page_counter { + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct vmpressure { + pub scanned: ::aya_ebpf::cty::c_ulong, + pub reclaimed: ::aya_ebpf::cty::c_ulong, + pub tree_scanned: ::aya_ebpf::cty::c_ulong, + pub tree_reclaimed: ::aya_ebpf::cty::c_ulong, + pub sr_lock: spinlock_t, + pub events: list_head, + pub events_lock: mutex, + pub work: work_struct, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mem_cgroup_thresholds { + pub primary: *mut mem_cgroup_threshold_ary, + pub spare: *mut mem_cgroup_threshold_ary, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct fprop_global { + pub events: percpu_counter, + pub period: ::aya_ebpf::cty::c_uint, + pub sequence: seqcount_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct wb_domain { + pub lock: spinlock_t, + pub completions: fprop_global, + pub period_timer: timer_list, + pub period_time: ::aya_ebpf::cty::c_ulong, + pub dirty_limit_tstamp: ::aya_ebpf::cty::c_ulong, + pub dirty_limit: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wb_completion { + pub cnt: atomic_t, + pub waitq: *mut wait_queue_head_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct memcg_cgwb_frn { + pub bdi_id: u64_, + pub memcg_id: ::aya_ebpf::cty::c_int, + pub at: u64_, + pub done: wb_completion, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct deferred_split { + pub split_queue_lock: spinlock_t, + pub split_queue: list_head, + pub split_queue_len: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct lru_gen_mm_list { + pub fifo: list_head, + pub lock: spinlock_t, +} +#[repr(C)] +pub struct mem_cgroup { + pub css: cgroup_subsys_state, + pub id: mem_cgroup_id, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, + pub memory: page_counter, + pub __bindgen_anon_1: mem_cgroup__bindgen_ty_1, + pub kmem: page_counter, + pub tcpmem: page_counter, + pub high_work: work_struct, + pub zswap_max: ::aya_ebpf::cty::c_ulong, + pub zswap_writeback: bool_, + pub soft_limit: ::aya_ebpf::cty::c_ulong, + pub vmpressure: vmpressure, + pub oom_group: bool_, + pub oom_lock: bool_, + pub under_oom: ::aya_ebpf::cty::c_int, + pub swappiness: ::aya_ebpf::cty::c_int, + pub oom_kill_disable: ::aya_ebpf::cty::c_int, + pub events_file: cgroup_file, + pub events_local_file: cgroup_file, + pub swap_events_file: cgroup_file, + pub thresholds_lock: mutex, + pub thresholds: mem_cgroup_thresholds, + pub memsw_thresholds: mem_cgroup_thresholds, + pub oom_notify: list_head, + pub move_charge_at_immigrate: ::aya_ebpf::cty::c_ulong, + pub move_lock: spinlock_t, + pub move_lock_flags: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, + pub _pad1_: cacheline_padding, + pub vmstats: *mut memcg_vmstats, + pub memory_events: [atomic_long_t; 9usize], + pub memory_events_local: [atomic_long_t; 9usize], + pub socket_pressure: ::aya_ebpf::cty::c_ulong, + pub tcpmem_active: bool_, + pub tcpmem_pressure: ::aya_ebpf::cty::c_int, + pub kmemcg_id: ::aya_ebpf::cty::c_int, + pub objcg: *mut obj_cgroup, + pub orig_objcg: *mut obj_cgroup, + pub objcg_list: list_head, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 48usize]>, + pub _pad2_: cacheline_padding, + pub moving_account: atomic_t, + pub move_lock_task: *mut task_struct, + pub vmstats_percpu: *mut memcg_vmstats_percpu, pub cgwb_list: list_head, pub cgwb_domain: wb_domain, pub cgwb_frn: [memcg_cgwb_frn; 4usize], @@ -11903,22 +11219,63 @@ pub struct mem_cgroup__bindgen_ty_1 { pub bindgen_union_field: [u64; 24usize], } #[repr(C)] +#[derive(Copy, Clone)] +pub struct obj_cgroup { + pub refcnt: percpu_ref, + pub memcg: *mut mem_cgroup, + pub nr_charged_bytes: atomic_t, + pub __bindgen_anon_1: obj_cgroup__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union obj_cgroup__bindgen_ty_1 { + pub list: list_head, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct hlist_nulls_head { + pub first: *mut hlist_nulls_node, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct hlist_nulls_node { + pub next: *mut hlist_nulls_node, + pub pprev: *mut *mut hlist_nulls_node, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct anon_vma { + pub root: *mut anon_vma, + pub rwsem: rw_semaphore, + pub refcount: atomic_t, + pub num_children: ::aya_ebpf::cty::c_ulong, + pub num_active_vmas: ::aya_ebpf::cty::c_ulong, + pub parent: *mut anon_vma, + pub rb_root: rb_root_cached, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct zswap_lruvec_state { + pub nr_zswap_protected: atomic_long_t, +} +#[repr(C)] #[derive(Debug, Copy, Clone)] pub struct free_area { pub free_list: [list_head; 6usize], - pub nr_free: ::aya_bpf::cty::c_ulong, + pub nr_free: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct lru_gen_folio { - pub max_seq: ::aya_bpf::cty::c_ulong, - pub min_seq: [::aya_bpf::cty::c_ulong; 2usize], - pub timestamps: [::aya_bpf::cty::c_ulong; 4usize], + pub max_seq: ::aya_ebpf::cty::c_ulong, + pub min_seq: [::aya_ebpf::cty::c_ulong; 2usize], + pub timestamps: [::aya_ebpf::cty::c_ulong; 4usize], pub folios: [list_head; 40usize], - pub nr_pages: [::aya_bpf::cty::c_long; 40usize], - pub avg_refaulted: [::aya_bpf::cty::c_ulong; 8usize], - pub avg_total: [::aya_bpf::cty::c_ulong; 8usize], - pub protected: [::aya_bpf::cty::c_ulong; 6usize], + pub nr_pages: [::aya_ebpf::cty::c_long; 40usize], + pub avg_refaulted: [::aya_ebpf::cty::c_ulong; 8usize], + pub avg_total: [::aya_ebpf::cty::c_ulong; 8usize], + pub protected: [::aya_ebpf::cty::c_ulong; 6usize], pub evicted: [atomic_long_t; 8usize], pub refaulted: [atomic_long_t; 8usize], pub enabled: bool_, @@ -11929,21 +11286,21 @@ pub struct lru_gen_folio { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct lru_gen_mm_state { - pub seq: ::aya_bpf::cty::c_ulong, + pub seq: ::aya_ebpf::cty::c_ulong, pub head: *mut list_head, pub tail: *mut list_head, - pub filters: [*mut ::aya_bpf::cty::c_ulong; 2usize], - pub stats: [::aya_bpf::cty::c_ulong; 6usize], + pub filters: [*mut ::aya_ebpf::cty::c_ulong; 2usize], + pub stats: [::aya_ebpf::cty::c_ulong; 6usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct lru_gen_mm_walk { pub lruvec: *mut lruvec, - pub max_seq: ::aya_bpf::cty::c_ulong, - pub next_addr: ::aya_bpf::cty::c_ulong, - pub nr_pages: [::aya_bpf::cty::c_int; 40usize], - pub mm_stats: [::aya_bpf::cty::c_int; 6usize], - pub batched: ::aya_bpf::cty::c_int, + pub max_seq: ::aya_ebpf::cty::c_ulong, + pub next_addr: ::aya_ebpf::cty::c_ulong, + pub nr_pages: [::aya_ebpf::cty::c_int; 40usize], + pub mm_stats: [::aya_ebpf::cty::c_int; 6usize], + pub batched: ::aya_ebpf::cty::c_int, pub can_swap: bool_, pub force_scan: bool_, } @@ -11952,78 +11309,81 @@ pub struct lru_gen_mm_walk { pub struct lruvec { pub lists: [list_head; 5usize], pub lru_lock: spinlock_t, - pub anon_cost: ::aya_bpf::cty::c_ulong, - pub file_cost: ::aya_bpf::cty::c_ulong, + pub anon_cost: ::aya_ebpf::cty::c_ulong, + pub file_cost: ::aya_ebpf::cty::c_ulong, pub nonresident_age: atomic_long_t, - pub refaults: [::aya_bpf::cty::c_ulong; 2usize], - pub flags: ::aya_bpf::cty::c_ulong, + pub refaults: [::aya_ebpf::cty::c_ulong; 2usize], + pub flags: ::aya_ebpf::cty::c_ulong, pub lrugen: lru_gen_folio, pub mm_state: lru_gen_mm_state, pub pgdat: *mut pglist_data, + pub zswap_lruvec_state: zswap_lruvec_state, } #[repr(C)] #[derive(Copy, Clone)] pub struct lru_gen_memcg { - pub seq: ::aya_bpf::cty::c_ulong, - pub nr_memcgs: [::aya_bpf::cty::c_ulong; 2usize], - pub fifo: [hlist_nulls_head; 16usize], + pub seq: ::aya_ebpf::cty::c_ulong, + pub nr_memcgs: [::aya_ebpf::cty::c_ulong; 3usize], + pub fifo: [hlist_nulls_head; 24usize], pub lock: spinlock_t, } #[repr(C)] pub struct zone { - pub _watermark: [::aya_bpf::cty::c_ulong; 4usize], - pub watermark_boost: ::aya_bpf::cty::c_ulong, - pub nr_reserved_highatomic: ::aya_bpf::cty::c_ulong, - pub lowmem_reserve: [::aya_bpf::cty::c_long; 5usize], - pub node: ::aya_bpf::cty::c_int, + pub _watermark: [::aya_ebpf::cty::c_ulong; 4usize], + pub watermark_boost: ::aya_ebpf::cty::c_ulong, + pub nr_reserved_highatomic: ::aya_ebpf::cty::c_ulong, + pub lowmem_reserve: [::aya_ebpf::cty::c_long; 5usize], + pub node: ::aya_ebpf::cty::c_int, pub zone_pgdat: *mut pglist_data, pub per_cpu_pageset: *mut per_cpu_pages, pub per_cpu_zonestats: *mut per_cpu_zonestat, - pub pageset_high: ::aya_bpf::cty::c_int, - pub pageset_batch: ::aya_bpf::cty::c_int, - pub zone_start_pfn: ::aya_bpf::cty::c_ulong, + pub pageset_high_min: ::aya_ebpf::cty::c_int, + pub pageset_high_max: ::aya_ebpf::cty::c_int, + pub pageset_batch: ::aya_ebpf::cty::c_int, + pub zone_start_pfn: ::aya_ebpf::cty::c_ulong, pub managed_pages: atomic_long_t, - pub spanned_pages: ::aya_bpf::cty::c_ulong, - pub present_pages: ::aya_bpf::cty::c_ulong, - pub present_early_pages: ::aya_bpf::cty::c_ulong, - pub cma_pages: ::aya_bpf::cty::c_ulong, - pub name: *const ::aya_bpf::cty::c_char, - pub nr_isolate_pageblock: ::aya_bpf::cty::c_ulong, + pub spanned_pages: ::aya_ebpf::cty::c_ulong, + pub present_pages: ::aya_ebpf::cty::c_ulong, + pub present_early_pages: ::aya_ebpf::cty::c_ulong, + pub cma_pages: ::aya_ebpf::cty::c_ulong, + pub name: *const ::aya_ebpf::cty::c_char, + pub nr_isolate_pageblock: ::aya_ebpf::cty::c_ulong, pub span_seqlock: seqlock_t, - pub initialized: ::aya_bpf::cty::c_int, + pub initialized: ::aya_ebpf::cty::c_int, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, pub __bindgen_padding_0: [u8; 4usize], pub _pad1_: cacheline_padding, pub free_area: [free_area; 11usize], - pub flags: ::aya_bpf::cty::c_ulong, + pub unaccepted_pages: list_head, + pub flags: ::aya_ebpf::cty::c_ulong, pub lock: spinlock_t, pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 40usize]>, pub __bindgen_padding_1: [u8; 4usize], pub _pad2_: cacheline_padding, - pub percpu_drift_mark: ::aya_bpf::cty::c_ulong, - pub compact_cached_free_pfn: ::aya_bpf::cty::c_ulong, - pub compact_cached_migrate_pfn: [::aya_bpf::cty::c_ulong; 2usize], - pub compact_init_migrate_pfn: ::aya_bpf::cty::c_ulong, - pub compact_init_free_pfn: ::aya_bpf::cty::c_ulong, - pub compact_considered: ::aya_bpf::cty::c_uint, - pub compact_defer_shift: ::aya_bpf::cty::c_uint, - pub compact_order_failed: ::aya_bpf::cty::c_int, + pub percpu_drift_mark: ::aya_ebpf::cty::c_ulong, + pub compact_cached_free_pfn: ::aya_ebpf::cty::c_ulong, + pub compact_cached_migrate_pfn: [::aya_ebpf::cty::c_ulong; 2usize], + pub compact_init_migrate_pfn: ::aya_ebpf::cty::c_ulong, + pub compact_init_free_pfn: ::aya_ebpf::cty::c_ulong, + pub compact_considered: ::aya_ebpf::cty::c_uint, + pub compact_defer_shift: ::aya_ebpf::cty::c_uint, + pub compact_order_failed: ::aya_ebpf::cty::c_int, pub compact_blockskip_flush: bool_, pub contiguous: bool_, pub __bindgen_padding_2: [u8; 2usize], pub _pad3_: cacheline_padding, - pub vm_stat: [atomic_long_t; 11usize], + pub vm_stat: [atomic_long_t; 12usize], pub vm_numa_event: [atomic_long_t; 6usize], pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 56usize]>, + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 48usize]>, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct zoneref { pub zone: *mut zone, - pub zone_idx: ::aya_bpf::cty::c_int, + pub zone_idx: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -12031,7 +11391,7 @@ pub struct zonelist { pub _zonerefs: [zoneref; 161usize], } pub mod zone_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const ZONE_DMA: Type = 0; pub const ZONE_DMA32: Type = 1; pub const ZONE_NORMAL: Type = 2; @@ -12042,62 +11402,62 @@ pub mod zone_type { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct memory_failure_stats { - pub total: ::aya_bpf::cty::c_ulong, - pub ignored: ::aya_bpf::cty::c_ulong, - pub failed: ::aya_bpf::cty::c_ulong, - pub delayed: ::aya_bpf::cty::c_ulong, - pub recovered: ::aya_bpf::cty::c_ulong, + pub total: ::aya_ebpf::cty::c_ulong, + pub ignored: ::aya_ebpf::cty::c_ulong, + pub failed: ::aya_ebpf::cty::c_ulong, + pub delayed: ::aya_ebpf::cty::c_ulong, + pub recovered: ::aya_ebpf::cty::c_ulong, } #[repr(C)] pub struct pglist_data { pub node_zones: [zone; 5usize], pub node_zonelists: [zonelist; 2usize], - pub nr_zones: ::aya_bpf::cty::c_int, + pub nr_zones: ::aya_ebpf::cty::c_int, pub node_size_lock: spinlock_t, - pub node_start_pfn: ::aya_bpf::cty::c_ulong, - pub node_present_pages: ::aya_bpf::cty::c_ulong, - pub node_spanned_pages: ::aya_bpf::cty::c_ulong, - pub node_id: ::aya_bpf::cty::c_int, + pub node_start_pfn: ::aya_ebpf::cty::c_ulong, + pub node_present_pages: ::aya_ebpf::cty::c_ulong, + pub node_spanned_pages: ::aya_ebpf::cty::c_ulong, + pub node_id: ::aya_ebpf::cty::c_int, pub kswapd_wait: wait_queue_head_t, pub pfmemalloc_wait: wait_queue_head_t, pub reclaim_wait: [wait_queue_head_t; 4usize], pub nr_writeback_throttled: atomic_t, - pub nr_reclaim_start: ::aya_bpf::cty::c_ulong, + pub nr_reclaim_start: ::aya_ebpf::cty::c_ulong, pub kswapd_lock: mutex, pub kswapd: *mut task_struct, - pub kswapd_order: ::aya_bpf::cty::c_int, + pub kswapd_order: ::aya_ebpf::cty::c_int, pub kswapd_highest_zoneidx: zone_type::Type, - pub kswapd_failures: ::aya_bpf::cty::c_int, - pub kcompactd_max_order: ::aya_bpf::cty::c_int, + pub kswapd_failures: ::aya_ebpf::cty::c_int, + pub kcompactd_max_order: ::aya_ebpf::cty::c_int, pub kcompactd_highest_zoneidx: zone_type::Type, pub kcompactd_wait: wait_queue_head_t, pub kcompactd: *mut task_struct, pub proactive_compact_trigger: bool_, - pub totalreserve_pages: ::aya_bpf::cty::c_ulong, - pub min_unmapped_pages: ::aya_bpf::cty::c_ulong, - pub min_slab_pages: ::aya_bpf::cty::c_ulong, + pub totalreserve_pages: ::aya_ebpf::cty::c_ulong, + pub min_unmapped_pages: ::aya_ebpf::cty::c_ulong, + pub min_slab_pages: ::aya_ebpf::cty::c_ulong, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, pub _pad1_: cacheline_padding, pub deferred_split_queue: deferred_split, - pub nbp_rl_start: ::aya_bpf::cty::c_uint, - pub nbp_rl_nr_cand: ::aya_bpf::cty::c_ulong, - pub nbp_threshold: ::aya_bpf::cty::c_uint, - pub nbp_th_start: ::aya_bpf::cty::c_uint, - pub nbp_th_nr_cand: ::aya_bpf::cty::c_ulong, + pub nbp_rl_start: ::aya_ebpf::cty::c_uint, + pub nbp_rl_nr_cand: ::aya_ebpf::cty::c_ulong, + pub nbp_threshold: ::aya_ebpf::cty::c_uint, + pub nbp_th_start: ::aya_ebpf::cty::c_uint, + pub nbp_th_nr_cand: ::aya_ebpf::cty::c_ulong, pub __lruvec: lruvec, - pub flags: ::aya_bpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, pub mm_walk: lru_gen_mm_walk, pub memcg_lru: lru_gen_memcg, pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 8usize]>, pub _pad2_: cacheline_padding, pub per_cpu_nodestats: *mut per_cpu_nodestat, - pub vm_stat: [atomic_long_t; 43usize], + pub vm_stat: [atomic_long_t; 46usize], pub memtier: *mut memory_tier, pub mf_stats: memory_failure_stats, pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 48usize]>, + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 24usize]>, } impl pglist_data { #[inline] @@ -12106,7 +11466,12 @@ impl pglist_data { __bindgen_bitfield_unit } #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 24usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); __bindgen_bitfield_unit } @@ -12115,154 +11480,62 @@ impl pglist_data { #[derive(Copy, Clone)] pub struct per_cpu_pages { pub lock: spinlock_t, - pub count: ::aya_bpf::cty::c_int, - pub high: ::aya_bpf::cty::c_int, - pub batch: ::aya_bpf::cty::c_int, - pub free_factor: ::aya_bpf::cty::c_short, - pub expire: ::aya_bpf::cty::c_short, + pub count: ::aya_ebpf::cty::c_int, + pub high: ::aya_ebpf::cty::c_int, + pub high_min: ::aya_ebpf::cty::c_int, + pub high_max: ::aya_ebpf::cty::c_int, + pub batch: ::aya_ebpf::cty::c_int, + pub flags: u8_, + pub alloc_factor: u8_, + pub expire: u8_, + pub free_count: ::aya_ebpf::cty::c_short, pub lists: [list_head; 13usize], pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, } impl per_cpu_pages { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct per_cpu_zonestat { - pub vm_stat_diff: [s8; 11usize], + pub vm_stat_diff: [s8; 12usize], pub stat_threshold: s8, - pub vm_numa_event: [::aya_bpf::cty::c_ulong; 6usize], + pub vm_numa_event: [::aya_ebpf::cty::c_ulong; 6usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct per_cpu_nodestat { pub stat_threshold: s8, - pub vm_node_stat_diff: [s8; 43usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bio_list { - pub head: *mut bio, - pub tail: *mut bio, + pub vm_node_stat_diff: [s8; 46usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct reclaim_state { - pub reclaimed: ::aya_bpf::cty::c_ulong, - pub mm_walk: *mut lru_gen_mm_walk, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fprop_local_percpu { - pub events: percpu_counter, - pub period: ::aya_bpf::cty::c_uint, - pub lock: raw_spinlock_t, -} -pub mod wb_reason { - pub type Type = ::aya_bpf::cty::c_uint; - pub const WB_REASON_BACKGROUND: Type = 0; - pub const WB_REASON_VMSCAN: Type = 1; - pub const WB_REASON_SYNC: Type = 2; - pub const WB_REASON_PERIODIC: Type = 3; - pub const WB_REASON_LAPTOP_TIMER: Type = 4; - pub const WB_REASON_FS_FREE_SPACE: Type = 5; - pub const WB_REASON_FORKER_THREAD: Type = 6; - pub const WB_REASON_FOREIGN_FLUSH: Type = 7; - pub const WB_REASON_MAX: Type = 8; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct bdi_writeback { - pub bdi: *mut backing_dev_info, - pub state: ::aya_bpf::cty::c_ulong, - pub last_old_flush: ::aya_bpf::cty::c_ulong, - pub b_dirty: list_head, - pub b_io: list_head, - pub b_more_io: list_head, - pub b_dirty_time: list_head, - pub list_lock: spinlock_t, - pub writeback_inodes: atomic_t, - pub stat: [percpu_counter; 4usize], - pub bw_time_stamp: ::aya_bpf::cty::c_ulong, - pub dirtied_stamp: ::aya_bpf::cty::c_ulong, - pub written_stamp: ::aya_bpf::cty::c_ulong, - pub write_bandwidth: ::aya_bpf::cty::c_ulong, - pub avg_write_bandwidth: ::aya_bpf::cty::c_ulong, - pub dirty_ratelimit: ::aya_bpf::cty::c_ulong, - pub balanced_dirty_ratelimit: ::aya_bpf::cty::c_ulong, - pub completions: fprop_local_percpu, - pub dirty_exceeded: ::aya_bpf::cty::c_int, - pub start_all_reason: wb_reason::Type, - pub work_lock: spinlock_t, - pub work_list: list_head, - pub dwork: delayed_work, - pub bw_dwork: delayed_work, - pub dirty_sleep: ::aya_bpf::cty::c_ulong, - pub bdi_node: list_head, - pub refcnt: percpu_ref, - pub memcg_completions: fprop_local_percpu, - pub memcg_css: *mut cgroup_subsys_state, - pub blkcg_css: *mut cgroup_subsys_state, - pub memcg_node: list_head, - pub blkcg_node: list_head, - pub b_attached: list_head, - pub offline_node: list_head, - pub __bindgen_anon_1: bdi_writeback__bindgen_ty_1, +pub struct shrinker_info_unit { + pub nr_deferred: [atomic_long_t; 64usize], + pub map: [::aya_ebpf::cty::c_ulong; 1usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union bdi_writeback__bindgen_ty_1 { - pub release_work: work_struct, +#[derive(Debug)] +pub struct shrinker_info { pub rcu: callback_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct backing_dev_info { - pub id: u64_, - pub rb_node: rb_node, - pub bdi_list: list_head, - pub ra_pages: ::aya_bpf::cty::c_ulong, - pub io_pages: ::aya_bpf::cty::c_ulong, - pub refcnt: kref, - pub capabilities: ::aya_bpf::cty::c_uint, - pub min_ratio: ::aya_bpf::cty::c_uint, - pub max_ratio: ::aya_bpf::cty::c_uint, - pub max_prop_frac: ::aya_bpf::cty::c_uint, - pub tot_write_bandwidth: atomic_long_t, - pub wb: bdi_writeback, - pub wb_list: list_head, - pub cgwb_tree: xarray, - pub cgwb_release_mutex: mutex, - pub wb_switch_rwsem: rw_semaphore, - pub wb_waitq: wait_queue_head_t, - pub dev: *mut device, - pub dev_name: [::aya_bpf::cty::c_char; 64usize], - pub owner: *mut device, - pub laptop_mode_wb_timer: timer_list, - pub debug_dir: *mut dentry, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wait_page_queue { - pub folio: *mut folio, - pub bit_nr: ::aya_bpf::cty::c_int, - pub wait: wait_queue_entry_t, + pub map_nr_max: ::aya_ebpf::cty::c_int, + pub unit: __IncompleteArrayField<*mut shrinker_info_unit>, } pub mod writeback_sync_modes { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const WB_SYNC_NONE: Type = 0; pub const WB_SYNC_ALL: Type = 1; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct writeback_control { - pub nr_to_write: ::aya_bpf::cty::c_long, - pub pages_skipped: ::aya_bpf::cty::c_long, + pub nr_to_write: ::aya_ebpf::cty::c_long, + pub pages_skipped: ::aya_ebpf::cty::c_long, pub range_start: loff_t, pub range_end: loff_t, pub sync_mode: writeback_sync_modes::Type, @@ -12271,97 +11544,97 @@ pub struct writeback_control { pub swap_plug: *mut *mut swap_iocb, pub wb: *mut bdi_writeback, pub inode: *mut inode, - pub wb_id: ::aya_bpf::cty::c_int, - pub wb_lcand_id: ::aya_bpf::cty::c_int, - pub wb_tcand_id: ::aya_bpf::cty::c_int, + pub wb_id: ::aya_ebpf::cty::c_int, + pub wb_lcand_id: ::aya_ebpf::cty::c_int, + pub wb_tcand_id: ::aya_ebpf::cty::c_int, pub wb_bytes: usize, pub wb_lcand_bytes: usize, pub wb_tcand_bytes: usize, } impl writeback_control { #[inline] - pub fn for_kupdate(&self) -> ::aya_bpf::cty::c_uint { + pub fn for_kupdate(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_for_kupdate(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_for_kupdate(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn for_background(&self) -> ::aya_bpf::cty::c_uint { + pub fn for_background(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_for_background(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_for_background(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn tagged_writepages(&self) -> ::aya_bpf::cty::c_uint { + pub fn tagged_writepages(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_tagged_writepages(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_tagged_writepages(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn for_reclaim(&self) -> ::aya_bpf::cty::c_uint { + pub fn for_reclaim(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_for_reclaim(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_for_reclaim(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn range_cyclic(&self) -> ::aya_bpf::cty::c_uint { + pub fn range_cyclic(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_range_cyclic(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_range_cyclic(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] - pub fn for_sync(&self) -> ::aya_bpf::cty::c_uint { + pub fn for_sync(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } } #[inline] - pub fn set_for_sync(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_for_sync(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] - pub fn unpinned_fscache_wb(&self) -> ::aya_bpf::cty::c_uint { + pub fn unpinned_netfs_wb(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } } #[inline] - pub fn set_unpinned_fscache_wb(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_unpinned_netfs_wb(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] - pub fn no_cgroup_owner(&self) -> ::aya_bpf::cty::c_uint { + pub fn no_cgroup_owner(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } } #[inline] - pub fn set_no_cgroup_owner(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_no_cgroup_owner(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(7usize, 1u8, val as u64) @@ -12369,14 +11642,14 @@ impl writeback_control { } #[inline] pub fn new_bitfield_1( - for_kupdate: ::aya_bpf::cty::c_uint, - for_background: ::aya_bpf::cty::c_uint, - tagged_writepages: ::aya_bpf::cty::c_uint, - for_reclaim: ::aya_bpf::cty::c_uint, - range_cyclic: ::aya_bpf::cty::c_uint, - for_sync: ::aya_bpf::cty::c_uint, - unpinned_fscache_wb: ::aya_bpf::cty::c_uint, - no_cgroup_owner: ::aya_bpf::cty::c_uint, + for_kupdate: ::aya_ebpf::cty::c_uint, + for_background: ::aya_ebpf::cty::c_uint, + tagged_writepages: ::aya_ebpf::cty::c_uint, + for_reclaim: ::aya_ebpf::cty::c_uint, + range_cyclic: ::aya_ebpf::cty::c_uint, + for_sync: ::aya_ebpf::cty::c_uint, + unpinned_netfs_wb: ::aya_ebpf::cty::c_uint, + no_cgroup_owner: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { @@ -12404,8 +11677,8 @@ impl writeback_control { for_sync as u64 }); __bindgen_bitfield_unit.set(6usize, 1u8, { - let unpinned_fscache_wb: u32 = unsafe { ::core::mem::transmute(unpinned_fscache_wb) }; - unpinned_fscache_wb as u64 + let unpinned_netfs_wb: u32 = unsafe { ::core::mem::transmute(unpinned_netfs_wb) }; + unpinned_netfs_wb as u64 }); __bindgen_bitfield_unit.set(7usize, 1u8, { let no_cgroup_owner: u32 = unsafe { ::core::mem::transmute(no_cgroup_owner) }; @@ -12415,18 +11688,6 @@ impl writeback_control { } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct readahead_control { - pub file: *mut file, - pub mapping: *mut address_space, - pub ra: *mut file_ra_state, - pub _index: ::aya_bpf::cty::c_ulong, - pub _nr_pages: ::aya_bpf::cty::c_uint, - pub _batch_count: ::aya_bpf::cty::c_uint, - pub _workingset: bool_, - pub _pflags: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] #[derive(Copy, Clone)] pub struct swap_cluster_info { pub lock: spinlock_t, @@ -12435,22 +11696,22 @@ pub struct swap_cluster_info { } impl swap_cluster_info { #[inline] - pub fn data(&self) -> ::aya_bpf::cty::c_uint { + pub fn data(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 24u8) as u32) } } #[inline] - pub fn set_data(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_data(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 24u8, val as u64) } } #[inline] - pub fn flags(&self) -> ::aya_bpf::cty::c_uint { + pub fn flags(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(24usize, 8u8) as u32) } } #[inline] - pub fn set_flags(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_flags(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(24usize, 8u8, val as u64) @@ -12458,8 +11719,8 @@ impl swap_cluster_info { } #[inline] pub fn new_bitfield_1( - data: ::aya_bpf::cty::c_uint, - flags: ::aya_bpf::cty::c_uint, + data: ::aya_ebpf::cty::c_uint, + flags: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 4usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 24u8, { @@ -12482,29 +11743,28 @@ pub struct swap_cluster_list { #[repr(C)] pub struct swap_info_struct { pub users: percpu_ref, - pub flags: ::aya_bpf::cty::c_ulong, - pub prio: ::aya_bpf::cty::c_short, + pub flags: ::aya_ebpf::cty::c_ulong, + pub prio: ::aya_ebpf::cty::c_short, pub list: plist_node, - pub type_: ::aya_bpf::cty::c_schar, - pub max: ::aya_bpf::cty::c_uint, - pub swap_map: *mut ::aya_bpf::cty::c_uchar, + pub type_: ::aya_ebpf::cty::c_schar, + pub max: ::aya_ebpf::cty::c_uint, + pub swap_map: *mut ::aya_ebpf::cty::c_uchar, pub cluster_info: *mut swap_cluster_info, pub free_clusters: swap_cluster_list, - pub lowest_bit: ::aya_bpf::cty::c_uint, - pub highest_bit: ::aya_bpf::cty::c_uint, - pub pages: ::aya_bpf::cty::c_uint, - pub inuse_pages: ::aya_bpf::cty::c_uint, - pub cluster_next: ::aya_bpf::cty::c_uint, - pub cluster_nr: ::aya_bpf::cty::c_uint, - pub cluster_next_cpu: *mut ::aya_bpf::cty::c_uint, + pub lowest_bit: ::aya_ebpf::cty::c_uint, + pub highest_bit: ::aya_ebpf::cty::c_uint, + pub pages: ::aya_ebpf::cty::c_uint, + pub inuse_pages: ::aya_ebpf::cty::c_uint, + pub cluster_next: ::aya_ebpf::cty::c_uint, + pub cluster_nr: ::aya_ebpf::cty::c_uint, + pub cluster_next_cpu: *mut ::aya_ebpf::cty::c_uint, pub percpu_cluster: *mut percpu_cluster, pub swap_extent_root: rb_root, + pub bdev_handle: *mut bdev_handle, pub bdev: *mut block_device, pub swap_file: *mut file, - pub old_block_size: ::aya_bpf::cty::c_uint, + pub old_block_size: ::aya_ebpf::cty::c_uint, pub comp: completion, - pub frontswap_map: *mut ::aya_bpf::cty::c_ulong, - pub frontswap_pages: atomic_t, pub lock: spinlock_t, pub cont_lock: spinlock_t, pub discard_work: work_struct, @@ -12513,43 +11773,135 @@ pub struct swap_info_struct { } #[repr(C)] #[derive(Copy, Clone)] +pub struct fprop_local_percpu { + pub events: percpu_counter, + pub period: ::aya_ebpf::cty::c_uint, + pub lock: raw_spinlock_t, +} +pub mod wb_reason { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const WB_REASON_BACKGROUND: Type = 0; + pub const WB_REASON_VMSCAN: Type = 1; + pub const WB_REASON_SYNC: Type = 2; + pub const WB_REASON_PERIODIC: Type = 3; + pub const WB_REASON_LAPTOP_TIMER: Type = 4; + pub const WB_REASON_FS_FREE_SPACE: Type = 5; + pub const WB_REASON_FORKER_THREAD: Type = 6; + pub const WB_REASON_FOREIGN_FLUSH: Type = 7; + pub const WB_REASON_MAX: Type = 8; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bdi_writeback { + pub bdi: *mut backing_dev_info, + pub state: ::aya_ebpf::cty::c_ulong, + pub last_old_flush: ::aya_ebpf::cty::c_ulong, + pub b_dirty: list_head, + pub b_io: list_head, + pub b_more_io: list_head, + pub b_dirty_time: list_head, + pub list_lock: spinlock_t, + pub writeback_inodes: atomic_t, + pub stat: [percpu_counter; 4usize], + pub bw_time_stamp: ::aya_ebpf::cty::c_ulong, + pub dirtied_stamp: ::aya_ebpf::cty::c_ulong, + pub written_stamp: ::aya_ebpf::cty::c_ulong, + pub write_bandwidth: ::aya_ebpf::cty::c_ulong, + pub avg_write_bandwidth: ::aya_ebpf::cty::c_ulong, + pub dirty_ratelimit: ::aya_ebpf::cty::c_ulong, + pub balanced_dirty_ratelimit: ::aya_ebpf::cty::c_ulong, + pub completions: fprop_local_percpu, + pub dirty_exceeded: ::aya_ebpf::cty::c_int, + pub start_all_reason: wb_reason::Type, + pub work_lock: spinlock_t, + pub work_list: list_head, + pub dwork: delayed_work, + pub bw_dwork: delayed_work, + pub bdi_node: list_head, + pub refcnt: percpu_ref, + pub memcg_completions: fprop_local_percpu, + pub memcg_css: *mut cgroup_subsys_state, + pub blkcg_css: *mut cgroup_subsys_state, + pub memcg_node: list_head, + pub blkcg_node: list_head, + pub b_attached: list_head, + pub offline_node: list_head, + pub __bindgen_anon_1: bdi_writeback__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bdi_writeback__bindgen_ty_1 { + pub release_work: work_struct, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Copy, Clone)] pub struct block_device { pub bd_start_sect: sector_t, pub bd_nr_sectors: sector_t, pub bd_disk: *mut gendisk, pub bd_queue: *mut request_queue, pub bd_stats: *mut disk_stats, - pub bd_stamp: ::aya_bpf::cty::c_ulong, + pub bd_stamp: ::aya_ebpf::cty::c_ulong, pub bd_read_only: bool_, pub bd_partno: u8_, pub bd_write_holder: bool_, pub bd_has_submit_bio: bool_, pub bd_dev: dev_t, + pub bd_inode: *mut inode, pub bd_openers: atomic_t, pub bd_size_lock: spinlock_t, - pub bd_inode: *mut inode, - pub bd_super: *mut super_block, - pub bd_claiming: *mut ::aya_bpf::cty::c_void, - pub bd_holder: *mut ::aya_bpf::cty::c_void, - pub bd_fsfreeze_count: ::aya_bpf::cty::c_int, - pub bd_holders: ::aya_bpf::cty::c_int, + pub bd_claiming: *mut ::aya_ebpf::cty::c_void, + pub bd_holder: *mut ::aya_ebpf::cty::c_void, + pub bd_holder_ops: *const blk_holder_ops, + pub bd_holder_lock: mutex, + pub bd_holders: ::aya_ebpf::cty::c_int, pub bd_holder_dir: *mut kobject, + pub bd_fsfreeze_count: atomic_t, pub bd_fsfreeze_mutex: mutex, - pub bd_fsfreeze_sb: *mut super_block, pub bd_meta_info: *mut partition_meta_info, + pub bd_ro_warned: bool_, + pub bd_writers: ::aya_ebpf::cty::c_int, pub bd_device: device, } +#[repr(C)] +#[derive(Copy, Clone)] +pub struct backing_dev_info { + pub id: u64_, + pub rb_node: rb_node, + pub bdi_list: list_head, + pub ra_pages: ::aya_ebpf::cty::c_ulong, + pub io_pages: ::aya_ebpf::cty::c_ulong, + pub refcnt: kref, + pub capabilities: ::aya_ebpf::cty::c_uint, + pub min_ratio: ::aya_ebpf::cty::c_uint, + pub max_ratio: ::aya_ebpf::cty::c_uint, + pub max_prop_frac: ::aya_ebpf::cty::c_uint, + pub tot_write_bandwidth: atomic_long_t, + pub last_bdp_sleep: ::aya_ebpf::cty::c_ulong, + pub wb: bdi_writeback, + pub wb_list: list_head, + pub cgwb_tree: xarray, + pub cgwb_release_mutex: mutex, + pub wb_switch_rwsem: rw_semaphore, + pub wb_waitq: wait_queue_head_t, + pub dev: *mut device, + pub dev_name: [::aya_ebpf::cty::c_char; 64usize], + pub owner: *mut device, + pub laptop_mode_wb_timer: timer_list, + pub debug_dir: *mut dentry, +} pub type blk_opf_t = __u32; pub type blk_status_t = u8_; #[repr(C, packed)] #[derive(Debug, Copy, Clone)] pub struct bvec_iter { pub bi_sector: sector_t, - pub bi_size: ::aya_bpf::cty::c_uint, - pub bi_idx: ::aya_bpf::cty::c_uint, - pub bi_bvec_done: ::aya_bpf::cty::c_uint, + pub bi_size: ::aya_ebpf::cty::c_uint, + pub bi_idx: ::aya_ebpf::cty::c_uint, + pub bi_bvec_done: ::aya_ebpf::cty::c_uint, } -pub type blk_qc_t = ::aya_bpf::cty::c_uint; +pub type blk_qc_t = ::aya_ebpf::cty::c_uint; pub type bio_end_io_t = ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -12561,21 +11913,21 @@ pub struct bio { pub bi_next: *mut bio, pub bi_bdev: *mut block_device, pub bi_opf: blk_opf_t, - pub bi_flags: ::aya_bpf::cty::c_ushort, - pub bi_ioprio: ::aya_bpf::cty::c_ushort, + pub bi_flags: ::aya_ebpf::cty::c_ushort, + pub bi_ioprio: ::aya_ebpf::cty::c_ushort, pub bi_status: blk_status_t, pub __bi_remaining: atomic_t, pub bi_iter: bvec_iter, pub bi_cookie: blk_qc_t, pub bi_end_io: bio_end_io_t, - pub bi_private: *mut ::aya_bpf::cty::c_void, + pub bi_private: *mut ::aya_ebpf::cty::c_void, pub bi_blkg: *mut blkcg_gq, pub bi_issue: bio_issue, pub bi_iocost_cost: u64_, pub bi_crypt_context: *mut bio_crypt_ctx, pub __bindgen_anon_1: bio__bindgen_ty_1, - pub bi_vcnt: ::aya_bpf::cty::c_ushort, - pub bi_max_vecs: ::aya_bpf::cty::c_ushort, + pub bi_vcnt: ::aya_ebpf::cty::c_ushort, + pub bi_max_vecs: ::aya_ebpf::cty::c_ushort, pub __bi_cnt: atomic_t, pub bi_io_vec: *mut bio_vec, pub bi_pool: *mut bio_set, @@ -12587,13 +11939,47 @@ pub union bio__bindgen_ty_1 { pub bi_integrity: *mut bio_integrity_payload, } #[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct device_attribute { + pub attr: attribute, + pub show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: *mut device_attribute, + arg3: *mut ::aya_ebpf::cty::c_char, + ) -> isize, + >, + pub store: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: *mut device_attribute, + arg3: *const ::aya_ebpf::cty::c_char, + arg4: usize, + ) -> isize, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_holder_ops { + pub mark_dead: + ::core::option::Option, + pub sync: ::core::option::Option, + pub freeze: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut block_device) -> ::aya_ebpf::cty::c_int, + >, + pub thaw: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut block_device) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] #[derive(Debug)] pub struct bio_integrity_payload { pub bip_bio: *mut bio, pub bip_iter: bvec_iter, - pub bip_vcnt: ::aya_bpf::cty::c_ushort, - pub bip_max_vcnt: ::aya_bpf::cty::c_ushort, - pub bip_flags: ::aya_bpf::cty::c_ushort, + pub bip_vcnt: ::aya_ebpf::cty::c_ushort, + pub bip_max_vcnt: ::aya_ebpf::cty::c_ushort, + pub bip_flags: ::aya_ebpf::cty::c_ushort, + pub __bindgen_padding_0: [u8; 2usize], pub bio_iter: bvec_iter, pub bip_work: work_struct, pub bip_vec: *mut bio_vec, @@ -12602,20 +11988,20 @@ pub struct bio_integrity_payload { pub type mempool_alloc_t = ::core::option::Option< unsafe extern "C" fn( arg1: gfp_t, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> *mut ::aya_ebpf::cty::c_void, >; pub type mempool_free_t = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void, arg2: *mut ::aya_bpf::cty::c_void), + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void, arg2: *mut ::aya_ebpf::cty::c_void), >; #[repr(C)] #[derive(Copy, Clone)] pub struct mempool_s { pub lock: spinlock_t, - pub min_nr: ::aya_bpf::cty::c_int, - pub curr_nr: ::aya_bpf::cty::c_int, - pub elements: *mut *mut ::aya_bpf::cty::c_void, - pub pool_data: *mut ::aya_bpf::cty::c_void, + pub min_nr: ::aya_ebpf::cty::c_int, + pub curr_nr: ::aya_ebpf::cty::c_int, + pub elements: *mut *mut ::aya_ebpf::cty::c_void, + pub pool_data: *mut ::aya_ebpf::cty::c_void, pub alloc: mempool_alloc_t, pub free: mempool_free_t, pub wait: wait_queue_head_t, @@ -12625,13 +12011,13 @@ pub type mempool_t = mempool_s; #[derive(Copy, Clone)] pub struct bio_set { pub bio_slab: *mut kmem_cache, - pub front_pad: ::aya_bpf::cty::c_uint, + pub front_pad: ::aya_ebpf::cty::c_uint, pub cache: *mut bio_alloc_cache, pub bio_pool: mempool_t, pub bvec_pool: mempool_t, pub bio_integrity_pool: mempool_t, pub bvec_integrity_pool: mempool_t, - pub back_pad: ::aya_bpf::cty::c_uint, + pub back_pad: ::aya_ebpf::cty::c_uint, pub rescue_lock: spinlock_t, pub rescue_list: bio_list, pub rescue_work: work_struct, @@ -12642,27 +12028,20 @@ pub struct bio_set { #[derive(Debug, Copy, Clone)] pub struct mem_cgroup_reclaim_iter { pub position: *mut mem_cgroup, - pub generation: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct shrinker_info { - pub rcu: callback_head, - pub nr_deferred: *mut atomic_long_t, - pub map: *mut ::aya_bpf::cty::c_ulong, - pub map_nr_max: ::aya_bpf::cty::c_int, + pub generation: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct lruvec_stats_percpu { - pub state: [::aya_bpf::cty::c_long; 43usize], - pub state_prev: [::aya_bpf::cty::c_long; 43usize], + pub state: [::aya_ebpf::cty::c_long; 46usize], + pub state_prev: [::aya_ebpf::cty::c_long; 46usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct lruvec_stats { - pub state: [::aya_bpf::cty::c_long; 43usize], - pub state_pending: [::aya_bpf::cty::c_long; 43usize], + pub state: [::aya_ebpf::cty::c_long; 46usize], + pub state_local: [::aya_ebpf::cty::c_long; 46usize], + pub state_pending: [::aya_ebpf::cty::c_long; 46usize], } #[repr(C)] #[derive(Copy, Clone)] @@ -12670,11 +12049,11 @@ pub struct mem_cgroup_per_node { pub lruvec: lruvec, pub lruvec_stats_percpu: *mut lruvec_stats_percpu, pub lruvec_stats: lruvec_stats, - pub lru_zone_size: [::aya_bpf::cty::c_ulong; 25usize], + pub lru_zone_size: [::aya_ebpf::cty::c_ulong; 25usize], pub iter: mem_cgroup_reclaim_iter, pub shrinker_info: *mut shrinker_info, pub tree_node: rb_node, - pub usage_in_excess: ::aya_bpf::cty::c_ulong, + pub usage_in_excess: ::aya_ebpf::cty::c_ulong, pub on_tree: bool_, pub memcg: *mut mem_cgroup, } @@ -12682,307 +12061,51 @@ pub struct mem_cgroup_per_node { #[derive(Debug, Copy, Clone)] pub struct mem_cgroup_threshold { pub eventfd: *mut eventfd_ctx, - pub threshold: ::aya_bpf::cty::c_ulong, + pub threshold: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug)] pub struct mem_cgroup_threshold_ary { - pub current_threshold: ::aya_bpf::cty::c_int, - pub size: ::aya_bpf::cty::c_uint, + pub current_threshold: ::aya_ebpf::cty::c_int, + pub size: ::aya_ebpf::cty::c_uint, pub entries: __IncompleteArrayField, } #[repr(C)] #[derive(Copy, Clone)] -pub struct obj_cgroup { - pub refcnt: percpu_ref, - pub memcg: *mut mem_cgroup, - pub nr_charged_bytes: atomic_t, - pub __bindgen_anon_1: obj_cgroup__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union obj_cgroup__bindgen_ty_1 { - pub list: list_head, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Copy, Clone)] pub struct percpu_cluster { pub index: swap_cluster_info, - pub next: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct linux_binfmt { - pub lh: list_head, - pub module: *mut module, - pub load_binary: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut linux_binprm) -> ::aya_bpf::cty::c_int, - >, - pub load_shlib: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub core_dump: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut coredump_params) -> ::aya_bpf::cty::c_int, - >, - pub min_coredump: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fs_struct { - pub users: ::aya_bpf::cty::c_int, - pub lock: spinlock_t, - pub seq: seqcount_spinlock_t, - pub umask: ::aya_bpf::cty::c_int, - pub in_exec: ::aya_bpf::cty::c_int, - pub root: path, - pub pwd: path, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fdtable { - pub max_fds: ::aya_bpf::cty::c_uint, - pub fd: *mut *mut file, - pub close_on_exec: *mut ::aya_bpf::cty::c_ulong, - pub open_fds: *mut ::aya_bpf::cty::c_ulong, - pub full_fds_bits: *mut ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct files_struct { - pub count: atomic_t, - pub resize_in_progress: bool_, - pub resize_wait: wait_queue_head_t, - pub fdt: *mut fdtable, - pub fdtab: fdtable, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, - pub file_lock: spinlock_t, - pub next_fd: ::aya_bpf::cty::c_uint, - pub close_on_exec_init: [::aya_bpf::cty::c_ulong; 1usize], - pub open_fds_init: [::aya_bpf::cty::c_ulong; 1usize], - pub full_fds_bits_init: [::aya_bpf::cty::c_ulong; 1usize], - pub fd_array: [*mut file; 64usize], - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl files_struct { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct linux_binprm { - pub vma: *mut vm_area_struct, - pub vma_pages: ::aya_bpf::cty::c_ulong, - pub mm: *mut mm_struct, - pub p: ::aya_bpf::cty::c_ulong, - pub argmin: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub executable: *mut file, - pub interpreter: *mut file, - pub file: *mut file, - pub cred: *mut cred, - pub unsafe_: ::aya_bpf::cty::c_int, - pub per_clear: ::aya_bpf::cty::c_uint, - pub argc: ::aya_bpf::cty::c_int, - pub envc: ::aya_bpf::cty::c_int, - pub filename: *const ::aya_bpf::cty::c_char, - pub interp: *const ::aya_bpf::cty::c_char, - pub fdpath: *const ::aya_bpf::cty::c_char, - pub interp_flags: ::aya_bpf::cty::c_uint, - pub execfd: ::aya_bpf::cty::c_int, - pub loader: ::aya_bpf::cty::c_ulong, - pub exec: ::aya_bpf::cty::c_ulong, - pub rlim_stack: rlimit, - pub buf: [::aya_bpf::cty::c_char; 256usize], -} -impl linux_binprm { - #[inline] - pub fn have_execfd(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_have_execfd(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn execfd_creds(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_execfd_creds(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn secureexec(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } - } - #[inline] - pub fn set_secureexec(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn point_of_no_return(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } - } - #[inline] - pub fn set_point_of_no_return(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - have_execfd: ::aya_bpf::cty::c_uint, - execfd_creds: ::aya_bpf::cty::c_uint, - secureexec: ::aya_bpf::cty::c_uint, - point_of_no_return: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let have_execfd: u32 = unsafe { ::core::mem::transmute(have_execfd) }; - have_execfd as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let execfd_creds: u32 = unsafe { ::core::mem::transmute(execfd_creds) }; - execfd_creds as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let secureexec: u32 = unsafe { ::core::mem::transmute(secureexec) }; - secureexec as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let point_of_no_return: u32 = unsafe { ::core::mem::transmute(point_of_no_return) }; - point_of_no_return as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct plist_head { - pub node_list: list_head, -} -pub type notifier_fn_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut notifier_block, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct notifier_block { - pub notifier_call: notifier_fn_t, - pub next: *mut notifier_block, - pub priority: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blocking_notifier_head { - pub rwsem: rw_semaphore, - pub head: *mut notifier_block, -} -pub mod pm_qos_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PM_QOS_UNITIALIZED: Type = 0; - pub const PM_QOS_MAX: Type = 1; - pub const PM_QOS_MIN: Type = 2; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pm_qos_constraints { - pub list: plist_head, - pub target_value: s32, - pub default_value: s32, - pub no_constraint_value: s32, - pub type_: pm_qos_type::Type, - pub notifiers: *mut blocking_notifier_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct freq_constraints { - pub min_freq: pm_qos_constraints, - pub min_freq_notifiers: blocking_notifier_head, - pub max_freq: pm_qos_constraints, - pub max_freq_notifiers: blocking_notifier_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pm_qos_flags { - pub list: list_head, - pub effective_flags: s32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct dev_pm_qos { - pub resume_latency: pm_qos_constraints, - pub latency_tolerance: pm_qos_constraints, - pub freq: freq_constraints, - pub flags: pm_qos_flags, - pub resume_latency_req: *mut dev_pm_qos_request, - pub latency_tolerance_req: *mut dev_pm_qos_request, - pub flags_req: *mut dev_pm_qos_request, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pm_qos_flags_request { - pub node: list_head, - pub flags: s32, -} -pub mod freq_qos_req_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FREQ_QOS_MIN: Type = 1; - pub const FREQ_QOS_MAX: Type = 2; + pub next: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct freq_qos_request { - pub type_: freq_qos_req_type::Type, - pub pnode: plist_node, - pub qos: *mut freq_constraints, -} -pub mod dev_pm_qos_req_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEV_PM_QOS_RESUME_LATENCY: Type = 1; - pub const DEV_PM_QOS_LATENCY_TOLERANCE: Type = 2; - pub const DEV_PM_QOS_MIN_FREQUENCY: Type = 3; - pub const DEV_PM_QOS_MAX_FREQUENCY: Type = 4; - pub const DEV_PM_QOS_FLAGS: Type = 5; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct dev_pm_qos_request { - pub type_: dev_pm_qos_req_type::Type, - pub data: dev_pm_qos_request__bindgen_ty_1, - pub dev: *mut device, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union dev_pm_qos_request__bindgen_ty_1 { - pub pnode: plist_node, - pub flr: pm_qos_flags_request, - pub freq: freq_qos_request, +pub struct compact_control { + pub freepages: list_head, + pub migratepages: list_head, + pub nr_freepages: ::aya_ebpf::cty::c_uint, + pub nr_migratepages: ::aya_ebpf::cty::c_uint, + pub free_pfn: ::aya_ebpf::cty::c_ulong, + pub migrate_pfn: ::aya_ebpf::cty::c_ulong, + pub fast_start_pfn: ::aya_ebpf::cty::c_ulong, + pub zone: *mut zone, + pub total_migrate_scanned: ::aya_ebpf::cty::c_ulong, + pub total_free_scanned: ::aya_ebpf::cty::c_ulong, + pub fast_search_fail: ::aya_ebpf::cty::c_ushort, + pub search_order: ::aya_ebpf::cty::c_short, + pub gfp_mask: gfp_t, + pub order: ::aya_ebpf::cty::c_int, + pub migratetype: ::aya_ebpf::cty::c_int, + pub alloc_flags: ::aya_ebpf::cty::c_uint, + pub highest_zoneidx: ::aya_ebpf::cty::c_int, + pub mode: migrate_mode::Type, + pub ignore_skip_hint: bool_, + pub no_set_skip_hint: bool_, + pub ignore_block_suitable: bool_, + pub direct_compaction: bool_, + pub proactive_compaction: bool_, + pub whole_zone: bool_, + pub contended: bool_, + pub finish_pageblock: bool_, + pub alloc_contig: bool_, } #[repr(C)] #[derive(Debug)] @@ -13028,755 +12151,1117 @@ impl ring_buffer_event { __bindgen_bitfield_unit } } +pub type __le16 = __u16; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct trace_event_file { - pub list: list_head, - pub event_call: *mut trace_event_call, - pub filter: *mut event_filter, - pub dir: *mut dentry, - pub tr: *mut trace_array, - pub system: *mut trace_subsystem_dir, - pub triggers: list_head, - pub flags: ::aya_bpf::cty::c_ulong, - pub sm_ref: atomic_t, - pub tm_ref: atomic_t, +pub struct blk_plug { + pub mq_list: *mut request, + pub cached_rq: *mut request, + pub nr_ios: ::aya_ebpf::cty::c_ushort, + pub rq_count: ::aya_ebpf::cty::c_ushort, + pub multiple_queues: bool_, + pub has_elevator: bool_, + pub cb_list: list_head, } -pub type cpu_stop_fn_t = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void) -> ::aya_bpf::cty::c_int, ->; +pub type blk_mode_t = ::aya_ebpf::cty::c_uint; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ftrace_hash { - pub size_bits: ::aya_bpf::cty::c_ulong, - pub buckets: *mut hlist_head, - pub count: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, +#[derive(Copy, Clone)] +pub struct gendisk { + pub major: ::aya_ebpf::cty::c_int, + pub first_minor: ::aya_ebpf::cty::c_int, + pub minors: ::aya_ebpf::cty::c_int, + pub disk_name: [::aya_ebpf::cty::c_char; 32usize], + pub events: ::aya_ebpf::cty::c_ushort, + pub event_flags: ::aya_ebpf::cty::c_ushort, + pub part_tbl: xarray, + pub part0: *mut block_device, + pub fops: *const block_device_operations, + pub queue: *mut request_queue, + pub private_data: *mut ::aya_ebpf::cty::c_void, + pub bio_split: bio_set, + pub flags: ::aya_ebpf::cty::c_int, + pub state: ::aya_ebpf::cty::c_ulong, + pub open_mutex: mutex, + pub open_partitions: ::aya_ebpf::cty::c_uint, + pub bdi: *mut backing_dev_info, + pub queue_kobj: kobject, + pub slave_dir: *mut kobject, + pub slave_bdevs: list_head, + pub random: *mut timer_rand_state, + pub sync_io: atomic_t, + pub ev: *mut disk_events, + pub nr_zones: ::aya_ebpf::cty::c_uint, + pub max_open_zones: ::aya_ebpf::cty::c_uint, + pub max_active_zones: ::aya_ebpf::cty::c_uint, + pub conv_zones_bitmap: *mut ::aya_ebpf::cty::c_ulong, + pub seq_zones_wlock: *mut ::aya_ebpf::cty::c_ulong, + pub cdi: *mut cdrom_device_info, + pub node_id: ::aya_ebpf::cty::c_int, + pub bb: *mut badblocks, + pub lockdep_map: lockdep_map, + pub diskseq: u64_, + pub open_mode: blk_mode_t, + pub ia_ranges: *mut blk_independent_access_ranges, +} +pub mod blk_bounce { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BLK_BOUNCE_NONE: Type = 0; + pub const BLK_BOUNCE_HIGH: Type = 1; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct event_filter { - pub prog: *mut prog_entry, - pub filter_string: *mut ::aya_bpf::cty::c_char, +pub struct queue_limits { + pub bounce: blk_bounce::Type, + pub seg_boundary_mask: ::aya_ebpf::cty::c_ulong, + pub virt_boundary_mask: ::aya_ebpf::cty::c_ulong, + pub max_hw_sectors: ::aya_ebpf::cty::c_uint, + pub max_dev_sectors: ::aya_ebpf::cty::c_uint, + pub chunk_sectors: ::aya_ebpf::cty::c_uint, + pub max_sectors: ::aya_ebpf::cty::c_uint, + pub max_user_sectors: ::aya_ebpf::cty::c_uint, + pub max_segment_size: ::aya_ebpf::cty::c_uint, + pub physical_block_size: ::aya_ebpf::cty::c_uint, + pub logical_block_size: ::aya_ebpf::cty::c_uint, + pub alignment_offset: ::aya_ebpf::cty::c_uint, + pub io_min: ::aya_ebpf::cty::c_uint, + pub io_opt: ::aya_ebpf::cty::c_uint, + pub max_discard_sectors: ::aya_ebpf::cty::c_uint, + pub max_hw_discard_sectors: ::aya_ebpf::cty::c_uint, + pub max_secure_erase_sectors: ::aya_ebpf::cty::c_uint, + pub max_write_zeroes_sectors: ::aya_ebpf::cty::c_uint, + pub max_zone_append_sectors: ::aya_ebpf::cty::c_uint, + pub discard_granularity: ::aya_ebpf::cty::c_uint, + pub discard_alignment: ::aya_ebpf::cty::c_uint, + pub zone_write_granularity: ::aya_ebpf::cty::c_uint, + pub max_segments: ::aya_ebpf::cty::c_ushort, + pub max_integrity_segments: ::aya_ebpf::cty::c_ushort, + pub max_discard_segments: ::aya_ebpf::cty::c_ushort, + pub misaligned: ::aya_ebpf::cty::c_uchar, + pub discard_misaligned: ::aya_ebpf::cty::c_uchar, + pub raid_partial_stripes_expensive: ::aya_ebpf::cty::c_uchar, + pub zoned: bool_, + pub dma_alignment: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct array_buffer { - pub tr: *mut trace_array, - pub buffer: *mut trace_buffer, - pub data: *mut trace_array_cpu, - pub time_start: u64_, - pub cpu: ::aya_bpf::cty::c_int, +pub struct blk_integrity { + pub profile: *const blk_integrity_profile, + pub flags: ::aya_ebpf::cty::c_uchar, + pub tuple_size: ::aya_ebpf::cty::c_uchar, + pub interval_exp: ::aya_ebpf::cty::c_uchar, + pub tag_size: ::aya_ebpf::cty::c_uchar, } #[repr(C)] #[derive(Copy, Clone)] -pub struct trace_array { - pub list: list_head, - pub name: *mut ::aya_bpf::cty::c_char, - pub array_buffer: array_buffer, - pub max_buffer: array_buffer, - pub allocated_snapshot: bool_, - pub max_latency: ::aya_bpf::cty::c_ulong, - pub d_max_latency: *mut dentry, - pub fsnotify_work: work_struct, - pub fsnotify_irqwork: irq_work, - pub filtered_pids: *mut trace_pid_list, - pub filtered_no_pids: *mut trace_pid_list, - pub max_lock: arch_spinlock_t, - pub buffer_disabled: ::aya_bpf::cty::c_int, - pub sys_refcount_enter: ::aya_bpf::cty::c_int, - pub sys_refcount_exit: ::aya_bpf::cty::c_int, - pub enter_syscall_files: [*mut trace_event_file; 451usize], - pub exit_syscall_files: [*mut trace_event_file; 451usize], - pub stop_count: ::aya_bpf::cty::c_int, - pub clock_id: ::aya_bpf::cty::c_int, - pub nr_topts: ::aya_bpf::cty::c_int, - pub clear_trace: bool_, - pub buffer_percent: ::aya_bpf::cty::c_int, - pub n_err_log_entries: ::aya_bpf::cty::c_uint, - pub current_trace: *mut tracer, - pub trace_flags: ::aya_bpf::cty::c_uint, - pub trace_flags_index: [::aya_bpf::cty::c_uchar; 32usize], - pub flags: ::aya_bpf::cty::c_uint, - pub start_lock: raw_spinlock_t, - pub err_log: list_head, - pub dir: *mut dentry, - pub options: *mut dentry, - pub percpu_dir: *mut dentry, - pub event_dir: *mut dentry, - pub topts: *mut trace_options, - pub systems: list_head, - pub events: list_head, - pub trace_marker_file: *mut trace_event_file, - pub tracing_cpumask: cpumask_var_t, - pub ref_: ::aya_bpf::cty::c_int, - pub trace_ref: ::aya_bpf::cty::c_int, - pub ops: *mut ftrace_ops, - pub function_pids: *mut trace_pid_list, - pub function_no_pids: *mut trace_pid_list, - pub func_probes: list_head, - pub mod_trace: list_head, - pub mod_notrace: list_head, - pub function_enabled: ::aya_bpf::cty::c_int, - pub no_filter_buffering_ref: ::aya_bpf::cty::c_int, - pub hist_vars: list_head, - pub cond_snapshot: *mut cond_snapshot, - pub last_func_repeats: *mut trace_func_repeats, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tracer { - pub name: *const ::aya_bpf::cty::c_char, - pub init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut trace_array) -> ::aya_bpf::cty::c_int, - >, - pub reset: ::core::option::Option, - pub start: ::core::option::Option, - pub stop: ::core::option::Option, - pub update_thresh: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut trace_array) -> ::aya_bpf::cty::c_int, - >, - pub open: ::core::option::Option, - pub pipe_open: ::core::option::Option, - pub close: ::core::option::Option, - pub pipe_close: ::core::option::Option, - pub read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut trace_iterator, - arg2: *mut file, - arg3: *mut ::aya_bpf::cty::c_char, - arg4: usize, - arg5: *mut loff_t, - ) -> isize, - >, - pub splice_read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut trace_iterator, - arg2: *mut file, - arg3: *mut loff_t, - arg4: *mut pipe_inode_info, - arg5: usize, - arg6: ::aya_bpf::cty::c_uint, - ) -> isize, - >, - pub print_header: ::core::option::Option, - pub print_line: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut trace_iterator) -> print_line_t::Type, - >, - pub set_flag: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut trace_array, - arg2: u32_, - arg3: u32_, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub flag_changed: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut trace_array, - arg2: u32_, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub next: *mut tracer, - pub flags: *mut tracer_flags, - pub enabled: ::aya_bpf::cty::c_int, - pub print_max: bool_, - pub allow_instances: bool_, - pub use_max_tr: bool_, - pub noboot: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct trace_subsystem_dir { - pub list: list_head, - pub subsystem: *mut event_subsystem, - pub tr: *mut trace_array, - pub entry: *mut dentry, - pub ref_count: ::aya_bpf::cty::c_int, - pub nr_events: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union lower_chunk { - pub next: *mut lower_chunk, - pub data: [::aya_bpf::cty::c_ulong; 256usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union upper_chunk { - pub next: *mut upper_chunk, - pub data: [*mut lower_chunk; 256usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct trace_pid_list { - pub lock: raw_spinlock_t, - pub refill_irqwork: irq_work, - pub upper: [*mut upper_chunk; 256usize], - pub upper_list: *mut upper_chunk, - pub lower_list: *mut lower_chunk, - pub free_upper_chunks: ::aya_bpf::cty::c_int, - pub free_lower_chunks: ::aya_bpf::cty::c_int, +pub struct request_queue { + pub queuedata: *mut ::aya_ebpf::cty::c_void, + pub elevator: *mut elevator_queue, + pub mq_ops: *const blk_mq_ops, + pub queue_ctx: *mut blk_mq_ctx, + pub queue_flags: ::aya_ebpf::cty::c_ulong, + pub rq_timeout: ::aya_ebpf::cty::c_uint, + pub queue_depth: ::aya_ebpf::cty::c_uint, + pub refs: refcount_t, + pub nr_hw_queues: ::aya_ebpf::cty::c_uint, + pub hctx_table: xarray, + pub q_usage_counter: percpu_ref, + pub last_merge: *mut request, + pub queue_lock: spinlock_t, + pub quiesce_depth: ::aya_ebpf::cty::c_int, + pub disk: *mut gendisk, + pub mq_kobj: *mut kobject, + pub limits: queue_limits, + pub integrity: blk_integrity, + pub dev: *mut device, + pub rpm_status: rpm_status::Type, + pub pm_only: atomic_t, + pub stats: *mut blk_queue_stats, + pub rq_qos: *mut rq_qos, + pub rq_qos_mutex: mutex, + pub id: ::aya_ebpf::cty::c_int, + pub dma_pad_mask: ::aya_ebpf::cty::c_uint, + pub nr_requests: ::aya_ebpf::cty::c_ulong, + pub crypto_profile: *mut blk_crypto_profile, + pub crypto_kobject: *mut kobject, + pub timeout: timer_list, + pub timeout_work: work_struct, + pub nr_active_requests_shared_tags: atomic_t, + pub required_elevator_features: ::aya_ebpf::cty::c_uint, + pub sched_shared_tags: *mut blk_mq_tags, + pub icq_list: list_head, + pub blkcg_pols: [::aya_ebpf::cty::c_ulong; 1usize], + pub root_blkg: *mut blkcg_gq, + pub blkg_list: list_head, + pub blkcg_mutex: mutex, + pub node: ::aya_ebpf::cty::c_int, + pub requeue_lock: spinlock_t, + pub requeue_list: list_head, + pub requeue_work: delayed_work, + pub blk_trace: *mut blk_trace, + pub fq: *mut blk_flush_queue, + pub flush_list: list_head, + pub sysfs_lock: mutex, + pub sysfs_dir_lock: mutex, + pub unused_hctx_list: list_head, + pub unused_hctx_lock: spinlock_t, + pub mq_freeze_depth: ::aya_ebpf::cty::c_int, + pub td: *mut throtl_data, + pub callback_head: callback_head, + pub mq_freeze_wq: wait_queue_head_t, + pub mq_freeze_lock: mutex, + pub tag_set: *mut blk_mq_tag_set, + pub tag_set_list: list_head, + pub debugfs_dir: *mut dentry, + pub sched_debugfs_dir: *mut dentry, + pub rqos_debugfs_dir: *mut dentry, + pub debugfs_mutex: mutex, + pub mq_sysfs_init_done: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct trace_array_cpu { - pub disabled: atomic_t, - pub buffer_page: *mut ::aya_bpf::cty::c_void, - pub entries: ::aya_bpf::cty::c_ulong, - pub saved_latency: ::aya_bpf::cty::c_ulong, - pub critical_start: ::aya_bpf::cty::c_ulong, - pub critical_end: ::aya_bpf::cty::c_ulong, - pub critical_sequence: ::aya_bpf::cty::c_ulong, - pub nice: ::aya_bpf::cty::c_ulong, - pub policy: ::aya_bpf::cty::c_ulong, - pub rt_priority: ::aya_bpf::cty::c_ulong, - pub skipped_entries: ::aya_bpf::cty::c_ulong, - pub preempt_timestamp: u64_, - pub pid: pid_t, - pub uid: kuid_t, - pub comm: [::aya_bpf::cty::c_char; 16usize], - pub ftrace_ignore_pid: ::aya_bpf::cty::c_int, - pub ignore_pid: bool_, +pub struct fscrypt_prepared_key { + pub tfm: *mut crypto_skcipher, + pub blk_key: *mut blk_crypto_key, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct trace_options { - pub tracer: *mut tracer, - pub topts: *mut trace_option_dentry, +pub struct siphash_key_t { + pub key: [u64_; 2usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct trace_option_dentry { - pub opt: *mut tracer_opt, - pub flags: *mut tracer_flags, - pub tr: *mut trace_array, - pub entry: *mut dentry, +pub struct fscrypt_policy_v1 { + pub version: __u8, + pub contents_encryption_mode: __u8, + pub filenames_encryption_mode: __u8, + pub flags: __u8, + pub master_key_descriptor: [__u8; 8usize], } -pub type cond_update_fn_t = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut trace_array, arg2: *mut ::aya_bpf::cty::c_void) -> bool_, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cond_snapshot { - pub cond_data: *mut ::aya_bpf::cty::c_void, - pub update: cond_update_fn_t, +pub struct fscrypt_policy_v2 { + pub version: __u8, + pub contents_encryption_mode: __u8, + pub filenames_encryption_mode: __u8, + pub flags: __u8, + pub log2_data_unit_size: __u8, + pub __reserved: [__u8; 3usize], + pub master_key_identifier: [__u8; 16usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct trace_func_repeats { - pub ip: ::aya_bpf::cty::c_ulong, - pub parent_ip: ::aya_bpf::cty::c_ulong, - pub count: ::aya_bpf::cty::c_ulong, - pub ts_last_call: u64_, +#[derive(Copy, Clone)] +pub union fscrypt_policy { + pub version: u8_, + pub v1: fscrypt_policy_v1, + pub v2: fscrypt_policy_v2, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tracer_opt { - pub name: *const ::aya_bpf::cty::c_char, - pub bit: u32_, +#[derive(Copy, Clone)] +pub struct fscrypt_inode_info { + pub ci_enc_key: fscrypt_prepared_key, + pub ci_owns_key: bool_, + pub ci_inlinecrypt: bool_, + pub ci_data_unit_bits: u8_, + pub ci_data_units_per_block_bits: u8_, + pub ci_mode: *mut fscrypt_mode, + pub ci_inode: *mut inode, + pub ci_master_key: *mut fscrypt_master_key, + pub ci_master_key_link: list_head, + pub ci_direct_key: *mut fscrypt_direct_key, + pub ci_dirhash_key: siphash_key_t, + pub ci_dirhash_key_initialized: bool_, + pub ci_policy: fscrypt_policy, + pub ci_nonce: [u8_; 16usize], + pub ci_hashed_ino: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tracer_flags { - pub val: u32_, - pub opts: *mut tracer_opt, - pub trace: *mut tracer, +pub struct bdev_handle { + pub bdev: *mut block_device, + pub holder: *mut ::aya_ebpf::cty::c_void, + pub mode: blk_mode_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct event_subsystem { - pub list: list_head, - pub name: *const ::aya_bpf::cty::c_char, - pub filter: *mut event_filter, - pub ref_count: ::aya_bpf::cty::c_int, +pub struct io_comp_batch { + pub req_list: *mut request, + pub need_ts: bool_, + pub complete: ::core::option::Option, } #[repr(C)] #[derive(Copy, Clone)] -pub struct anon_vma { - pub root: *mut anon_vma, - pub rwsem: rw_semaphore, - pub refcount: atomic_t, - pub num_children: ::aya_bpf::cty::c_ulong, - pub num_active_vmas: ::aya_bpf::cty::c_ulong, - pub parent: *mut anon_vma, - pub rb_root: rb_root_cached, +pub struct fscrypt_key_specifier { + pub type_: __u32, + pub __reserved: __u32, + pub u: fscrypt_key_specifier__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct mempolicy { - pub refcnt: atomic_t, - pub mode: ::aya_bpf::cty::c_ushort, - pub flags: ::aya_bpf::cty::c_ushort, - pub nodes: nodemask_t, - pub home_node: ::aya_bpf::cty::c_int, - pub w: mempolicy__bindgen_ty_1, +pub union fscrypt_key_specifier__bindgen_ty_1 { + pub __reserved: [__u8; 32usize], + pub descriptor: [__u8; 8usize], + pub identifier: [__u8; 16usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union mempolicy__bindgen_ty_1 { - pub cpuset_mems_allowed: nodemask_t, - pub user_nodemask: nodemask_t, +#[derive(Debug)] +pub struct crypto_tfm { + pub refcnt: refcount_t, + pub crt_flags: u32_, + pub node: ::aya_ebpf::cty::c_int, + pub exit: ::core::option::Option, + pub __crt_alg: *mut crypto_alg, + pub __crt_ctx: __IncompleteArrayField<*mut ::aya_ebpf::cty::c_void>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct vm_special_mapping { - pub name: *const ::aya_bpf::cty::c_char, - pub pages: *mut *mut page, - pub fault: ::core::option::Option< +pub struct cipher_alg { + pub cia_min_keysize: ::aya_ebpf::cty::c_uint, + pub cia_max_keysize: ::aya_ebpf::cty::c_uint, + pub cia_setkey: ::core::option::Option< unsafe extern "C" fn( - arg1: *const vm_special_mapping, - arg2: *mut vm_area_struct, - arg3: *mut vm_fault, - ) -> vm_fault_t, + arg1: *mut crypto_tfm, + arg2: *const u8_, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub mremap: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const vm_special_mapping, - arg2: *mut vm_area_struct, - ) -> ::aya_bpf::cty::c_int, + pub cia_encrypt: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut crypto_tfm, arg2: *mut u8_, arg3: *const u8_), + >, + pub cia_decrypt: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut crypto_tfm, arg2: *mut u8_, arg3: *const u8_), >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct capture_control { - pub cc: *mut compact_control, - pub page: *mut page, +pub struct compress_alg { + pub coa_compress: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut crypto_tfm, + arg2: *const u8_, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut u8_, + arg5: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub coa_decompress: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut crypto_tfm, + arg2: *const u8_, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut u8_, + arg5: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct p_log { - pub prefix: *const ::aya_bpf::cty::c_char, - pub log: *mut fc_log, -} -pub mod fs_context_purpose { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FS_CONTEXT_FOR_MOUNT: Type = 0; - pub const FS_CONTEXT_FOR_SUBMOUNT: Type = 1; - pub const FS_CONTEXT_FOR_RECONFIGURE: Type = 2; -} -pub mod fs_context_phase { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FS_CONTEXT_CREATE_PARAMS: Type = 0; - pub const FS_CONTEXT_CREATING: Type = 1; - pub const FS_CONTEXT_AWAITING_MOUNT: Type = 2; - pub const FS_CONTEXT_AWAITING_RECONF: Type = 3; - pub const FS_CONTEXT_RECONF_PARAMS: Type = 4; - pub const FS_CONTEXT_RECONFIGURING: Type = 5; - pub const FS_CONTEXT_FAILED: Type = 6; +#[derive(Copy, Clone)] +pub struct crypto_alg { + pub cra_list: list_head, + pub cra_users: list_head, + pub cra_flags: u32_, + pub cra_blocksize: ::aya_ebpf::cty::c_uint, + pub cra_ctxsize: ::aya_ebpf::cty::c_uint, + pub cra_alignmask: ::aya_ebpf::cty::c_uint, + pub cra_priority: ::aya_ebpf::cty::c_int, + pub cra_refcnt: refcount_t, + pub cra_name: [::aya_ebpf::cty::c_char; 128usize], + pub cra_driver_name: [::aya_ebpf::cty::c_char; 128usize], + pub cra_type: *const crypto_type, + pub cra_u: crypto_alg__bindgen_ty_1, + pub cra_init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut crypto_tfm) -> ::aya_ebpf::cty::c_int, + >, + pub cra_exit: ::core::option::Option, + pub cra_destroy: ::core::option::Option, + pub cra_module: *mut module, } #[repr(C)] #[derive(Copy, Clone)] -pub struct fs_context { - pub ops: *const fs_context_operations, - pub uapi_mutex: mutex, - pub fs_type: *mut file_system_type, - pub fs_private: *mut ::aya_bpf::cty::c_void, - pub sget_key: *mut ::aya_bpf::cty::c_void, - pub root: *mut dentry, - pub user_ns: *mut user_namespace, - pub net_ns: *mut net, - pub cred: *const cred, - pub log: p_log, - pub source: *const ::aya_bpf::cty::c_char, - pub security: *mut ::aya_bpf::cty::c_void, - pub s_fs_info: *mut ::aya_bpf::cty::c_void, - pub sb_flags: ::aya_bpf::cty::c_uint, - pub sb_flags_mask: ::aya_bpf::cty::c_uint, - pub s_iflags: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 3usize]>, - pub __bindgen_padding_0: u8, +pub union crypto_alg__bindgen_ty_1 { + pub cipher: cipher_alg, + pub compress: compress_alg, } -impl fs_context { - #[inline] - pub fn purpose(&self) -> fs_context_purpose::Type { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } - } - #[inline] - pub fn set_purpose(&mut self, val: fs_context_purpose::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 8u8, val as u64) - } - } - #[inline] - pub fn phase(&self) -> fs_context_phase::Type { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 8u8) as u32) } - } - #[inline] - pub fn set_phase(&mut self, val: fs_context_phase::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 8u8, val as u64) - } - } - #[inline] - pub fn need_free(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 1u8) as u8) } - } - #[inline] - pub fn set_need_free(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(16usize, 1u8, val as u64) - } - } - #[inline] - pub fn global(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u8) } - } - #[inline] - pub fn set_global(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(17usize, 1u8, val as u64) - } - } - #[inline] - pub fn oldapi(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 1u8) as u8) } - } - #[inline] - pub fn set_oldapi(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(18usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - purpose: fs_context_purpose::Type, - phase: fs_context_phase::Type, - need_free: bool_, - global: bool_, - oldapi: bool_, - ) -> __BindgenBitfieldUnit<[u8; 3usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 3usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 8u8, { - let purpose: u32 = unsafe { ::core::mem::transmute(purpose) }; - purpose as u64 - }); - __bindgen_bitfield_unit.set(8usize, 8u8, { - let phase: u32 = unsafe { ::core::mem::transmute(phase) }; - phase as u64 - }); - __bindgen_bitfield_unit.set(16usize, 1u8, { - let need_free: u8 = unsafe { ::core::mem::transmute(need_free) }; - need_free as u64 - }); - __bindgen_bitfield_unit.set(17usize, 1u8, { - let global: u8 = unsafe { ::core::mem::transmute(global) }; - global as u64 - }); - __bindgen_bitfield_unit.set(18usize, 1u8, { - let oldapi: u8 = unsafe { ::core::mem::transmute(oldapi) }; - oldapi as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct crypto_type { + pub ctxsize: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut crypto_alg, + arg2: u32_, + arg3: u32_, + ) -> ::aya_ebpf::cty::c_uint, + >, + pub extsize: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut crypto_alg) -> ::aya_ebpf::cty::c_uint, + >, + pub init_tfm: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut crypto_tfm) -> ::aya_ebpf::cty::c_int, + >, + pub show: + ::core::option::Option, + pub report: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut crypto_alg) -> ::aya_ebpf::cty::c_int, + >, + pub free: ::core::option::Option, + pub report_stat: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut crypto_alg) -> ::aya_ebpf::cty::c_int, + >, + pub type_: ::aya_ebpf::cty::c_uint, + pub maskclear: ::aya_ebpf::cty::c_uint, + pub maskset: ::aya_ebpf::cty::c_uint, + pub tfmsize: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug)] -pub struct filename { - pub name: *const ::aya_bpf::cty::c_char, - pub uptr: *const ::aya_bpf::cty::c_char, - pub refcnt: ::aya_bpf::cty::c_int, - pub aname: *mut audit_names, - pub iname: __IncompleteArrayField<::aya_bpf::cty::c_char>, +pub struct crypto_shash { + pub descsize: ::aya_ebpf::cty::c_uint, + pub base: crypto_tfm, } -pub mod fs_value_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const fs_value_is_undefined: Type = 0; - pub const fs_value_is_flag: Type = 1; - pub const fs_value_is_string: Type = 2; - pub const fs_value_is_blob: Type = 3; - pub const fs_value_is_filename: Type = 4; - pub const fs_value_is_file: Type = 5; +pub mod blk_crypto_mode_num { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BLK_ENCRYPTION_MODE_INVALID: Type = 0; + pub const BLK_ENCRYPTION_MODE_AES_256_XTS: Type = 1; + pub const BLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV: Type = 2; + pub const BLK_ENCRYPTION_MODE_ADIANTUM: Type = 3; + pub const BLK_ENCRYPTION_MODE_SM4_XTS: Type = 4; + pub const BLK_ENCRYPTION_MODE_MAX: Type = 5; } #[repr(C)] -#[derive(Copy, Clone)] -pub struct fs_parameter { - pub key: *const ::aya_bpf::cty::c_char, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_anon_1: fs_parameter__bindgen_ty_1, - pub size: usize, - pub dirfd: ::aya_bpf::cty::c_int, +#[derive(Debug, Copy, Clone)] +pub struct blk_crypto_config { + pub crypto_mode: blk_crypto_mode_num::Type, + pub data_unit_size: ::aya_ebpf::cty::c_uint, + pub dun_bytes: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub union fs_parameter__bindgen_ty_1 { - pub string: *mut ::aya_bpf::cty::c_char, - pub blob: *mut ::aya_bpf::cty::c_void, - pub name: *mut filename, - pub file: *mut file, +#[derive(Debug, Copy, Clone)] +pub struct blk_crypto_key { + pub crypto_cfg: blk_crypto_config, + pub data_unit_size_bits: ::aya_ebpf::cty::c_uint, + pub size: ::aya_ebpf::cty::c_uint, + pub raw: [u8_; 64usize], } -impl fs_parameter { - #[inline] - pub fn type_(&self) -> fs_value_type::Type { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } - } - #[inline] - pub fn set_type(&mut self, val: fs_value_type::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 8u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(type_: fs_value_type::Type) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 8u8, { - let type_: u32 = unsafe { ::core::mem::transmute(type_) }; - type_ as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bio_crypt_ctx { + pub bc_key: *const blk_crypto_key, + pub bc_dun: [u64_; 4usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fc_log { - pub usage: refcount_t, - pub head: u8_, - pub tail: u8_, - pub need_free: u8_, - pub owner: *mut module, - pub buffer: [*mut ::aya_bpf::cty::c_char; 8usize], +pub struct partition_meta_info { + pub uuid: [::aya_ebpf::cty::c_char; 37usize], + pub volname: [u8_; 64usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fs_context_operations { - pub free: ::core::option::Option, - pub dup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fs_context, arg2: *mut fs_context) -> ::aya_bpf::cty::c_int, +pub struct blk_zone { + pub start: __u64, + pub len: __u64, + pub wp: __u64, + pub type_: __u8, + pub cond: __u8, + pub non_seq: __u8, + pub reset: __u8, + pub resv: [__u8; 4usize], + pub capacity: __u64, + pub reserved: [__u8; 24usize], +} +pub type integrity_processing_fn = + ::core::option::Option blk_status_t>; +pub type integrity_prepare_fn = ::core::option::Option; +pub type integrity_complete_fn = + ::core::option::Option; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_integrity_profile { + pub generate_fn: integrity_processing_fn, + pub verify_fn: integrity_processing_fn, + pub prepare_fn: integrity_prepare_fn, + pub complete_fn: integrity_complete_fn, + pub name: *const ::aya_ebpf::cty::c_char, +} +pub type report_zones_cb = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_zone, + arg2: ::aya_ebpf::cty::c_uint, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; +pub mod blk_unique_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BLK_UID_T10: Type = 1; + pub const BLK_UID_EUI64: Type = 2; + pub const BLK_UID_NAA: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct block_device_operations { + pub submit_bio: ::core::option::Option, + pub poll_bio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bio, + arg2: *mut io_comp_batch, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub parse_param: ::core::option::Option< + pub open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gendisk, arg2: blk_mode_t) -> ::aya_ebpf::cty::c_int, + >, + pub release: ::core::option::Option, + pub ioctl: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut fs_context, - arg2: *mut fs_parameter, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut block_device, + arg2: blk_mode_t, + arg3: ::aya_ebpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub parse_monolithic: ::core::option::Option< + pub compat_ioctl: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut fs_context, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut block_device, + arg2: blk_mode_t, + arg3: ::aya_ebpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub get_tree: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_bpf::cty::c_int, + pub check_events: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gendisk, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_uint, >, - pub reconfigure: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_bpf::cty::c_int, + pub unlock_native_capacity: ::core::option::Option, + pub getgeo: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut block_device, + arg2: *mut hd_geometry, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_read_only: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut block_device, arg2: bool_) -> ::aya_ebpf::cty::c_int, + >, + pub free_disk: ::core::option::Option, + pub swap_slot_free_notify: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut block_device, arg2: ::aya_ebpf::cty::c_ulong), + >, + pub report_zones: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gendisk, + arg2: sector_t, + arg3: ::aya_ebpf::cty::c_uint, + arg4: report_zones_cb, + arg5: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devnode: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gendisk, + arg2: *mut umode_t, + ) -> *mut ::aya_ebpf::cty::c_char, + >, + pub get_unique_id: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gendisk, + arg2: *mut u8_, + arg3: blk_unique_id::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub owner: *mut module, + pub pr_ops: *const pr_ops, + pub alternative_gpt_sector: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gendisk, arg2: *mut sector_t) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct fs_parse_result { - pub negated: bool_, - pub __bindgen_anon_1: fs_parse_result__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct blk_independent_access_range { + pub kobj: kobject, + pub sector: sector_t, + pub nr_sectors: sector_t, } #[repr(C)] -#[derive(Copy, Clone)] -pub union fs_parse_result__bindgen_ty_1 { - pub boolean: bool_, - pub int_32: ::aya_bpf::cty::c_int, - pub uint_32: ::aya_bpf::cty::c_uint, - pub uint_64: u64_, +#[derive(Debug)] +pub struct blk_independent_access_ranges { + pub kobj: kobject, + pub sysfs_registered: bool_, + pub nr_ia_ranges: ::aya_ebpf::cty::c_uint, + pub ia_range: __IncompleteArrayField, +} +pub mod blk_eh_timer_return { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BLK_EH_DONE: Type = 0; + pub const BLK_EH_RESET_TIMER: Type = 1; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct compact_control { - pub freepages: list_head, - pub migratepages: list_head, - pub nr_freepages: ::aya_bpf::cty::c_uint, - pub nr_migratepages: ::aya_bpf::cty::c_uint, - pub free_pfn: ::aya_bpf::cty::c_ulong, - pub migrate_pfn: ::aya_bpf::cty::c_ulong, - pub fast_start_pfn: ::aya_bpf::cty::c_ulong, - pub zone: *mut zone, - pub total_migrate_scanned: ::aya_bpf::cty::c_ulong, - pub total_free_scanned: ::aya_bpf::cty::c_ulong, - pub fast_search_fail: ::aya_bpf::cty::c_ushort, - pub search_order: ::aya_bpf::cty::c_short, - pub gfp_mask: gfp_t, - pub order: ::aya_bpf::cty::c_int, - pub migratetype: ::aya_bpf::cty::c_int, - pub alloc_flags: ::aya_bpf::cty::c_uint, - pub highest_zoneidx: ::aya_bpf::cty::c_int, - pub mode: migrate_mode::Type, - pub ignore_skip_hint: bool_, - pub no_set_skip_hint: bool_, - pub ignore_block_suitable: bool_, - pub direct_compaction: bool_, - pub proactive_compaction: bool_, - pub whole_zone: bool_, - pub contended: bool_, - pub finish_pageblock: bool_, - pub alloc_contig: bool_, +pub struct blk_mq_ops { + pub queue_rq: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_mq_hw_ctx, + arg2: *const blk_mq_queue_data, + ) -> blk_status_t, + >, + pub commit_rqs: ::core::option::Option, + pub queue_rqs: ::core::option::Option, + pub get_budget: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue) -> ::aya_ebpf::cty::c_int, + >, + pub put_budget: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue, arg2: ::aya_ebpf::cty::c_int), + >, + pub set_rq_budget_token: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request, arg2: ::aya_ebpf::cty::c_int), + >, + pub get_rq_budget_token: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub timeout: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request) -> blk_eh_timer_return::Type, + >, + pub poll: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_mq_hw_ctx, + arg2: *mut io_comp_batch, + ) -> ::aya_ebpf::cty::c_int, + >, + pub complete: ::core::option::Option, + pub init_hctx: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_mq_hw_ctx, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub exit_hctx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut blk_mq_hw_ctx, arg2: ::aya_ebpf::cty::c_uint), + >, + pub init_request: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_mq_tag_set, + arg2: *mut request, + arg3: ::aya_ebpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub exit_request: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_mq_tag_set, + arg2: *mut request, + arg3: ::aya_ebpf::cty::c_uint, + ), + >, + pub cleanup_rq: ::core::option::Option, + pub busy: ::core::option::Option bool_>, + pub map_queues: ::core::option::Option, + pub show_rq: + ::core::option::Option, +} +pub mod pr_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const PR_WRITE_EXCLUSIVE: Type = 1; + pub const PR_EXCLUSIVE_ACCESS: Type = 2; + pub const PR_WRITE_EXCLUSIVE_REG_ONLY: Type = 3; + pub const PR_EXCLUSIVE_ACCESS_REG_ONLY: Type = 4; + pub const PR_WRITE_EXCLUSIVE_ALL_REGS: Type = 5; + pub const PR_EXCLUSIVE_ACCESS_ALL_REGS: Type = 6; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct __kernel_fsid_t { - pub val: [::aya_bpf::cty::c_int; 2usize], +pub struct pr_ops { + pub pr_register: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut block_device, + arg2: u64_, + arg3: u64_, + arg4: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pr_reserve: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut block_device, + arg2: u64_, + arg3: pr_type::Type, + arg4: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pr_release: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut block_device, + arg2: u64_, + arg3: pr_type::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pr_preempt: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut block_device, + arg2: u64_, + arg3: u64_, + arg4: pr_type::Type, + arg5: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pr_clear: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut block_device, arg2: u64_) -> ::aya_ebpf::cty::c_int, + >, + pub pr_read_keys: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut block_device, arg2: *mut pr_keys) -> ::aya_ebpf::cty::c_int, + >, + pub pr_read_reservation: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut block_device, + arg2: *mut pr_held_reservation, + ) -> ::aya_ebpf::cty::c_int, + >, } -pub type slab_flags_t = ::aya_bpf::cty::c_uint; -pub type fsnotify_connp_t = *mut fsnotify_mark_connector; #[repr(C)] -#[derive(Copy, Clone)] -pub struct fsnotify_mark_connector { - pub lock: spinlock_t, - pub type_: ::aya_bpf::cty::c_ushort, - pub flags: ::aya_bpf::cty::c_ushort, - pub fsid: __kernel_fsid_t, - pub __bindgen_anon_1: fsnotify_mark_connector__bindgen_ty_1, - pub list: hlist_head, +#[derive(Debug, Copy, Clone)] +pub struct fscrypt_mode { + pub friendly_name: *const ::aya_ebpf::cty::c_char, + pub cipher_str: *const ::aya_ebpf::cty::c_char, + pub keysize: ::aya_ebpf::cty::c_int, + pub security_strength: ::aya_ebpf::cty::c_int, + pub ivsize: ::aya_ebpf::cty::c_int, + pub logged_cryptoapi_impl: ::aya_ebpf::cty::c_int, + pub logged_blk_crypto_native: ::aya_ebpf::cty::c_int, + pub logged_blk_crypto_fallback: ::aya_ebpf::cty::c_int, + pub blk_crypto_mode: blk_crypto_mode_num::Type, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fscrypt_hkdf { + pub hmac_tfm: *mut crypto_shash, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fscrypt_master_key_secret { + pub hkdf: fscrypt_hkdf, + pub size: u32_, + pub raw: [u8_; 64usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union fsnotify_mark_connector__bindgen_ty_1 { - pub obj: *mut fsnotify_connp_t, - pub destroy_next: *mut fsnotify_mark_connector, +pub struct fscrypt_master_key { + pub mk_node: hlist_node, + pub mk_sem: rw_semaphore, + pub mk_active_refs: refcount_t, + pub mk_struct_refs: refcount_t, + pub mk_rcu_head: callback_head, + pub mk_secret: fscrypt_master_key_secret, + pub mk_spec: fscrypt_key_specifier, + pub mk_users: *mut key, + pub mk_decrypted_inodes: list_head, + pub mk_decrypted_inodes_lock: spinlock_t, + pub mk_direct_keys: [fscrypt_prepared_key; 11usize], + pub mk_iv_ino_lblk_64_keys: [fscrypt_prepared_key; 11usize], + pub mk_iv_ino_lblk_32_keys: [fscrypt_prepared_key; 11usize], + pub mk_ino_hash_key: siphash_key_t, + pub mk_ino_hash_key_initialized: bool_, + pub mk_present: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fscrypt_policy_v1 { - pub version: __u8, - pub contents_encryption_mode: __u8, - pub filenames_encryption_mode: __u8, - pub flags: __u8, - pub master_key_descriptor: [__u8; 8usize], +pub struct __kernel_fsid_t { + pub val: [::aya_ebpf::cty::c_int; 2usize], } +pub type __le64 = __u64; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fscrypt_policy_v2 { - pub version: __u8, - pub contents_encryption_mode: __u8, - pub filenames_encryption_mode: __u8, - pub flags: __u8, - pub __reserved: [__u8; 4usize], - pub master_key_identifier: [__u8; 16usize], +pub struct kstatfs { + pub f_type: ::aya_ebpf::cty::c_long, + pub f_bsize: ::aya_ebpf::cty::c_long, + pub f_blocks: u64_, + pub f_bfree: u64_, + pub f_bavail: u64_, + pub f_files: u64_, + pub f_ffree: u64_, + pub f_fsid: __kernel_fsid_t, + pub f_namelen: ::aya_ebpf::cty::c_long, + pub f_frsize: ::aya_ebpf::cty::c_long, + pub f_flags: ::aya_ebpf::cty::c_long, + pub f_spare: [::aya_ebpf::cty::c_long; 4usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union fscrypt_policy { - pub version: u8_, - pub v1: fscrypt_policy_v1, - pub v2: fscrypt_policy_v2, +#[derive(Debug, Copy, Clone)] +pub struct p_log { + pub prefix: *const ::aya_ebpf::cty::c_char, + pub log: *mut fc_log, +} +pub mod fs_context_purpose { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FS_CONTEXT_FOR_MOUNT: Type = 0; + pub const FS_CONTEXT_FOR_SUBMOUNT: Type = 1; + pub const FS_CONTEXT_FOR_RECONFIGURE: Type = 2; +} +pub mod fs_context_phase { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FS_CONTEXT_CREATE_PARAMS: Type = 0; + pub const FS_CONTEXT_CREATING: Type = 1; + pub const FS_CONTEXT_AWAITING_MOUNT: Type = 2; + pub const FS_CONTEXT_AWAITING_RECONF: Type = 3; + pub const FS_CONTEXT_RECONF_PARAMS: Type = 4; + pub const FS_CONTEXT_RECONFIGURING: Type = 5; + pub const FS_CONTEXT_FAILED: Type = 6; } #[repr(C)] #[derive(Copy, Clone)] -pub struct mnt_namespace { - pub ns: ns_common, - pub root: *mut mount, - pub list: list_head, - pub ns_lock: spinlock_t, +pub struct fs_context { + pub ops: *const fs_context_operations, + pub uapi_mutex: mutex, + pub fs_type: *mut file_system_type, + pub fs_private: *mut ::aya_ebpf::cty::c_void, + pub sget_key: *mut ::aya_ebpf::cty::c_void, + pub root: *mut dentry, pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub seq: u64_, - pub poll: wait_queue_head_t, - pub event: u64_, - pub mounts: ::aya_bpf::cty::c_uint, - pub pending_mounts: ::aya_bpf::cty::c_uint, + pub net_ns: *mut net, + pub cred: *const cred, + pub log: p_log, + pub source: *const ::aya_ebpf::cty::c_char, + pub security: *mut ::aya_ebpf::cty::c_void, + pub s_fs_info: *mut ::aya_ebpf::cty::c_void, + pub sb_flags: ::aya_ebpf::cty::c_uint, + pub sb_flags_mask: ::aya_ebpf::cty::c_uint, + pub s_iflags: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 3usize]>, + pub __bindgen_padding_0: u8, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fs_pin { - pub wait: wait_queue_head_t, - pub done: ::aya_bpf::cty::c_int, - pub s_list: hlist_node, - pub m_list: hlist_node, - pub kill: ::core::option::Option, +impl fs_context { + #[inline] + pub fn purpose(&self) -> fs_context_purpose::Type { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_purpose(&mut self, val: fs_context_purpose::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn phase(&self) -> fs_context_phase::Type { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 8u8) as u32) } + } + #[inline] + pub fn set_phase(&mut self, val: fs_context_phase::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 8u8, val as u64) + } + } + #[inline] + pub fn need_free(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 1u8) as u8) } + } + #[inline] + pub fn set_need_free(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(16usize, 1u8, val as u64) + } + } + #[inline] + pub fn global(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u8) } + } + #[inline] + pub fn set_global(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(17usize, 1u8, val as u64) + } + } + #[inline] + pub fn oldapi(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 1u8) as u8) } + } + #[inline] + pub fn set_oldapi(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(18usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclusive(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(19usize, 1u8) as u8) } + } + #[inline] + pub fn set_exclusive(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(19usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + purpose: fs_context_purpose::Type, + phase: fs_context_phase::Type, + need_free: bool_, + global: bool_, + oldapi: bool_, + exclusive: bool_, + ) -> __BindgenBitfieldUnit<[u8; 3usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 3usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let purpose: u32 = unsafe { ::core::mem::transmute(purpose) }; + purpose as u64 + }); + __bindgen_bitfield_unit.set(8usize, 8u8, { + let phase: u32 = unsafe { ::core::mem::transmute(phase) }; + phase as u64 + }); + __bindgen_bitfield_unit.set(16usize, 1u8, { + let need_free: u8 = unsafe { ::core::mem::transmute(need_free) }; + need_free as u64 + }); + __bindgen_bitfield_unit.set(17usize, 1u8, { + let global: u8 = unsafe { ::core::mem::transmute(global) }; + global as u64 + }); + __bindgen_bitfield_unit.set(18usize, 1u8, { + let oldapi: u8 = unsafe { ::core::mem::transmute(oldapi) }; + oldapi as u64 + }); + __bindgen_bitfield_unit.set(19usize, 1u8, { + let exclusive: u8 = unsafe { ::core::mem::transmute(exclusive) }; + exclusive as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct mount { - pub mnt_hash: hlist_node, - pub mnt_parent: *mut mount, - pub mnt_mountpoint: *mut dentry, - pub mnt: vfsmount, - pub __bindgen_anon_1: mount__bindgen_ty_1, - pub mnt_pcp: *mut mnt_pcp, - pub mnt_mounts: list_head, - pub mnt_child: list_head, - pub mnt_instance: list_head, - pub mnt_devname: *const ::aya_bpf::cty::c_char, - pub mnt_list: list_head, - pub mnt_expire: list_head, - pub mnt_share: list_head, - pub mnt_slave_list: list_head, - pub mnt_slave: list_head, - pub mnt_master: *mut mount, - pub mnt_ns: *mut mnt_namespace, - pub mnt_mp: *mut mountpoint, - pub __bindgen_anon_2: mount__bindgen_ty_2, - pub mnt_umounting: list_head, - pub mnt_fsnotify_marks: *mut fsnotify_mark_connector, - pub mnt_fsnotify_mask: __u32, - pub mnt_id: ::aya_bpf::cty::c_int, - pub mnt_group_id: ::aya_bpf::cty::c_int, - pub mnt_expiry_mark: ::aya_bpf::cty::c_int, - pub mnt_pins: hlist_head, - pub mnt_stuck_children: hlist_head, +#[derive(Debug)] +pub struct filename { + pub name: *const ::aya_ebpf::cty::c_char, + pub uptr: *const ::aya_ebpf::cty::c_char, + pub refcnt: atomic_t, + pub aname: *mut audit_names, + pub iname: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] -#[derive(Copy, Clone)] -pub union mount__bindgen_ty_1 { - pub mnt_rcu: callback_head, - pub mnt_llist: llist_node, +pub struct fid { + pub __bindgen_anon_1: fid__bindgen_ty_1, } #[repr(C)] -#[derive(Copy, Clone)] -pub union mount__bindgen_ty_2 { - pub mnt_mp_list: hlist_node, - pub mnt_umount: hlist_node, +pub struct fid__bindgen_ty_1 { + pub i32_: __BindgenUnionField, + pub i64_: __BindgenUnionField, + pub udf: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, + pub bindgen_union_field: [u32; 5usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mnt_pcp { - pub mnt_count: ::aya_bpf::cty::c_int, - pub mnt_writers: ::aya_bpf::cty::c_int, +pub struct fid__bindgen_ty_1__bindgen_ty_1 { + pub ino: u32_, + pub gen: u32_, + pub parent_ino: u32_, + pub parent_gen: u32_, } -#[repr(C)] +#[repr(C, packed)] #[derive(Debug, Copy, Clone)] -pub struct mountpoint { - pub m_hash: hlist_node, - pub m_dentry: *mut dentry, - pub m_list: hlist_head, - pub m_count: ::aya_bpf::cty::c_int, +pub struct fid__bindgen_ty_1__bindgen_ty_2 { + pub ino: u64_, + pub gen: u32_, } -pub type __be16 = __u16; -pub type __be32 = __u32; -pub type __wsum = __u32; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rhashtable_compare_arg { - pub ht: *mut rhashtable, - pub key: *const ::aya_bpf::cty::c_void, +pub struct fid__bindgen_ty_1__bindgen_ty_3 { + pub block: u32_, + pub partref: u16_, + pub parent_partref: u16_, + pub generation: u32_, + pub parent_block: u32_, + pub parent_generation: u32_, +} +#[repr(C)] +#[derive(Debug)] +pub struct fid__bindgen_ty_1__bindgen_ty_4 { + pub __empty_raw: fid__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1, + pub raw: __IncompleteArrayField<__u32>, } -pub type rht_hashfn_t = ::core::option::Option< - unsafe extern "C" fn(arg1: *const ::aya_bpf::cty::c_void, arg2: u32_, arg3: u32_) -> u32_, ->; -pub type rht_obj_hashfn_t = ::core::option::Option< - unsafe extern "C" fn(arg1: *const ::aya_bpf::cty::c_void, arg2: u32_, arg3: u32_) -> u32_, ->; -pub type rht_obj_cmpfn_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rhashtable_compare_arg, - arg2: *const ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rhashtable_params { - pub nelem_hint: u16_, - pub key_len: u16_, - pub key_offset: u16_, - pub head_offset: u16_, - pub max_size: ::aya_bpf::cty::c_uint, - pub min_size: u16_, +pub struct fid__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1 {} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct simple_xattrs { + pub rb_root: rb_root, + pub lock: rwlock_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct kernfs_root { + pub kn: *mut kernfs_node, + pub flags: ::aya_ebpf::cty::c_uint, + pub ino_idr: idr, + pub last_id_lowbits: u32_, + pub id_highbits: u32_, + pub syscall_ops: *mut kernfs_syscall_ops, + pub supers: list_head, + pub deactivate_waitq: wait_queue_head_t, + pub kernfs_rwsem: rw_semaphore, + pub kernfs_iattr_rwsem: rw_semaphore, + pub kernfs_supers_rwsem: rw_semaphore, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct kernfs_iattrs { + pub ia_uid: kuid_t, + pub ia_gid: kgid_t, + pub ia_atime: timespec64, + pub ia_mtime: timespec64, + pub ia_ctime: timespec64, + pub xattrs: simple_xattrs, + pub nr_user_xattrs: atomic_t, + pub user_xattr_size: atomic_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct kernfs_syscall_ops { + pub show_options: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut kernfs_root) -> ::aya_ebpf::cty::c_int, + >, + pub mkdir: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut kernfs_node, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: umode_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rmdir: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut kernfs_node) -> ::aya_ebpf::cty::c_int, + >, + pub rename: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut kernfs_node, + arg2: *mut kernfs_node, + arg3: *const ::aya_ebpf::cty::c_char, + ) -> ::aya_ebpf::cty::c_int, + >, + pub show_path: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut kernfs_node, + arg3: *mut kernfs_root, + ) -> ::aya_ebpf::cty::c_int, + >, +} +pub mod fs_value_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const fs_value_is_undefined: Type = 0; + pub const fs_value_is_flag: Type = 1; + pub const fs_value_is_string: Type = 2; + pub const fs_value_is_blob: Type = 3; + pub const fs_value_is_filename: Type = 4; + pub const fs_value_is_file: Type = 5; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct fs_parameter { + pub key: *const ::aya_ebpf::cty::c_char, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_anon_1: fs_parameter__bindgen_ty_1, + pub size: usize, + pub dirfd: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union fs_parameter__bindgen_ty_1 { + pub string: *mut ::aya_ebpf::cty::c_char, + pub blob: *mut ::aya_ebpf::cty::c_void, + pub name: *mut filename, + pub file: *mut file, +} +impl fs_parameter { + #[inline] + pub fn type_(&self) -> fs_value_type::Type { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_type(&mut self, val: fs_value_type::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(type_: fs_value_type::Type) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let type_: u32 = unsafe { ::core::mem::transmute(type_) }; + type_ as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fc_log { + pub usage: refcount_t, + pub head: u8_, + pub tail: u8_, + pub need_free: u8_, + pub owner: *mut module, + pub buffer: [*mut ::aya_ebpf::cty::c_char; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fs_context_operations { + pub free: ::core::option::Option, + pub dup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fs_context, + arg2: *mut fs_context, + ) -> ::aya_ebpf::cty::c_int, + >, + pub parse_param: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fs_context, + arg2: *mut fs_parameter, + ) -> ::aya_ebpf::cty::c_int, + >, + pub parse_monolithic: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fs_context, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_tree: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_ebpf::cty::c_int, + >, + pub reconfigure: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rhashtable_compare_arg { + pub ht: *mut rhashtable, + pub key: *const ::aya_ebpf::cty::c_void, +} +pub type rht_hashfn_t = ::core::option::Option< + unsafe extern "C" fn(arg1: *const ::aya_ebpf::cty::c_void, arg2: u32_, arg3: u32_) -> u32_, +>; +pub type rht_obj_hashfn_t = ::core::option::Option< + unsafe extern "C" fn(arg1: *const ::aya_ebpf::cty::c_void, arg2: u32_, arg3: u32_) -> u32_, +>; +pub type rht_obj_cmpfn_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rhashtable_compare_arg, + arg2: *const ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rhashtable_params { + pub nelem_hint: u16_, + pub key_len: u16_, + pub key_offset: u16_, + pub head_offset: u16_, + pub max_size: ::aya_ebpf::cty::c_uint, + pub min_size: u16_, pub automatic_shrinking: bool_, pub hashfn: rht_hashfn_t, pub obj_hashfn: rht_obj_hashfn_t, @@ -13786,8 +13271,8 @@ pub struct rhashtable_params { #[derive(Copy, Clone)] pub struct rhashtable { pub tbl: *mut bucket_table, - pub key_len: ::aya_bpf::cty::c_uint, - pub max_elems: ::aya_bpf::cty::c_uint, + pub key_len: ::aya_ebpf::cty::c_uint, + pub max_elems: ::aya_ebpf::cty::c_uint, pub p: rhashtable_params, pub rhlist: bool_, pub run_work: work_struct, @@ -13796,460 +13281,2131 @@ pub struct rhashtable { pub nelems: atomic_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_notifier_head { - pub head: *mut notifier_block, +#[derive(Debug)] +pub struct bucket_table { + pub size: ::aya_ebpf::cty::c_uint, + pub nest: ::aya_ebpf::cty::c_uint, + pub hash_rnd: u32_, + pub walkers: list_head, + pub rcu: callback_head, + pub future_tbl: *mut bucket_table, + pub dep_map: lockdep_map, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub buckets: __IncompleteArrayField<*mut rhash_lock_head>, +} +impl bucket_table { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } } +pub type notifier_fn_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut notifier_block, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct page_pool_params { - pub flags: ::aya_bpf::cty::c_uint, - pub order: ::aya_bpf::cty::c_uint, - pub pool_size: ::aya_bpf::cty::c_uint, - pub nid: ::aya_bpf::cty::c_int, - pub dev: *mut device, - pub napi: *mut napi_struct, - pub dma_dir: dma_data_direction::Type, - pub max_len: ::aya_bpf::cty::c_uint, - pub offset: ::aya_bpf::cty::c_uint, - pub init_callback: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut page, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub init_arg: *mut ::aya_bpf::cty::c_void, +pub struct notifier_block { + pub notifier_call: notifier_fn_t, + pub next: *mut notifier_block, + pub priority: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ipc_ids { + pub in_use: ::aya_ebpf::cty::c_int, + pub seq: ::aya_ebpf::cty::c_ushort, + pub rwsem: rw_semaphore, + pub ipcs_idr: idr, + pub max_idx: ::aya_ebpf::cty::c_int, + pub last_idx: ::aya_ebpf::cty::c_int, + pub next_id: ::aya_ebpf::cty::c_int, + pub key_ht: rhashtable, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ipc_namespace { + pub ids: [ipc_ids; 3usize], + pub sem_ctls: [::aya_ebpf::cty::c_int; 4usize], + pub used_sems: ::aya_ebpf::cty::c_int, + pub msg_ctlmax: ::aya_ebpf::cty::c_uint, + pub msg_ctlmnb: ::aya_ebpf::cty::c_uint, + pub msg_ctlmni: ::aya_ebpf::cty::c_uint, + pub percpu_msg_bytes: percpu_counter, + pub percpu_msg_hdrs: percpu_counter, + pub shm_ctlmax: usize, + pub shm_ctlall: usize, + pub shm_tot: ::aya_ebpf::cty::c_ulong, + pub shm_ctlmni: ::aya_ebpf::cty::c_int, + pub shm_rmid_forced: ::aya_ebpf::cty::c_int, + pub ipcns_nb: notifier_block, + pub mq_mnt: *mut vfsmount, + pub mq_queues_count: ::aya_ebpf::cty::c_uint, + pub mq_queues_max: ::aya_ebpf::cty::c_uint, + pub mq_msg_max: ::aya_ebpf::cty::c_uint, + pub mq_msgsize_max: ::aya_ebpf::cty::c_uint, + pub mq_msg_default: ::aya_ebpf::cty::c_uint, + pub mq_msgsize_default: ::aya_ebpf::cty::c_uint, + pub mq_set: ctl_table_set, + pub mq_sysctls: *mut ctl_table_header, + pub ipc_set: ctl_table_set, + pub ipc_sysctls: *mut ctl_table_header, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub mnt_llist: llist_node, + pub ns: ns_common, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct page_pool_alloc_stats { - pub fast: u64_, - pub slow: u64_, - pub slow_high_order: u64_, - pub empty: u64_, - pub refill: u64_, - pub waive: u64_, +pub struct rhash_lock_head {} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blkg_iostat { + pub bytes: [u64_; 3usize], + pub ios: [u64_; 3usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pp_alloc_cache { - pub count: u32_, - pub cache: [*mut page; 128usize], +pub struct blkg_iostat_set { + pub sync: u64_stats_sync, + pub blkg: *mut blkcg_gq, + pub lnode: llist_node, + pub lqueued: ::aya_ebpf::cty::c_int, + pub cur: blkg_iostat, + pub last: blkg_iostat, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ptr_ring { - pub producer: ::aya_bpf::cty::c_int, - pub producer_lock: spinlock_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub consumer_head: ::aya_bpf::cty::c_int, - pub consumer_tail: ::aya_bpf::cty::c_int, - pub consumer_lock: spinlock_t, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, - pub __bindgen_padding_0: u32, - pub size: ::aya_bpf::cty::c_int, - pub batch: ::aya_bpf::cty::c_int, - pub queue: *mut *mut ::aya_bpf::cty::c_void, - pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 48usize]>, +pub struct blkcg_gq { + pub q: *mut request_queue, + pub q_node: list_head, + pub blkcg_node: hlist_node, + pub blkcg: *mut blkcg, + pub parent: *mut blkcg_gq, + pub refcnt: percpu_ref, + pub online: bool_, + pub iostat_cpu: *mut blkg_iostat_set, + pub iostat: blkg_iostat_set, + pub pd: [*mut blkg_policy_data; 6usize], + pub async_bio_lock: spinlock_t, + pub async_bios: bio_list, + pub __bindgen_anon_1: blkcg_gq__bindgen_ty_1, + pub use_delay: atomic_t, + pub delay_nsec: atomic64_t, + pub delay_start: atomic64_t, + pub last_delay: u64_, + pub last_use: ::aya_ebpf::cty::c_int, + pub callback_head: callback_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct page_pool { - pub p: page_pool_params, - pub release_dw: delayed_work, - pub disconnect: ::core::option::Option, - pub defer_start: ::aya_bpf::cty::c_ulong, - pub defer_warn: ::aya_bpf::cty::c_ulong, - pub pages_state_hold_cnt: u32_, - pub frag_offset: ::aya_bpf::cty::c_uint, - pub frag_page: *mut page, - pub frag_users: ::aya_bpf::cty::c_long, - pub alloc_stats: page_pool_alloc_stats, - pub xdp_mem_id: u32_, - pub alloc: pp_alloc_cache, +pub union blkcg_gq__bindgen_ty_1 { + pub async_bio_work: work_struct, + pub free_work: work_struct, +} +pub type blk_mq_req_flags_t = __u32; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sbitmap_word { + pub word: ::aya_ebpf::cty::c_ulong, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub ring: ptr_ring, - pub recycle_stats: *mut page_pool_recycle_stats, - pub pages_state_release_cnt: atomic_t, - pub user_cnt: refcount_t, - pub destroy_cnt: u64_, + pub cleared: ::aya_ebpf::cty::c_ulong, pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 40usize]>, + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, } -pub type sk_buff_data_t = ::aya_bpf::cty::c_uint; #[repr(C)] -pub struct sk_buff { - pub __bindgen_anon_1: sk_buff__bindgen_ty_1, - pub __bindgen_anon_2: sk_buff__bindgen_ty_2, - pub __bindgen_anon_3: sk_buff__bindgen_ty_3, - pub cb: [::aya_bpf::cty::c_char; 48usize], - pub __bindgen_anon_4: sk_buff__bindgen_ty_4, - pub _nfct: ::aya_bpf::cty::c_ulong, - pub len: ::aya_bpf::cty::c_uint, - pub data_len: ::aya_bpf::cty::c_uint, - pub mac_len: __u16, - pub hdr_len: __u16, - pub queue_mapping: __u16, - pub __cloned_offset: __IncompleteArrayField<__u8>, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub active_extensions: __u8, - pub __bindgen_anon_5: sk_buff__bindgen_ty_5, - pub tail: sk_buff_data_t, - pub end: sk_buff_data_t, - pub head: *mut ::aya_bpf::cty::c_uchar, - pub data: *mut ::aya_bpf::cty::c_uchar, - pub truesize: ::aya_bpf::cty::c_uint, - pub users: refcount_t, - pub extensions: *mut skb_ext, +#[derive(Debug, Copy, Clone)] +pub struct sbitmap { + pub depth: ::aya_ebpf::cty::c_uint, + pub shift: ::aya_ebpf::cty::c_uint, + pub map_nr: ::aya_ebpf::cty::c_uint, + pub round_robin: bool_, + pub map: *mut sbitmap_word, + pub alloc_hint: *mut ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_1 { - pub __bindgen_anon_1: sk_buff__bindgen_ty_1__bindgen_ty_1, - pub rbnode: rb_node, - pub list: list_head, - pub ll_node: llist_node, +pub struct sbq_wait_state { + pub wait: wait_queue_head_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct sk_buff__bindgen_ty_1__bindgen_ty_1 { - pub next: *mut sk_buff, - pub prev: *mut sk_buff, - pub __bindgen_anon_1: sk_buff__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct sbitmap_queue { + pub sb: sbitmap, + pub wake_batch: ::aya_ebpf::cty::c_uint, + pub wake_index: atomic_t, + pub ws: *mut sbq_wait_state, + pub ws_active: atomic_t, + pub min_shallow_depth: ::aya_ebpf::cty::c_uint, + pub completion_cnt: atomic_t, + pub wakeup_cnt: atomic_t, } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub dev: *mut net_device, - pub dev_scratch: ::aya_bpf::cty::c_ulong, +pub struct elevator_queue { + pub type_: *mut elevator_type, + pub elevator_data: *mut ::aya_ebpf::cty::c_void, + pub kobj: kobject, + pub sysfs_lock: mutex, + pub flags: ::aya_ebpf::cty::c_ulong, + pub hash: [hlist_head; 64usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_2 { - pub sk: *mut sock, - pub ip_defrag_offset: ::aya_bpf::cty::c_int, +pub struct blk_mq_ctx { + pub __bindgen_anon_1: blk_mq_ctx__bindgen_ty_1, + pub cpu: ::aya_ebpf::cty::c_uint, + pub index_hw: [::aya_ebpf::cty::c_ushort; 3usize], + pub hctxs: [*mut blk_mq_hw_ctx; 3usize], + pub queue: *mut request_queue, + pub ctxs: *mut blk_mq_ctxs, + pub kobj: kobject, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_3 { - pub tstamp: ktime_t, - pub skb_mstamp_ns: u64_, +pub struct blk_mq_ctx__bindgen_ty_1 { + pub lock: spinlock_t, + pub rq_lists: [list_head; 3usize], + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } -#[repr(C)] -#[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_4 { - pub __bindgen_anon_1: sk_buff__bindgen_ty_4__bindgen_ty_1, - pub tcp_tsorted_anchor: list_head, - pub _sk_redir: ::aya_bpf::cty::c_ulong, +impl blk_mq_ctx__bindgen_ty_1 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +impl blk_mq_ctx { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +pub type req_flags_t = __u32; +pub mod mq_rq_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const MQ_RQ_IDLE: Type = 0; + pub const MQ_RQ_IN_FLIGHT: Type = 1; + pub const MQ_RQ_COMPLETE: Type = 2; +} +pub mod rq_end_io_ret { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RQ_END_IO_NONE: Type = 0; + pub const RQ_END_IO_FREE: Type = 1; } +pub type rq_end_io_fn = ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request, arg2: blk_status_t) -> rq_end_io_ret::Type, +>; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sk_buff__bindgen_ty_4__bindgen_ty_1 { - pub _skb_refdst: ::aya_bpf::cty::c_ulong, - pub destructor: ::core::option::Option, +#[derive(Copy, Clone)] +pub struct request { + pub q: *mut request_queue, + pub mq_ctx: *mut blk_mq_ctx, + pub mq_hctx: *mut blk_mq_hw_ctx, + pub cmd_flags: blk_opf_t, + pub rq_flags: req_flags_t, + pub tag: ::aya_ebpf::cty::c_int, + pub internal_tag: ::aya_ebpf::cty::c_int, + pub timeout: ::aya_ebpf::cty::c_uint, + pub __data_len: ::aya_ebpf::cty::c_uint, + pub __sector: sector_t, + pub bio: *mut bio, + pub biotail: *mut bio, + pub __bindgen_anon_1: request__bindgen_ty_1, + pub part: *mut block_device, + pub alloc_time_ns: u64_, + pub start_time_ns: u64_, + pub io_start_time_ns: u64_, + pub wbt_flags: ::aya_ebpf::cty::c_ushort, + pub stats_sectors: ::aya_ebpf::cty::c_ushort, + pub nr_phys_segments: ::aya_ebpf::cty::c_ushort, + pub nr_integrity_segments: ::aya_ebpf::cty::c_ushort, + pub crypt_ctx: *mut bio_crypt_ctx, + pub crypt_keyslot: *mut blk_crypto_keyslot, + pub ioprio: ::aya_ebpf::cty::c_ushort, + pub state: mq_rq_state::Type, + pub ref_: atomic_t, + pub deadline: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_2: request__bindgen_ty_2, + pub __bindgen_anon_3: request__bindgen_ty_3, + pub elv: request__bindgen_ty_4, + pub flush: request__bindgen_ty_5, + pub fifo_time: u64_, + pub end_io: rq_end_io_fn, + pub end_io_data: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -pub struct sk_buff__bindgen_ty_5 { - pub __bindgen_anon_1: __BindgenUnionField, - pub headers: __BindgenUnionField, - pub bindgen_union_field: [u32; 15usize], +#[derive(Copy, Clone)] +pub union request__bindgen_ty_1 { + pub queuelist: list_head, + pub rq_next: *mut request, } #[repr(C)] -pub struct sk_buff__bindgen_ty_5__bindgen_ty_1 { - pub __pkt_type_offset: __IncompleteArrayField<__u8>, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __mono_tc_offset: __IncompleteArrayField<__u8>, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 4usize]>, - pub tc_index: __u16, - pub alloc_cpu: u16_, - pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1, - pub priority: __u32, - pub skb_iif: ::aya_bpf::cty::c_int, - pub hash: __u32, - pub __bindgen_anon_2: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2, - pub __bindgen_anon_3: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3, - pub secmark: __u32, - pub __bindgen_anon_4: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_4, - pub __bindgen_anon_5: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_5, - pub inner_transport_header: __u16, - pub inner_network_header: __u16, - pub inner_mac_header: __u16, - pub protocol: __be16, - pub transport_header: __u16, - pub network_header: __u16, - pub mac_header: __u16, +#[derive(Copy, Clone)] +pub union request__bindgen_ty_2 { + pub hash: hlist_node, + pub ipi_list: llist_node, } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1 { - pub csum: __wsum, - pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, +pub union request__bindgen_ty_3 { + pub rb_node: rb_node, + pub special_vec: bio_vec, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub csum_start: __u16, - pub csum_offset: __u16, +pub struct request__bindgen_ty_4 { + pub icq: *mut io_cq, + pub priv_: [*mut ::aya_ebpf::cty::c_void; 2usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2 { - pub vlan_all: u32_, - pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct request__bindgen_ty_5 { + pub seq: ::aya_ebpf::cty::c_uint, + pub saved_end_io: rq_end_io_fn, +} +pub mod rq_qos_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RQ_QOS_WBT: Type = 0; + pub const RQ_QOS_LATENCY: Type = 1; + pub const RQ_QOS_COST: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - pub vlan_proto: __be16, - pub vlan_tci: __u16, +pub struct rq_qos { + pub ops: *const rq_qos_ops, + pub disk: *mut gendisk, + pub id: rq_qos_id::Type, + pub next: *mut rq_qos, + pub debugfs_dir: *mut dentry, } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3 { - pub napi_id: ::aya_bpf::cty::c_uint, - pub sender_cpu: ::aya_bpf::cty::c_uint, +pub struct blk_mq_tags { + pub nr_tags: ::aya_ebpf::cty::c_uint, + pub nr_reserved_tags: ::aya_ebpf::cty::c_uint, + pub active_queues: ::aya_ebpf::cty::c_uint, + pub bitmap_tags: sbitmap_queue, + pub breserved_tags: sbitmap_queue, + pub rqs: *mut *mut request, + pub static_rqs: *mut *mut request, + pub page_list: list_head, + pub lock: spinlock_t, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_4 { - pub mark: __u32, - pub reserved_tailroom: __u32, +#[derive(Debug, Copy, Clone)] +pub struct blk_trace { + pub trace_state: ::aya_ebpf::cty::c_int, + pub rchan: *mut rchan, + pub sequence: *mut ::aya_ebpf::cty::c_ulong, + pub msg_data: *mut ::aya_ebpf::cty::c_uchar, + pub act_mask: u16_, + pub start_lba: u64_, + pub end_lba: u64_, + pub pid: u32_, + pub dev: u32_, + pub dir: *mut dentry, + pub running_list: list_head, + pub dropped: atomic_t, } #[repr(C)] #[derive(Copy, Clone)] -pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_5 { - pub inner_protocol: __be16, - pub inner_ipproto: __u8, +pub struct blk_flush_queue { + pub mq_flush_lock: spinlock_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub rq_status: blk_status_t, + pub flush_pending_since: ::aya_ebpf::cty::c_ulong, + pub flush_queue: [list_head; 2usize], + pub flush_data_in_flight: ::aya_ebpf::cty::c_ulong, + pub flush_rq: *mut request, } -impl sk_buff__bindgen_ty_5__bindgen_ty_1 { +impl blk_flush_queue { #[inline] - pub fn pkt_type(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 3u8) as u8) } + pub fn flush_pending_idx(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_pkt_type(&mut self, val: __u8) { + pub fn set_flush_pending_idx(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 3u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn ignore_df(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + pub fn flush_running_idx(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_ignore_df(&mut self, val: __u8) { + pub fn set_flush_running_idx(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn dst_pending_confirm(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } + pub fn new_bitfield_1( + flush_pending_idx: ::aya_ebpf::cty::c_uint, + flush_running_idx: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let flush_pending_idx: u32 = unsafe { ::core::mem::transmute(flush_pending_idx) }; + flush_pending_idx as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let flush_running_idx: u32 = unsafe { ::core::mem::transmute(flush_running_idx) }; + flush_running_idx as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_mq_queue_map { + pub mq_map: *mut ::aya_ebpf::cty::c_uint, + pub nr_queues: ::aya_ebpf::cty::c_uint, + pub queue_offset: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct blk_mq_tag_set { + pub ops: *const blk_mq_ops, + pub map: [blk_mq_queue_map; 3usize], + pub nr_maps: ::aya_ebpf::cty::c_uint, + pub nr_hw_queues: ::aya_ebpf::cty::c_uint, + pub queue_depth: ::aya_ebpf::cty::c_uint, + pub reserved_tags: ::aya_ebpf::cty::c_uint, + pub cmd_size: ::aya_ebpf::cty::c_uint, + pub numa_node: ::aya_ebpf::cty::c_int, + pub timeout: ::aya_ebpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, + pub driver_data: *mut ::aya_ebpf::cty::c_void, + pub tags: *mut *mut blk_mq_tags, + pub shared_tags: *mut blk_mq_tags, + pub tag_list_lock: mutex, + pub tag_list: list_head, + pub srcu: *mut srcu_struct, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct blk_mq_hw_ctx { + pub __bindgen_anon_1: blk_mq_hw_ctx__bindgen_ty_1, + pub run_work: delayed_work, + pub cpumask: cpumask_var_t, + pub next_cpu: ::aya_ebpf::cty::c_int, + pub next_cpu_batch: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_ulong, + pub sched_data: *mut ::aya_ebpf::cty::c_void, + pub queue: *mut request_queue, + pub fq: *mut blk_flush_queue, + pub driver_data: *mut ::aya_ebpf::cty::c_void, + pub ctx_map: sbitmap, + pub dispatch_from: *mut blk_mq_ctx, + pub dispatch_busy: ::aya_ebpf::cty::c_uint, + pub type_: ::aya_ebpf::cty::c_ushort, + pub nr_ctx: ::aya_ebpf::cty::c_ushort, + pub ctxs: *mut *mut blk_mq_ctx, + pub dispatch_wait_lock: spinlock_t, + pub dispatch_wait: wait_queue_entry_t, + pub wait_index: atomic_t, + pub tags: *mut blk_mq_tags, + pub sched_tags: *mut blk_mq_tags, + pub numa_node: ::aya_ebpf::cty::c_uint, + pub queue_num: ::aya_ebpf::cty::c_uint, + pub nr_active: atomic_t, + pub cpuhp_online: hlist_node, + pub cpuhp_dead: hlist_node, + pub kobj: kobject, + pub debugfs_dir: *mut dentry, + pub sched_debugfs_dir: *mut dentry, + pub hctx_list: list_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct blk_mq_hw_ctx__bindgen_ty_1 { + pub lock: spinlock_t, + pub dispatch: list_head, + pub state: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl blk_mq_hw_ctx__bindgen_ty_1 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_mq_queue_data { + pub rq: *mut request, + pub last: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rchan_buf { + pub start: *mut ::aya_ebpf::cty::c_void, + pub data: *mut ::aya_ebpf::cty::c_void, + pub offset: usize, + pub subbufs_produced: usize, + pub subbufs_consumed: usize, + pub chan: *mut rchan, + pub read_wait: wait_queue_head_t, + pub wakeup_work: irq_work, + pub dentry: *mut dentry, + pub kref: kref, + pub page_array: *mut *mut page, + pub page_count: ::aya_ebpf::cty::c_uint, + pub finalized: ::aya_ebpf::cty::c_uint, + pub padding: *mut usize, + pub prev_padding: usize, + pub bytes_consumed: usize, + pub early_bytes: usize, + pub cpu: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub __bindgen_padding_0: u32, +} +impl rchan_buf { #[inline] - pub fn set_dst_pending_confirm(&mut self, val: __u8) { + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rchan { + pub version: u32_, + pub subbuf_size: usize, + pub n_subbufs: usize, + pub alloc_size: usize, + pub cb: *const rchan_callbacks, + pub kref: kref, + pub private_data: *mut ::aya_ebpf::cty::c_void, + pub last_toobig: usize, + pub buf: *mut *mut rchan_buf, + pub is_global: ::aya_ebpf::cty::c_int, + pub list: list_head, + pub parent: *mut dentry, + pub has_base_filename: ::aya_ebpf::cty::c_int, + pub base_filename: [::aya_ebpf::cty::c_char; 255usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rchan_callbacks { + pub subbuf_start: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rchan_buf, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub create_buf_file: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_char, + arg2: *mut dentry, + arg3: umode_t, + arg4: *mut rchan_buf, + arg5: *mut ::aya_ebpf::cty::c_int, + ) -> *mut dentry, + >, + pub remove_buf_file: + ::core::option::Option ::aya_ebpf::cty::c_int>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_mq_ctxs { + pub kobj: kobject, + pub queue_ctx: *mut blk_mq_ctx, +} +pub type blk_insert_t = ::aya_ebpf::cty::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_mq_alloc_data { + pub q: *mut request_queue, + pub flags: blk_mq_req_flags_t, + pub shallow_depth: ::aya_ebpf::cty::c_uint, + pub cmd_flags: blk_opf_t, + pub rq_flags: req_flags_t, + pub nr_tags: ::aya_ebpf::cty::c_uint, + pub cached_rq: *mut *mut request, + pub ctx: *mut blk_mq_ctx, + pub hctx: *mut blk_mq_hw_ctx, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_mq_debugfs_attr { + pub name: *const ::aya_ebpf::cty::c_char, + pub mode: umode_t, + pub show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: *mut seq_file, + ) -> ::aya_ebpf::cty::c_int, + >, + pub write: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: usize, + arg4: *mut loff_t, + ) -> isize, + >, + pub seq_ops: *const seq_operations, +} +pub mod elv_merge { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ELEVATOR_NO_MERGE: Type = 0; + pub const ELEVATOR_FRONT_MERGE: Type = 1; + pub const ELEVATOR_BACK_MERGE: Type = 2; + pub const ELEVATOR_DISCARD_MERGE: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct elevator_mq_ops { + pub init_sched: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut request_queue, + arg2: *mut elevator_type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub exit_sched: ::core::option::Option, + pub init_hctx: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_mq_hw_ctx, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub exit_hctx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut blk_mq_hw_ctx, arg2: ::aya_ebpf::cty::c_uint), + >, + pub depth_updated: ::core::option::Option, + pub allow_merge: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request, arg3: *mut bio) -> bool_, + >, + pub bio_merge: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut request_queue, + arg2: *mut bio, + arg3: ::aya_ebpf::cty::c_uint, + ) -> bool_, + >, + pub request_merge: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut request_queue, + arg2: *mut *mut request, + arg3: *mut bio, + ) -> ::aya_ebpf::cty::c_int, + >, + pub request_merged: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request, arg3: elv_merge::Type), + >, + pub requests_merged: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request, arg3: *mut request), + >, + pub limit_depth: + ::core::option::Option, + pub prepare_request: ::core::option::Option, + pub finish_request: ::core::option::Option, + pub insert_requests: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut blk_mq_hw_ctx, arg2: *mut list_head, arg3: blk_insert_t), + >, + pub dispatch_request: + ::core::option::Option *mut request>, + pub has_work: ::core::option::Option bool_>, + pub completed_request: + ::core::option::Option, + pub requeue_request: ::core::option::Option, + pub former_request: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request) -> *mut request, + >, + pub next_request: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request) -> *mut request, + >, + pub init_icq: ::core::option::Option, + pub exit_icq: ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct elevator_type { + pub icq_cache: *mut kmem_cache, + pub ops: elevator_mq_ops, + pub icq_size: usize, + pub icq_align: usize, + pub elevator_attrs: *mut elv_fs_entry, + pub elevator_name: *const ::aya_ebpf::cty::c_char, + pub elevator_alias: *const ::aya_ebpf::cty::c_char, + pub elevator_features: ::aya_ebpf::cty::c_uint, + pub elevator_owner: *mut module, + pub queue_debugfs_attrs: *const blk_mq_debugfs_attr, + pub hctx_debugfs_attrs: *const blk_mq_debugfs_attr, + pub icq_cache_name: [::aya_ebpf::cty::c_char; 22usize], + pub list: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct elv_fs_entry { + pub attr: attribute, + pub show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut elevator_queue, + arg2: *mut ::aya_ebpf::cty::c_char, + ) -> isize, + >, + pub store: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut elevator_queue, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: usize, + ) -> isize, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rq_qos_ops { + pub throttle: ::core::option::Option, + pub track: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq_qos, arg2: *mut request, arg3: *mut bio), + >, + pub merge: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rq_qos, arg2: *mut request, arg3: *mut bio), + >, + pub issue: ::core::option::Option, + pub requeue: + ::core::option::Option, + pub done: ::core::option::Option, + pub done_bio: ::core::option::Option, + pub cleanup: ::core::option::Option, + pub queue_depth_changed: ::core::option::Option, + pub exit: ::core::option::Option, + pub debugfs_attrs: *const blk_mq_debugfs_attr, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct blkcg { + pub css: cgroup_subsys_state, + pub lock: spinlock_t, + pub online_pin: refcount_t, + pub blkg_tree: xarray, + pub blkg_hint: *mut blkcg_gq, + pub blkg_list: hlist_head, + pub cpd: [*mut blkcg_policy_data; 6usize], + pub all_blkcgs_node: list_head, + pub lhead: *mut llist_head, + pub fc_app_id: [::aya_ebpf::cty::c_char; 129usize], + pub cgwb_list: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blkg_policy_data { + pub blkg: *mut blkcg_gq, + pub plid: ::aya_ebpf::cty::c_int, + pub online: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blkcg_policy_data { + pub blkcg: *mut blkcg, + pub plid: ::aya_ebpf::cty::c_int, +} +pub type __le32 = __u32; +pub type irq_hw_number_t = ::aya_ebpf::cty::c_ulong; +pub type irq_flow_handler_t = ::core::option::Option; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_common_data { + pub state_use_accessors: ::aya_ebpf::cty::c_uint, + pub node: ::aya_ebpf::cty::c_uint, + pub handler_data: *mut ::aya_ebpf::cty::c_void, + pub msi_desc: *mut msi_desc, + pub affinity: cpumask_var_t, + pub effective_affinity: cpumask_var_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_data { + pub mask: u32_, + pub irq: ::aya_ebpf::cty::c_uint, + pub hwirq: ::aya_ebpf::cty::c_ulong, + pub common: *mut irq_common_data, + pub chip: *mut irq_chip, + pub domain: *mut irq_domain, + pub parent_data: *mut irq_data, + pub chip_data: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct irq_desc { + pub irq_common_data: irq_common_data, + pub irq_data: irq_data, + pub kstat_irqs: *mut ::aya_ebpf::cty::c_uint, + pub handle_irq: irq_flow_handler_t, + pub action: *mut irqaction, + pub status_use_accessors: ::aya_ebpf::cty::c_uint, + pub core_internal_state__do_not_mess_with_it: ::aya_ebpf::cty::c_uint, + pub depth: ::aya_ebpf::cty::c_uint, + pub wake_depth: ::aya_ebpf::cty::c_uint, + pub tot_count: ::aya_ebpf::cty::c_uint, + pub irq_count: ::aya_ebpf::cty::c_uint, + pub last_unhandled: ::aya_ebpf::cty::c_ulong, + pub irqs_unhandled: ::aya_ebpf::cty::c_uint, + pub threads_handled: atomic_t, + pub threads_handled_last: ::aya_ebpf::cty::c_int, + pub lock: raw_spinlock_t, + pub percpu_enabled: *mut cpumask, + pub percpu_affinity: *const cpumask, + pub affinity_hint: *const cpumask, + pub affinity_notify: *mut irq_affinity_notify, + pub pending_mask: cpumask_var_t, + pub threads_oneshot: ::aya_ebpf::cty::c_ulong, + pub threads_active: atomic_t, + pub wait_for_threads: wait_queue_head_t, + pub nr_actions: ::aya_ebpf::cty::c_uint, + pub no_suspend_depth: ::aya_ebpf::cty::c_uint, + pub cond_suspend_depth: ::aya_ebpf::cty::c_uint, + pub force_resume_depth: ::aya_ebpf::cty::c_uint, + pub dir: *mut proc_dir_entry, + pub rcu: callback_head, + pub kobj: kobject, + pub request_mutex: mutex, + pub parent_irq: ::aya_ebpf::cty::c_int, + pub owner: *mut module, + pub name: *const ::aya_ebpf::cty::c_char, + pub resend_node: hlist_node, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, +} +pub mod irq_domain_bus_token { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DOMAIN_BUS_ANY: Type = 0; + pub const DOMAIN_BUS_WIRED: Type = 1; + pub const DOMAIN_BUS_GENERIC_MSI: Type = 2; + pub const DOMAIN_BUS_PCI_MSI: Type = 3; + pub const DOMAIN_BUS_PLATFORM_MSI: Type = 4; + pub const DOMAIN_BUS_NEXUS: Type = 5; + pub const DOMAIN_BUS_IPI: Type = 6; + pub const DOMAIN_BUS_FSL_MC_MSI: Type = 7; + pub const DOMAIN_BUS_TI_SCI_INTA_MSI: Type = 8; + pub const DOMAIN_BUS_WAKEUP: Type = 9; + pub const DOMAIN_BUS_VMD_MSI: Type = 10; + pub const DOMAIN_BUS_PCI_DEVICE_MSI: Type = 11; + pub const DOMAIN_BUS_PCI_DEVICE_MSIX: Type = 12; + pub const DOMAIN_BUS_DMAR: Type = 13; + pub const DOMAIN_BUS_AMDVI: Type = 14; + pub const DOMAIN_BUS_PCI_DEVICE_IMS: Type = 15; +} +#[repr(C)] +pub struct irq_domain { + pub link: list_head, + pub name: *const ::aya_ebpf::cty::c_char, + pub ops: *const irq_domain_ops, + pub host_data: *mut ::aya_ebpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_uint, + pub mapcount: ::aya_ebpf::cty::c_uint, + pub mutex: mutex, + pub root: *mut irq_domain, + pub fwnode: *mut fwnode_handle, + pub bus_token: irq_domain_bus_token::Type, + pub gc: *mut irq_domain_chip_generic, + pub dev: *mut device, + pub pm_dev: *mut device, + pub parent: *mut irq_domain, + pub msi_parent_ops: *const msi_parent_ops, + pub hwirq_max: irq_hw_number_t, + pub revmap_size: ::aya_ebpf::cty::c_uint, + pub revmap_tree: xarray, + pub revmap: __IncompleteArrayField<*mut irq_data>, +} +pub mod irqchip_irq_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IRQCHIP_STATE_PENDING: Type = 0; + pub const IRQCHIP_STATE_ACTIVE: Type = 1; + pub const IRQCHIP_STATE_MASKED: Type = 2; + pub const IRQCHIP_STATE_LINE_LEVEL: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_chip { + pub name: *const ::aya_ebpf::cty::c_char, + pub irq_startup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut irq_data) -> ::aya_ebpf::cty::c_uint, + >, + pub irq_shutdown: ::core::option::Option, + pub irq_enable: ::core::option::Option, + pub irq_disable: ::core::option::Option, + pub irq_ack: ::core::option::Option, + pub irq_mask: ::core::option::Option, + pub irq_mask_ack: ::core::option::Option, + pub irq_unmask: ::core::option::Option, + pub irq_eoi: ::core::option::Option, + pub irq_set_affinity: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_data, + arg2: *const cpumask, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub irq_retrigger: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub irq_set_type: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_data, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub irq_set_wake: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_data, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub irq_bus_lock: ::core::option::Option, + pub irq_bus_sync_unlock: ::core::option::Option, + pub irq_suspend: ::core::option::Option, + pub irq_resume: ::core::option::Option, + pub irq_pm_shutdown: ::core::option::Option, + pub irq_calc_mask: ::core::option::Option, + pub irq_print_chip: + ::core::option::Option, + pub irq_request_resources: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub irq_release_resources: ::core::option::Option, + pub irq_compose_msi_msg: + ::core::option::Option, + pub irq_write_msi_msg: + ::core::option::Option, + pub irq_get_irqchip_state: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_data, + arg2: irqchip_irq_state::Type, + arg3: *mut bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub irq_set_irqchip_state: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_data, + arg2: irqchip_irq_state::Type, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub irq_set_vcpu_affinity: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_data, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ipi_send_single: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut irq_data, arg2: ::aya_ebpf::cty::c_uint), + >, + pub ipi_send_mask: + ::core::option::Option, + pub irq_nmi_setup: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub irq_nmi_teardown: ::core::option::Option, + pub flags: ::aya_ebpf::cty::c_ulong, +} +pub mod irq_alloc_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const X86_IRQ_ALLOC_TYPE_IOAPIC: Type = 1; + pub const X86_IRQ_ALLOC_TYPE_HPET: Type = 2; + pub const X86_IRQ_ALLOC_TYPE_PCI_MSI: Type = 3; + pub const X86_IRQ_ALLOC_TYPE_PCI_MSIX: Type = 4; + pub const X86_IRQ_ALLOC_TYPE_DMAR: Type = 5; + pub const X86_IRQ_ALLOC_TYPE_AMDVI: Type = 6; + pub const X86_IRQ_ALLOC_TYPE_UV: Type = 7; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ioapic_alloc_info { + pub pin: ::aya_ebpf::cty::c_int, + pub node: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 3usize], +} +impl ioapic_alloc_info { + #[inline] + pub fn is_level(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_level(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn ip_summed(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 2u8) as u8) } + pub fn active_low(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_ip_summed(&mut self, val: __u8) { + pub fn set_active_low(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 2u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn ooo_okay(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + pub fn valid(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_ooo_okay(&mut self, val: __u8) { + pub fn set_valid(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - pkt_type: __u8, - ignore_df: __u8, - dst_pending_confirm: __u8, - ip_summed: __u8, - ooo_okay: __u8, + is_level: u32_, + active_low: u32_, + valid: u32_, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 3u8, { - let pkt_type: u8 = unsafe { ::core::mem::transmute(pkt_type) }; - pkt_type as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let ignore_df: u8 = unsafe { ::core::mem::transmute(ignore_df) }; - ignore_df as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let dst_pending_confirm: u8 = unsafe { ::core::mem::transmute(dst_pending_confirm) }; - dst_pending_confirm as u64 + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_level: u32 = unsafe { ::core::mem::transmute(is_level) }; + is_level as u64 }); - __bindgen_bitfield_unit.set(5usize, 2u8, { - let ip_summed: u8 = unsafe { ::core::mem::transmute(ip_summed) }; - ip_summed as u64 + __bindgen_bitfield_unit.set(1usize, 1u8, { + let active_low: u32 = unsafe { ::core::mem::transmute(active_low) }; + active_low as u64 }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let ooo_okay: u8 = unsafe { ::core::mem::transmute(ooo_okay) }; - ooo_okay as u64 + __bindgen_bitfield_unit.set(2usize, 1u8, { + let valid: u32 = unsafe { ::core::mem::transmute(valid) }; + valid as u64 }); __bindgen_bitfield_unit } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct uv_alloc_info { + pub limit: ::aya_ebpf::cty::c_int, + pub blade: ::aya_ebpf::cty::c_int, + pub offset: ::aya_ebpf::cty::c_ulong, + pub name: *mut ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct irq_alloc_info { + pub type_: irq_alloc_type::Type, + pub flags: u32_, + pub devid: u32_, + pub hwirq: irq_hw_number_t, + pub mask: *const cpumask, + pub desc: *mut msi_desc, + pub data: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: irq_alloc_info__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union irq_alloc_info__bindgen_ty_1 { + pub ioapic: ioapic_alloc_info, + pub uv: uv_alloc_info, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_chip_regs { + pub enable: ::aya_ebpf::cty::c_ulong, + pub disable: ::aya_ebpf::cty::c_ulong, + pub mask: ::aya_ebpf::cty::c_ulong, + pub ack: ::aya_ebpf::cty::c_ulong, + pub eoi: ::aya_ebpf::cty::c_ulong, + pub type_: ::aya_ebpf::cty::c_ulong, + pub polarity: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_chip_type { + pub chip: irq_chip, + pub regs: irq_chip_regs, + pub handler: irq_flow_handler_t, + pub type_: u32_, + pub mask_cache_priv: u32_, + pub mask_cache: *mut u32_, +} +#[repr(C)] +pub struct irq_chip_generic { + pub lock: raw_spinlock_t, + pub reg_base: *mut ::aya_ebpf::cty::c_void, + pub reg_readl: + ::core::option::Option u32_>, + pub reg_writel: ::core::option::Option< + unsafe extern "C" fn(arg1: u32_, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub suspend: ::core::option::Option, + pub resume: ::core::option::Option, + pub irq_base: ::aya_ebpf::cty::c_uint, + pub irq_cnt: ::aya_ebpf::cty::c_uint, + pub mask_cache: u32_, + pub type_cache: u32_, + pub polarity_cache: u32_, + pub wake_enabled: u32_, + pub wake_active: u32_, + pub num_ct: ::aya_ebpf::cty::c_uint, + pub private: *mut ::aya_ebpf::cty::c_void, + pub installed: ::aya_ebpf::cty::c_ulong, + pub unused: ::aya_ebpf::cty::c_ulong, + pub domain: *mut irq_domain, + pub list: list_head, + pub chip_types: __IncompleteArrayField, +} +pub mod irq_gc_flags { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IRQ_GC_INIT_MASK_CACHE: Type = 1; + pub const IRQ_GC_INIT_NESTED_LOCK: Type = 2; + pub const IRQ_GC_MASK_CACHE_PER_TYPE: Type = 4; + pub const IRQ_GC_NO_MASK: Type = 8; + pub const IRQ_GC_BE_IO: Type = 16; +} +#[repr(C)] +#[derive(Debug)] +pub struct irq_domain_chip_generic { + pub irqs_per_chip: ::aya_ebpf::cty::c_uint, + pub num_chips: ::aya_ebpf::cty::c_uint, + pub irq_flags_to_clear: ::aya_ebpf::cty::c_uint, + pub irq_flags_to_set: ::aya_ebpf::cty::c_uint, + pub gc_flags: irq_gc_flags::Type, + pub gc: __IncompleteArrayField<*mut irq_chip_generic>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_fwspec { + pub fwnode: *mut fwnode_handle, + pub param_count: ::aya_ebpf::cty::c_int, + pub param: [u32_; 16usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct irq_domain_ops { + pub match_: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut device_node, + arg3: irq_domain_bus_token::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub select: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut irq_fwspec, + arg3: irq_domain_bus_token::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub map: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: ::aya_ebpf::cty::c_uint, + arg3: irq_hw_number_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub unmap: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut irq_domain, arg2: ::aya_ebpf::cty::c_uint), + >, + pub xlate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut device_node, + arg3: *const u32_, + arg4: ::aya_ebpf::cty::c_uint, + arg5: *mut ::aya_ebpf::cty::c_ulong, + arg6: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub alloc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub free: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, + ), + >, + pub activate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut irq_data, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub deactivate: + ::core::option::Option, + pub translate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut irq_fwspec, + arg3: *mut ::aya_ebpf::cty::c_ulong, + arg4: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct msi_parent_ops { + pub supported_flags: u32_, + pub prefix: *const ::aya_ebpf::cty::c_char, + pub init_dev_msi_info: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: *mut irq_domain, + arg3: *mut irq_domain, + arg4: *mut msi_domain_info, + ) -> bool_, + >, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct gpio_irq_chip { + pub chip: *mut irq_chip, + pub domain: *mut irq_domain, + pub fwnode: *mut fwnode_handle, + pub parent_domain: *mut irq_domain, + pub child_to_parent_hwirq: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut ::aya_ebpf::cty::c_uint, + arg5: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub populate_parent_alloc_arg: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: *mut gpio_irq_fwspec, + arg3: ::aya_ebpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub child_offset_to_irq: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_uint, + >, + pub child_irq_domain_ops: irq_domain_ops, + pub handler: irq_flow_handler_t, + pub default_type: ::aya_ebpf::cty::c_uint, + pub lock_key: *mut lock_class_key, + pub request_key: *mut lock_class_key, + pub parent_handler: irq_flow_handler_t, + pub __bindgen_anon_1: gpio_irq_chip__bindgen_ty_1, + pub num_parents: ::aya_ebpf::cty::c_uint, + pub parents: *mut ::aya_ebpf::cty::c_uint, + pub map: *mut ::aya_ebpf::cty::c_uint, + pub threaded: bool_, + pub per_parent_data: bool_, + pub initialized: bool_, + pub domain_is_allocated_externally: bool_, + pub init_hw: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gpio_chip) -> ::aya_ebpf::cty::c_int, + >, + pub init_valid_mask: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: *mut ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_uint, + ), + >, + pub valid_mask: *mut ::aya_ebpf::cty::c_ulong, + pub first: ::aya_ebpf::cty::c_uint, + pub irq_enable: ::core::option::Option, + pub irq_disable: ::core::option::Option, + pub irq_unmask: ::core::option::Option, + pub irq_mask: ::core::option::Option, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union gpio_irq_chip__bindgen_ty_1 { + pub parent_handler_data: *mut ::aya_ebpf::cty::c_void, + pub parent_handler_data_array: *mut *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct gpio_chip { + pub label: *const ::aya_ebpf::cty::c_char, + pub gpiodev: *mut gpio_device, + pub parent: *mut device, + pub fwnode: *mut fwnode_handle, + pub owner: *mut module, + pub request: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub free: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gpio_chip, arg2: ::aya_ebpf::cty::c_uint), + >, + pub get_direction: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub direction_input: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub direction_output: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_multiple: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: *mut ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_int, + ), + >, + pub set_multiple: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: *mut ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_ulong, + ), + >, + pub set_config: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub to_irq: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dbg_show: + ::core::option::Option, + pub init_valid_mask: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: *mut ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub add_pin_ranges: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gpio_chip) -> ::aya_ebpf::cty::c_int, + >, + pub en_hw_timestamp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: u32_, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dis_hw_timestamp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gpio_chip, + arg2: u32_, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub base: ::aya_ebpf::cty::c_int, + pub ngpio: u16_, + pub offset: u16_, + pub names: *const *const ::aya_ebpf::cty::c_char, + pub can_sleep: bool_, + pub read_reg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void) -> ::aya_ebpf::cty::c_ulong, + >, + pub write_reg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void, arg2: ::aya_ebpf::cty::c_ulong), + >, + pub be_bits: bool_, + pub reg_dat: *mut ::aya_ebpf::cty::c_void, + pub reg_set: *mut ::aya_ebpf::cty::c_void, + pub reg_clr: *mut ::aya_ebpf::cty::c_void, + pub reg_dir_out: *mut ::aya_ebpf::cty::c_void, + pub reg_dir_in: *mut ::aya_ebpf::cty::c_void, + pub bgpio_dir_unreadable: bool_, + pub bgpio_bits: ::aya_ebpf::cty::c_int, + pub bgpio_lock: raw_spinlock_t, + pub bgpio_data: ::aya_ebpf::cty::c_ulong, + pub bgpio_dir: ::aya_ebpf::cty::c_ulong, + pub irq: gpio_irq_chip, + pub valid_mask: *mut ::aya_ebpf::cty::c_ulong, +} +pub type msi_alloc_info_t = irq_alloc_info; +#[repr(C)] +#[derive(Copy, Clone)] +pub union gpio_irq_fwspec { + pub fwspec: irq_fwspec, + pub msiinfo: msi_alloc_info_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ida { + pub xa: xarray, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct scatterlist { + pub page_link: ::aya_ebpf::cty::c_ulong, + pub offset: ::aya_ebpf::cty::c_uint, + pub length: ::aya_ebpf::cty::c_uint, + pub dma_address: dma_addr_t, + pub dma_length: ::aya_ebpf::cty::c_uint, + pub dma_flags: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct local_lock_t {} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sg_table { + pub sgl: *mut scatterlist, + pub nents: ::aya_ebpf::cty::c_uint, + pub orig_nents: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ww_acquire_ctx { + pub task: *mut task_struct, + pub stamp: ::aya_ebpf::cty::c_ulong, + pub acquired: ::aya_ebpf::cty::c_uint, + pub wounded: ::aya_ebpf::cty::c_ushort, + pub is_wait_die: ::aya_ebpf::cty::c_ushort, +} +pub type kthread_work_func_t = + ::core::option::Option; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct kthread_work { + pub node: list_head, + pub func: kthread_work_func_t, + pub worker: *mut kthread_worker, + pub canceling: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct kthread_worker { + pub flags: ::aya_ebpf::cty::c_uint, + pub lock: raw_spinlock_t, + pub work_list: list_head, + pub delayed_work_list: list_head, + pub task: *mut task_struct, + pub current_work: *mut kthread_work, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct u64_stats_t { + pub v: local64_t, +} +pub mod irqreturn { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IRQ_NONE: Type = 0; + pub const IRQ_HANDLED: Type = 1; + pub const IRQ_WAKE_THREAD: Type = 2; +} +pub use self::irqreturn::Type as irqreturn_t; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cdrom_device_info { + pub ops: *const cdrom_device_ops, + pub list: list_head, + pub disk: *mut gendisk, + pub handle: *mut ::aya_ebpf::cty::c_void, + pub mask: ::aya_ebpf::cty::c_int, + pub speed: ::aya_ebpf::cty::c_int, + pub capacity: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, + pub vfs_events: ::aya_ebpf::cty::c_uint, + pub ioctl_events: ::aya_ebpf::cty::c_uint, + pub use_count: ::aya_ebpf::cty::c_int, + pub name: [::aya_ebpf::cty::c_char; 20usize], + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, + pub cdda_method: ::aya_ebpf::cty::c_int, + pub last_sense: __u8, + pub media_written: __u8, + pub mmc3_profile: ::aya_ebpf::cty::c_ushort, + pub exit: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cdrom_device_info) -> ::aya_ebpf::cty::c_int, + >, + pub mrw_mode_page: ::aya_ebpf::cty::c_int, + pub opened_for_data: bool_, + pub last_media_change_ms: __s64, +} +impl cdrom_device_info { #[inline] - pub fn mono_delivery_time(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_mono_delivery_time(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn tc_at_ingress(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_tc_at_ingress(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn tc_skip_classify(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_tc_skip_classify(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn remcsum_offload(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(3usize, 1u8) as u8) } - } - #[inline] - pub fn set_remcsum_offload(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn csum_complete_sw(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(4usize, 1u8) as u8) } - } - #[inline] - pub fn set_csum_complete_sw(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn csum_level(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(5usize, 2u8) as u8) } - } - #[inline] - pub fn set_csum_level(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(5usize, 2u8, val as u64) - } - } - #[inline] - pub fn inner_protocol_type(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(7usize, 1u8) as u8) } + pub fn options(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 30u8) as u32) } } #[inline] - pub fn set_inner_protocol_type(&mut self, val: __u8) { + pub fn set_options(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(7usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 30u8, val as u64) } } #[inline] - pub fn l4_hash(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(8usize, 1u8) as u8) } + pub fn mc_flags(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(30usize, 2u8) as u32) } } #[inline] - pub fn set_l4_hash(&mut self, val: __u8) { + pub fn set_mc_flags(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(8usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(30usize, 2u8, val as u64) } } #[inline] - pub fn sw_hash(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(9usize, 1u8) as u8) } - } - #[inline] - pub fn set_sw_hash(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(9usize, 1u8, val as u64) - } + pub fn new_bitfield_1( + options: ::aya_ebpf::cty::c_uint, + mc_flags: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 30u8, { + let options: u32 = unsafe { ::core::mem::transmute(options) }; + options as u64 + }); + __bindgen_bitfield_unit.set(30usize, 2u8, { + let mc_flags: u32 = unsafe { ::core::mem::transmute(mc_flags) }; + mc_flags as u64 + }); + __bindgen_bitfield_unit } #[inline] - pub fn wifi_acked_valid(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(10usize, 1u8) as u8) } + pub fn sanyo_slot(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 2u8) as u8) } } #[inline] - pub fn set_wifi_acked_valid(&mut self, val: __u8) { + pub fn set_sanyo_slot(&mut self, val: __u8) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(10usize, 1u8, val as u64) + self._bitfield_2.set(0usize, 2u8, val as u64) } } #[inline] - pub fn wifi_acked(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(11usize, 1u8) as u8) } + pub fn keeplocked(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 1u8) as u8) } } #[inline] - pub fn set_wifi_acked(&mut self, val: __u8) { + pub fn set_keeplocked(&mut self, val: __u8) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(11usize, 1u8, val as u64) + self._bitfield_2.set(2usize, 1u8, val as u64) } } #[inline] - pub fn no_fcs(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(12usize, 1u8) as u8) } + pub fn reserved(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(3usize, 5u8) as u8) } } #[inline] - pub fn set_no_fcs(&mut self, val: __u8) { + pub fn set_reserved(&mut self, val: __u8) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(12usize, 1u8, val as u64) + self._bitfield_2.set(3usize, 5u8, val as u64) } } #[inline] - pub fn encapsulation(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(13usize, 1u8) as u8) } + pub fn new_bitfield_2( + sanyo_slot: __u8, + keeplocked: __u8, + reserved: __u8, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 2u8, { + let sanyo_slot: u8 = unsafe { ::core::mem::transmute(sanyo_slot) }; + sanyo_slot as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let keeplocked: u8 = unsafe { ::core::mem::transmute(keeplocked) }; + keeplocked as u64 + }); + __bindgen_bitfield_unit.set(3usize, 5u8, { + let reserved: u8 = unsafe { ::core::mem::transmute(reserved) }; + reserved as u64 + }); + __bindgen_bitfield_unit } - #[inline] - pub fn set_encapsulation(&mut self, val: __u8) { +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct scsi_sense_hdr { + pub response_code: u8_, + pub sense_key: u8_, + pub asc: u8_, + pub ascq: u8_, + pub byte4: u8_, + pub byte5: u8_, + pub byte6: u8_, + pub additional_length: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cdrom_msf0 { + pub minute: __u8, + pub second: __u8, + pub frame: __u8, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union cdrom_addr { + pub msf: cdrom_msf0, + pub lba: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cdrom_multisession { + pub addr: cdrom_addr, + pub xa_flag: __u8, + pub addr_format: __u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cdrom_mcn { + pub medium_catalog_number: [__u8; 14usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct packet_command { + pub cmd: [::aya_ebpf::cty::c_uchar; 12usize], + pub buffer: *mut ::aya_ebpf::cty::c_uchar, + pub buflen: ::aya_ebpf::cty::c_uint, + pub stat: ::aya_ebpf::cty::c_int, + pub sshdr: *mut scsi_sense_hdr, + pub data_direction: ::aya_ebpf::cty::c_uchar, + pub quiet: ::aya_ebpf::cty::c_int, + pub timeout: ::aya_ebpf::cty::c_int, + pub reserved: [*mut ::aya_ebpf::cty::c_void; 1usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cdrom_device_ops { + pub open: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub release: ::core::option::Option, + pub drive_status: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub check_events: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_uint, + >, + pub tray_move: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lock_door: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub select_speed: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_last_session: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: *mut cdrom_multisession, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_mcn: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: *mut cdrom_mcn, + ) -> ::aya_ebpf::cty::c_int, + >, + pub reset: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cdrom_device_info) -> ::aya_ebpf::cty::c_int, + >, + pub audio_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: ::aya_ebpf::cty::c_uint, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub generic_packet: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: *mut packet_command, + ) -> ::aya_ebpf::cty::c_int, + >, + pub read_cdda_bpc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut cdrom_device_info, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u32_, + arg4: u32_, + arg5: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub capability: ::aya_ebpf::cty::c_int, +} +pub type __be16 = __u16; +pub type __be32 = __u32; +pub type __wsum = __u32; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct blocking_notifier_head { + pub rwsem: rw_semaphore, + pub head: *mut notifier_block, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct raw_notifier_head { + pub head: *mut notifier_block, +} +pub type __kernel_sa_family_t = ::aya_ebpf::cty::c_ushort; +pub type sa_family_t = __kernel_sa_family_t; +#[repr(C)] +pub struct sockaddr { + pub sa_family: sa_family_t, + pub __bindgen_anon_1: sockaddr__bindgen_ty_1, +} +#[repr(C)] +pub struct sockaddr__bindgen_ty_1 { + pub sa_data_min: __BindgenUnionField<[::aya_ebpf::cty::c_char; 14usize]>, + pub __bindgen_anon_1: __BindgenUnionField, + pub bindgen_union_field: [u8; 14usize], +} +#[repr(C)] +#[derive(Debug)] +pub struct sockaddr__bindgen_ty_1__bindgen_ty_1 { + pub __empty_sa_data: sockaddr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub sa_data: __IncompleteArrayField<::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sockaddr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {} +pub type sk_buff_data_t = ::aya_ebpf::cty::c_uint; +#[repr(C)] +pub struct sk_buff { + pub __bindgen_anon_1: sk_buff__bindgen_ty_1, + pub __bindgen_anon_2: sk_buff__bindgen_ty_2, + pub __bindgen_anon_3: sk_buff__bindgen_ty_3, + pub cb: [::aya_ebpf::cty::c_char; 48usize], + pub __bindgen_anon_4: sk_buff__bindgen_ty_4, + pub _nfct: ::aya_ebpf::cty::c_ulong, + pub len: ::aya_ebpf::cty::c_uint, + pub data_len: ::aya_ebpf::cty::c_uint, + pub mac_len: __u16, + pub hdr_len: __u16, + pub queue_mapping: __u16, + pub __cloned_offset: __IncompleteArrayField<__u8>, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub active_extensions: __u8, + pub __bindgen_anon_5: sk_buff__bindgen_ty_5, + pub tail: sk_buff_data_t, + pub end: sk_buff_data_t, + pub head: *mut ::aya_ebpf::cty::c_uchar, + pub data: *mut ::aya_ebpf::cty::c_uchar, + pub truesize: ::aya_ebpf::cty::c_uint, + pub users: refcount_t, + pub extensions: *mut skb_ext, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_1 { + pub __bindgen_anon_1: sk_buff__bindgen_ty_1__bindgen_ty_1, + pub rbnode: rb_node, + pub list: list_head, + pub ll_node: llist_node, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct sk_buff__bindgen_ty_1__bindgen_ty_1 { + pub next: *mut sk_buff, + pub prev: *mut sk_buff, + pub __bindgen_anon_1: sk_buff__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub dev: *mut net_device, + pub dev_scratch: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_2 { + pub sk: *mut sock, + pub ip_defrag_offset: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_3 { + pub tstamp: ktime_t, + pub skb_mstamp_ns: u64_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_4 { + pub __bindgen_anon_1: sk_buff__bindgen_ty_4__bindgen_ty_1, + pub tcp_tsorted_anchor: list_head, + pub _sk_redir: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_buff__bindgen_ty_4__bindgen_ty_1 { + pub _skb_refdst: ::aya_ebpf::cty::c_ulong, + pub destructor: ::core::option::Option, +} +#[repr(C)] +pub struct sk_buff__bindgen_ty_5 { + pub __bindgen_anon_1: __BindgenUnionField, + pub headers: __BindgenUnionField, + pub bindgen_union_field: [u32; 15usize], +} +#[repr(C)] +pub struct sk_buff__bindgen_ty_5__bindgen_ty_1 { + pub __pkt_type_offset: __IncompleteArrayField<__u8>, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __mono_tc_offset: __IncompleteArrayField<__u8>, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 4usize]>, + pub tc_index: __u16, + pub alloc_cpu: u16_, + pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1, + pub priority: __u32, + pub skb_iif: ::aya_ebpf::cty::c_int, + pub hash: __u32, + pub __bindgen_anon_2: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2, + pub __bindgen_anon_3: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3, + pub secmark: __u32, + pub __bindgen_anon_4: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_4, + pub __bindgen_anon_5: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_5, + pub inner_transport_header: __u16, + pub inner_network_header: __u16, + pub inner_mac_header: __u16, + pub protocol: __be16, + pub transport_header: __u16, + pub network_header: __u16, + pub mac_header: __u16, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1 { + pub csum: __wsum, + pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub csum_start: __u16, + pub csum_offset: __u16, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2 { + pub vlan_all: u32_, + pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { + pub vlan_proto: __be16, + pub vlan_tci: __u16, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3 { + pub napi_id: ::aya_ebpf::cty::c_uint, + pub sender_cpu: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_4 { + pub mark: __u32, + pub reserved_tailroom: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union sk_buff__bindgen_ty_5__bindgen_ty_1__bindgen_ty_5 { + pub inner_protocol: __be16, + pub inner_ipproto: __u8, +} +impl sk_buff__bindgen_ty_5__bindgen_ty_1 { + #[inline] + pub fn pkt_type(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 3u8) as u8) } + } + #[inline] + pub fn set_pkt_type(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 3u8, val as u64) + } + } + #[inline] + pub fn ignore_df(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_ignore_df(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn dst_pending_confirm(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } + } + #[inline] + pub fn set_dst_pending_confirm(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn ip_summed(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 2u8) as u8) } + } + #[inline] + pub fn set_ip_summed(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 2u8, val as u64) + } + } + #[inline] + pub fn ooo_okay(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + } + #[inline] + pub fn set_ooo_okay(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + pkt_type: __u8, + ignore_df: __u8, + dst_pending_confirm: __u8, + ip_summed: __u8, + ooo_okay: __u8, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 3u8, { + let pkt_type: u8 = unsafe { ::core::mem::transmute(pkt_type) }; + pkt_type as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let ignore_df: u8 = unsafe { ::core::mem::transmute(ignore_df) }; + ignore_df as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let dst_pending_confirm: u8 = unsafe { ::core::mem::transmute(dst_pending_confirm) }; + dst_pending_confirm as u64 + }); + __bindgen_bitfield_unit.set(5usize, 2u8, { + let ip_summed: u8 = unsafe { ::core::mem::transmute(ip_summed) }; + ip_summed as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let ooo_okay: u8 = unsafe { ::core::mem::transmute(ooo_okay) }; + ooo_okay as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn mono_delivery_time(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_mono_delivery_time(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn tc_at_ingress(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_tc_at_ingress(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn tc_skip_classify(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_tc_skip_classify(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn remcsum_offload(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_remcsum_offload(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn csum_complete_sw(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(4usize, 1u8) as u8) } + } + #[inline] + pub fn set_csum_complete_sw(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn csum_level(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(5usize, 2u8) as u8) } + } + #[inline] + pub fn set_csum_level(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(5usize, 2u8, val as u64) + } + } + #[inline] + pub fn inner_protocol_type(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(7usize, 1u8) as u8) } + } + #[inline] + pub fn set_inner_protocol_type(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn l4_hash(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(8usize, 1u8) as u8) } + } + #[inline] + pub fn set_l4_hash(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(8usize, 1u8, val as u64) + } + } + #[inline] + pub fn sw_hash(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(9usize, 1u8) as u8) } + } + #[inline] + pub fn set_sw_hash(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(9usize, 1u8, val as u64) + } + } + #[inline] + pub fn wifi_acked_valid(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(10usize, 1u8) as u8) } + } + #[inline] + pub fn set_wifi_acked_valid(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(10usize, 1u8, val as u64) + } + } + #[inline] + pub fn wifi_acked(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(11usize, 1u8) as u8) } + } + #[inline] + pub fn set_wifi_acked(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(11usize, 1u8, val as u64) + } + } + #[inline] + pub fn no_fcs(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(12usize, 1u8) as u8) } + } + #[inline] + pub fn set_no_fcs(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(12usize, 1u8, val as u64) + } + } + #[inline] + pub fn encapsulation(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_2.get(13usize, 1u8) as u8) } + } + #[inline] + pub fn set_encapsulation(&mut self, val: __u8) { unsafe { let val: u8 = ::core::mem::transmute(val); self._bitfield_2.set(13usize, 1u8, val as u64) @@ -14547,7 +15703,7 @@ pub struct sk_buff__bindgen_ty_5__bindgen_ty_2 { pub alloc_cpu: u16_, pub __bindgen_anon_1: sk_buff__bindgen_ty_5__bindgen_ty_2__bindgen_ty_1, pub priority: __u32, - pub skb_iif: ::aya_bpf::cty::c_int, + pub skb_iif: ::aya_ebpf::cty::c_int, pub hash: __u32, pub __bindgen_anon_2: sk_buff__bindgen_ty_5__bindgen_ty_2__bindgen_ty_2, pub __bindgen_anon_3: sk_buff__bindgen_ty_5__bindgen_ty_2__bindgen_ty_3, @@ -14589,8 +15745,8 @@ pub struct sk_buff__bindgen_ty_5__bindgen_ty_2__bindgen_ty_2__bindgen_ty_1 { #[repr(C)] #[derive(Copy, Clone)] pub union sk_buff__bindgen_ty_5__bindgen_ty_2__bindgen_ty_3 { - pub napi_id: ::aya_bpf::cty::c_uint, - pub sender_cpu: ::aya_bpf::cty::c_uint, + pub napi_id: ::aya_ebpf::cty::c_uint, + pub sender_cpu: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] @@ -15235,737 +16391,775 @@ impl sk_buff { } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct in6_addr { - pub in6_u: in6_addr__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct sync_serial_settings { + pub clock_rate: ::aya_ebpf::cty::c_uint, + pub clock_type: ::aya_ebpf::cty::c_uint, + pub loopback: ::aya_ebpf::cty::c_ushort, } #[repr(C)] -#[derive(Copy, Clone)] -pub union in6_addr__bindgen_ty_1 { - pub u6_addr8: [__u8; 16usize], - pub u6_addr16: [__be16; 8usize], - pub u6_addr32: [__be32; 4usize], +#[derive(Debug, Copy, Clone)] +pub struct te1_settings { + pub clock_rate: ::aya_ebpf::cty::c_uint, + pub clock_type: ::aya_ebpf::cty::c_uint, + pub loopback: ::aya_ebpf::cty::c_ushort, + pub slot_map: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct siphash_key_t { - pub key: [u64_; 2usize], +pub struct raw_hdlc_proto { + pub encoding: ::aya_ebpf::cty::c_ushort, + pub parity: ::aya_ebpf::cty::c_ushort, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct page_pool_recycle_stats { - pub cached: u64_, - pub cache_full: u64_, - pub ring: u64_, - pub ring_full: u64_, - pub released_refcnt: u64_, +pub struct fr_proto { + pub t391: ::aya_ebpf::cty::c_uint, + pub t392: ::aya_ebpf::cty::c_uint, + pub n391: ::aya_ebpf::cty::c_uint, + pub n392: ::aya_ebpf::cty::c_uint, + pub n393: ::aya_ebpf::cty::c_uint, + pub lmi: ::aya_ebpf::cty::c_ushort, + pub dce: ::aya_ebpf::cty::c_ushort, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ip_conntrack_stat { - pub found: ::aya_bpf::cty::c_uint, - pub invalid: ::aya_bpf::cty::c_uint, - pub insert: ::aya_bpf::cty::c_uint, - pub insert_failed: ::aya_bpf::cty::c_uint, - pub clash_resolve: ::aya_bpf::cty::c_uint, - pub drop: ::aya_bpf::cty::c_uint, - pub early_drop: ::aya_bpf::cty::c_uint, - pub error: ::aya_bpf::cty::c_uint, - pub expect_new: ::aya_bpf::cty::c_uint, - pub expect_create: ::aya_bpf::cty::c_uint, - pub expect_delete: ::aya_bpf::cty::c_uint, - pub search_restart: ::aya_bpf::cty::c_uint, - pub chaintoolong: ::aya_bpf::cty::c_uint, +pub struct fr_proto_pvc { + pub dlci: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_buff_list { - pub next: *mut sk_buff, - pub prev: *mut sk_buff, +pub struct fr_proto_pvc_info { + pub dlci: ::aya_ebpf::cty::c_uint, + pub master: [::aya_ebpf::cty::c_char; 16usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct sk_buff_head { - pub __bindgen_anon_1: sk_buff_head__bindgen_ty_1, - pub qlen: __u32, - pub lock: spinlock_t, +#[derive(Debug, Copy, Clone)] +pub struct cisco_proto { + pub interval: ::aya_ebpf::cty::c_uint, + pub timeout: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sk_buff_head__bindgen_ty_1 { - pub __bindgen_anon_1: sk_buff_head__bindgen_ty_1__bindgen_ty_1, - pub list: sk_buff_list, +#[derive(Debug, Copy, Clone)] +pub struct x25_hdlc_proto { + pub dce: ::aya_ebpf::cty::c_ushort, + pub modulo: ::aya_ebpf::cty::c_uint, + pub window: ::aya_ebpf::cty::c_uint, + pub t1: ::aya_ebpf::cty::c_uint, + pub t2: ::aya_ebpf::cty::c_uint, + pub n2: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_buff_head__bindgen_ty_1__bindgen_ty_1 { - pub next: *mut sk_buff, - pub prev: *mut sk_buff, +pub struct ifmap { + pub mem_start: ::aya_ebpf::cty::c_ulong, + pub mem_end: ::aya_ebpf::cty::c_ulong, + pub base_addr: ::aya_ebpf::cty::c_ushort, + pub irq: ::aya_ebpf::cty::c_uchar, + pub dma: ::aya_ebpf::cty::c_uchar, + pub port: ::aya_ebpf::cty::c_uchar, } #[repr(C)] -#[derive(Debug)] -pub struct skb_ext { - pub refcnt: refcount_t, - pub offset: [u8_; 5usize], - pub chunks: u8_, - pub __bindgen_padding_0: [u8; 6usize], - pub data: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Copy, Clone)] +pub struct if_settings { + pub type_: ::aya_ebpf::cty::c_uint, + pub size: ::aya_ebpf::cty::c_uint, + pub ifs_ifsu: if_settings__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ref_tracker_dir {} +#[derive(Copy, Clone)] +pub union if_settings__bindgen_ty_1 { + pub raw_hdlc: *mut raw_hdlc_proto, + pub cisco: *mut cisco_proto, + pub fr: *mut fr_proto, + pub fr_pvc: *mut fr_proto_pvc, + pub fr_pvc_info: *mut fr_proto_pvc_info, + pub x25: *mut x25_hdlc_proto, + pub sync: *mut sync_serial_settings, + pub te1: *mut te1_settings, +} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netns_core { - pub sysctl_hdr: *mut ctl_table_header, - pub sysctl_somaxconn: ::aya_bpf::cty::c_int, - pub sysctl_txrehash: u8_, - pub prot_inuse: *mut prot_inuse, - pub rps_default_mask: *mut cpumask, +pub struct ifreq { + pub ifr_ifrn: ifreq__bindgen_ty_1, + pub ifr_ifru: ifreq__bindgen_ty_2, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netns_mib { - pub ip_statistics: *mut ipstats_mib, - pub ipv6_statistics: *mut ipstats_mib, - pub tcp_statistics: *mut tcp_mib, - pub net_statistics: *mut linux_mib, - pub udp_statistics: *mut udp_mib, - pub udp_stats_in6: *mut udp_mib, - pub xfrm_statistics: *mut linux_xfrm_mib, - pub tls_statistics: *mut linux_tls_mib, - pub mptcp_statistics: *mut mptcp_mib, - pub udplite_statistics: *mut udp_mib, - pub udplite_stats_in6: *mut udp_mib, - pub icmp_statistics: *mut icmp_mib, - pub icmpmsg_statistics: *mut icmpmsg_mib, - pub icmpv6_statistics: *mut icmpv6_mib, - pub icmpv6msg_statistics: *mut icmpv6msg_mib, - pub proc_net_devsnmp6: *mut proc_dir_entry, +#[derive(Copy, Clone)] +pub union ifreq__bindgen_ty_1 { + pub ifrn_name: [::aya_ebpf::cty::c_char; 16usize], } #[repr(C)] +pub struct ifreq__bindgen_ty_2 { + pub ifru_addr: __BindgenUnionField, + pub ifru_dstaddr: __BindgenUnionField, + pub ifru_broadaddr: __BindgenUnionField, + pub ifru_netmask: __BindgenUnionField, + pub ifru_hwaddr: __BindgenUnionField, + pub ifru_flags: __BindgenUnionField<::aya_ebpf::cty::c_short>, + pub ifru_ivalue: __BindgenUnionField<::aya_ebpf::cty::c_int>, + pub ifru_mtu: __BindgenUnionField<::aya_ebpf::cty::c_int>, + pub ifru_map: __BindgenUnionField, + pub ifru_slave: __BindgenUnionField<[::aya_ebpf::cty::c_char; 16usize]>, + pub ifru_newname: __BindgenUnionField<[::aya_ebpf::cty::c_char; 16usize]>, + pub ifru_data: __BindgenUnionField<*mut ::aya_ebpf::cty::c_void>, + pub ifru_settings: __BindgenUnionField, + pub bindgen_union_field: [u64; 3usize], +} +pub type netdev_features_t = u64_; +#[repr(C)] #[derive(Copy, Clone)] -pub struct netns_packet { - pub sklist_lock: mutex, - pub sklist: hlist_head, +pub struct in6_addr { + pub in6_u: in6_addr__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct unix_table { - pub locks: *mut spinlock_t, - pub buckets: *mut hlist_head, +#[derive(Copy, Clone)] +pub union in6_addr__bindgen_ty_1 { + pub u6_addr8: [__u8; 16usize], + pub u6_addr16: [__be16; 8usize], + pub u6_addr32: [__be32; 4usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_unix { - pub table: unix_table, - pub sysctl_max_dgram_qlen: ::aya_bpf::cty::c_int, - pub ctl: *mut ctl_table_header, +pub struct ip_conntrack_stat { + pub found: ::aya_ebpf::cty::c_uint, + pub invalid: ::aya_ebpf::cty::c_uint, + pub insert: ::aya_ebpf::cty::c_uint, + pub insert_failed: ::aya_ebpf::cty::c_uint, + pub clash_resolve: ::aya_ebpf::cty::c_uint, + pub drop: ::aya_ebpf::cty::c_uint, + pub early_drop: ::aya_ebpf::cty::c_uint, + pub error: ::aya_ebpf::cty::c_uint, + pub expect_new: ::aya_ebpf::cty::c_uint, + pub expect_create: ::aya_ebpf::cty::c_uint, + pub expect_delete: ::aya_ebpf::cty::c_uint, + pub search_restart: ::aya_ebpf::cty::c_uint, + pub chaintoolong: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct netns_nexthop { - pub rb_root: rb_root, - pub devhash: *mut hlist_head, - pub seq: ::aya_bpf::cty::c_uint, - pub last_id_allocated: u32_, - pub notifier_chain: blocking_notifier_head, +#[derive(Debug, Copy, Clone)] +pub struct netdev_tc_txq { + pub count: u16_, + pub offset: u16_, } +pub mod rx_handler_result { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RX_HANDLER_CONSUMED: Type = 0; + pub const RX_HANDLER_ANOTHER: Type = 1; + pub const RX_HANDLER_EXACT: Type = 2; + pub const RX_HANDLER_PASS: Type = 3; +} +pub use self::rx_handler_result::Type as rx_handler_result_t; +pub type rx_handler_func_t = + ::core::option::Option rx_handler_result_t>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct inet_timewait_death_row { - pub tw_refcount: refcount_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub hashinfo: *mut inet_hashinfo, - pub sysctl_max_tw_buckets: ::aya_bpf::cty::c_int, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, - pub __bindgen_padding_0: u32, +pub struct possible_net_t { + pub net: *mut net, } +pub type xdp_features_t = u32_; #[repr(C)] #[derive(Copy, Clone)] -pub struct local_ports { - pub lock: seqlock_t, - pub range: [::aya_bpf::cty::c_int; 2usize], - pub warned: bool_, +pub struct net_device_stats { + pub __bindgen_anon_1: net_device_stats__bindgen_ty_1, + pub __bindgen_anon_2: net_device_stats__bindgen_ty_2, + pub __bindgen_anon_3: net_device_stats__bindgen_ty_3, + pub __bindgen_anon_4: net_device_stats__bindgen_ty_4, + pub __bindgen_anon_5: net_device_stats__bindgen_ty_5, + pub __bindgen_anon_6: net_device_stats__bindgen_ty_6, + pub __bindgen_anon_7: net_device_stats__bindgen_ty_7, + pub __bindgen_anon_8: net_device_stats__bindgen_ty_8, + pub __bindgen_anon_9: net_device_stats__bindgen_ty_9, + pub __bindgen_anon_10: net_device_stats__bindgen_ty_10, + pub __bindgen_anon_11: net_device_stats__bindgen_ty_11, + pub __bindgen_anon_12: net_device_stats__bindgen_ty_12, + pub __bindgen_anon_13: net_device_stats__bindgen_ty_13, + pub __bindgen_anon_14: net_device_stats__bindgen_ty_14, + pub __bindgen_anon_15: net_device_stats__bindgen_ty_15, + pub __bindgen_anon_16: net_device_stats__bindgen_ty_16, + pub __bindgen_anon_17: net_device_stats__bindgen_ty_17, + pub __bindgen_anon_18: net_device_stats__bindgen_ty_18, + pub __bindgen_anon_19: net_device_stats__bindgen_ty_19, + pub __bindgen_anon_20: net_device_stats__bindgen_ty_20, + pub __bindgen_anon_21: net_device_stats__bindgen_ty_21, + pub __bindgen_anon_22: net_device_stats__bindgen_ty_22, + pub __bindgen_anon_23: net_device_stats__bindgen_ty_23, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ping_group_range { - pub lock: seqlock_t, - pub range: [kgid_t; 2usize], +pub union net_device_stats__bindgen_ty_1 { + pub rx_packets: ::aya_ebpf::cty::c_ulong, + pub __rx_packets: atomic_long_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct netns_ipv4 { - pub tcp_death_row: inet_timewait_death_row, - pub udp_table: *mut udp_table, - pub forw_hdr: *mut ctl_table_header, - pub frags_hdr: *mut ctl_table_header, - pub ipv4_hdr: *mut ctl_table_header, - pub route_hdr: *mut ctl_table_header, - pub xfrm4_hdr: *mut ctl_table_header, - pub devconf_all: *mut ipv4_devconf, - pub devconf_dflt: *mut ipv4_devconf, - pub ra_chain: *mut ip_ra_chain, - pub ra_mutex: mutex, - pub rules_ops: *mut fib_rules_ops, - pub fib_main: *mut fib_table, - pub fib_default: *mut fib_table, - pub fib_rules_require_fldissect: ::aya_bpf::cty::c_uint, - pub fib_has_custom_rules: bool_, - pub fib_has_custom_local_routes: bool_, - pub fib_offload_disabled: bool_, - pub fib_num_tclassid_users: atomic_t, - pub fib_table_hash: *mut hlist_head, - pub fibnl: *mut sock, - pub mc_autojoin_sk: *mut sock, - pub peers: *mut inet_peer_base, - pub fqdir: *mut fqdir, - pub sysctl_icmp_echo_ignore_all: u8_, - pub sysctl_icmp_echo_enable_probe: u8_, - pub sysctl_icmp_echo_ignore_broadcasts: u8_, - pub sysctl_icmp_ignore_bogus_error_responses: u8_, - pub sysctl_icmp_errors_use_inbound_ifaddr: u8_, - pub sysctl_icmp_ratelimit: ::aya_bpf::cty::c_int, - pub sysctl_icmp_ratemask: ::aya_bpf::cty::c_int, - pub ip_rt_min_pmtu: u32_, - pub ip_rt_mtu_expires: ::aya_bpf::cty::c_int, - pub ip_rt_min_advmss: ::aya_bpf::cty::c_int, - pub ip_local_ports: local_ports, - pub sysctl_tcp_ecn: u8_, - pub sysctl_tcp_ecn_fallback: u8_, - pub sysctl_ip_default_ttl: u8_, - pub sysctl_ip_no_pmtu_disc: u8_, - pub sysctl_ip_fwd_use_pmtu: u8_, - pub sysctl_ip_fwd_update_priority: u8_, - pub sysctl_ip_nonlocal_bind: u8_, - pub sysctl_ip_autobind_reuse: u8_, - pub sysctl_ip_dynaddr: u8_, - pub sysctl_ip_early_demux: u8_, - pub sysctl_raw_l3mdev_accept: u8_, - pub sysctl_tcp_early_demux: u8_, - pub sysctl_udp_early_demux: u8_, - pub sysctl_nexthop_compat_mode: u8_, - pub sysctl_fwmark_reflect: u8_, - pub sysctl_tcp_fwmark_accept: u8_, - pub sysctl_tcp_l3mdev_accept: u8_, - pub sysctl_tcp_mtu_probing: u8_, - pub sysctl_tcp_mtu_probe_floor: ::aya_bpf::cty::c_int, - pub sysctl_tcp_base_mss: ::aya_bpf::cty::c_int, - pub sysctl_tcp_min_snd_mss: ::aya_bpf::cty::c_int, - pub sysctl_tcp_probe_threshold: ::aya_bpf::cty::c_int, - pub sysctl_tcp_probe_interval: u32_, - pub sysctl_tcp_keepalive_time: ::aya_bpf::cty::c_int, - pub sysctl_tcp_keepalive_intvl: ::aya_bpf::cty::c_int, - pub sysctl_tcp_keepalive_probes: u8_, - pub sysctl_tcp_syn_retries: u8_, - pub sysctl_tcp_synack_retries: u8_, - pub sysctl_tcp_syncookies: u8_, - pub sysctl_tcp_migrate_req: u8_, - pub sysctl_tcp_comp_sack_nr: u8_, - pub sysctl_tcp_reordering: ::aya_bpf::cty::c_int, - pub sysctl_tcp_retries1: u8_, - pub sysctl_tcp_retries2: u8_, - pub sysctl_tcp_orphan_retries: u8_, - pub sysctl_tcp_tw_reuse: u8_, - pub sysctl_tcp_fin_timeout: ::aya_bpf::cty::c_int, - pub sysctl_tcp_notsent_lowat: ::aya_bpf::cty::c_uint, - pub sysctl_tcp_sack: u8_, - pub sysctl_tcp_window_scaling: u8_, - pub sysctl_tcp_timestamps: u8_, - pub sysctl_tcp_early_retrans: u8_, - pub sysctl_tcp_recovery: u8_, - pub sysctl_tcp_thin_linear_timeouts: u8_, - pub sysctl_tcp_slow_start_after_idle: u8_, - pub sysctl_tcp_retrans_collapse: u8_, - pub sysctl_tcp_stdurg: u8_, - pub sysctl_tcp_rfc1337: u8_, - pub sysctl_tcp_abort_on_overflow: u8_, - pub sysctl_tcp_fack: u8_, - pub sysctl_tcp_max_reordering: ::aya_bpf::cty::c_int, - pub sysctl_tcp_adv_win_scale: ::aya_bpf::cty::c_int, - pub sysctl_tcp_dsack: u8_, - pub sysctl_tcp_app_win: u8_, - pub sysctl_tcp_frto: u8_, - pub sysctl_tcp_nometrics_save: u8_, - pub sysctl_tcp_no_ssthresh_metrics_save: u8_, - pub sysctl_tcp_moderate_rcvbuf: u8_, - pub sysctl_tcp_tso_win_divisor: u8_, - pub sysctl_tcp_workaround_signed_windows: u8_, - pub sysctl_tcp_limit_output_bytes: ::aya_bpf::cty::c_int, - pub sysctl_tcp_challenge_ack_limit: ::aya_bpf::cty::c_int, - pub sysctl_tcp_min_rtt_wlen: ::aya_bpf::cty::c_int, - pub sysctl_tcp_min_tso_segs: u8_, - pub sysctl_tcp_tso_rtt_log: u8_, - pub sysctl_tcp_autocorking: u8_, - pub sysctl_tcp_reflect_tos: u8_, - pub sysctl_tcp_invalid_ratelimit: ::aya_bpf::cty::c_int, - pub sysctl_tcp_pacing_ss_ratio: ::aya_bpf::cty::c_int, - pub sysctl_tcp_pacing_ca_ratio: ::aya_bpf::cty::c_int, - pub sysctl_tcp_wmem: [::aya_bpf::cty::c_int; 3usize], - pub sysctl_tcp_rmem: [::aya_bpf::cty::c_int; 3usize], - pub sysctl_tcp_child_ehash_entries: ::aya_bpf::cty::c_uint, - pub sysctl_tcp_comp_sack_delay_ns: ::aya_bpf::cty::c_ulong, - pub sysctl_tcp_comp_sack_slack_ns: ::aya_bpf::cty::c_ulong, - pub sysctl_max_syn_backlog: ::aya_bpf::cty::c_int, - pub sysctl_tcp_fastopen: ::aya_bpf::cty::c_int, - pub tcp_congestion_control: *const tcp_congestion_ops, - pub tcp_fastopen_ctx: *mut tcp_fastopen_context, - pub sysctl_tcp_fastopen_blackhole_timeout: ::aya_bpf::cty::c_uint, - pub tfo_active_disable_times: atomic_t, - pub tfo_active_disable_stamp: ::aya_bpf::cty::c_ulong, - pub tcp_challenge_timestamp: u32_, - pub tcp_challenge_count: u32_, - pub sysctl_tcp_plb_enabled: u8_, - pub sysctl_tcp_plb_idle_rehash_rounds: u8_, - pub sysctl_tcp_plb_rehash_rounds: u8_, - pub sysctl_tcp_plb_suspend_rto_sec: u8_, - pub sysctl_tcp_plb_cong_thresh: ::aya_bpf::cty::c_int, - pub sysctl_udp_wmem_min: ::aya_bpf::cty::c_int, - pub sysctl_udp_rmem_min: ::aya_bpf::cty::c_int, - pub sysctl_fib_notify_on_flag_change: u8_, - pub sysctl_udp_l3mdev_accept: u8_, - pub sysctl_igmp_llm_reports: u8_, - pub sysctl_igmp_max_memberships: ::aya_bpf::cty::c_int, - pub sysctl_igmp_max_msf: ::aya_bpf::cty::c_int, - pub sysctl_igmp_qrv: ::aya_bpf::cty::c_int, - pub ping_group_range: ping_group_range, - pub dev_addr_genid: atomic_t, - pub sysctl_udp_child_hash_entries: ::aya_bpf::cty::c_uint, - pub sysctl_local_reserved_ports: *mut ::aya_bpf::cty::c_ulong, - pub sysctl_ip_prot_sock: ::aya_bpf::cty::c_int, - pub mr_tables: list_head, - pub mr_rules_ops: *mut fib_rules_ops, - pub sysctl_fib_multipath_hash_fields: u32_, - pub sysctl_fib_multipath_use_neigh: u8_, - pub sysctl_fib_multipath_hash_policy: u8_, - pub notifier_ops: *mut fib_notifier_ops, - pub fib_seq: ::aya_bpf::cty::c_uint, - pub ipmr_notifier_ops: *mut fib_notifier_ops, - pub ipmr_seq: ::aya_bpf::cty::c_uint, - pub rt_genid: atomic_t, - pub ip_id_key: siphash_key_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl netns_ipv4 { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub union net_device_stats__bindgen_ty_2 { + pub tx_packets: ::aya_ebpf::cty::c_ulong, + pub __tx_packets: atomic_long_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct dst_ops { - pub family: ::aya_bpf::cty::c_ushort, - pub gc_thresh: ::aya_bpf::cty::c_uint, - pub gc: ::core::option::Option, - pub check: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dst_entry, arg2: __u32) -> *mut dst_entry, - >, - pub default_advmss: ::core::option::Option< - unsafe extern "C" fn(arg1: *const dst_entry) -> ::aya_bpf::cty::c_uint, - >, - pub mtu: ::core::option::Option< - unsafe extern "C" fn(arg1: *const dst_entry) -> ::aya_bpf::cty::c_uint, - >, - pub cow_metrics: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dst_entry, arg2: ::aya_bpf::cty::c_ulong) -> *mut u32_, - >, - pub destroy: ::core::option::Option, - pub ifdown: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dst_entry, - arg2: *mut net_device, - arg3: ::aya_bpf::cty::c_int, - ), - >, - pub negative_advice: - ::core::option::Option *mut dst_entry>, - pub link_failure: ::core::option::Option, - pub update_pmtu: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dst_entry, - arg2: *mut sock, - arg3: *mut sk_buff, - arg4: u32_, - arg5: bool_, - ), - >, - pub redirect: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dst_entry, arg2: *mut sock, arg3: *mut sk_buff), - >, - pub local_out: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut sock, - arg3: *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, - >, - pub neigh_lookup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const dst_entry, - arg2: *mut sk_buff, - arg3: *const ::aya_bpf::cty::c_void, - ) -> *mut neighbour, - >, - pub confirm_neigh: ::core::option::Option< - unsafe extern "C" fn(arg1: *const dst_entry, arg2: *const ::aya_bpf::cty::c_void), - >, - pub kmem_cachep: *mut kmem_cache, - pub pcpuc_entries: percpu_counter, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, -} -impl dst_ops { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub union net_device_stats__bindgen_ty_3 { + pub rx_bytes: ::aya_ebpf::cty::c_ulong, + pub __rx_bytes: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netns_sysctl_ipv6 { - pub hdr: *mut ctl_table_header, - pub route_hdr: *mut ctl_table_header, - pub icmp_hdr: *mut ctl_table_header, - pub frags_hdr: *mut ctl_table_header, - pub xfrm6_hdr: *mut ctl_table_header, - pub flush_delay: ::aya_bpf::cty::c_int, - pub ip6_rt_max_size: ::aya_bpf::cty::c_int, - pub ip6_rt_gc_min_interval: ::aya_bpf::cty::c_int, - pub ip6_rt_gc_timeout: ::aya_bpf::cty::c_int, - pub ip6_rt_gc_interval: ::aya_bpf::cty::c_int, - pub ip6_rt_gc_elasticity: ::aya_bpf::cty::c_int, - pub ip6_rt_mtu_expires: ::aya_bpf::cty::c_int, - pub ip6_rt_min_advmss: ::aya_bpf::cty::c_int, - pub multipath_hash_fields: u32_, - pub multipath_hash_policy: u8_, - pub bindv6only: u8_, - pub flowlabel_consistency: u8_, - pub auto_flowlabels: u8_, - pub icmpv6_time: ::aya_bpf::cty::c_int, - pub icmpv6_echo_ignore_all: u8_, - pub icmpv6_echo_ignore_multicast: u8_, - pub icmpv6_echo_ignore_anycast: u8_, - pub icmpv6_ratemask: [::aya_bpf::cty::c_ulong; 4usize], - pub icmpv6_ratemask_ptr: *mut ::aya_bpf::cty::c_ulong, - pub anycast_src_echo_reply: u8_, - pub ip_nonlocal_bind: u8_, - pub fwmark_reflect: u8_, - pub flowlabel_state_ranges: u8_, - pub idgen_retries: ::aya_bpf::cty::c_int, - pub idgen_delay: ::aya_bpf::cty::c_int, - pub flowlabel_reflect: ::aya_bpf::cty::c_int, - pub max_dst_opts_cnt: ::aya_bpf::cty::c_int, - pub max_hbh_opts_cnt: ::aya_bpf::cty::c_int, - pub max_dst_opts_len: ::aya_bpf::cty::c_int, - pub max_hbh_opts_len: ::aya_bpf::cty::c_int, - pub seg6_flowlabel: ::aya_bpf::cty::c_int, - pub ioam6_id: u32_, - pub ioam6_id_wide: u64_, - pub skip_notify_on_dev_down: u8_, - pub fib_notify_on_flag_change: u8_, - pub icmpv6_error_anycast_as_unicast: u8_, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_4 { + pub tx_bytes: ::aya_ebpf::cty::c_ulong, + pub __tx_bytes: atomic_long_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct netns_ipv6 { - pub ip6_dst_ops: dst_ops, - pub sysctl: netns_sysctl_ipv6, - pub devconf_all: *mut ipv6_devconf, - pub devconf_dflt: *mut ipv6_devconf, - pub peers: *mut inet_peer_base, - pub fqdir: *mut fqdir, - pub fib6_null_entry: *mut fib6_info, - pub ip6_null_entry: *mut rt6_info, - pub rt6_stats: *mut rt6_statistics, - pub ip6_fib_timer: timer_list, - pub fib_table_hash: *mut hlist_head, - pub fib6_main_tbl: *mut fib6_table, - pub fib6_walkers: list_head, - pub fib6_walker_lock: rwlock_t, - pub fib6_gc_lock: spinlock_t, - pub ip6_rt_gc_expire: atomic_t, - pub ip6_rt_last_gc: ::aya_bpf::cty::c_ulong, - pub flowlabel_has_excl: ::aya_bpf::cty::c_uchar, - pub fib6_has_custom_rules: bool_, - pub fib6_rules_require_fldissect: ::aya_bpf::cty::c_uint, - pub fib6_routes_require_src: ::aya_bpf::cty::c_uint, - pub ip6_prohibit_entry: *mut rt6_info, - pub ip6_blk_hole_entry: *mut rt6_info, - pub fib6_local_tbl: *mut fib6_table, - pub fib6_rules_ops: *mut fib_rules_ops, - pub ndisc_sk: *mut sock, - pub tcp_sk: *mut sock, - pub igmp_sk: *mut sock, - pub mc_autojoin_sk: *mut sock, - pub inet6_addr_lst: *mut hlist_head, - pub addrconf_hash_lock: spinlock_t, - pub addr_chk_work: delayed_work, - pub mr6_tables: list_head, - pub mr6_rules_ops: *mut fib_rules_ops, - pub dev_addr_genid: atomic_t, - pub fib6_sernum: atomic_t, - pub seg6_data: *mut seg6_pernet_data, - pub notifier_ops: *mut fib_notifier_ops, - pub ip6mr_notifier_ops: *mut fib_notifier_ops, - pub ipmr_seq: ::aya_bpf::cty::c_uint, - pub ip6addrlbl_table: netns_ipv6__bindgen_ty_1, - pub ioam6_data: *mut ioam6_pernet_data, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +pub union net_device_stats__bindgen_ty_5 { + pub rx_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_errors: atomic_long_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct netns_ipv6__bindgen_ty_1 { - pub head: hlist_head, - pub lock: spinlock_t, - pub seq: u32_, -} -impl netns_ipv6 { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub union net_device_stats__bindgen_ty_6 { + pub tx_errors: ::aya_ebpf::cty::c_ulong, + pub __tx_errors: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netns_sysctl_lowpan { - pub frags_hdr: *mut ctl_table_header, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_7 { + pub rx_dropped: ::aya_ebpf::cty::c_ulong, + pub __rx_dropped: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netns_ieee802154_lowpan { - pub sysctl: netns_sysctl_lowpan, - pub fqdir: *mut fqdir, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_8 { + pub tx_dropped: ::aya_ebpf::cty::c_ulong, + pub __tx_dropped: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sctp_mib { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_9 { + pub multicast: ::aya_ebpf::cty::c_ulong, + pub __multicast: atomic_long_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct netns_sctp { - pub sctp_statistics: *mut sctp_mib, - pub proc_net_sctp: *mut proc_dir_entry, - pub sysctl_header: *mut ctl_table_header, - pub ctl_sock: *mut sock, - pub udp4_sock: *mut sock, - pub udp6_sock: *mut sock, - pub udp_port: ::aya_bpf::cty::c_int, - pub encap_port: ::aya_bpf::cty::c_int, - pub local_addr_list: list_head, - pub addr_waitq: list_head, - pub addr_wq_timer: timer_list, - pub auto_asconf_splist: list_head, - pub addr_wq_lock: spinlock_t, - pub local_addr_lock: spinlock_t, - pub rto_initial: ::aya_bpf::cty::c_uint, - pub rto_min: ::aya_bpf::cty::c_uint, - pub rto_max: ::aya_bpf::cty::c_uint, - pub rto_alpha: ::aya_bpf::cty::c_int, - pub rto_beta: ::aya_bpf::cty::c_int, - pub max_burst: ::aya_bpf::cty::c_int, - pub cookie_preserve_enable: ::aya_bpf::cty::c_int, - pub sctp_hmac_alg: *mut ::aya_bpf::cty::c_char, - pub valid_cookie_life: ::aya_bpf::cty::c_uint, - pub sack_timeout: ::aya_bpf::cty::c_uint, - pub hb_interval: ::aya_bpf::cty::c_uint, - pub probe_interval: ::aya_bpf::cty::c_uint, - pub max_retrans_association: ::aya_bpf::cty::c_int, - pub max_retrans_path: ::aya_bpf::cty::c_int, - pub max_retrans_init: ::aya_bpf::cty::c_int, - pub pf_retrans: ::aya_bpf::cty::c_int, - pub ps_retrans: ::aya_bpf::cty::c_int, - pub pf_enable: ::aya_bpf::cty::c_int, - pub pf_expose: ::aya_bpf::cty::c_int, - pub sndbuf_policy: ::aya_bpf::cty::c_int, - pub rcvbuf_policy: ::aya_bpf::cty::c_int, - pub default_auto_asconf: ::aya_bpf::cty::c_int, - pub addip_enable: ::aya_bpf::cty::c_int, - pub addip_noauth: ::aya_bpf::cty::c_int, - pub prsctp_enable: ::aya_bpf::cty::c_int, - pub reconf_enable: ::aya_bpf::cty::c_int, - pub auth_enable: ::aya_bpf::cty::c_int, - pub intl_enable: ::aya_bpf::cty::c_int, - pub ecn_enable: ::aya_bpf::cty::c_int, - pub scope_policy: ::aya_bpf::cty::c_int, - pub rwnd_upd_shift: ::aya_bpf::cty::c_int, - pub max_autoclose: ::aya_bpf::cty::c_ulong, - pub l3mdev_accept: ::aya_bpf::cty::c_int, +pub union net_device_stats__bindgen_ty_10 { + pub collisions: ::aya_ebpf::cty::c_ulong, + pub __collisions: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netns_nf { - pub proc_netfilter: *mut proc_dir_entry, - pub nf_loggers: [*const nf_logger; 11usize], - pub nf_log_dir_header: *mut ctl_table_header, - pub hooks_ipv4: [*mut nf_hook_entries; 5usize], - pub hooks_ipv6: [*mut nf_hook_entries; 5usize], - pub hooks_arp: [*mut nf_hook_entries; 3usize], - pub hooks_bridge: [*mut nf_hook_entries; 5usize], - pub defrag_ipv4_users: ::aya_bpf::cty::c_uint, - pub defrag_ipv6_users: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_11 { + pub rx_length_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_length_errors: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_generic_net { - pub timeout: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_12 { + pub rx_over_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_over_errors: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_tcp_net { - pub timeouts: [::aya_bpf::cty::c_uint; 14usize], - pub tcp_loose: u8_, - pub tcp_be_liberal: u8_, - pub tcp_max_retrans: u8_, - pub tcp_ignore_invalid_rst: u8_, - pub offload_timeout: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_13 { + pub rx_crc_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_crc_errors: atomic_long_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_udp_net { - pub timeouts: [::aya_bpf::cty::c_uint; 2usize], - pub offload_timeout: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_14 { + pub rx_frame_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_frame_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_15 { + pub rx_fifo_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_fifo_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_16 { + pub rx_missed_errors: ::aya_ebpf::cty::c_ulong, + pub __rx_missed_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_17 { + pub tx_aborted_errors: ::aya_ebpf::cty::c_ulong, + pub __tx_aborted_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_18 { + pub tx_carrier_errors: ::aya_ebpf::cty::c_ulong, + pub __tx_carrier_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_19 { + pub tx_fifo_errors: ::aya_ebpf::cty::c_ulong, + pub __tx_fifo_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_20 { + pub tx_heartbeat_errors: ::aya_ebpf::cty::c_ulong, + pub __tx_heartbeat_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_21 { + pub tx_window_errors: ::aya_ebpf::cty::c_ulong, + pub __tx_window_errors: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_22 { + pub rx_compressed: ::aya_ebpf::cty::c_ulong, + pub __rx_compressed: atomic_long_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device_stats__bindgen_ty_23 { + pub tx_compressed: ::aya_ebpf::cty::c_ulong, + pub __tx_compressed: atomic_long_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_icmp_net { - pub timeout: ::aya_bpf::cty::c_uint, +pub struct netdev_hw_addr_list { + pub list: list_head, + pub count: ::aya_ebpf::cty::c_int, + pub tree: rb_root, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_dccp_net { - pub dccp_loose: u8_, - pub dccp_timeout: [::aya_bpf::cty::c_uint; 10usize], +pub struct tipc_bearer { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_sctp_net { - pub timeouts: [::aya_bpf::cty::c_uint; 10usize], +pub struct mpls_dev { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_gre_net { - pub keymap_list: list_head, - pub timeouts: [::aya_bpf::cty::c_uint; 2usize], +pub struct ref_tracker_dir {} +pub mod netdev_ml_priv_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ML_PRIV_NONE: Type = 0; + pub const ML_PRIV_CAN: Type = 1; +} +pub mod netdev_stat_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NETDEV_PCPU_STAT_NONE: Type = 0; + pub const NETDEV_PCPU_STAT_LSTATS: Type = 1; + pub const NETDEV_PCPU_STAT_TSTATS: Type = 2; + pub const NETDEV_PCPU_STAT_DSTATS: Type = 3; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_ip_net { - pub generic: nf_generic_net, - pub tcp: nf_tcp_net, - pub udp: nf_udp_net, - pub icmp: nf_icmp_net, - pub icmpv6: nf_icmp_net, - pub dccp: nf_dccp_net, - pub sctp: nf_sctp_net, - pub gre: nf_gre_net, +pub struct garp_port { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_ct { - pub ecache_dwork_pending: bool_, - pub sysctl_log_invalid: u8_, - pub sysctl_events: u8_, - pub sysctl_acct: u8_, - pub sysctl_tstamp: u8_, - pub sysctl_checksum: u8_, - pub stat: *mut ip_conntrack_stat, - pub nf_conntrack_event_cb: *mut nf_ct_event_notifier, - pub nf_ct_proto: nf_ip_net, - pub labels_used: ::aya_bpf::cty::c_uint, +pub struct mrp_port { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_nftables { - pub gencursor: u8_, +pub struct udp_tunnel_nic { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_ft { - pub stat: *mut nf_flow_table_stat, +pub struct bpf_xdp_entity { + pub prog: *mut bpf_prog, + pub link: *mut bpf_xdp_link, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_bpf { - pub run_array: [*mut bpf_prog_array; 2usize], - pub progs: [*mut bpf_prog; 2usize], - pub links: [list_head; 2usize], +pub struct netdevice_tracker {} +#[repr(C)] +pub struct net_device { + pub __cacheline_group_begin__net_device_read_tx: __IncompleteArrayField<__u8>, + pub priv_flags: ::aya_ebpf::cty::c_ulonglong, + pub netdev_ops: *const net_device_ops, + pub header_ops: *const header_ops, + pub _tx: *mut netdev_queue, + pub gso_partial_features: netdev_features_t, + pub real_num_tx_queues: ::aya_ebpf::cty::c_uint, + pub gso_max_size: ::aya_ebpf::cty::c_uint, + pub gso_ipv4_max_size: ::aya_ebpf::cty::c_uint, + pub gso_max_segs: u16_, + pub num_tc: s16, + pub mtu: ::aya_ebpf::cty::c_uint, + pub needed_headroom: ::aya_ebpf::cty::c_ushort, + pub tc_to_txq: [netdev_tc_txq; 16usize], + pub xps_maps: [*mut xps_dev_maps; 2usize], + pub nf_hooks_egress: *mut nf_hook_entries, + pub tcx_egress: *mut bpf_mprog_entry, + pub __cacheline_group_end__net_device_read_tx: __IncompleteArrayField<__u8>, + pub __cacheline_group_begin__net_device_read_txrx: __IncompleteArrayField<__u8>, + pub __bindgen_anon_1: net_device__bindgen_ty_1, + pub flags: ::aya_ebpf::cty::c_uint, + pub hard_header_len: ::aya_ebpf::cty::c_ushort, + pub features: netdev_features_t, + pub ip6_ptr: *mut inet6_dev, + pub __cacheline_group_end__net_device_read_txrx: __IncompleteArrayField<__u8>, + pub __cacheline_group_begin__net_device_read_rx: __IncompleteArrayField<__u8>, + pub xdp_prog: *mut bpf_prog, + pub ptype_specific: list_head, + pub ifindex: ::aya_ebpf::cty::c_int, + pub real_num_rx_queues: ::aya_ebpf::cty::c_uint, + pub _rx: *mut netdev_rx_queue, + pub gro_flush_timeout: ::aya_ebpf::cty::c_ulong, + pub napi_defer_hard_irqs: ::aya_ebpf::cty::c_int, + pub gro_max_size: ::aya_ebpf::cty::c_uint, + pub gro_ipv4_max_size: ::aya_ebpf::cty::c_uint, + pub rx_handler: rx_handler_func_t, + pub rx_handler_data: *mut ::aya_ebpf::cty::c_void, + pub nd_net: possible_net_t, + pub npinfo: *mut netpoll_info, + pub tcx_ingress: *mut bpf_mprog_entry, + pub __cacheline_group_end__net_device_read_rx: __IncompleteArrayField<__u8>, + pub name: [::aya_ebpf::cty::c_char; 16usize], + pub name_node: *mut netdev_name_node, + pub ifalias: *mut dev_ifalias, + pub mem_end: ::aya_ebpf::cty::c_ulong, + pub mem_start: ::aya_ebpf::cty::c_ulong, + pub base_addr: ::aya_ebpf::cty::c_ulong, + pub state: ::aya_ebpf::cty::c_ulong, + pub dev_list: list_head, + pub napi_list: list_head, + pub unreg_list: list_head, + pub close_list: list_head, + pub ptype_all: list_head, + pub adj_list: net_device__bindgen_ty_2, + pub xdp_features: xdp_features_t, + pub xdp_metadata_ops: *const xdp_metadata_ops, + pub xsk_tx_metadata_ops: *const xsk_tx_metadata_ops, + pub gflags: ::aya_ebpf::cty::c_ushort, + pub needed_tailroom: ::aya_ebpf::cty::c_ushort, + pub hw_features: netdev_features_t, + pub wanted_features: netdev_features_t, + pub vlan_features: netdev_features_t, + pub hw_enc_features: netdev_features_t, + pub mpls_features: netdev_features_t, + pub min_mtu: ::aya_ebpf::cty::c_uint, + pub max_mtu: ::aya_ebpf::cty::c_uint, + pub type_: ::aya_ebpf::cty::c_ushort, + pub min_header_len: ::aya_ebpf::cty::c_uchar, + pub name_assign_type: ::aya_ebpf::cty::c_uchar, + pub group: ::aya_ebpf::cty::c_int, + pub stats: net_device_stats, + pub core_stats: *mut net_device_core_stats, + pub carrier_up_count: atomic_t, + pub carrier_down_count: atomic_t, + pub wireless_handlers: *const iw_handler_def, + pub wireless_data: *mut iw_public_data, + pub ethtool_ops: *const ethtool_ops, + pub l3mdev_ops: *const l3mdev_ops, + pub ndisc_ops: *const ndisc_ops, + pub xfrmdev_ops: *const xfrmdev_ops, + pub tlsdev_ops: *const tlsdev_ops, + pub operstate: ::aya_ebpf::cty::c_uchar, + pub link_mode: ::aya_ebpf::cty::c_uchar, + pub if_port: ::aya_ebpf::cty::c_uchar, + pub dma: ::aya_ebpf::cty::c_uchar, + pub perm_addr: [::aya_ebpf::cty::c_uchar; 32usize], + pub addr_assign_type: ::aya_ebpf::cty::c_uchar, + pub addr_len: ::aya_ebpf::cty::c_uchar, + pub upper_level: ::aya_ebpf::cty::c_uchar, + pub lower_level: ::aya_ebpf::cty::c_uchar, + pub neigh_priv_len: ::aya_ebpf::cty::c_ushort, + pub dev_id: ::aya_ebpf::cty::c_ushort, + pub dev_port: ::aya_ebpf::cty::c_ushort, + pub padded: ::aya_ebpf::cty::c_ushort, + pub addr_list_lock: spinlock_t, + pub irq: ::aya_ebpf::cty::c_int, + pub uc: netdev_hw_addr_list, + pub mc: netdev_hw_addr_list, + pub dev_addrs: netdev_hw_addr_list, + pub queues_kset: *mut kset, + pub promiscuity: ::aya_ebpf::cty::c_uint, + pub allmulti: ::aya_ebpf::cty::c_uint, + pub uc_promisc: bool_, + pub ip_ptr: *mut in_device, + pub vlan_info: *mut vlan_info, + pub dsa_ptr: *mut dsa_port, + pub tipc_ptr: *mut tipc_bearer, + pub atalk_ptr: *mut ::aya_ebpf::cty::c_void, + pub ax25_ptr: *mut ::aya_ebpf::cty::c_void, + pub ieee80211_ptr: *mut wireless_dev, + pub ieee802154_ptr: *mut wpan_dev, + pub mpls_ptr: *mut mpls_dev, + pub mctp_ptr: *mut mctp_dev, + pub dev_addr: *const ::aya_ebpf::cty::c_uchar, + pub num_rx_queues: ::aya_ebpf::cty::c_uint, + pub xdp_zc_max_segs: ::aya_ebpf::cty::c_uint, + pub ingress_queue: *mut netdev_queue, + pub nf_hooks_ingress: *mut nf_hook_entries, + pub broadcast: [::aya_ebpf::cty::c_uchar; 32usize], + pub rx_cpu_rmap: *mut cpu_rmap, + pub index_hlist: hlist_node, + pub num_tx_queues: ::aya_ebpf::cty::c_uint, + pub qdisc: *mut Qdisc, + pub tx_queue_len: ::aya_ebpf::cty::c_uint, + pub tx_global_lock: spinlock_t, + pub xdp_bulkq: *mut xdp_dev_bulk_queue, + pub qdisc_hash: [hlist_head; 16usize], + pub watchdog_timer: timer_list, + pub watchdog_timeo: ::aya_ebpf::cty::c_int, + pub proto_down_reason: u32_, + pub todo_list: list_head, + pub pcpu_refcnt: *mut ::aya_ebpf::cty::c_int, + pub refcnt_tracker: ref_tracker_dir, + pub link_watch_list: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub dismantle: bool_, + pub _bitfield_align_2: [u16; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 2usize]>, + pub needs_free_netdev: bool_, + pub priv_destructor: ::core::option::Option, + pub ml_priv: *mut ::aya_ebpf::cty::c_void, + pub ml_priv_type: netdev_ml_priv_type::Type, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 1usize]>, + pub garp_port: *mut garp_port, + pub mrp_port: *mut mrp_port, + pub dm_private: *mut dm_hw_stat_delta, + pub dev: device, + pub sysfs_groups: [*const attribute_group; 4usize], + pub sysfs_rx_queue_group: *const attribute_group, + pub rtnl_link_ops: *const rtnl_link_ops, + pub tso_max_size: ::aya_ebpf::cty::c_uint, + pub tso_max_segs: u16_, + pub dcbnl_ops: *const dcbnl_rtnl_ops, + pub prio_tc_map: [u8_; 16usize], + pub fcoe_ddp_xid: ::aya_ebpf::cty::c_uint, + pub priomap: *mut netprio_map, + pub phydev: *mut phy_device, + pub sfp_bus: *mut sfp_bus, + pub qdisc_tx_busylock: *mut lock_class_key, + pub proto_down: bool_, + pub _bitfield_align_4: [u8; 0], + pub _bitfield_4: __BindgenBitfieldUnit<[u8; 1usize]>, + pub net_notifier_list: list_head, + pub macsec_ops: *const macsec_ops, + pub udp_tunnel_nic_info: *const udp_tunnel_nic_info, + pub udp_tunnel_nic: *mut udp_tunnel_nic, + pub xdp_state: [bpf_xdp_entity; 3usize], + pub dev_addr_shadow: [u8_; 32usize], + pub linkwatch_dev_tracker: netdevice_tracker, + pub watchdog_dev_tracker: netdevice_tracker, + pub dev_registered_tracker: netdevice_tracker, + pub offload_xstats_l3: *mut rtnl_hw_stats64, + pub devlink_port: *mut devlink_port, + pub dpll_pin: *mut dpll_pin, + pub page_pools: hlist_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union net_device__bindgen_ty_1 { + pub lstats: *mut pcpu_lstats, + pub tstats: *mut pcpu_sw_netstats, + pub dstats: *mut pcpu_dstats, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_policy_hash { - pub table: *mut hlist_head, - pub hmask: ::aya_bpf::cty::c_uint, - pub dbits4: u8_, - pub sbits4: u8_, - pub dbits6: u8_, - pub sbits6: u8_, +pub struct net_device__bindgen_ty_2 { + pub upper: list_head, + pub lower: list_head, +} +pub mod net_device__bindgen_ty_3 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NETREG_UNINITIALIZED: Type = 0; + pub const NETREG_REGISTERED: Type = 1; + pub const NETREG_UNREGISTERING: Type = 2; + pub const NETREG_UNREGISTERED: Type = 3; + pub const NETREG_RELEASED: Type = 4; + pub const NETREG_DUMMY: Type = 5; +} +pub mod net_device__bindgen_ty_4 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RTNL_LINK_INITIALIZED: Type = 0; + pub const RTNL_LINK_INITIALIZING: Type = 1; +} +impl net_device { + #[inline] + pub fn reg_state(&self) -> net_device__bindgen_ty_3::Type { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_reg_state(&mut self, val: net_device__bindgen_ty_3::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + reg_state: net_device__bindgen_ty_3::Type, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let reg_state: u32 = unsafe { ::core::mem::transmute(reg_state) }; + reg_state as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn rtnl_link_state(&self) -> net_device__bindgen_ty_4::Type { + unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 16u8) as u32) } + } + #[inline] + pub fn set_rtnl_link_state(&mut self, val: net_device__bindgen_ty_4::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_2.set(0usize, 16u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_2( + rtnl_link_state: net_device__bindgen_ty_4::Type, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 16u8, { + let rtnl_link_state: u32 = unsafe { ::core::mem::transmute(rtnl_link_state) }; + rtnl_link_state as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn pcpu_stat_type(&self) -> netdev_stat_type::Type { + unsafe { ::core::mem::transmute(self._bitfield_3.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_pcpu_stat_type(&mut self, val: netdev_stat_type::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_3.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_3( + pcpu_stat_type: netdev_stat_type::Type, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let pcpu_stat_type: u32 = unsafe { ::core::mem::transmute(pcpu_stat_type) }; + pcpu_stat_type as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn wol_enabled(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_4.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_wol_enabled(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_4.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn threaded(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_4.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_threaded(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_4.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_4( + wol_enabled: ::aya_ebpf::cty::c_uint, + threaded: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let wol_enabled: u32 = unsafe { ::core::mem::transmute(wol_enabled) }; + wol_enabled as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let threaded: u32 = unsafe { ::core::mem::transmute(threaded) }; + threaded as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_buff_list { + pub next: *mut sk_buff, + pub prev: *mut sk_buff, } #[repr(C)] #[derive(Copy, Clone)] -pub struct xfrm_policy_hthresh { - pub work: work_struct, - pub lock: seqlock_t, - pub lbits4: u8_, - pub rbits4: u8_, - pub lbits6: u8_, - pub rbits6: u8_, +pub struct sk_buff_head { + pub __bindgen_anon_1: sk_buff_head__bindgen_ty_1, + pub qlen: __u32, + pub lock: spinlock_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct netns_xfrm { - pub state_all: list_head, - pub state_bydst: *mut hlist_head, - pub state_bysrc: *mut hlist_head, - pub state_byspi: *mut hlist_head, - pub state_byseq: *mut hlist_head, - pub state_hmask: ::aya_bpf::cty::c_uint, - pub state_num: ::aya_bpf::cty::c_uint, - pub state_hash_work: work_struct, - pub policy_all: list_head, - pub policy_byidx: *mut hlist_head, - pub policy_idx_hmask: ::aya_bpf::cty::c_uint, - pub policy_inexact: [hlist_head; 3usize], - pub policy_bydst: [xfrm_policy_hash; 3usize], - pub policy_count: [::aya_bpf::cty::c_uint; 6usize], - pub policy_hash_work: work_struct, - pub policy_hthresh: xfrm_policy_hthresh, - pub inexact_bins: list_head, - pub nlsk: *mut sock, - pub nlsk_stash: *mut sock, - pub sysctl_aevent_etime: u32_, - pub sysctl_aevent_rseqth: u32_, - pub sysctl_larval_drop: ::aya_bpf::cty::c_int, - pub sysctl_acq_expires: u32_, - pub policy_default: [u8_; 3usize], - pub sysctl_hdr: *mut ctl_table_header, +pub union sk_buff_head__bindgen_ty_1 { + pub __bindgen_anon_1: sk_buff_head__bindgen_ty_1__bindgen_ty_1, + pub list: sk_buff_list, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_buff_head__bindgen_ty_1__bindgen_ty_1 { + pub next: *mut sk_buff, + pub prev: *mut sk_buff, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct skb_shared_hwtstamps { + pub __bindgen_anon_1: skb_shared_hwtstamps__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union skb_shared_hwtstamps__bindgen_ty_1 { + pub hwtstamp: ktime_t, + pub netdev_data: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Debug)] +pub struct skb_ext { + pub refcnt: refcount_t, + pub offset: [u8_; 5usize], + pub chunks: u8_, + pub __bindgen_padding_0: [u8; 6usize], + pub data: __IncompleteArrayField<::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct dql { + pub num_queued: ::aya_ebpf::cty::c_uint, + pub adj_limit: ::aya_ebpf::cty::c_uint, + pub last_obj_cnt: ::aya_ebpf::cty::c_uint, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub xfrm4_dst_ops: dst_ops, - pub xfrm6_dst_ops: dst_ops, - pub xfrm_state_lock: spinlock_t, - pub xfrm_state_hash_generation: seqcount_spinlock_t, - pub xfrm_policy_hash_generation: seqcount_spinlock_t, - pub xfrm_policy_lock: spinlock_t, - pub xfrm_cfg_mutex: mutex, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, + pub __bindgen_padding_0: u32, + pub limit: ::aya_ebpf::cty::c_uint, + pub num_completed: ::aya_ebpf::cty::c_uint, + pub prev_ovlimit: ::aya_ebpf::cty::c_uint, + pub prev_num_queued: ::aya_ebpf::cty::c_uint, + pub prev_last_obj_cnt: ::aya_ebpf::cty::c_uint, + pub lowest_slack: ::aya_ebpf::cty::c_uint, + pub slack_start_time: ::aya_ebpf::cty::c_ulong, + pub max_limit: ::aya_ebpf::cty::c_uint, + pub min_limit: ::aya_ebpf::cty::c_uint, + pub slack_hold_time: ::aya_ebpf::cty::c_uint, pub _bitfield_align_2: [u8; 0], pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, + pub __bindgen_padding_1: u32, } -impl netns_xfrm { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +impl dql { #[inline] pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); @@ -15974,373 +17168,948 @@ impl netns_xfrm { } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_ipvs { - _unused: [u8; 0], +pub struct netns_core { + pub sysctl_hdr: *mut ctl_table_header, + pub sysctl_somaxconn: ::aya_ebpf::cty::c_int, + pub sysctl_optmem_max: ::aya_ebpf::cty::c_int, + pub sysctl_txrehash: u8_, + pub prot_inuse: *mut prot_inuse, + pub rps_default_mask: *mut cpumask, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mpls_route { - _unused: [u8; 0], +pub struct ipstats_mib { + pub mibs: [u64_; 38usize], + pub syncp: u64_stats_sync, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_mpls { - pub ip_ttl_propagate: ::aya_bpf::cty::c_int, - pub default_ttl: ::aya_bpf::cty::c_int, - pub platform_labels: usize, - pub platform_label: *mut *mut mpls_route, - pub ctl: *mut ctl_table_header, +pub struct icmp_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 30usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct can_dev_rcv_lists { - _unused: [u8; 0], +pub struct icmpmsg_mib { + pub mibs: [atomic_long_t; 512usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct can_pkg_stats { - _unused: [u8; 0], +pub struct icmpv6_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 7usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct can_rcv_lists_stats { - _unused: [u8; 0], +pub struct icmpv6msg_mib { + pub mibs: [atomic_long_t; 512usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct netns_can { - pub proc_dir: *mut proc_dir_entry, - pub pde_stats: *mut proc_dir_entry, - pub pde_reset_stats: *mut proc_dir_entry, - pub pde_rcvlist_all: *mut proc_dir_entry, - pub pde_rcvlist_fil: *mut proc_dir_entry, - pub pde_rcvlist_inv: *mut proc_dir_entry, - pub pde_rcvlist_sff: *mut proc_dir_entry, - pub pde_rcvlist_eff: *mut proc_dir_entry, - pub pde_rcvlist_err: *mut proc_dir_entry, - pub bcmproc_dir: *mut proc_dir_entry, - pub rx_alldev_list: *mut can_dev_rcv_lists, - pub rcvlists_lock: spinlock_t, - pub stattimer: timer_list, - pub pkg_stats: *mut can_pkg_stats, - pub rcv_lists_stats: *mut can_rcv_lists_stats, - pub cgw_list: hlist_head, +#[derive(Debug, Copy, Clone)] +pub struct tcp_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 16usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct netns_xdp { - pub lock: mutex, - pub list: hlist_head, +#[derive(Debug, Copy, Clone)] +pub struct udp_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 10usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct netns_mctp { - pub routes: list_head, - pub bind_lock: mutex, - pub binds: hlist_head, - pub keys_lock: spinlock_t, - pub keys: hlist_head, - pub default_net: ::aya_bpf::cty::c_uint, - pub neigh_lock: mutex, - pub neighbours: list_head, +#[derive(Debug, Copy, Clone)] +pub struct linux_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 132usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct smc_stats { - _unused: [u8; 0], +pub struct linux_xfrm_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 29usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct smc_stats_rsn { - _unused: [u8; 0], +pub struct linux_tls_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 13usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct netns_smc { - pub smc_stats: *mut smc_stats, - pub mutex_fback_rsn: mutex, - pub fback_rsn: *mut smc_stats_rsn, - pub limit_smc_hs: bool_, - pub smc_hdr: *mut ctl_table_header, - pub sysctl_autocorking_size: ::aya_bpf::cty::c_uint, - pub sysctl_smcr_buf_type: ::aya_bpf::cty::c_uint, - pub sysctl_smcr_testlink_time: ::aya_bpf::cty::c_int, - pub sysctl_wmem: ::aya_bpf::cty::c_int, - pub sysctl_rmem: ::aya_bpf::cty::c_int, +#[derive(Debug, Copy, Clone)] +pub struct netns_mib { + pub ip_statistics: *mut ipstats_mib, + pub ipv6_statistics: *mut ipstats_mib, + pub tcp_statistics: *mut tcp_mib, + pub net_statistics: *mut linux_mib, + pub udp_statistics: *mut udp_mib, + pub udp_stats_in6: *mut udp_mib, + pub xfrm_statistics: *mut linux_xfrm_mib, + pub tls_statistics: *mut linux_tls_mib, + pub mptcp_statistics: *mut mptcp_mib, + pub udplite_statistics: *mut udp_mib, + pub udplite_stats_in6: *mut udp_mib, + pub icmp_statistics: *mut icmp_mib, + pub icmpmsg_statistics: *mut icmpmsg_mib, + pub icmpv6_statistics: *mut icmpv6_mib, + pub icmpv6msg_statistics: *mut icmpv6msg_mib, + pub proc_net_devsnmp6: *mut proc_dir_entry, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct unix_table { + pub locks: *mut spinlock_t, + pub buckets: *mut hlist_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_unix { + pub table: unix_table, + pub sysctl_max_dgram_qlen: ::aya_ebpf::cty::c_int, + pub ctl: *mut ctl_table_header, } #[repr(C)] #[derive(Copy, Clone)] -pub struct net { - pub passive: refcount_t, - pub rules_mod_lock: spinlock_t, - pub dev_unreg_count: atomic_t, - pub dev_base_seq: ::aya_bpf::cty::c_uint, - pub ifindex: ::aya_bpf::cty::c_int, - pub nsid_lock: spinlock_t, - pub fnhe_genid: atomic_t, - pub list: list_head, - pub exit_list: list_head, - pub cleanup_list: llist_node, - pub key_domain: *mut key_tag, - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub netns_ids: idr, - pub ns: ns_common, - pub refcnt_tracker: ref_tracker_dir, - pub notrefcnt_tracker: ref_tracker_dir, - pub dev_base_head: list_head, - pub proc_net: *mut proc_dir_entry, - pub proc_net_stat: *mut proc_dir_entry, - pub sysctls: ctl_table_set, - pub rtnl: *mut sock, - pub genl_sock: *mut sock, - pub uevent_sock: *mut uevent_sock, - pub dev_name_head: *mut hlist_head, - pub dev_index_head: *mut hlist_head, - pub netdev_chain: raw_notifier_head, - pub hash_mix: u32_, - pub loopback_dev: *mut net_device, - pub rules_ops: list_head, - pub core: netns_core, - pub mib: netns_mib, - pub packet: netns_packet, - pub unx: netns_unix, - pub nexthop: netns_nexthop, +pub struct netns_packet { + pub sklist_lock: mutex, + pub sklist: hlist_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct fqdir { + pub high_thresh: ::aya_ebpf::cty::c_long, + pub low_thresh: ::aya_ebpf::cty::c_long, + pub timeout: ::aya_ebpf::cty::c_int, + pub max_dist: ::aya_ebpf::cty::c_int, + pub f: *mut inet_frags, + pub net: *mut net, + pub dead: bool_, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, - pub ipv4: netns_ipv4, - pub ipv6: netns_ipv6, - pub ieee802154_lowpan: netns_ieee802154_lowpan, - pub sctp: netns_sctp, - pub nf: netns_nf, - pub ct: netns_ct, - pub nft: netns_nftables, - pub ft: netns_ft, - pub wext_nlevents: sk_buff_head, - pub gen: *mut net_generic, - pub bpf: netns_bpf, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub rhashtable: rhashtable, pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 40usize]>, - pub xfrm: netns_xfrm, - pub net_cookie: u64_, - pub ipvs: *mut netns_ipvs, - pub mpls: netns_mpls, - pub can: netns_can, - pub xdp: netns_xdp, - pub mctp: netns_mctp, - pub crypto_nlsk: *mut sock, - pub diag_nlsk: *mut sock, - pub smc: netns_smc, + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, + pub mem: atomic_long_t, + pub destroy_work: work_struct, + pub free_list: llist_node, pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 32usize]>, + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 16usize]>, } -impl net { +impl fqdir { #[inline] - pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nlmsghdr { - pub nlmsg_len: __u32, - pub nlmsg_type: __u16, - pub nlmsg_flags: __u16, - pub nlmsg_seq: __u32, - pub nlmsg_pid: __u32, +#[derive(Copy, Clone)] +pub struct inet_frags { + pub qsize: ::aya_ebpf::cty::c_uint, + pub constructor: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inet_frag_queue, arg2: *const ::aya_ebpf::cty::c_void), + >, + pub destructor: ::core::option::Option, + pub frag_expire: ::core::option::Option, + pub frags_cachep: *mut kmem_cache, + pub frags_cache_name: *const ::aya_ebpf::cty::c_char, + pub rhash_params: rhashtable_params, + pub refcnt: refcount_t, + pub completion: completion, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct netns_nexthop { + pub rb_root: rb_root, + pub devhash: *mut hlist_head, + pub seq: ::aya_ebpf::cty::c_uint, + pub last_id_allocated: u32_, + pub notifier_chain: blocking_notifier_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nlattr { - pub nla_len: __u16, - pub nla_type: __u16, +pub struct inet_timewait_death_row { + pub tw_refcount: refcount_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub hashinfo: *mut inet_hashinfo, + pub sysctl_max_tw_buckets: ::aya_ebpf::cty::c_int, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, + pub __bindgen_padding_0: u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netlink_ext_ack { - pub _msg: *const ::aya_bpf::cty::c_char, - pub bad_attr: *const nlattr, - pub policy: *const nla_policy, - pub miss_nest: *const nlattr, - pub miss_type: u16_, - pub cookie: [u8_; 20usize], - pub cookie_len: u8_, - pub _msg_buf: [::aya_bpf::cty::c_char; 80usize], +pub struct local_ports { + pub range: u32_, + pub warned: bool_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nla_policy { - pub type_: u8_, - pub validation_type: u8_, - pub len: u16_, - pub __bindgen_anon_1: nla_policy__bindgen_ty_1, +pub struct ping_group_range { + pub lock: seqlock_t, + pub range: [kgid_t; 2usize], +} +#[repr(C)] +pub struct netns_ipv4 { + pub __cacheline_group_begin__netns_ipv4_read_tx: __IncompleteArrayField<__u8>, + pub sysctl_tcp_early_retrans: u8_, + pub sysctl_tcp_tso_win_divisor: u8_, + pub sysctl_tcp_tso_rtt_log: u8_, + pub sysctl_tcp_autocorking: u8_, + pub sysctl_tcp_min_snd_mss: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_notsent_lowat: ::aya_ebpf::cty::c_uint, + pub sysctl_tcp_limit_output_bytes: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_min_rtt_wlen: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_wmem: [::aya_ebpf::cty::c_int; 3usize], + pub sysctl_ip_fwd_use_pmtu: u8_, + pub __cacheline_group_end__netns_ipv4_read_tx: __IncompleteArrayField<__u8>, + pub __cacheline_group_begin__netns_ipv4_read_txrx: __IncompleteArrayField<__u8>, + pub sysctl_tcp_moderate_rcvbuf: u8_, + pub __cacheline_group_end__netns_ipv4_read_txrx: __IncompleteArrayField<__u8>, + pub __cacheline_group_begin__netns_ipv4_read_rx: __IncompleteArrayField<__u8>, + pub sysctl_ip_early_demux: u8_, + pub sysctl_tcp_early_demux: u8_, + pub sysctl_tcp_reordering: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_rmem: [::aya_ebpf::cty::c_int; 3usize], + pub __cacheline_group_end__netns_ipv4_read_rx: __IncompleteArrayField<__u8>, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub tcp_death_row: inet_timewait_death_row, + pub udp_table: *mut udp_table, + pub forw_hdr: *mut ctl_table_header, + pub frags_hdr: *mut ctl_table_header, + pub ipv4_hdr: *mut ctl_table_header, + pub route_hdr: *mut ctl_table_header, + pub xfrm4_hdr: *mut ctl_table_header, + pub devconf_all: *mut ipv4_devconf, + pub devconf_dflt: *mut ipv4_devconf, + pub ra_chain: *mut ip_ra_chain, + pub ra_mutex: mutex, + pub rules_ops: *mut fib_rules_ops, + pub fib_main: *mut fib_table, + pub fib_default: *mut fib_table, + pub fib_rules_require_fldissect: ::aya_ebpf::cty::c_uint, + pub fib_has_custom_rules: bool_, + pub fib_has_custom_local_routes: bool_, + pub fib_offload_disabled: bool_, + pub sysctl_tcp_shrink_window: u8_, + pub fib_num_tclassid_users: atomic_t, + pub fib_table_hash: *mut hlist_head, + pub fibnl: *mut sock, + pub mc_autojoin_sk: *mut sock, + pub peers: *mut inet_peer_base, + pub fqdir: *mut fqdir, + pub sysctl_icmp_echo_ignore_all: u8_, + pub sysctl_icmp_echo_enable_probe: u8_, + pub sysctl_icmp_echo_ignore_broadcasts: u8_, + pub sysctl_icmp_ignore_bogus_error_responses: u8_, + pub sysctl_icmp_errors_use_inbound_ifaddr: u8_, + pub sysctl_icmp_ratelimit: ::aya_ebpf::cty::c_int, + pub sysctl_icmp_ratemask: ::aya_ebpf::cty::c_int, + pub ip_rt_min_pmtu: u32_, + pub ip_rt_mtu_expires: ::aya_ebpf::cty::c_int, + pub ip_rt_min_advmss: ::aya_ebpf::cty::c_int, + pub ip_local_ports: local_ports, + pub sysctl_tcp_ecn: u8_, + pub sysctl_tcp_ecn_fallback: u8_, + pub sysctl_ip_default_ttl: u8_, + pub sysctl_ip_no_pmtu_disc: u8_, + pub sysctl_ip_fwd_update_priority: u8_, + pub sysctl_ip_nonlocal_bind: u8_, + pub sysctl_ip_autobind_reuse: u8_, + pub sysctl_ip_dynaddr: u8_, + pub sysctl_raw_l3mdev_accept: u8_, + pub sysctl_udp_early_demux: u8_, + pub sysctl_nexthop_compat_mode: u8_, + pub sysctl_fwmark_reflect: u8_, + pub sysctl_tcp_fwmark_accept: u8_, + pub sysctl_tcp_l3mdev_accept: u8_, + pub sysctl_tcp_mtu_probing: u8_, + pub sysctl_tcp_mtu_probe_floor: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_base_mss: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_probe_threshold: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_probe_interval: u32_, + pub sysctl_tcp_keepalive_time: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_keepalive_intvl: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_keepalive_probes: u8_, + pub sysctl_tcp_syn_retries: u8_, + pub sysctl_tcp_synack_retries: u8_, + pub sysctl_tcp_syncookies: u8_, + pub sysctl_tcp_migrate_req: u8_, + pub sysctl_tcp_comp_sack_nr: u8_, + pub sysctl_tcp_backlog_ack_defer: u8_, + pub sysctl_tcp_pingpong_thresh: u8_, + pub sysctl_tcp_retries1: u8_, + pub sysctl_tcp_retries2: u8_, + pub sysctl_tcp_orphan_retries: u8_, + pub sysctl_tcp_tw_reuse: u8_, + pub sysctl_tcp_fin_timeout: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_sack: u8_, + pub sysctl_tcp_window_scaling: u8_, + pub sysctl_tcp_timestamps: u8_, + pub sysctl_tcp_recovery: u8_, + pub sysctl_tcp_thin_linear_timeouts: u8_, + pub sysctl_tcp_slow_start_after_idle: u8_, + pub sysctl_tcp_retrans_collapse: u8_, + pub sysctl_tcp_stdurg: u8_, + pub sysctl_tcp_rfc1337: u8_, + pub sysctl_tcp_abort_on_overflow: u8_, + pub sysctl_tcp_fack: u8_, + pub sysctl_tcp_max_reordering: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_adv_win_scale: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_dsack: u8_, + pub sysctl_tcp_app_win: u8_, + pub sysctl_tcp_frto: u8_, + pub sysctl_tcp_nometrics_save: u8_, + pub sysctl_tcp_no_ssthresh_metrics_save: u8_, + pub sysctl_tcp_workaround_signed_windows: u8_, + pub sysctl_tcp_challenge_ack_limit: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_min_tso_segs: u8_, + pub sysctl_tcp_reflect_tos: u8_, + pub sysctl_tcp_invalid_ratelimit: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_pacing_ss_ratio: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_pacing_ca_ratio: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_child_ehash_entries: ::aya_ebpf::cty::c_uint, + pub sysctl_tcp_comp_sack_delay_ns: ::aya_ebpf::cty::c_ulong, + pub sysctl_tcp_comp_sack_slack_ns: ::aya_ebpf::cty::c_ulong, + pub sysctl_max_syn_backlog: ::aya_ebpf::cty::c_int, + pub sysctl_tcp_fastopen: ::aya_ebpf::cty::c_int, + pub tcp_congestion_control: *const tcp_congestion_ops, + pub tcp_fastopen_ctx: *mut tcp_fastopen_context, + pub sysctl_tcp_fastopen_blackhole_timeout: ::aya_ebpf::cty::c_uint, + pub tfo_active_disable_times: atomic_t, + pub tfo_active_disable_stamp: ::aya_ebpf::cty::c_ulong, + pub tcp_challenge_timestamp: u32_, + pub tcp_challenge_count: u32_, + pub sysctl_tcp_plb_enabled: u8_, + pub sysctl_tcp_plb_idle_rehash_rounds: u8_, + pub sysctl_tcp_plb_rehash_rounds: u8_, + pub sysctl_tcp_plb_suspend_rto_sec: u8_, + pub sysctl_tcp_plb_cong_thresh: ::aya_ebpf::cty::c_int, + pub sysctl_udp_wmem_min: ::aya_ebpf::cty::c_int, + pub sysctl_udp_rmem_min: ::aya_ebpf::cty::c_int, + pub sysctl_fib_notify_on_flag_change: u8_, + pub sysctl_tcp_syn_linear_timeouts: u8_, + pub sysctl_udp_l3mdev_accept: u8_, + pub sysctl_igmp_llm_reports: u8_, + pub sysctl_igmp_max_memberships: ::aya_ebpf::cty::c_int, + pub sysctl_igmp_max_msf: ::aya_ebpf::cty::c_int, + pub sysctl_igmp_qrv: ::aya_ebpf::cty::c_int, + pub ping_group_range: ping_group_range, + pub dev_addr_genid: atomic_t, + pub sysctl_udp_child_hash_entries: ::aya_ebpf::cty::c_uint, + pub sysctl_local_reserved_ports: *mut ::aya_ebpf::cty::c_ulong, + pub sysctl_ip_prot_sock: ::aya_ebpf::cty::c_int, + pub mr_tables: list_head, + pub mr_rules_ops: *mut fib_rules_ops, + pub sysctl_fib_multipath_hash_fields: u32_, + pub sysctl_fib_multipath_use_neigh: u8_, + pub sysctl_fib_multipath_hash_policy: u8_, + pub notifier_ops: *mut fib_notifier_ops, + pub fib_seq: ::aya_ebpf::cty::c_uint, + pub ipmr_notifier_ops: *mut fib_notifier_ops, + pub ipmr_seq: ::aya_ebpf::cty::c_uint, + pub rt_genid: atomic_t, + pub ip_id_key: siphash_key_t, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl netns_ipv4 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Copy, Clone)] -pub union nla_policy__bindgen_ty_1 { - pub strict_start_type: u16_, - pub bitfield32_valid: u32_, - pub mask: u32_, - pub reject_message: *const ::aya_bpf::cty::c_char, - pub nested_policy: *const nla_policy, - pub range: *mut netlink_range_validation, - pub range_signed: *mut netlink_range_validation_signed, - pub __bindgen_anon_1: nla_policy__bindgen_ty_1__bindgen_ty_1, - pub validate: ::core::option::Option< +pub struct dst_ops { + pub family: ::aya_ebpf::cty::c_ushort, + pub gc_thresh: ::aya_ebpf::cty::c_uint, + pub gc: ::core::option::Option, + pub check: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dst_entry, arg2: __u32) -> *mut dst_entry, + >, + pub default_advmss: ::core::option::Option< + unsafe extern "C" fn(arg1: *const dst_entry) -> ::aya_ebpf::cty::c_uint, + >, + pub mtu: ::core::option::Option< + unsafe extern "C" fn(arg1: *const dst_entry) -> ::aya_ebpf::cty::c_uint, + >, + pub cow_metrics: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dst_entry, arg2: ::aya_ebpf::cty::c_ulong) -> *mut u32_, + >, + pub destroy: ::core::option::Option, + pub ifdown: + ::core::option::Option, + pub negative_advice: + ::core::option::Option *mut dst_entry>, + pub link_failure: ::core::option::Option, + pub update_pmtu: ::core::option::Option< unsafe extern "C" fn( - arg1: *const nlattr, - arg2: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dst_entry, + arg2: *mut sock, + arg3: *mut sk_buff, + arg4: u32_, + arg5: bool_, + ), + >, + pub redirect: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dst_entry, arg2: *mut sock, arg3: *mut sk_buff), + >, + pub local_out: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut sock, + arg3: *mut sk_buff, + ) -> ::aya_ebpf::cty::c_int, + >, + pub neigh_lookup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const dst_entry, + arg2: *mut sk_buff, + arg3: *const ::aya_ebpf::cty::c_void, + ) -> *mut neighbour, + >, + pub confirm_neigh: ::core::option::Option< + unsafe extern "C" fn(arg1: *const dst_entry, arg2: *const ::aya_ebpf::cty::c_void), >, + pub kmem_cachep: *mut kmem_cache, + pub pcpuc_entries: percpu_counter, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl dst_ops { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nla_policy__bindgen_ty_1__bindgen_ty_1 { - pub min: s16, - pub max: s16, +pub struct netns_sysctl_ipv6 { + pub hdr: *mut ctl_table_header, + pub route_hdr: *mut ctl_table_header, + pub icmp_hdr: *mut ctl_table_header, + pub frags_hdr: *mut ctl_table_header, + pub xfrm6_hdr: *mut ctl_table_header, + pub flush_delay: ::aya_ebpf::cty::c_int, + pub ip6_rt_max_size: ::aya_ebpf::cty::c_int, + pub ip6_rt_gc_min_interval: ::aya_ebpf::cty::c_int, + pub ip6_rt_gc_timeout: ::aya_ebpf::cty::c_int, + pub ip6_rt_gc_interval: ::aya_ebpf::cty::c_int, + pub ip6_rt_gc_elasticity: ::aya_ebpf::cty::c_int, + pub ip6_rt_mtu_expires: ::aya_ebpf::cty::c_int, + pub ip6_rt_min_advmss: ::aya_ebpf::cty::c_int, + pub multipath_hash_fields: u32_, + pub multipath_hash_policy: u8_, + pub bindv6only: u8_, + pub flowlabel_consistency: u8_, + pub auto_flowlabels: u8_, + pub icmpv6_time: ::aya_ebpf::cty::c_int, + pub icmpv6_echo_ignore_all: u8_, + pub icmpv6_echo_ignore_multicast: u8_, + pub icmpv6_echo_ignore_anycast: u8_, + pub icmpv6_ratemask: [::aya_ebpf::cty::c_ulong; 4usize], + pub icmpv6_ratemask_ptr: *mut ::aya_ebpf::cty::c_ulong, + pub anycast_src_echo_reply: u8_, + pub ip_nonlocal_bind: u8_, + pub fwmark_reflect: u8_, + pub flowlabel_state_ranges: u8_, + pub idgen_retries: ::aya_ebpf::cty::c_int, + pub idgen_delay: ::aya_ebpf::cty::c_int, + pub flowlabel_reflect: ::aya_ebpf::cty::c_int, + pub max_dst_opts_cnt: ::aya_ebpf::cty::c_int, + pub max_hbh_opts_cnt: ::aya_ebpf::cty::c_int, + pub max_dst_opts_len: ::aya_ebpf::cty::c_int, + pub max_hbh_opts_len: ::aya_ebpf::cty::c_int, + pub seg6_flowlabel: ::aya_ebpf::cty::c_int, + pub ioam6_id: u32_, + pub ioam6_id_wide: u64_, + pub skip_notify_on_dev_down: u8_, + pub fib_notify_on_flag_change: u8_, + pub icmpv6_error_anycast_as_unicast: u8_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct netlink_callback { - pub skb: *mut sk_buff, - pub nlh: *const nlmsghdr, - pub dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut netlink_callback, - ) -> ::aya_bpf::cty::c_int, - >, - pub done: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut netlink_callback) -> ::aya_bpf::cty::c_int, - >, - pub data: *mut ::aya_bpf::cty::c_void, - pub module: *mut module, - pub extack: *mut netlink_ext_ack, - pub family: u16_, - pub answer_flags: u16_, - pub min_dump_alloc: u32_, - pub prev_seq: ::aya_bpf::cty::c_uint, - pub seq: ::aya_bpf::cty::c_uint, - pub strict_check: bool_, - pub __bindgen_anon_1: netlink_callback__bindgen_ty_1, +pub struct netns_ipv6 { + pub ip6_dst_ops: dst_ops, + pub sysctl: netns_sysctl_ipv6, + pub devconf_all: *mut ipv6_devconf, + pub devconf_dflt: *mut ipv6_devconf, + pub peers: *mut inet_peer_base, + pub fqdir: *mut fqdir, + pub fib6_null_entry: *mut fib6_info, + pub ip6_null_entry: *mut rt6_info, + pub rt6_stats: *mut rt6_statistics, + pub ip6_fib_timer: timer_list, + pub fib_table_hash: *mut hlist_head, + pub fib6_main_tbl: *mut fib6_table, + pub fib6_walkers: list_head, + pub fib6_walker_lock: rwlock_t, + pub fib6_gc_lock: spinlock_t, + pub ip6_rt_gc_expire: atomic_t, + pub ip6_rt_last_gc: ::aya_ebpf::cty::c_ulong, + pub flowlabel_has_excl: ::aya_ebpf::cty::c_uchar, + pub fib6_has_custom_rules: bool_, + pub fib6_rules_require_fldissect: ::aya_ebpf::cty::c_uint, + pub fib6_routes_require_src: ::aya_ebpf::cty::c_uint, + pub ip6_prohibit_entry: *mut rt6_info, + pub ip6_blk_hole_entry: *mut rt6_info, + pub fib6_local_tbl: *mut fib6_table, + pub fib6_rules_ops: *mut fib_rules_ops, + pub ndisc_sk: *mut sock, + pub tcp_sk: *mut sock, + pub igmp_sk: *mut sock, + pub mc_autojoin_sk: *mut sock, + pub inet6_addr_lst: *mut hlist_head, + pub addrconf_hash_lock: spinlock_t, + pub addr_chk_work: delayed_work, + pub mr6_tables: list_head, + pub mr6_rules_ops: *mut fib_rules_ops, + pub dev_addr_genid: atomic_t, + pub fib6_sernum: atomic_t, + pub seg6_data: *mut seg6_pernet_data, + pub notifier_ops: *mut fib_notifier_ops, + pub ip6mr_notifier_ops: *mut fib_notifier_ops, + pub ipmr_seq: ::aya_ebpf::cty::c_uint, + pub ip6addrlbl_table: netns_ipv6__bindgen_ty_1, + pub ioam6_data: *mut ioam6_pernet_data, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, } #[repr(C)] #[derive(Copy, Clone)] -pub union netlink_callback__bindgen_ty_1 { - pub ctx: [u8_; 48usize], - pub args: [::aya_bpf::cty::c_long; 6usize], +pub struct netns_ipv6__bindgen_ty_1 { + pub head: hlist_head, + pub lock: spinlock_t, + pub seq: u32_, +} +impl netns_ipv6 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netlink_range_validation { - pub min: u64_, - pub max: u64_, +pub struct netns_sysctl_lowpan { + pub frags_hdr: *mut ctl_table_header, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netlink_range_validation_signed { - pub min: s64, - pub max: s64, +pub struct netns_ieee802154_lowpan { + pub sysctl: netns_sysctl_lowpan, + pub fqdir: *mut fqdir, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ipstats_mib { - pub mibs: [u64_; 37usize], - pub syncp: u64_stats_sync, +pub struct sctp_mib { + _unused: [u8; 0], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct icmp_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 30usize], +#[derive(Copy, Clone)] +pub struct netns_sctp { + pub sctp_statistics: *mut sctp_mib, + pub proc_net_sctp: *mut proc_dir_entry, + pub sysctl_header: *mut ctl_table_header, + pub ctl_sock: *mut sock, + pub udp4_sock: *mut sock, + pub udp6_sock: *mut sock, + pub udp_port: ::aya_ebpf::cty::c_int, + pub encap_port: ::aya_ebpf::cty::c_int, + pub local_addr_list: list_head, + pub addr_waitq: list_head, + pub addr_wq_timer: timer_list, + pub auto_asconf_splist: list_head, + pub addr_wq_lock: spinlock_t, + pub local_addr_lock: spinlock_t, + pub rto_initial: ::aya_ebpf::cty::c_uint, + pub rto_min: ::aya_ebpf::cty::c_uint, + pub rto_max: ::aya_ebpf::cty::c_uint, + pub rto_alpha: ::aya_ebpf::cty::c_int, + pub rto_beta: ::aya_ebpf::cty::c_int, + pub max_burst: ::aya_ebpf::cty::c_int, + pub cookie_preserve_enable: ::aya_ebpf::cty::c_int, + pub sctp_hmac_alg: *mut ::aya_ebpf::cty::c_char, + pub valid_cookie_life: ::aya_ebpf::cty::c_uint, + pub sack_timeout: ::aya_ebpf::cty::c_uint, + pub hb_interval: ::aya_ebpf::cty::c_uint, + pub probe_interval: ::aya_ebpf::cty::c_uint, + pub max_retrans_association: ::aya_ebpf::cty::c_int, + pub max_retrans_path: ::aya_ebpf::cty::c_int, + pub max_retrans_init: ::aya_ebpf::cty::c_int, + pub pf_retrans: ::aya_ebpf::cty::c_int, + pub ps_retrans: ::aya_ebpf::cty::c_int, + pub pf_enable: ::aya_ebpf::cty::c_int, + pub pf_expose: ::aya_ebpf::cty::c_int, + pub sndbuf_policy: ::aya_ebpf::cty::c_int, + pub rcvbuf_policy: ::aya_ebpf::cty::c_int, + pub default_auto_asconf: ::aya_ebpf::cty::c_int, + pub addip_enable: ::aya_ebpf::cty::c_int, + pub addip_noauth: ::aya_ebpf::cty::c_int, + pub prsctp_enable: ::aya_ebpf::cty::c_int, + pub reconf_enable: ::aya_ebpf::cty::c_int, + pub auth_enable: ::aya_ebpf::cty::c_int, + pub intl_enable: ::aya_ebpf::cty::c_int, + pub ecn_enable: ::aya_ebpf::cty::c_int, + pub scope_policy: ::aya_ebpf::cty::c_int, + pub rwnd_upd_shift: ::aya_ebpf::cty::c_int, + pub max_autoclose: ::aya_ebpf::cty::c_ulong, + pub l3mdev_accept: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct icmpmsg_mib { - pub mibs: [atomic_long_t; 512usize], +pub struct netns_nf { + pub proc_netfilter: *mut proc_dir_entry, + pub nf_loggers: [*const nf_logger; 11usize], + pub nf_log_dir_header: *mut ctl_table_header, + pub hooks_ipv4: [*mut nf_hook_entries; 5usize], + pub hooks_ipv6: [*mut nf_hook_entries; 5usize], + pub hooks_arp: [*mut nf_hook_entries; 3usize], + pub hooks_bridge: [*mut nf_hook_entries; 5usize], + pub defrag_ipv4_users: ::aya_ebpf::cty::c_uint, + pub defrag_ipv6_users: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct icmpv6_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 7usize], +pub struct nf_generic_net { + pub timeout: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct icmpv6msg_mib { - pub mibs: [atomic_long_t; 512usize], +pub struct nf_tcp_net { + pub timeouts: [::aya_ebpf::cty::c_uint; 14usize], + pub tcp_loose: u8_, + pub tcp_be_liberal: u8_, + pub tcp_max_retrans: u8_, + pub tcp_ignore_invalid_rst: u8_, + pub offload_timeout: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcp_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 16usize], +pub struct nf_udp_net { + pub timeouts: [::aya_ebpf::cty::c_uint; 2usize], + pub offload_timeout: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct udp_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 10usize], +pub struct nf_icmp_net { + pub timeout: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct linux_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 127usize], +pub struct nf_dccp_net { + pub dccp_loose: u8_, + pub dccp_timeout: [::aya_ebpf::cty::c_uint; 10usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct linux_xfrm_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 29usize], +pub struct nf_sctp_net { + pub timeouts: [::aya_ebpf::cty::c_uint; 10usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct linux_tls_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 13usize], +pub struct nf_gre_net { + pub keymap_list: list_head, + pub timeouts: [::aya_ebpf::cty::c_uint; 2usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct fqdir { - pub high_thresh: ::aya_bpf::cty::c_long, - pub low_thresh: ::aya_bpf::cty::c_long, - pub timeout: ::aya_bpf::cty::c_int, - pub max_dist: ::aya_bpf::cty::c_int, - pub f: *mut inet_frags, - pub net: *mut net, - pub dead: bool_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, - pub rhashtable: rhashtable, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, - pub mem: atomic_long_t, - pub destroy_work: work_struct, - pub free_list: llist_node, - pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 16usize]>, +#[derive(Debug, Copy, Clone)] +pub struct nf_ip_net { + pub generic: nf_generic_net, + pub tcp: nf_tcp_net, + pub udp: nf_udp_net, + pub icmp: nf_icmp_net, + pub icmpv6: nf_icmp_net, + pub dccp: nf_dccp_net, + pub sctp: nf_sctp_net, + pub gre: nf_gre_net, } -impl fqdir { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_ct { + pub ecache_dwork_pending: bool_, + pub sysctl_log_invalid: u8_, + pub sysctl_events: u8_, + pub sysctl_acct: u8_, + pub sysctl_tstamp: u8_, + pub sysctl_checksum: u8_, + pub stat: *mut ip_conntrack_stat, + pub nf_conntrack_event_cb: *mut nf_ct_event_notifier, + pub nf_ct_proto: nf_ip_net, + pub labels_used: atomic_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_nftables { + pub gencursor: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_ft { + pub stat: *mut nf_flow_table_stat, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_bpf { + pub run_array: [*mut bpf_prog_array; 2usize], + pub progs: [*mut bpf_prog; 2usize], + pub links: [list_head; 2usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_policy_hash { + pub table: *mut hlist_head, + pub hmask: ::aya_ebpf::cty::c_uint, + pub dbits4: u8_, + pub sbits4: u8_, + pub dbits6: u8_, + pub sbits6: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_policy_hthresh { + pub work: work_struct, + pub lock: seqlock_t, + pub lbits4: u8_, + pub rbits4: u8_, + pub lbits6: u8_, + pub rbits6: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct netns_xfrm { + pub state_all: list_head, + pub state_bydst: *mut hlist_head, + pub state_bysrc: *mut hlist_head, + pub state_byspi: *mut hlist_head, + pub state_byseq: *mut hlist_head, + pub state_hmask: ::aya_ebpf::cty::c_uint, + pub state_num: ::aya_ebpf::cty::c_uint, + pub state_hash_work: work_struct, + pub policy_all: list_head, + pub policy_byidx: *mut hlist_head, + pub policy_idx_hmask: ::aya_ebpf::cty::c_uint, + pub idx_generator: ::aya_ebpf::cty::c_uint, + pub policy_inexact: [hlist_head; 3usize], + pub policy_bydst: [xfrm_policy_hash; 3usize], + pub policy_count: [::aya_ebpf::cty::c_uint; 6usize], + pub policy_hash_work: work_struct, + pub policy_hthresh: xfrm_policy_hthresh, + pub inexact_bins: list_head, + pub nlsk: *mut sock, + pub nlsk_stash: *mut sock, + pub sysctl_aevent_etime: u32_, + pub sysctl_aevent_rseqth: u32_, + pub sysctl_larval_drop: ::aya_ebpf::cty::c_int, + pub sysctl_acq_expires: u32_, + pub policy_default: [u8_; 3usize], + pub sysctl_hdr: *mut ctl_table_header, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub xfrm4_dst_ops: dst_ops, + pub xfrm6_dst_ops: dst_ops, + pub xfrm_state_lock: spinlock_t, + pub xfrm_state_hash_generation: seqcount_spinlock_t, + pub xfrm_policy_hash_generation: seqcount_spinlock_t, + pub xfrm_policy_lock: spinlock_t, + pub xfrm_cfg_mutex: mutex, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, +} +impl netns_xfrm { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit } } #[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_ipvs { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mpls_route { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netns_mpls { + pub ip_ttl_propagate: ::aya_ebpf::cty::c_int, + pub default_ttl: ::aya_ebpf::cty::c_int, + pub platform_labels: usize, + pub platform_label: *mut *mut mpls_route, + pub ctl: *mut ctl_table_header, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct can_dev_rcv_lists { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct can_pkg_stats { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct can_rcv_lists_stats { + _unused: [u8; 0], +} +#[repr(C)] #[derive(Copy, Clone)] -pub struct inet_frags { - pub qsize: ::aya_bpf::cty::c_uint, - pub constructor: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inet_frag_queue, arg2: *const ::aya_bpf::cty::c_void), - >, - pub destructor: ::core::option::Option, - pub frag_expire: ::core::option::Option, - pub frags_cachep: *mut kmem_cache, - pub frags_cache_name: *const ::aya_bpf::cty::c_char, - pub rhash_params: rhashtable_params, - pub refcnt: refcount_t, - pub completion: completion, +pub struct netns_can { + pub proc_dir: *mut proc_dir_entry, + pub pde_stats: *mut proc_dir_entry, + pub pde_reset_stats: *mut proc_dir_entry, + pub pde_rcvlist_all: *mut proc_dir_entry, + pub pde_rcvlist_fil: *mut proc_dir_entry, + pub pde_rcvlist_inv: *mut proc_dir_entry, + pub pde_rcvlist_sff: *mut proc_dir_entry, + pub pde_rcvlist_eff: *mut proc_dir_entry, + pub pde_rcvlist_err: *mut proc_dir_entry, + pub bcmproc_dir: *mut proc_dir_entry, + pub rx_alldev_list: *mut can_dev_rcv_lists, + pub rcvlists_lock: spinlock_t, + pub stattimer: timer_list, + pub pkg_stats: *mut can_pkg_stats, + pub rcv_lists_stats: *mut can_rcv_lists_stats, + pub cgw_list: hlist_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct netns_xdp { + pub lock: mutex, + pub list: hlist_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct netns_mctp { + pub routes: list_head, + pub bind_lock: mutex, + pub binds: hlist_head, + pub keys_lock: spinlock_t, + pub keys: hlist_head, + pub default_net: ::aya_ebpf::cty::c_uint, + pub neigh_lock: mutex, + pub neighbours: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct smc_stats { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct smc_stats_rsn { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct netns_smc { + pub smc_stats: *mut smc_stats, + pub mutex_fback_rsn: mutex, + pub fback_rsn: *mut smc_stats_rsn, + pub limit_smc_hs: bool_, + pub smc_hdr: *mut ctl_table_header, + pub sysctl_autocorking_size: ::aya_ebpf::cty::c_uint, + pub sysctl_smcr_buf_type: ::aya_ebpf::cty::c_uint, + pub sysctl_smcr_testlink_time: ::aya_ebpf::cty::c_int, + pub sysctl_wmem: ::aya_ebpf::cty::c_int, + pub sysctl_rmem: ::aya_ebpf::cty::c_int, + pub sysctl_max_links_per_lgr: ::aya_ebpf::cty::c_int, + pub sysctl_max_conns_per_lgr: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +pub struct net { + pub passive: refcount_t, + pub rules_mod_lock: spinlock_t, + pub dev_unreg_count: atomic_t, + pub dev_base_seq: ::aya_ebpf::cty::c_uint, + pub ifindex: u32_, + pub nsid_lock: spinlock_t, + pub fnhe_genid: atomic_t, + pub list: list_head, + pub exit_list: list_head, + pub cleanup_list: llist_node, + pub key_domain: *mut key_tag, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub netns_ids: idr, + pub ns: ns_common, + pub refcnt_tracker: ref_tracker_dir, + pub notrefcnt_tracker: ref_tracker_dir, + pub dev_base_head: list_head, + pub proc_net: *mut proc_dir_entry, + pub proc_net_stat: *mut proc_dir_entry, + pub sysctls: ctl_table_set, + pub rtnl: *mut sock, + pub genl_sock: *mut sock, + pub uevent_sock: *mut uevent_sock, + pub dev_name_head: *mut hlist_head, + pub dev_index_head: *mut hlist_head, + pub dev_by_index: xarray, + pub netdev_chain: raw_notifier_head, + pub hash_mix: u32_, + pub loopback_dev: *mut net_device, + pub rules_ops: list_head, + pub core: netns_core, + pub mib: netns_mib, + pub packet: netns_packet, + pub unx: netns_unix, + pub nexthop: netns_nexthop, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub ipv4: netns_ipv4, + pub ipv6: netns_ipv6, + pub ieee802154_lowpan: netns_ieee802154_lowpan, + pub sctp: netns_sctp, + pub nf: netns_nf, + pub ct: netns_ct, + pub nft: netns_nftables, + pub ft: netns_ft, + pub wext_nlevents: sk_buff_head, + pub gen: *mut net_generic, + pub bpf: netns_bpf, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 40usize]>, + pub xfrm: netns_xfrm, + pub net_cookie: u64_, + pub ipvs: *mut netns_ipvs, + pub mpls: netns_mpls, + pub can: netns_can, + pub xdp: netns_xdp, + pub mctp: netns_mctp, + pub crypto_nlsk: *mut sock, + pub diag_nlsk: *mut sock, + pub smc: netns_smc, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl net { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -16373,8 +18142,8 @@ pub struct inet_frag_queue { pub fragments_tail: *mut sk_buff, pub last_run_head: *mut sk_buff, pub stamp: ktime_t, - pub len: ::aya_bpf::cty::c_int, - pub meat: ::aya_bpf::cty::c_int, + pub len: ::aya_ebpf::cty::c_int, + pub meat: ::aya_ebpf::cty::c_int, pub mono_delivery_time: u8_, pub flags: __u8, pub max_size: u16_, @@ -16388,7 +18157,7 @@ pub union inet_frag_queue__bindgen_ty_1 { pub v6: frag_v6_compare_key, } pub mod tcp_ca_event { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const CA_EVENT_TX_START: Type = 0; pub const CA_EVENT_CWND_RESTART: Type = 1; pub const CA_EVENT_COMPLETE_CWR: Type = 2; @@ -16417,11 +18186,11 @@ pub struct tcp_congestion_ops { unsafe extern "C" fn( arg1: *mut sock, arg2: u32_, - arg3: *mut ::aya_bpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_int, arg4: *mut tcp_cc_info, ) -> usize, >, - pub name: [::aya_bpf::cty::c_char; 16usize], + pub name: [::aya_ebpf::cty::c_char; 16usize], pub owner: *mut module, pub list: list_head, pub key: u32_, @@ -16438,42 +18207,80 @@ pub struct rcuref_t { } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netdevice_tracker {} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct dst_entry { pub dev: *mut net_device, pub ops: *mut dst_ops, - pub _metrics: ::aya_bpf::cty::c_ulong, - pub expires: ::aya_bpf::cty::c_ulong, + pub _metrics: ::aya_ebpf::cty::c_ulong, + pub expires: ::aya_ebpf::cty::c_ulong, pub xfrm: *mut xfrm_state, pub input: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub output: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net, arg2: *mut sock, arg3: *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub flags: ::aya_bpf::cty::c_ushort, - pub obsolete: ::aya_bpf::cty::c_short, - pub header_len: ::aya_bpf::cty::c_ushort, - pub trailer_len: ::aya_bpf::cty::c_ushort, + pub flags: ::aya_ebpf::cty::c_ushort, + pub obsolete: ::aya_ebpf::cty::c_short, + pub header_len: ::aya_ebpf::cty::c_ushort, + pub trailer_len: ::aya_ebpf::cty::c_ushort, pub __rcuref: rcuref_t, - pub __use: ::aya_bpf::cty::c_int, - pub lastuse: ::aya_bpf::cty::c_ulong, + pub __use: ::aya_ebpf::cty::c_int, + pub lastuse: ::aya_ebpf::cty::c_ulong, pub callback_head: callback_head, - pub error: ::aya_bpf::cty::c_short, - pub __pad: ::aya_bpf::cty::c_short, + pub error: ::aya_ebpf::cty::c_short, + pub __pad: ::aya_ebpf::cty::c_short, pub tclassid: __u32, pub dev_tracker: netdevice_tracker, pub rt_uncached: list_head, pub rt_uncached_list: *mut uncached_list, pub lwtstate: *mut lwtunnel_state, } +#[repr(C)] +#[derive(Copy, Clone)] +pub struct hh_cache { + pub hh_len: ::aya_ebpf::cty::c_uint, + pub hh_lock: seqlock_t, + pub hh_data: [::aya_ebpf::cty::c_ulong; 16usize], +} +#[repr(C)] +pub struct neighbour { + pub next: *mut neighbour, + pub tbl: *mut neigh_table, + pub parms: *mut neigh_parms, + pub confirmed: ::aya_ebpf::cty::c_ulong, + pub updated: ::aya_ebpf::cty::c_ulong, + pub lock: rwlock_t, + pub refcnt: refcount_t, + pub arp_queue_len_bytes: ::aya_ebpf::cty::c_uint, + pub arp_queue: sk_buff_head, + pub timer: timer_list, + pub used: ::aya_ebpf::cty::c_ulong, + pub probes: atomic_t, + pub nud_state: u8_, + pub type_: u8_, + pub dead: u8_, + pub protocol: u8_, + pub flags: u32_, + pub ha_lock: seqlock_t, + pub __bindgen_padding_0: [u8; 4usize], + pub ha: [::aya_ebpf::cty::c_uchar; 32usize], + pub hh: hh_cache, + pub output: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut neighbour, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, + >, + pub ops: *const neigh_ops, + pub gc_list: list_head, + pub managed_list: list_head, + pub rcu: callback_head, + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub primary_key: __IncompleteArrayField, +} pub mod nf_log_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const NF_LOG_TYPE_LOG: Type = 0; pub const NF_LOG_TYPE_ULOG: Type = 1; pub const NF_LOG_TYPE_MAX: Type = 2; @@ -16483,2298 +18290,1427 @@ pub type nf_logfn = ::core::option::Option< unsafe extern "C" fn( arg1: *mut net, arg2: u_int8_t, - arg3: ::aya_bpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, arg4: *const sk_buff, arg5: *const net_device, arg6: *const net_device, arg7: *const nf_loginfo, - arg8: *const ::aya_bpf::cty::c_char, + arg8: *const ::aya_ebpf::cty::c_char, ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct nf_logger { - pub name: *mut ::aya_bpf::cty::c_char, + pub name: *mut ::aya_ebpf::cty::c_char, pub type_: nf_log_type::Type, pub logfn: nf_logfn, pub me: *mut module, } -pub mod ip_conntrack_dir { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IP_CT_DIR_ORIGINAL: Type = 0; - pub const IP_CT_DIR_REPLY: Type = 1; - pub const IP_CT_DIR_MAX: Type = 2; -} -pub mod sctp_conntrack { - pub type Type = ::aya_bpf::cty::c_uint; - pub const SCTP_CONNTRACK_NONE: Type = 0; - pub const SCTP_CONNTRACK_CLOSED: Type = 1; - pub const SCTP_CONNTRACK_COOKIE_WAIT: Type = 2; - pub const SCTP_CONNTRACK_COOKIE_ECHOED: Type = 3; - pub const SCTP_CONNTRACK_ESTABLISHED: Type = 4; - pub const SCTP_CONNTRACK_SHUTDOWN_SENT: Type = 5; - pub const SCTP_CONNTRACK_SHUTDOWN_RECD: Type = 6; - pub const SCTP_CONNTRACK_SHUTDOWN_ACK_SENT: Type = 7; - pub const SCTP_CONNTRACK_HEARTBEAT_SENT: Type = 8; - pub const SCTP_CONNTRACK_HEARTBEAT_ACKED: Type = 9; - pub const SCTP_CONNTRACK_MAX: Type = 10; -} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct nf_flow_table_stat { - pub count_wq_add: ::aya_bpf::cty::c_uint, - pub count_wq_del: ::aya_bpf::cty::c_uint, - pub count_wq_stats: ::aya_bpf::cty::c_uint, + pub count_wq_add: ::aya_ebpf::cty::c_uint, + pub count_wq_del: ::aya_ebpf::cty::c_uint, + pub count_wq_stats: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct possible_net_t { - pub net: *mut net, +pub struct ieee_ets { + pub willing: __u8, + pub ets_cap: __u8, + pub cbs: __u8, + pub tc_tx_bw: [__u8; 8usize], + pub tc_rx_bw: [__u8; 8usize], + pub tc_tsa: [__u8; 8usize], + pub prio_tc: [__u8; 8usize], + pub tc_reco_bw: [__u8; 8usize], + pub tc_reco_tsa: [__u8; 8usize], + pub reco_prio_tc: [__u8; 8usize], } -pub type __le16 = __u16; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ipc_ids { - pub in_use: ::aya_bpf::cty::c_int, - pub seq: ::aya_bpf::cty::c_ushort, - pub rwsem: rw_semaphore, - pub ipcs_idr: idr, - pub max_idx: ::aya_bpf::cty::c_int, - pub last_idx: ::aya_bpf::cty::c_int, - pub next_id: ::aya_bpf::cty::c_int, - pub key_ht: rhashtable, +#[derive(Debug, Copy, Clone)] +pub struct ieee_maxrate { + pub tc_maxrate: [__u64; 8usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ipc_namespace { - pub ids: [ipc_ids; 3usize], - pub sem_ctls: [::aya_bpf::cty::c_int; 4usize], - pub used_sems: ::aya_bpf::cty::c_int, - pub msg_ctlmax: ::aya_bpf::cty::c_uint, - pub msg_ctlmnb: ::aya_bpf::cty::c_uint, - pub msg_ctlmni: ::aya_bpf::cty::c_uint, - pub percpu_msg_bytes: percpu_counter, - pub percpu_msg_hdrs: percpu_counter, - pub shm_ctlmax: usize, - pub shm_ctlall: usize, - pub shm_tot: ::aya_bpf::cty::c_ulong, - pub shm_ctlmni: ::aya_bpf::cty::c_int, - pub shm_rmid_forced: ::aya_bpf::cty::c_int, - pub ipcns_nb: notifier_block, - pub mq_mnt: *mut vfsmount, - pub mq_queues_count: ::aya_bpf::cty::c_uint, - pub mq_queues_max: ::aya_bpf::cty::c_uint, - pub mq_msg_max: ::aya_bpf::cty::c_uint, - pub mq_msgsize_max: ::aya_bpf::cty::c_uint, - pub mq_msg_default: ::aya_bpf::cty::c_uint, - pub mq_msgsize_default: ::aya_bpf::cty::c_uint, - pub mq_set: ctl_table_set, - pub mq_sysctls: *mut ctl_table_header, - pub ipc_set: ctl_table_set, - pub ipc_sysctls: *mut ctl_table_header, - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub mnt_llist: llist_node, - pub ns: ns_common, +#[derive(Debug, Copy, Clone)] +pub struct ieee_qcn { + pub rpg_enable: [__u8; 8usize], + pub rppp_max_rps: [__u32; 8usize], + pub rpg_time_reset: [__u32; 8usize], + pub rpg_byte_reset: [__u32; 8usize], + pub rpg_threshold: [__u32; 8usize], + pub rpg_max_rate: [__u32; 8usize], + pub rpg_ai_rate: [__u32; 8usize], + pub rpg_hai_rate: [__u32; 8usize], + pub rpg_gd: [__u32; 8usize], + pub rpg_min_dec_fac: [__u32; 8usize], + pub rpg_min_rate: [__u32; 8usize], + pub cndd_state_machine: [__u32; 8usize], } -pub type __be64 = __u64; #[repr(C)] -#[derive(Copy, Clone)] -pub struct sockptr_t { - pub __bindgen_anon_1: sockptr_t__bindgen_ty_1, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 7usize], +#[derive(Debug, Copy, Clone)] +pub struct ieee_qcn_stats { + pub rppp_rp_centiseconds: [__u64; 8usize], + pub rppp_created_rps: [__u32; 8usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub union sockptr_t__bindgen_ty_1 { - pub kernel: *mut ::aya_bpf::cty::c_void, - pub user: *mut ::aya_bpf::cty::c_void, -} -impl sockptr_t { - #[inline] - pub fn is_kernel(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_is_kernel(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(is_kernel: bool_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_kernel: u8 = unsafe { ::core::mem::transmute(is_kernel) }; - is_kernel as u64 - }); - __bindgen_bitfield_unit - } +#[derive(Debug, Copy, Clone)] +pub struct ieee_pfc { + pub pfc_cap: __u8, + pub pfc_en: __u8, + pub mbc: __u8, + pub delay: __u16, + pub requests: [__u64; 8usize], + pub indications: [__u64; 8usize], } -pub type __kernel_sa_family_t = ::aya_bpf::cty::c_ushort; -pub type sa_family_t = __kernel_sa_family_t; #[repr(C)] -pub struct sockaddr { - pub sa_family: sa_family_t, - pub __bindgen_anon_1: sockaddr__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct dcbnl_buffer { + pub prio2buffer: [__u8; 8usize], + pub buffer_size: [__u32; 8usize], + pub total_size: __u32, } #[repr(C)] -pub struct sockaddr__bindgen_ty_1 { - pub sa_data_min: __BindgenUnionField<[::aya_bpf::cty::c_char; 14usize]>, - pub __bindgen_anon_1: __BindgenUnionField, - pub bindgen_union_field: [u8; 14usize], +#[derive(Debug, Copy, Clone)] +pub struct cee_pg { + pub willing: __u8, + pub error: __u8, + pub pg_en: __u8, + pub tcs_supported: __u8, + pub pg_bw: [__u8; 8usize], + pub prio_pg: [__u8; 8usize], } #[repr(C)] -#[derive(Debug)] -pub struct sockaddr__bindgen_ty_1__bindgen_ty_1 { - pub __empty_sa_data: sockaddr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub sa_data: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Debug, Copy, Clone)] +pub struct cee_pfc { + pub willing: __u8, + pub error: __u8, + pub pfc_en: __u8, + pub tcs_supported: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sockaddr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct msghdr { - pub msg_name: *mut ::aya_bpf::cty::c_void, - pub msg_namelen: ::aya_bpf::cty::c_int, - pub msg_inq: ::aya_bpf::cty::c_int, - pub msg_iter: iov_iter, - pub __bindgen_anon_1: msghdr__bindgen_ty_1, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub msg_flags: ::aya_bpf::cty::c_uint, - pub msg_controllen: __kernel_size_t, - pub msg_iocb: *mut kiocb, - pub msg_ubuf: *mut ubuf_info, - pub sg_from_iter: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sk_buff, - arg3: *mut iov_iter, - arg4: usize, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct dcb_app { + pub selector: __u8, + pub priority: __u8, + pub protocol: __u16, } #[repr(C)] -#[derive(Copy, Clone)] -pub union msghdr__bindgen_ty_1 { - pub msg_control: *mut ::aya_bpf::cty::c_void, - pub msg_control_user: *mut ::aya_bpf::cty::c_void, -} -impl msghdr { - #[inline] - pub fn msg_control_is_user(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_msg_control_is_user(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn msg_get_inq(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_msg_get_inq(&mut self, val: bool_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - msg_control_is_user: bool_, - msg_get_inq: bool_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let msg_control_is_user: u8 = unsafe { ::core::mem::transmute(msg_control_is_user) }; - msg_control_is_user as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let msg_get_inq: u8 = unsafe { ::core::mem::transmute(msg_get_inq) }; - msg_get_inq as u64 - }); - __bindgen_bitfield_unit - } +#[derive(Debug, Copy, Clone)] +pub struct dcb_peer_app_info { + pub willing: __u8, + pub error: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ubuf_info { - pub callback: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ubuf_info, arg3: bool_), +pub struct dcbnl_rtnl_ops { + pub ieee_getets: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_ets) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_setets: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_ets) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_getmaxrate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ieee_maxrate, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_setmaxrate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ieee_maxrate, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_getqcn: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_qcn) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_setqcn: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_qcn) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_getqcnstats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ieee_qcn_stats, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_getpfc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_pfc) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_setpfc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_pfc) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_getapp: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_setapp: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_delapp: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_peer_getets: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_ets) -> ::aya_ebpf::cty::c_int, + >, + pub ieee_peer_getpfc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_pfc) -> ::aya_ebpf::cty::c_int, + >, + pub getstate: ::core::option::Option u8_>, + pub setstate: + ::core::option::Option u8_>, + pub getpermhwaddr: + ::core::option::Option, + pub setpgtccfgtx: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + arg4: u8_, + arg5: u8_, + arg6: u8_, + ), + >, + pub setpgbwgcfgtx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: u8_), + >, + pub setpgtccfgrx: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + arg4: u8_, + arg5: u8_, + arg6: u8_, + ), + >, + pub setpgbwgcfgrx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: u8_), + >, + pub getpgtccfgtx: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut u8_, + arg4: *mut u8_, + arg5: *mut u8_, + arg6: *mut u8_, + ), + >, + pub getpgbwgcfgtx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u8_), + >, + pub getpgtccfgrx: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut u8_, + arg4: *mut u8_, + arg5: *mut u8_, + arg6: *mut u8_, + ), + >, + pub getpgbwgcfgrx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u8_), + >, + pub setpfccfg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: u8_), + >, + pub getpfccfg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u8_), + >, + pub setall: ::core::option::Option u8_>, + pub getcap: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut u8_, + ) -> u8_, + >, + pub getnumtcs: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub setnumtcs: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub getpfcstate: ::core::option::Option u8_>, + pub setpfcstate: ::core::option::Option, + pub getbcncfg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u32_), + >, + pub setbcncfg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: u32_), + >, + pub getbcnrp: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u8_), + >, + pub setbcnrp: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: u8_), + >, + pub setapp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: u8_, + arg3: u16_, + arg4: u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub getapp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: u8_, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub getfeatcfg: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut u8_, + ) -> u8_, + >, + pub setfeatcfg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int, arg3: u8_) -> u8_, + >, + pub getdcbx: ::core::option::Option u8_>, + pub setdcbx: + ::core::option::Option u8_>, + pub peer_getappinfo: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut dcb_peer_app_info, + arg3: *mut u16_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub peer_getapptable: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_ebpf::cty::c_int, + >, + pub cee_peer_getpg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut cee_pg) -> ::aya_ebpf::cty::c_int, + >, + pub cee_peer_getpfc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut cee_pfc) -> ::aya_ebpf::cty::c_int, + >, + pub dcbnl_getbuffer: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut dcbnl_buffer, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dcbnl_setbuffer: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut dcbnl_buffer, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dcbnl_setapptrust: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut u8_, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dcbnl_getapptrust: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut u8_, + arg3: *mut ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dcbnl_setrewr: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_ebpf::cty::c_int, + >, + pub dcbnl_delrewr: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_ebpf::cty::c_int, >, - pub refcnt: refcount_t, - pub flags: u8_, -} -pub type __addrpair = __u64; -pub type __portpair = __u32; -#[repr(C)] -pub struct sock_common { - pub __bindgen_anon_1: sock_common__bindgen_ty_1, - pub __bindgen_anon_2: sock_common__bindgen_ty_2, - pub __bindgen_anon_3: sock_common__bindgen_ty_3, - pub skc_family: ::aya_bpf::cty::c_ushort, - pub skc_state: ::aya_bpf::cty::c_uchar, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub skc_bound_dev_if: ::aya_bpf::cty::c_int, - pub __bindgen_anon_4: sock_common__bindgen_ty_4, - pub skc_prot: *mut proto, - pub skc_net: possible_net_t, - pub skc_v6_daddr: in6_addr, - pub skc_v6_rcv_saddr: in6_addr, - pub skc_cookie: atomic64_t, - pub __bindgen_anon_5: sock_common__bindgen_ty_5, - pub skc_dontcopy_begin: __IncompleteArrayField<::aya_bpf::cty::c_int>, - pub __bindgen_anon_6: sock_common__bindgen_ty_6, - pub skc_tx_queue_mapping: ::aya_bpf::cty::c_ushort, - pub skc_rx_queue_mapping: ::aya_bpf::cty::c_ushort, - pub __bindgen_anon_7: sock_common__bindgen_ty_7, - pub skc_refcnt: refcount_t, - pub skc_dontcopy_end: __IncompleteArrayField<::aya_bpf::cty::c_int>, - pub __bindgen_anon_8: sock_common__bindgen_ty_8, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_1 { - pub skc_addrpair: __addrpair, - pub __bindgen_anon_1: sock_common__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug)] +pub struct netprio_map { + pub rcu: callback_head, + pub priomap_len: u32_, + pub priomap: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sock_common__bindgen_ty_1__bindgen_ty_1 { - pub skc_daddr: __be32, - pub skc_rcv_saddr: __be32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_2 { - pub skc_hash: ::aya_bpf::cty::c_uint, - pub skc_u16hashes: [__u16; 2usize], +pub struct nlmsghdr { + pub nlmsg_len: __u32, + pub nlmsg_type: __u16, + pub nlmsg_flags: __u16, + pub nlmsg_seq: __u32, + pub nlmsg_pid: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_3 { - pub skc_portpair: __portpair, - pub __bindgen_anon_1: sock_common__bindgen_ty_3__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct nlattr { + pub nla_len: __u16, + pub nla_type: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sock_common__bindgen_ty_3__bindgen_ty_1 { - pub skc_dport: __be16, - pub skc_num: __u16, +pub struct netlink_ext_ack { + pub _msg: *const ::aya_ebpf::cty::c_char, + pub bad_attr: *const nlattr, + pub policy: *const nla_policy, + pub miss_nest: *const nlattr, + pub miss_type: u16_, + pub cookie: [u8_; 20usize], + pub cookie_len: u8_, + pub _msg_buf: [::aya_ebpf::cty::c_char; 80usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_4 { - pub skc_bind_node: hlist_node, - pub skc_portaddr_node: hlist_node, +pub struct nla_policy { + pub type_: u8_, + pub validation_type: u8_, + pub len: u16_, + pub __bindgen_anon_1: nla_policy__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_5 { - pub skc_flags: ::aya_bpf::cty::c_ulong, - pub skc_listener: *mut sock, - pub skc_tw_dr: *mut inet_timewait_death_row, +pub union nla_policy__bindgen_ty_1 { + pub strict_start_type: u16_, + pub bitfield32_valid: u32_, + pub mask: u32_, + pub reject_message: *const ::aya_ebpf::cty::c_char, + pub nested_policy: *const nla_policy, + pub range: *const netlink_range_validation, + pub range_signed: *const netlink_range_validation_signed, + pub __bindgen_anon_1: nla_policy__bindgen_ty_1__bindgen_ty_1, + pub validate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const nlattr, + arg2: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_6 { - pub skc_node: hlist_node, - pub skc_nulls_node: hlist_nulls_node, +#[derive(Debug, Copy, Clone)] +pub struct nla_policy__bindgen_ty_1__bindgen_ty_1 { + pub min: s16, + pub max: s16, } #[repr(C)] #[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_7 { - pub skc_incoming_cpu: ::aya_bpf::cty::c_int, - pub skc_rcv_wnd: u32_, - pub skc_tw_rcv_nxt: u32_, +pub struct netlink_callback { + pub skb: *mut sk_buff, + pub nlh: *const nlmsghdr, + pub dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut netlink_callback, + ) -> ::aya_ebpf::cty::c_int, + >, + pub done: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut netlink_callback) -> ::aya_ebpf::cty::c_int, + >, + pub data: *mut ::aya_ebpf::cty::c_void, + pub module: *mut module, + pub extack: *mut netlink_ext_ack, + pub family: u16_, + pub answer_flags: u16_, + pub min_dump_alloc: u32_, + pub prev_seq: ::aya_ebpf::cty::c_uint, + pub seq: ::aya_ebpf::cty::c_uint, + pub strict_check: bool_, + pub __bindgen_anon_1: netlink_callback__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union sock_common__bindgen_ty_8 { - pub skc_rxhash: u32_, - pub skc_window_clamp: u32_, - pub skc_tw_snd_nxt: u32_, -} -impl sock_common { - #[inline] - pub fn skc_reuse(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } - } - #[inline] - pub fn set_skc_reuse(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 4u8, val as u64) - } - } - #[inline] - pub fn skc_reuseport(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } - } - #[inline] - pub fn set_skc_reuseport(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn skc_ipv6only(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } - } - #[inline] - pub fn set_skc_ipv6only(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) - } - } - #[inline] - pub fn skc_net_refcnt(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } - } - #[inline] - pub fn set_skc_net_refcnt(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - skc_reuse: ::aya_bpf::cty::c_uchar, - skc_reuseport: ::aya_bpf::cty::c_uchar, - skc_ipv6only: ::aya_bpf::cty::c_uchar, - skc_net_refcnt: ::aya_bpf::cty::c_uchar, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 4u8, { - let skc_reuse: u8 = unsafe { ::core::mem::transmute(skc_reuse) }; - skc_reuse as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let skc_reuseport: u8 = unsafe { ::core::mem::transmute(skc_reuseport) }; - skc_reuseport as u64 - }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let skc_ipv6only: u8 = unsafe { ::core::mem::transmute(skc_ipv6only) }; - skc_ipv6only as u64 - }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let skc_net_refcnt: u8 = unsafe { ::core::mem::transmute(skc_net_refcnt) }; - skc_net_refcnt as u64 - }); - __bindgen_bitfield_unit - } +pub union netlink_callback__bindgen_ty_1 { + pub ctx: [u8_; 48usize], + pub args: [::aya_ebpf::cty::c_long; 6usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct socket_lock_t { - pub slock: spinlock_t, - pub owned: ::aya_bpf::cty::c_int, - pub wq: wait_queue_head_t, +#[derive(Debug, Copy, Clone)] +pub struct ndmsg { + pub ndm_family: __u8, + pub ndm_pad1: __u8, + pub ndm_pad2: __u16, + pub ndm_ifindex: __s32, + pub ndm_state: __u16, + pub ndm_flags: __u8, + pub ndm_type: __u8, } -pub type netdev_features_t = u64_; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sock_cgroup_data { - pub cgroup: *mut cgroup, - pub classid: u32_, - pub prioidx: u16_, +pub struct rtnl_link_stats64 { + pub rx_packets: __u64, + pub tx_packets: __u64, + pub rx_bytes: __u64, + pub tx_bytes: __u64, + pub rx_errors: __u64, + pub tx_errors: __u64, + pub rx_dropped: __u64, + pub tx_dropped: __u64, + pub multicast: __u64, + pub collisions: __u64, + pub rx_length_errors: __u64, + pub rx_over_errors: __u64, + pub rx_crc_errors: __u64, + pub rx_frame_errors: __u64, + pub rx_fifo_errors: __u64, + pub rx_missed_errors: __u64, + pub tx_aborted_errors: __u64, + pub tx_carrier_errors: __u64, + pub tx_fifo_errors: __u64, + pub tx_heartbeat_errors: __u64, + pub tx_window_errors: __u64, + pub rx_compressed: __u64, + pub tx_compressed: __u64, + pub rx_nohandler: __u64, + pub rx_otherhost_dropped: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netns_tracker {} -#[repr(C)] -pub struct sock { - pub __sk_common: sock_common, - pub sk_rx_dst: *mut dst_entry, - pub sk_rx_dst_ifindex: ::aya_bpf::cty::c_int, - pub sk_rx_dst_cookie: u32_, - pub sk_lock: socket_lock_t, - pub sk_drops: atomic_t, - pub sk_rcvlowat: ::aya_bpf::cty::c_int, - pub sk_error_queue: sk_buff_head, - pub sk_receive_queue: sk_buff_head, - pub sk_backlog: sock__bindgen_ty_1, - pub sk_forward_alloc: ::aya_bpf::cty::c_int, - pub sk_reserved_mem: u32_, - pub sk_ll_usec: ::aya_bpf::cty::c_uint, - pub sk_napi_id: ::aya_bpf::cty::c_uint, - pub sk_rcvbuf: ::aya_bpf::cty::c_int, - pub sk_wait_pending: ::aya_bpf::cty::c_int, - pub sk_filter: *mut sk_filter, - pub __bindgen_anon_1: sock__bindgen_ty_2, - pub sk_policy: [*mut xfrm_policy; 2usize], - pub sk_dst_cache: *mut dst_entry, - pub sk_omem_alloc: atomic_t, - pub sk_sndbuf: ::aya_bpf::cty::c_int, - pub sk_wmem_queued: ::aya_bpf::cty::c_int, - pub sk_wmem_alloc: refcount_t, - pub sk_tsq_flags: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_2: sock__bindgen_ty_3, - pub sk_write_queue: sk_buff_head, - pub sk_peek_off: __s32, - pub sk_write_pending: ::aya_bpf::cty::c_int, - pub sk_dst_pending_confirm: __u32, - pub sk_pacing_status: u32_, - pub sk_sndtimeo: ::aya_bpf::cty::c_long, - pub sk_timer: timer_list, - pub sk_priority: __u32, - pub sk_mark: __u32, - pub sk_pacing_rate: ::aya_bpf::cty::c_ulong, - pub sk_max_pacing_rate: ::aya_bpf::cty::c_ulong, - pub sk_frag: page_frag, - pub sk_route_caps: netdev_features_t, - pub sk_gso_type: ::aya_bpf::cty::c_int, - pub sk_gso_max_size: ::aya_bpf::cty::c_uint, - pub sk_allocation: gfp_t, - pub sk_txhash: __u32, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub sk_pacing_shift: u8_, - pub sk_type: u16_, - pub sk_protocol: u16_, - pub sk_gso_max_segs: u16_, - pub sk_lingertime: ::aya_bpf::cty::c_ulong, - pub sk_prot_creator: *mut proto, - pub sk_callback_lock: rwlock_t, - pub sk_err: ::aya_bpf::cty::c_int, - pub sk_err_soft: ::aya_bpf::cty::c_int, - pub sk_ack_backlog: u32_, - pub sk_max_ack_backlog: u32_, - pub sk_uid: kuid_t, - pub sk_txrehash: u8_, - pub sk_prefer_busy_poll: u8_, - pub sk_busy_poll_budget: u16_, - pub sk_peer_lock: spinlock_t, - pub sk_bind_phc: ::aya_bpf::cty::c_int, - pub sk_peer_pid: *mut pid, - pub sk_peer_cred: *const cred, - pub sk_rcvtimeo: ::aya_bpf::cty::c_long, - pub sk_stamp: ktime_t, - pub sk_tskey: atomic_t, - pub sk_zckey: atomic_t, - pub sk_tsflags: u32_, - pub sk_shutdown: u8_, - pub sk_clockid: u8_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, - pub sk_use_task_frag: bool_, - pub sk_socket: *mut socket, - pub sk_user_data: *mut ::aya_bpf::cty::c_void, - pub sk_security: *mut ::aya_bpf::cty::c_void, - pub sk_cgrp_data: sock_cgroup_data, - pub sk_memcg: *mut mem_cgroup, - pub sk_state_change: ::core::option::Option, - pub sk_data_ready: ::core::option::Option, - pub sk_write_space: ::core::option::Option, - pub sk_error_report: ::core::option::Option, - pub sk_backlog_rcv: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub sk_validate_xmit_skb: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut net_device, - arg3: *mut sk_buff, - ) -> *mut sk_buff, - >, - pub sk_destruct: ::core::option::Option, - pub sk_reuseport_cb: *mut sock_reuseport, - pub sk_bpf_storage: *mut bpf_local_storage, - pub sk_rcu: callback_head, - pub ns_tracker: netns_tracker, - pub sk_bind2_node: hlist_node, +pub struct rtnl_hw_stats64 { + pub rx_packets: __u64, + pub tx_packets: __u64, + pub rx_bytes: __u64, + pub tx_bytes: __u64, + pub rx_errors: __u64, + pub tx_errors: __u64, + pub rx_dropped: __u64, + pub tx_dropped: __u64, + pub multicast: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sock__bindgen_ty_1 { - pub rmem_alloc: atomic_t, - pub len: ::aya_bpf::cty::c_int, - pub head: *mut sk_buff, - pub tail: *mut sk_buff, +pub struct ifla_vf_guid { + pub vf: __u32, + pub guid: __u64, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sock__bindgen_ty_2 { - pub sk_wq: *mut socket_wq, - pub sk_wq_raw: *mut socket_wq, +#[derive(Debug, Copy, Clone)] +pub struct ifla_vf_stats { + pub rx_packets: __u64, + pub tx_packets: __u64, + pub rx_bytes: __u64, + pub tx_bytes: __u64, + pub broadcast: __u64, + pub multicast: __u64, + pub rx_dropped: __u64, + pub tx_dropped: __u64, } #[repr(C)] -#[derive(Copy, Clone)] -pub union sock__bindgen_ty_3 { - pub sk_send_head: *mut sk_buff, - pub tcp_rtx_queue: rb_root, -} -impl sock { - #[inline] - pub fn sk_gso_disabled(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_sk_gso_disabled(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn sk_kern_sock(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_sk_kern_sock(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn sk_no_check_tx(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_sk_no_check_tx(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn sk_no_check_rx(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } - } - #[inline] - pub fn set_sk_no_check_rx(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn sk_userlocks(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } - } - #[inline] - pub fn set_sk_userlocks(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 4u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - sk_gso_disabled: u8_, - sk_kern_sock: u8_, - sk_no_check_tx: u8_, - sk_no_check_rx: u8_, - sk_userlocks: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let sk_gso_disabled: u8 = unsafe { ::core::mem::transmute(sk_gso_disabled) }; - sk_gso_disabled as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let sk_kern_sock: u8 = unsafe { ::core::mem::transmute(sk_kern_sock) }; - sk_kern_sock as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let sk_no_check_tx: u8 = unsafe { ::core::mem::transmute(sk_no_check_tx) }; - sk_no_check_tx as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let sk_no_check_rx: u8 = unsafe { ::core::mem::transmute(sk_no_check_rx) }; - sk_no_check_rx as u64 - }); - __bindgen_bitfield_unit.set(4usize, 4u8, { - let sk_userlocks: u8 = unsafe { ::core::mem::transmute(sk_userlocks) }; - sk_userlocks as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn sk_txtime_deadline_mode(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_sk_txtime_deadline_mode(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn sk_txtime_report_errors(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_2.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_sk_txtime_report_errors(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn sk_txtime_unused(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 6u8) as u8) } - } - #[inline] - pub fn set_sk_txtime_unused(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(2usize, 6u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_2( - sk_txtime_deadline_mode: u8_, - sk_txtime_report_errors: u8_, - sk_txtime_unused: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let sk_txtime_deadline_mode: u8 = - unsafe { ::core::mem::transmute(sk_txtime_deadline_mode) }; - sk_txtime_deadline_mode as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let sk_txtime_report_errors: u8 = - unsafe { ::core::mem::transmute(sk_txtime_report_errors) }; - sk_txtime_report_errors as u64 - }); - __bindgen_bitfield_unit.set(2usize, 6u8, { - let sk_txtime_unused: u8 = unsafe { ::core::mem::transmute(sk_txtime_unused) }; - sk_txtime_unused as u64 - }); - __bindgen_bitfield_unit - } -} -pub mod socket_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const SS_FREE: Type = 0; - pub const SS_UNCONNECTED: Type = 1; - pub const SS_CONNECTING: Type = 2; - pub const SS_CONNECTED: Type = 3; - pub const SS_DISCONNECTING: Type = 4; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct socket_wq { - pub wait: wait_queue_head_t, - pub fasync_list: *mut fasync_struct, - pub flags: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, -} -impl socket_wq { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct socket { - pub state: socket_state::Type, - pub type_: ::aya_bpf::cty::c_short, - pub flags: ::aya_bpf::cty::c_ulong, - pub file: *mut file, - pub sk: *mut sock, - pub ops: *const proto_ops, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub wq: socket_wq, -} -impl socket { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[derive(Debug, Copy, Clone)] +pub struct ifla_vf_info { + pub vf: __u32, + pub mac: [__u8; 32usize], + pub vlan: __u32, + pub qos: __u32, + pub spoofchk: __u32, + pub linkstate: __u32, + pub min_tx_rate: __u32, + pub max_tx_rate: __u32, + pub rss_query_en: __u32, + pub trusted: __u32, + pub vlan_proto: __be16, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct read_descriptor_t { - pub written: usize, - pub count: usize, - pub arg: read_descriptor_t__bindgen_ty_1, - pub error: ::aya_bpf::cty::c_int, +pub mod netdev_tx { + pub type Type = ::aya_ebpf::cty::c_int; + pub const __NETDEV_TX_MIN: Type = -2147483648; + pub const NETDEV_TX_OK: Type = 0; + pub const NETDEV_TX_BUSY: Type = 16; } +pub use self::netdev_tx::Type as netdev_tx_t; #[repr(C)] -#[derive(Copy, Clone)] -pub union read_descriptor_t__bindgen_ty_1 { - pub buf: *mut ::aya_bpf::cty::c_char, - pub data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct net_device_core_stats { + pub rx_dropped: ::aya_ebpf::cty::c_ulong, + pub tx_dropped: ::aya_ebpf::cty::c_ulong, + pub rx_nohandler: ::aya_ebpf::cty::c_ulong, + pub rx_otherhost_dropped: ::aya_ebpf::cty::c_ulong, } -pub type sk_read_actor_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut read_descriptor_t, - arg2: *mut sk_buff, - arg3: ::aya_bpf::cty::c_uint, - arg4: usize, - ) -> ::aya_bpf::cty::c_int, ->; -pub type skb_read_actor_t = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct proto_ops { - pub family: ::aya_bpf::cty::c_int, - pub owner: *mut module, - pub release: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub bind: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub connect: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub socketpair: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut socket, arg2: *mut socket) -> ::aya_bpf::cty::c_int, - >, - pub accept: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut socket, - arg3: ::aya_bpf::cty::c_int, - arg4: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub getname: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub poll: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut socket, - arg3: *mut poll_table_struct, - ) -> __poll_t, - >, - pub ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub compat_ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub gettstamp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: bool_, - arg4: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub listen: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub shutdown: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub setsockopt: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: sockptr_t, - arg5: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub getsockopt: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut ::aya_bpf::cty::c_char, - arg5: *mut ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub show_fdinfo: - ::core::option::Option, - pub sendmsg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut msghdr, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub recvmsg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut msghdr, - arg3: usize, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub mmap: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut socket, - arg3: *mut vm_area_struct, - ) -> ::aya_bpf::cty::c_int, - >, - pub sendpage: ::core::option::Option< +pub struct header_ops { + pub create: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut page, - arg3: ::aya_bpf::cty::c_int, - arg4: usize, - arg5: ::aya_bpf::cty::c_int, - ) -> isize, + arg1: *mut sk_buff, + arg2: *mut net_device, + arg3: ::aya_ebpf::cty::c_ushort, + arg4: *const ::aya_ebpf::cty::c_void, + arg5: *const ::aya_ebpf::cty::c_void, + arg6: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub splice_read: ::core::option::Option< + pub parse: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut socket, - arg2: *mut loff_t, - arg3: *mut pipe_inode_info, - arg4: usize, - arg5: ::aya_bpf::cty::c_uint, - ) -> isize, - >, - pub set_peek_off: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, + arg1: *const sk_buff, + arg2: *mut ::aya_ebpf::cty::c_uchar, + ) -> ::aya_ebpf::cty::c_int, >, - pub peek_len: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub read_sock: ::core::option::Option< + pub cache: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut read_descriptor_t, - arg3: sk_read_actor_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub read_skb: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: skb_read_actor_t) -> ::aya_bpf::cty::c_int, + arg1: *const neighbour, + arg2: *mut hh_cache, + arg3: __be16, + ) -> ::aya_ebpf::cty::c_int, >, - pub sendpage_locked: ::core::option::Option< + pub cache_update: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut page, - arg3: ::aya_bpf::cty::c_int, - arg4: usize, - arg5: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut hh_cache, + arg2: *const net_device, + arg3: *const ::aya_ebpf::cty::c_uchar, + ), >, - pub sendmsg_locked: ::core::option::Option< + pub validate: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut msghdr, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_rcvlowat: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, + arg1: *const ::aya_ebpf::cty::c_char, + arg2: ::aya_ebpf::cty::c_uint, + ) -> bool_, >, + pub parse_protocol: + ::core::option::Option __be16>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flowi_tunnel { - pub tun_id: __be64, +pub struct gro_list { + pub list: list_head, + pub count: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flowi_common { - pub flowic_oif: ::aya_bpf::cty::c_int, - pub flowic_iif: ::aya_bpf::cty::c_int, - pub flowic_l3mdev: ::aya_bpf::cty::c_int, - pub flowic_mark: __u32, - pub flowic_tos: __u8, - pub flowic_scope: __u8, - pub flowic_proto: __u8, - pub flowic_flags: __u8, - pub flowic_secid: __u32, - pub flowic_uid: kuid_t, - pub flowic_tun_key: flowi_tunnel, - pub flowic_multipath_hash: __u32, +pub struct napi_struct { + pub poll_list: list_head, + pub state: ::aya_ebpf::cty::c_ulong, + pub weight: ::aya_ebpf::cty::c_int, + pub defer_hard_irqs_count: ::aya_ebpf::cty::c_int, + pub gro_bitmask: ::aya_ebpf::cty::c_ulong, + pub poll: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut napi_struct, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub poll_owner: ::aya_ebpf::cty::c_int, + pub list_owner: ::aya_ebpf::cty::c_int, + pub dev: *mut net_device, + pub gro_hash: [gro_list; 8usize], + pub skb: *mut sk_buff, + pub rx_list: list_head, + pub rx_count: ::aya_ebpf::cty::c_int, + pub napi_id: ::aya_ebpf::cty::c_uint, + pub timer: hrtimer, + pub thread: *mut task_struct, + pub dev_list: list_head, + pub napi_hash_node: hlist_node, + pub irq: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub union flowi_uli { - pub ports: flowi_uli__bindgen_ty_1, - pub icmpt: flowi_uli__bindgen_ty_2, - pub gre_key: __be32, - pub mht: flowi_uli__bindgen_ty_3, +pub struct netdev_queue { + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub qdisc: *mut Qdisc, + pub qdisc_sleeping: *mut Qdisc, + pub kobj: kobject, + pub numa_node: ::aya_ebpf::cty::c_int, + pub tx_maxrate: ::aya_ebpf::cty::c_ulong, + pub trans_timeout: atomic_long_t, + pub sb_dev: *mut net_device, + pub pool: *mut xsk_buff_pool, + pub napi: *mut napi_struct, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub _xmit_lock: spinlock_t, + pub xmit_lock_owner: ::aya_ebpf::cty::c_int, + pub trans_start: ::aya_ebpf::cty::c_ulong, + pub state: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 40usize]>, + pub dql: dql, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flowi_uli__bindgen_ty_1 { - pub dport: __be16, - pub sport: __be16, +#[derive(Debug)] +pub struct xps_map { + pub len: ::aya_ebpf::cty::c_uint, + pub alloc_len: ::aya_ebpf::cty::c_uint, + pub rcu: callback_head, + pub queues: __IncompleteArrayField, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flowi_uli__bindgen_ty_2 { - pub type_: __u8, - pub code: __u8, +#[derive(Debug)] +pub struct xps_dev_maps { + pub rcu: callback_head, + pub nr_ids: ::aya_ebpf::cty::c_uint, + pub num_tc: s16, + pub attr_map: __IncompleteArrayField<*mut xps_map>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flowi_uli__bindgen_ty_3 { - pub type_: __u8, +pub struct netdev_fcoe_hbainfo { + pub manufacturer: [::aya_ebpf::cty::c_char; 64usize], + pub serial_number: [::aya_ebpf::cty::c_char; 64usize], + pub hardware_version: [::aya_ebpf::cty::c_char; 64usize], + pub driver_version: [::aya_ebpf::cty::c_char; 64usize], + pub optionrom_version: [::aya_ebpf::cty::c_char; 64usize], + pub firmware_version: [::aya_ebpf::cty::c_char; 64usize], + pub model: [::aya_ebpf::cty::c_char; 256usize], + pub model_description: [::aya_ebpf::cty::c_char; 256usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct flowi4 { - pub __fl_common: flowi_common, - pub saddr: __be32, - pub daddr: __be32, - pub uli: flowi_uli, +#[derive(Debug, Copy, Clone)] +pub struct netdev_phys_item_id { + pub id: [::aya_ebpf::cty::c_uchar; 32usize], + pub id_len: ::aya_ebpf::cty::c_uchar, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct flowi6 { - pub __fl_common: flowi_common, - pub daddr: in6_addr, - pub saddr: in6_addr, - pub flowlabel: __be32, - pub uli: flowi_uli, - pub mp_hash: __u32, +pub mod net_device_path_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEV_PATH_ETHERNET: Type = 0; + pub const DEV_PATH_VLAN: Type = 1; + pub const DEV_PATH_BRIDGE: Type = 2; + pub const DEV_PATH_PPPOE: Type = 3; + pub const DEV_PATH_DSA: Type = 4; + pub const DEV_PATH_MTK_WDMA: Type = 5; } #[repr(C)] #[derive(Copy, Clone)] -pub struct flowi { - pub u: flowi__bindgen_ty_1, +pub struct net_device_path { + pub type_: net_device_path_type::Type, + pub dev: *const net_device, + pub __bindgen_anon_1: net_device_path__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union flowi__bindgen_ty_1 { - pub __fl_common: flowi_common, - pub ip4: flowi4, - pub ip6: flowi6, +pub union net_device_path__bindgen_ty_1 { + pub encap: net_device_path__bindgen_ty_1__bindgen_ty_1, + pub bridge: net_device_path__bindgen_ty_1__bindgen_ty_2, + pub dsa: net_device_path__bindgen_ty_1__bindgen_ty_3, + pub mtk_wdma: net_device_path__bindgen_ty_1__bindgen_ty_4, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct prot_inuse { - pub all: ::aya_bpf::cty::c_int, - pub val: [::aya_bpf::cty::c_int; 64usize], +pub struct net_device_path__bindgen_ty_1__bindgen_ty_1 { + pub id: u16_, + pub proto: __be16, + pub h_dest: [u8_; 6usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct u64_stats_t { - pub v: local64_t, +pub struct net_device_path__bindgen_ty_1__bindgen_ty_2 { + pub vlan_mode: net_device_path__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1::Type, + pub vlan_id: u16_, + pub vlan_proto: __be16, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct icmpv6_mib_device { - pub mibs: [atomic_long_t; 7usize], +pub mod net_device_path__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEV_PATH_BR_VLAN_KEEP: Type = 0; + pub const DEV_PATH_BR_VLAN_TAG: Type = 1; + pub const DEV_PATH_BR_VLAN_UNTAG: Type = 2; + pub const DEV_PATH_BR_VLAN_UNTAG_HW: Type = 3; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct icmpv6msg_mib_device { - pub mibs: [atomic_long_t; 512usize], +pub struct net_device_path__bindgen_ty_1__bindgen_ty_3 { + pub port: ::aya_ebpf::cty::c_int, + pub proto: u16_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct udp_table { - pub hash: *mut udp_hslot, - pub hash2: *mut udp_hslot, - pub mask: ::aya_bpf::cty::c_uint, - pub log: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip_ra_chain { - pub next: *mut ip_ra_chain, - pub sk: *mut sock, - pub __bindgen_anon_1: ip_ra_chain__bindgen_ty_1, - pub rcu: callback_head, +pub struct net_device_path__bindgen_ty_1__bindgen_ty_4 { + pub wdma_idx: u8_, + pub queue: u8_, + pub wcid: u16_, + pub bss: u8_, + pub amsdu: u8_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ip_ra_chain__bindgen_ty_1 { - pub destructor: ::core::option::Option, - pub saved_sk: *mut sock, +#[derive(Debug, Copy, Clone)] +pub struct net_device_path_ctx { + pub dev: *const net_device, + pub daddr: [u8_; 6usize], + pub num_vlans: ::aya_ebpf::cty::c_int, + pub vlan: [net_device_path_ctx__bindgen_ty_1; 2usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fib_rules_ops { - pub family: ::aya_bpf::cty::c_int, - pub list: list_head, - pub rule_size: ::aya_bpf::cty::c_int, - pub addr_size: ::aya_bpf::cty::c_int, - pub unresolved_rules: ::aya_bpf::cty::c_int, - pub nr_goto_rules: ::aya_bpf::cty::c_int, - pub fib_rules_seq: ::aya_bpf::cty::c_uint, - pub action: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fib_rule, - arg2: *mut flowi, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut fib_lookup_arg, - ) -> ::aya_bpf::cty::c_int, - >, - pub suppress: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fib_rule, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut fib_lookup_arg, - ) -> bool_, - >, - pub match_: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fib_rule, - arg2: *mut flowi, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub configure: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fib_rule, - arg2: *mut sk_buff, - arg3: *mut fib_rule_hdr, - arg4: *mut *mut nlattr, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub delete: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub compare: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fib_rule, - arg2: *mut fib_rule_hdr, - arg3: *mut *mut nlattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub fill: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut fib_rule, - arg2: *mut sk_buff, - arg3: *mut fib_rule_hdr, - ) -> ::aya_bpf::cty::c_int, - >, - pub nlmsg_payload: ::core::option::Option usize>, - pub flush_cache: ::core::option::Option, - pub nlgroup: ::aya_bpf::cty::c_int, - pub rules_list: list_head, - pub owner: *mut module, - pub fro_net: *mut net, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug)] -pub struct fib_table { - pub tb_hlist: hlist_node, - pub tb_id: u32_, - pub tb_num_default: ::aya_bpf::cty::c_int, - pub rcu: callback_head, - pub tb_data: *mut ::aya_bpf::cty::c_ulong, - pub __data: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct inet_peer_base { - pub rb_root: rb_root, - pub lock: seqlock_t, - pub total: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fib_notifier_ops { - pub family: ::aya_bpf::cty::c_int, - pub list: list_head, - pub fib_seq_read: - ::core::option::Option ::aya_bpf::cty::c_uint>, - pub fib_dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut notifier_block, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub owner: *mut module, - pub rcu: callback_head, -} -pub type xdp_features_t = u32_; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct net_device_stats { - pub __bindgen_anon_1: net_device_stats__bindgen_ty_1, - pub __bindgen_anon_2: net_device_stats__bindgen_ty_2, - pub __bindgen_anon_3: net_device_stats__bindgen_ty_3, - pub __bindgen_anon_4: net_device_stats__bindgen_ty_4, - pub __bindgen_anon_5: net_device_stats__bindgen_ty_5, - pub __bindgen_anon_6: net_device_stats__bindgen_ty_6, - pub __bindgen_anon_7: net_device_stats__bindgen_ty_7, - pub __bindgen_anon_8: net_device_stats__bindgen_ty_8, - pub __bindgen_anon_9: net_device_stats__bindgen_ty_9, - pub __bindgen_anon_10: net_device_stats__bindgen_ty_10, - pub __bindgen_anon_11: net_device_stats__bindgen_ty_11, - pub __bindgen_anon_12: net_device_stats__bindgen_ty_12, - pub __bindgen_anon_13: net_device_stats__bindgen_ty_13, - pub __bindgen_anon_14: net_device_stats__bindgen_ty_14, - pub __bindgen_anon_15: net_device_stats__bindgen_ty_15, - pub __bindgen_anon_16: net_device_stats__bindgen_ty_16, - pub __bindgen_anon_17: net_device_stats__bindgen_ty_17, - pub __bindgen_anon_18: net_device_stats__bindgen_ty_18, - pub __bindgen_anon_19: net_device_stats__bindgen_ty_19, - pub __bindgen_anon_20: net_device_stats__bindgen_ty_20, - pub __bindgen_anon_21: net_device_stats__bindgen_ty_21, - pub __bindgen_anon_22: net_device_stats__bindgen_ty_22, - pub __bindgen_anon_23: net_device_stats__bindgen_ty_23, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_1 { - pub rx_packets: ::aya_bpf::cty::c_ulong, - pub __rx_packets: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_2 { - pub tx_packets: ::aya_bpf::cty::c_ulong, - pub __tx_packets: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_3 { - pub rx_bytes: ::aya_bpf::cty::c_ulong, - pub __rx_bytes: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_4 { - pub tx_bytes: ::aya_bpf::cty::c_ulong, - pub __tx_bytes: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_5 { - pub rx_errors: ::aya_bpf::cty::c_ulong, - pub __rx_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_6 { - pub tx_errors: ::aya_bpf::cty::c_ulong, - pub __tx_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_7 { - pub rx_dropped: ::aya_bpf::cty::c_ulong, - pub __rx_dropped: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_8 { - pub tx_dropped: ::aya_bpf::cty::c_ulong, - pub __tx_dropped: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_9 { - pub multicast: ::aya_bpf::cty::c_ulong, - pub __multicast: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_10 { - pub collisions: ::aya_bpf::cty::c_ulong, - pub __collisions: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_11 { - pub rx_length_errors: ::aya_bpf::cty::c_ulong, - pub __rx_length_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_12 { - pub rx_over_errors: ::aya_bpf::cty::c_ulong, - pub __rx_over_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_13 { - pub rx_crc_errors: ::aya_bpf::cty::c_ulong, - pub __rx_crc_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_14 { - pub rx_frame_errors: ::aya_bpf::cty::c_ulong, - pub __rx_frame_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_15 { - pub rx_fifo_errors: ::aya_bpf::cty::c_ulong, - pub __rx_fifo_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_16 { - pub rx_missed_errors: ::aya_bpf::cty::c_ulong, - pub __rx_missed_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_17 { - pub tx_aborted_errors: ::aya_bpf::cty::c_ulong, - pub __tx_aborted_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_18 { - pub tx_carrier_errors: ::aya_bpf::cty::c_ulong, - pub __tx_carrier_errors: atomic_long_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_19 { - pub tx_fifo_errors: ::aya_bpf::cty::c_ulong, - pub __tx_fifo_errors: atomic_long_t, +pub struct net_device_path_ctx__bindgen_ty_1 { + pub id: u16_, + pub proto: __be16, } -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_20 { - pub tx_heartbeat_errors: ::aya_bpf::cty::c_ulong, - pub __tx_heartbeat_errors: atomic_long_t, +pub mod tc_setup_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const TC_QUERY_CAPS: Type = 0; + pub const TC_SETUP_QDISC_MQPRIO: Type = 1; + pub const TC_SETUP_CLSU32: Type = 2; + pub const TC_SETUP_CLSFLOWER: Type = 3; + pub const TC_SETUP_CLSMATCHALL: Type = 4; + pub const TC_SETUP_CLSBPF: Type = 5; + pub const TC_SETUP_BLOCK: Type = 6; + pub const TC_SETUP_QDISC_CBS: Type = 7; + pub const TC_SETUP_QDISC_RED: Type = 8; + pub const TC_SETUP_QDISC_PRIO: Type = 9; + pub const TC_SETUP_QDISC_MQ: Type = 10; + pub const TC_SETUP_QDISC_ETF: Type = 11; + pub const TC_SETUP_ROOT_QDISC: Type = 12; + pub const TC_SETUP_QDISC_GRED: Type = 13; + pub const TC_SETUP_QDISC_TAPRIO: Type = 14; + pub const TC_SETUP_FT: Type = 15; + pub const TC_SETUP_QDISC_ETS: Type = 16; + pub const TC_SETUP_QDISC_TBF: Type = 17; + pub const TC_SETUP_QDISC_FIFO: Type = 18; + pub const TC_SETUP_QDISC_HTB: Type = 19; + pub const TC_SETUP_ACT: Type = 20; } -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_21 { - pub tx_window_errors: ::aya_bpf::cty::c_ulong, - pub __tx_window_errors: atomic_long_t, +pub mod bpf_netdev_command { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const XDP_SETUP_PROG: Type = 0; + pub const XDP_SETUP_PROG_HW: Type = 1; + pub const BPF_OFFLOAD_MAP_ALLOC: Type = 2; + pub const BPF_OFFLOAD_MAP_FREE: Type = 3; + pub const XDP_SETUP_XSK_POOL: Type = 4; } #[repr(C)] #[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_22 { - pub rx_compressed: ::aya_bpf::cty::c_ulong, - pub __rx_compressed: atomic_long_t, +pub struct netdev_bpf { + pub command: bpf_netdev_command::Type, + pub __bindgen_anon_1: netdev_bpf__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union net_device_stats__bindgen_ty_23 { - pub tx_compressed: ::aya_bpf::cty::c_ulong, - pub __tx_compressed: atomic_long_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_hw_addr_list { - pub list: list_head, - pub count: ::aya_bpf::cty::c_int, - pub tree: rb_root, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tipc_bearer { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mpls_dev { - _unused: [u8; 0], -} -pub mod rx_handler_result { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RX_HANDLER_CONSUMED: Type = 0; - pub const RX_HANDLER_ANOTHER: Type = 1; - pub const RX_HANDLER_EXACT: Type = 2; - pub const RX_HANDLER_PASS: Type = 3; -} -pub use self::rx_handler_result::Type as rx_handler_result_t; -pub type rx_handler_func_t = - ::core::option::Option rx_handler_result_t>; -pub mod netdev_ml_priv_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ML_PRIV_NONE: Type = 0; - pub const ML_PRIV_CAN: Type = 1; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pcpu_dstats { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct garp_port { - _unused: [u8; 0], +pub union netdev_bpf__bindgen_ty_1 { + pub __bindgen_anon_1: netdev_bpf__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: netdev_bpf__bindgen_ty_1__bindgen_ty_2, + pub xsk: netdev_bpf__bindgen_ty_1__bindgen_ty_3, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mrp_port { - _unused: [u8; 0], +pub struct netdev_bpf__bindgen_ty_1__bindgen_ty_1 { + pub flags: u32_, + pub prog: *mut bpf_prog, + pub extack: *mut netlink_ext_ack, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netdev_tc_txq { - pub count: u16_, - pub offset: u16_, +pub struct netdev_bpf__bindgen_ty_1__bindgen_ty_2 { + pub offmap: *mut bpf_offloaded_map, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct udp_tunnel_nic { - _unused: [u8; 0], +pub struct netdev_bpf__bindgen_ty_1__bindgen_ty_3 { + pub pool: *mut xsk_buff_pool, + pub queue_id: u16_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_xdp_entity { - pub prog: *mut bpf_prog, - pub link: *mut bpf_xdp_link, +pub struct xfrmdev_ops { + pub xdo_dev_state_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut xfrm_state, + arg2: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub xdo_dev_state_delete: ::core::option::Option, + pub xdo_dev_state_free: ::core::option::Option, + pub xdo_dev_offload_ok: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut xfrm_state) -> bool_, + >, + pub xdo_dev_state_advance_esn: + ::core::option::Option, + pub xdo_dev_state_update_curlft: + ::core::option::Option, + pub xdo_dev_policy_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut xfrm_policy, + arg2: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub xdo_dev_policy_delete: ::core::option::Option, + pub xdo_dev_policy_free: ::core::option::Option, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct net_device { - pub name: [::aya_bpf::cty::c_char; 16usize], - pub name_node: *mut netdev_name_node, - pub ifalias: *mut dev_ifalias, - pub mem_end: ::aya_bpf::cty::c_ulong, - pub mem_start: ::aya_bpf::cty::c_ulong, - pub base_addr: ::aya_bpf::cty::c_ulong, - pub state: ::aya_bpf::cty::c_ulong, - pub dev_list: list_head, - pub napi_list: list_head, - pub unreg_list: list_head, - pub close_list: list_head, - pub ptype_all: list_head, - pub ptype_specific: list_head, - pub adj_list: net_device__bindgen_ty_1, - pub flags: ::aya_bpf::cty::c_uint, - pub xdp_features: xdp_features_t, - pub priv_flags: ::aya_bpf::cty::c_ulonglong, - pub netdev_ops: *const net_device_ops, - pub xdp_metadata_ops: *const xdp_metadata_ops, - pub ifindex: ::aya_bpf::cty::c_int, - pub gflags: ::aya_bpf::cty::c_ushort, - pub hard_header_len: ::aya_bpf::cty::c_ushort, - pub mtu: ::aya_bpf::cty::c_uint, - pub needed_headroom: ::aya_bpf::cty::c_ushort, - pub needed_tailroom: ::aya_bpf::cty::c_ushort, - pub features: netdev_features_t, - pub hw_features: netdev_features_t, - pub wanted_features: netdev_features_t, - pub vlan_features: netdev_features_t, - pub hw_enc_features: netdev_features_t, - pub mpls_features: netdev_features_t, - pub gso_partial_features: netdev_features_t, - pub min_mtu: ::aya_bpf::cty::c_uint, - pub max_mtu: ::aya_bpf::cty::c_uint, - pub type_: ::aya_bpf::cty::c_ushort, - pub min_header_len: ::aya_bpf::cty::c_uchar, - pub name_assign_type: ::aya_bpf::cty::c_uchar, - pub group: ::aya_bpf::cty::c_int, - pub stats: net_device_stats, - pub core_stats: *mut net_device_core_stats, - pub carrier_up_count: atomic_t, - pub carrier_down_count: atomic_t, - pub wireless_handlers: *const iw_handler_def, - pub wireless_data: *mut iw_public_data, - pub ethtool_ops: *const ethtool_ops, - pub l3mdev_ops: *const l3mdev_ops, - pub ndisc_ops: *const ndisc_ops, - pub xfrmdev_ops: *const xfrmdev_ops, - pub tlsdev_ops: *const tlsdev_ops, - pub header_ops: *const header_ops, - pub operstate: ::aya_bpf::cty::c_uchar, - pub link_mode: ::aya_bpf::cty::c_uchar, - pub if_port: ::aya_bpf::cty::c_uchar, - pub dma: ::aya_bpf::cty::c_uchar, - pub perm_addr: [::aya_bpf::cty::c_uchar; 32usize], - pub addr_assign_type: ::aya_bpf::cty::c_uchar, - pub addr_len: ::aya_bpf::cty::c_uchar, - pub upper_level: ::aya_bpf::cty::c_uchar, - pub lower_level: ::aya_bpf::cty::c_uchar, - pub neigh_priv_len: ::aya_bpf::cty::c_ushort, - pub dev_id: ::aya_bpf::cty::c_ushort, - pub dev_port: ::aya_bpf::cty::c_ushort, - pub padded: ::aya_bpf::cty::c_ushort, - pub addr_list_lock: spinlock_t, - pub irq: ::aya_bpf::cty::c_int, - pub uc: netdev_hw_addr_list, - pub mc: netdev_hw_addr_list, - pub dev_addrs: netdev_hw_addr_list, - pub queues_kset: *mut kset, - pub promiscuity: ::aya_bpf::cty::c_uint, - pub allmulti: ::aya_bpf::cty::c_uint, - pub uc_promisc: bool_, - pub ip_ptr: *mut in_device, - pub ip6_ptr: *mut inet6_dev, - pub vlan_info: *mut vlan_info, - pub dsa_ptr: *mut dsa_port, - pub tipc_ptr: *mut tipc_bearer, - pub atalk_ptr: *mut ::aya_bpf::cty::c_void, - pub ax25_ptr: *mut ::aya_bpf::cty::c_void, - pub ieee80211_ptr: *mut wireless_dev, - pub ieee802154_ptr: *mut wpan_dev, - pub mpls_ptr: *mut mpls_dev, - pub mctp_ptr: *mut mctp_dev, - pub dev_addr: *const ::aya_bpf::cty::c_uchar, - pub _rx: *mut netdev_rx_queue, - pub num_rx_queues: ::aya_bpf::cty::c_uint, - pub real_num_rx_queues: ::aya_bpf::cty::c_uint, - pub xdp_prog: *mut bpf_prog, - pub gro_flush_timeout: ::aya_bpf::cty::c_ulong, - pub napi_defer_hard_irqs: ::aya_bpf::cty::c_int, - pub gro_max_size: ::aya_bpf::cty::c_uint, - pub gro_ipv4_max_size: ::aya_bpf::cty::c_uint, - pub rx_handler: rx_handler_func_t, - pub rx_handler_data: *mut ::aya_bpf::cty::c_void, - pub miniq_ingress: *mut mini_Qdisc, - pub ingress_queue: *mut netdev_queue, - pub nf_hooks_ingress: *mut nf_hook_entries, - pub broadcast: [::aya_bpf::cty::c_uchar; 32usize], - pub rx_cpu_rmap: *mut cpu_rmap, - pub index_hlist: hlist_node, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, - pub _tx: *mut netdev_queue, - pub num_tx_queues: ::aya_bpf::cty::c_uint, - pub real_num_tx_queues: ::aya_bpf::cty::c_uint, - pub qdisc: *mut Qdisc, - pub tx_queue_len: ::aya_bpf::cty::c_uint, - pub tx_global_lock: spinlock_t, - pub xdp_bulkq: *mut xdp_dev_bulk_queue, - pub xps_maps: [*mut xps_dev_maps; 2usize], - pub miniq_egress: *mut mini_Qdisc, - pub nf_hooks_egress: *mut nf_hook_entries, - pub qdisc_hash: [hlist_head; 16usize], - pub watchdog_timer: timer_list, - pub watchdog_timeo: ::aya_bpf::cty::c_int, - pub proto_down_reason: u32_, - pub todo_list: list_head, - pub pcpu_refcnt: *mut ::aya_bpf::cty::c_int, - pub refcnt_tracker: ref_tracker_dir, - pub link_watch_list: list_head, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, - pub dismantle: bool_, - pub _bitfield_align_3: [u16; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 2usize]>, - pub needs_free_netdev: bool_, - pub priv_destructor: ::core::option::Option, - pub npinfo: *mut netpoll_info, - pub nd_net: possible_net_t, - pub ml_priv: *mut ::aya_bpf::cty::c_void, - pub ml_priv_type: netdev_ml_priv_type::Type, - pub __bindgen_anon_1: net_device__bindgen_ty_4, - pub garp_port: *mut garp_port, - pub mrp_port: *mut mrp_port, - pub dm_private: *mut dm_hw_stat_delta, - pub dev: device, - pub sysfs_groups: [*const attribute_group; 4usize], - pub sysfs_rx_queue_group: *const attribute_group, - pub rtnl_link_ops: *const rtnl_link_ops, - pub gso_max_size: ::aya_bpf::cty::c_uint, - pub tso_max_size: ::aya_bpf::cty::c_uint, - pub gso_max_segs: u16_, - pub tso_max_segs: u16_, - pub gso_ipv4_max_size: ::aya_bpf::cty::c_uint, - pub dcbnl_ops: *const dcbnl_rtnl_ops, - pub num_tc: s16, - pub tc_to_txq: [netdev_tc_txq; 16usize], - pub prio_tc_map: [u8_; 16usize], - pub fcoe_ddp_xid: ::aya_bpf::cty::c_uint, - pub priomap: *mut netprio_map, - pub phydev: *mut phy_device, - pub sfp_bus: *mut sfp_bus, - pub qdisc_tx_busylock: *mut lock_class_key, - pub proto_down: bool_, - pub _bitfield_align_4: [u8; 0], - pub _bitfield_4: __BindgenBitfieldUnit<[u8; 1usize]>, - pub net_notifier_list: list_head, - pub macsec_ops: *const macsec_ops, - pub udp_tunnel_nic_info: *const udp_tunnel_nic_info, - pub udp_tunnel_nic: *mut udp_tunnel_nic, - pub xdp_state: [bpf_xdp_entity; 3usize], - pub dev_addr_shadow: [u8_; 32usize], - pub linkwatch_dev_tracker: netdevice_tracker, - pub watchdog_dev_tracker: netdevice_tracker, - pub dev_registered_tracker: netdevice_tracker, - pub offload_xstats_l3: *mut rtnl_hw_stats64, - pub devlink_port: *mut devlink_port, - pub _bitfield_align_5: [u8; 0], - pub _bitfield_5: __BindgenBitfieldUnit<[u8; 16usize]>, +#[derive(Debug)] +pub struct dev_ifalias { + pub rcuhead: callback_head, + pub ifalias: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct net_device__bindgen_ty_1 { - pub upper: list_head, - pub lower: list_head, -} -pub mod net_device__bindgen_ty_2 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NETREG_UNINITIALIZED: Type = 0; - pub const NETREG_REGISTERED: Type = 1; - pub const NETREG_UNREGISTERING: Type = 2; - pub const NETREG_UNREGISTERED: Type = 3; - pub const NETREG_RELEASED: Type = 4; - pub const NETREG_DUMMY: Type = 5; -} -pub mod net_device__bindgen_ty_3 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RTNL_LINK_INITIALIZED: Type = 0; - pub const RTNL_LINK_INITIALIZING: Type = 1; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device__bindgen_ty_4 { - pub lstats: *mut pcpu_lstats, - pub tstats: *mut pcpu_sw_netstats, - pub dstats: *mut pcpu_dstats, -} -impl net_device { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn reg_state(&self) -> net_device__bindgen_ty_2::Type { - unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 8u8) as u32) } - } - #[inline] - pub fn set_reg_state(&mut self, val: net_device__bindgen_ty_2::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_2.set(0usize, 8u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_2( - reg_state: net_device__bindgen_ty_2::Type, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 8u8, { - let reg_state: u32 = unsafe { ::core::mem::transmute(reg_state) }; - reg_state as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn rtnl_link_state(&self) -> net_device__bindgen_ty_3::Type { - unsafe { ::core::mem::transmute(self._bitfield_3.get(0usize, 16u8) as u32) } - } - #[inline] - pub fn set_rtnl_link_state(&mut self, val: net_device__bindgen_ty_3::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_3.set(0usize, 16u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_3( - rtnl_link_state: net_device__bindgen_ty_3::Type, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 16u8, { - let rtnl_link_state: u32 = unsafe { ::core::mem::transmute(rtnl_link_state) }; - rtnl_link_state as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn wol_enabled(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_4.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_wol_enabled(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_4.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn threaded(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_4.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_threaded(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_4.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_4( - wol_enabled: ::aya_bpf::cty::c_uint, - threaded: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let wol_enabled: u32 = unsafe { ::core::mem::transmute(wol_enabled) }; - wol_enabled as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let threaded: u32 = unsafe { ::core::mem::transmute(threaded) }; - threaded as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_5() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct hh_cache { - pub hh_len: ::aya_bpf::cty::c_uint, - pub hh_lock: seqlock_t, - pub hh_data: [::aya_bpf::cty::c_ulong; 16usize], -} -#[repr(C)] -pub struct neighbour { - pub next: *mut neighbour, - pub tbl: *mut neigh_table, - pub parms: *mut neigh_parms, - pub confirmed: ::aya_bpf::cty::c_ulong, - pub updated: ::aya_bpf::cty::c_ulong, - pub lock: rwlock_t, - pub refcnt: refcount_t, - pub arp_queue_len_bytes: ::aya_bpf::cty::c_uint, - pub arp_queue: sk_buff_head, - pub timer: timer_list, - pub used: ::aya_bpf::cty::c_ulong, - pub probes: atomic_t, - pub nud_state: u8_, - pub type_: u8_, - pub dead: u8_, - pub protocol: u8_, - pub flags: u32_, - pub ha_lock: seqlock_t, - pub __bindgen_padding_0: [u8; 4usize], - pub ha: [::aya_bpf::cty::c_uchar; 32usize], - pub hh: hh_cache, - pub output: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut neighbour, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, +pub struct net_device_ops { + pub ndo_init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub ops: *const neigh_ops, - pub gc_list: list_head, - pub managed_list: list_head, - pub rcu: callback_head, - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub primary_key: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ipv6_stable_secret { - pub initialized: bool_, - pub secret: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ipv6_devconf { - pub forwarding: __s32, - pub hop_limit: __s32, - pub mtu6: __s32, - pub accept_ra: __s32, - pub accept_redirects: __s32, - pub autoconf: __s32, - pub dad_transmits: __s32, - pub rtr_solicits: __s32, - pub rtr_solicit_interval: __s32, - pub rtr_solicit_max_interval: __s32, - pub rtr_solicit_delay: __s32, - pub force_mld_version: __s32, - pub mldv1_unsolicited_report_interval: __s32, - pub mldv2_unsolicited_report_interval: __s32, - pub use_tempaddr: __s32, - pub temp_valid_lft: __s32, - pub temp_prefered_lft: __s32, - pub regen_max_retry: __s32, - pub max_desync_factor: __s32, - pub max_addresses: __s32, - pub accept_ra_defrtr: __s32, - pub ra_defrtr_metric: __u32, - pub accept_ra_min_hop_limit: __s32, - pub accept_ra_pinfo: __s32, - pub ignore_routes_with_linkdown: __s32, - pub accept_ra_rtr_pref: __s32, - pub rtr_probe_interval: __s32, - pub accept_ra_rt_info_min_plen: __s32, - pub accept_ra_rt_info_max_plen: __s32, - pub proxy_ndp: __s32, - pub accept_source_route: __s32, - pub accept_ra_from_local: __s32, - pub optimistic_dad: __s32, - pub use_optimistic: __s32, - pub mc_forwarding: atomic_t, - pub disable_ipv6: __s32, - pub drop_unicast_in_l2_multicast: __s32, - pub accept_dad: __s32, - pub force_tllao: __s32, - pub ndisc_notify: __s32, - pub suppress_frag_ndisc: __s32, - pub accept_ra_mtu: __s32, - pub drop_unsolicited_na: __s32, - pub accept_untracked_na: __s32, - pub stable_secret: ipv6_stable_secret, - pub use_oif_addrs_only: __s32, - pub keep_addr_on_down: __s32, - pub seg6_enabled: __s32, - pub seg6_require_hmac: __s32, - pub enhanced_dad: __u32, - pub addr_gen_mode: __u32, - pub disable_policy: __s32, - pub ndisc_tclass: __s32, - pub rpl_seg_enabled: __s32, - pub ioam6_id: __u32, - pub ioam6_id_wide: __u32, - pub ioam6_enabled: __u8, - pub ndisc_evict_nocarrier: __u8, - pub sysctl_header: *mut ctl_table_header, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct scatterlist { - pub page_link: ::aya_bpf::cty::c_ulong, - pub offset: ::aya_bpf::cty::c_uint, - pub length: ::aya_bpf::cty::c_uint, - pub dma_address: dma_addr_t, - pub dma_length: ::aya_bpf::cty::c_uint, - pub dma_flags: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct gro_list { - pub list: list_head, - pub count: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct napi_struct { - pub poll_list: list_head, - pub state: ::aya_bpf::cty::c_ulong, - pub weight: ::aya_bpf::cty::c_int, - pub defer_hard_irqs_count: ::aya_bpf::cty::c_int, - pub gro_bitmask: ::aya_bpf::cty::c_ulong, - pub poll: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut napi_struct, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + pub ndo_uninit: ::core::option::Option, + pub ndo_open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub poll_owner: ::aya_bpf::cty::c_int, - pub list_owner: ::aya_bpf::cty::c_int, - pub dev: *mut net_device, - pub gro_hash: [gro_list; 8usize], - pub skb: *mut sk_buff, - pub rx_list: list_head, - pub rx_count: ::aya_bpf::cty::c_int, - pub napi_id: ::aya_bpf::cty::c_uint, - pub timer: hrtimer, - pub thread: *mut task_struct, - pub dev_list: list_head, - pub napi_hash_node: hlist_node, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct skb_shared_hwtstamps { - pub __bindgen_anon_1: skb_shared_hwtstamps__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union skb_shared_hwtstamps__bindgen_ty_1 { - pub hwtstamp: ktime_t, - pub netdev_data: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -pub struct request_sock { - pub __req_common: sock_common, - pub dl_next: *mut request_sock, - pub mss: u16_, - pub num_retrans: u8_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub ts_recent: u32_, - pub rsk_timer: timer_list, - pub rsk_ops: *const request_sock_ops, - pub sk: *mut sock, - pub saved_syn: *mut saved_syn, - pub secid: u32_, - pub peer_secid: u32_, - pub timeout: u32_, -} -impl request_sock { - #[inline] - pub fn syncookie(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_syncookie(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn num_timeout(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 7u8) as u8) } - } - #[inline] - pub fn set_num_timeout(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 7u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(syncookie: u8_, num_timeout: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let syncookie: u8 = unsafe { ::core::mem::transmute(syncookie) }; - syncookie as u64 - }); - __bindgen_bitfield_unit.set(1usize, 7u8, { - let num_timeout: u8 = unsafe { ::core::mem::transmute(num_timeout) }; - num_timeout as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dql { - pub num_queued: ::aya_bpf::cty::c_uint, - pub adj_limit: ::aya_bpf::cty::c_uint, - pub last_obj_cnt: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, - pub __bindgen_padding_0: u32, - pub limit: ::aya_bpf::cty::c_uint, - pub num_completed: ::aya_bpf::cty::c_uint, - pub prev_ovlimit: ::aya_bpf::cty::c_uint, - pub prev_num_queued: ::aya_bpf::cty::c_uint, - pub prev_last_obj_cnt: ::aya_bpf::cty::c_uint, - pub lowest_slack: ::aya_bpf::cty::c_uint, - pub slack_start_time: ::aya_bpf::cty::c_ulong, - pub max_limit: ::aya_bpf::cty::c_uint, - pub min_limit: ::aya_bpf::cty::c_uint, - pub slack_hold_time: ::aya_bpf::cty::c_uint, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, - pub __bindgen_padding_1: u32, -} -impl dql { - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee_ets { - pub willing: __u8, - pub ets_cap: __u8, - pub cbs: __u8, - pub tc_tx_bw: [__u8; 8usize], - pub tc_rx_bw: [__u8; 8usize], - pub tc_tsa: [__u8; 8usize], - pub prio_tc: [__u8; 8usize], - pub tc_reco_bw: [__u8; 8usize], - pub tc_reco_tsa: [__u8; 8usize], - pub reco_prio_tc: [__u8; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee_maxrate { - pub tc_maxrate: [__u64; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee_qcn { - pub rpg_enable: [__u8; 8usize], - pub rppp_max_rps: [__u32; 8usize], - pub rpg_time_reset: [__u32; 8usize], - pub rpg_byte_reset: [__u32; 8usize], - pub rpg_threshold: [__u32; 8usize], - pub rpg_max_rate: [__u32; 8usize], - pub rpg_ai_rate: [__u32; 8usize], - pub rpg_hai_rate: [__u32; 8usize], - pub rpg_gd: [__u32; 8usize], - pub rpg_min_dec_fac: [__u32; 8usize], - pub rpg_min_rate: [__u32; 8usize], - pub cndd_state_machine: [__u32; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee_qcn_stats { - pub rppp_rp_centiseconds: [__u64; 8usize], - pub rppp_created_rps: [__u32; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee_pfc { - pub pfc_cap: __u8, - pub pfc_en: __u8, - pub mbc: __u8, - pub delay: __u16, - pub requests: [__u64; 8usize], - pub indications: [__u64; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dcbnl_buffer { - pub prio2buffer: [__u8; 8usize], - pub buffer_size: [__u32; 8usize], - pub total_size: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cee_pg { - pub willing: __u8, - pub error: __u8, - pub pg_en: __u8, - pub tcs_supported: __u8, - pub pg_bw: [__u8; 8usize], - pub prio_pg: [__u8; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cee_pfc { - pub willing: __u8, - pub error: __u8, - pub pfc_en: __u8, - pub tcs_supported: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dcb_app { - pub selector: __u8, - pub priority: __u8, - pub protocol: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dcb_peer_app_info { - pub willing: __u8, - pub error: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dcbnl_rtnl_ops { - pub ieee_getets: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_ets) -> ::aya_bpf::cty::c_int, + pub ndo_stop: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub ieee_setets: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_ets) -> ::aya_bpf::cty::c_int, + pub ndo_start_xmit: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> netdev_tx_t, >, - pub ieee_getmaxrate: ::core::option::Option< + pub ndo_features_check: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ieee_maxrate, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sk_buff, + arg2: *mut net_device, + arg3: netdev_features_t, + ) -> netdev_features_t, >, - pub ieee_setmaxrate: ::core::option::Option< + pub ndo_select_queue: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ieee_maxrate, - ) -> ::aya_bpf::cty::c_int, - >, - pub ieee_getqcn: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_qcn) -> ::aya_bpf::cty::c_int, + arg2: *mut sk_buff, + arg3: *mut net_device, + ) -> u16_, >, - pub ieee_setqcn: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_qcn) -> ::aya_bpf::cty::c_int, + pub ndo_change_rx_flags: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int), >, - pub ieee_getqcnstats: ::core::option::Option< + pub ndo_set_rx_mode: ::core::option::Option, + pub ndo_set_mac_address: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ieee_qcn_stats, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub ieee_getpfc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_pfc) -> ::aya_bpf::cty::c_int, - >, - pub ieee_setpfc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_pfc) -> ::aya_bpf::cty::c_int, - >, - pub ieee_getapp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_bpf::cty::c_int, - >, - pub ieee_setapp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_bpf::cty::c_int, - >, - pub ieee_delapp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_bpf::cty::c_int, + pub ndo_validate_addr: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub ieee_peer_getets: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_ets) -> ::aya_bpf::cty::c_int, + pub ndo_do_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ifreq, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub ieee_peer_getpfc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ieee_pfc) -> ::aya_bpf::cty::c_int, + pub ndo_eth_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ifreq, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub getstate: ::core::option::Option u8_>, - pub setstate: - ::core::option::Option u8_>, - pub getpermhwaddr: - ::core::option::Option, - pub setpgtccfgtx: ::core::option::Option< + pub ndo_siocbond: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - arg4: u8_, - arg5: u8_, - arg6: u8_, - ), + arg2: *mut ifreq, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub setpgbwgcfgtx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: u8_), + pub ndo_siocwandev: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut if_settings, + ) -> ::aya_ebpf::cty::c_int, >, - pub setpgtccfgrx: ::core::option::Option< + pub ndo_siocdevprivate: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - arg4: u8_, - arg5: u8_, - arg6: u8_, - ), + arg2: *mut ifreq, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub setpgbwgcfgrx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: u8_), + pub ndo_set_config: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ifmap) -> ::aya_ebpf::cty::c_int, >, - pub getpgtccfgtx: ::core::option::Option< + pub ndo_change_mtu: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut u8_, - arg4: *mut u8_, - arg5: *mut u8_, - arg6: *mut u8_, - ), - >, - pub getpgbwgcfgtx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: *mut u8_), + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub getpgtccfgrx: ::core::option::Option< + pub ndo_neigh_setup: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut u8_, - arg4: *mut u8_, - arg5: *mut u8_, - arg6: *mut u8_, - ), + arg2: *mut neigh_parms, + ) -> ::aya_ebpf::cty::c_int, >, - pub getpgbwgcfgrx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: *mut u8_), + pub ndo_tx_timeout: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_uint), >, - pub setpfccfg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: u8_), + pub ndo_get_stats64: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut rtnl_link_stats64), >, - pub getpfccfg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: *mut u8_), + pub ndo_has_offload_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *const net_device, arg2: ::aya_ebpf::cty::c_int) -> bool_, >, - pub setall: ::core::option::Option u8_>, - pub getcap: ::core::option::Option< + pub ndo_get_offload_stats: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut u8_, - ) -> u8_, + arg1: ::aya_ebpf::cty::c_int, + arg2: *const net_device, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub getnumtcs: ::core::option::Option< + pub ndo_get_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> *mut net_device_stats, + >, + pub ndo_vlan_rx_add_vid: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, + arg2: __be16, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub setnumtcs: ::core::option::Option< + pub ndo_vlan_rx_kill_vid: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub getpfcstate: ::core::option::Option u8_>, - pub setpfcstate: ::core::option::Option, - pub getbcncfg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: *mut u32_), - >, - pub setbcncfg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: u32_), + arg2: __be16, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub getbcnrp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: *mut u8_), + pub ndo_poll_controller: ::core::option::Option, + pub ndo_netpoll_setup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut netpoll_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub setbcnrp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: u8_), + pub ndo_netpoll_cleanup: ::core::option::Option, + pub ndo_set_vf_mac: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, >, - pub setapp: ::core::option::Option< + pub ndo_set_vf_vlan: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: u8_, + arg2: ::aya_ebpf::cty::c_int, arg3: u16_, arg4: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub getapp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: u8_, arg3: u16_) -> ::aya_bpf::cty::c_int, + arg5: __be16, + ) -> ::aya_ebpf::cty::c_int, >, - pub getfeatcfg: ::core::option::Option< + pub ndo_set_vf_rate: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut u8_, - ) -> u8_, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub setfeatcfg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int, arg3: u8_) -> u8_, - >, - pub getdcbx: ::core::option::Option u8_>, - pub setdcbx: - ::core::option::Option u8_>, - pub peer_getappinfo: ::core::option::Option< + pub ndo_set_vf_spoofchk: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut dcb_peer_app_info, - arg3: *mut u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub peer_getapptable: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_bpf::cty::c_int, - >, - pub cee_peer_getpg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut cee_pg) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, >, - pub cee_peer_getpfc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut cee_pfc) -> ::aya_bpf::cty::c_int, + pub ndo_set_vf_trust: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, >, - pub dcbnl_getbuffer: ::core::option::Option< + pub ndo_get_vf_config: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut dcbnl_buffer, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ifla_vf_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub dcbnl_setbuffer: ::core::option::Option< + pub ndo_set_vf_link_state: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut dcbnl_buffer, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub dcbnl_setapptrust: ::core::option::Option< + pub ndo_get_vf_stats: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut u8_, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ifla_vf_stats, + ) -> ::aya_ebpf::cty::c_int, >, - pub dcbnl_getapptrust: ::core::option::Option< + pub ndo_set_vf_port: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut u8_, - arg3: *mut ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut *mut nlattr, + ) -> ::aya_ebpf::cty::c_int, >, - pub dcbnl_setrewr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_bpf::cty::c_int, + pub ndo_get_vf_port: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut sk_buff, + ) -> ::aya_ebpf::cty::c_int, >, - pub dcbnl_delrewr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut dcb_app) -> ::aya_bpf::cty::c_int, + pub ndo_get_vf_guid: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ifla_vf_guid, + arg4: *mut ifla_vf_guid, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_set_vf_guid: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u64_, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_set_vf_rss_query_en: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_setup_tc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: tc_setup_type::Type, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_enable: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_disable: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_ddp_setup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: u16_, + arg3: *mut scatterlist, + arg4: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_ddp_done: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: u16_) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_ddp_target: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: u16_, + arg3: *mut scatterlist, + arg4: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_get_hbainfo: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut netdev_fcoe_hbainfo, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fcoe_get_wwn: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut u64_, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_rx_flow_steer: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *const sk_buff, + arg3: u16_, + arg4: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_add_slave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut net_device, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_del_slave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut net_device, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_xmit_slave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut sk_buff, + arg3: bool_, + ) -> *mut net_device, + >, + pub ndo_sk_get_lower_dev: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut sock) -> *mut net_device, + >, + pub ndo_fix_features: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: netdev_features_t) -> netdev_features_t, + >, + pub ndo_set_features: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: netdev_features_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_neigh_construct: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut neighbour) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_neigh_destroy: + ::core::option::Option, + pub ndo_fdb_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ndmsg, + arg2: *mut *mut nlattr, + arg3: *mut net_device, + arg4: *const ::aya_ebpf::cty::c_uchar, + arg5: u16_, + arg6: u16_, + arg7: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fdb_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ndmsg, + arg2: *mut *mut nlattr, + arg3: *mut net_device, + arg4: *const ::aya_ebpf::cty::c_uchar, + arg5: u16_, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fdb_del_bulk: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nlmsghdr, + arg2: *mut net_device, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fdb_dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut netlink_callback, + arg3: *mut net_device, + arg4: *mut net_device, + arg5: *mut ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fdb_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut *mut nlattr, + arg3: *mut net_device, + arg4: *const ::aya_ebpf::cty::c_uchar, + arg5: u16_, + arg6: u32_, + arg7: u32_, + arg8: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_mdb_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut *mut nlattr, + arg3: u16_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_mdb_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut *mut nlattr, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_mdb_del_bulk: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut *mut nlattr, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_mdb_dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut sk_buff, + arg3: *mut netlink_callback, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_mdb_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut *mut nlattr, + arg3: u32_, + arg4: u32_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_bridge_setlink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut nlmsghdr, + arg3: u16_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_bridge_getlink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: u32_, + arg3: u32_, + arg4: *mut net_device, + arg5: u32_, + arg6: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_bridge_dellink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut nlmsghdr, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_change_carrier: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: bool_) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_phys_port_id: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut netdev_phys_item_id, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_port_parent_id: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut netdev_phys_item_id, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_phys_port_name: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_dfwd_add_station: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut net_device, + ) -> *mut ::aya_ebpf::cty::c_void, + >, + pub ndo_dfwd_del_station: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub ndo_set_tx_maxrate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_iflink: ::core::option::Option< + unsafe extern "C" fn(arg1: *const net_device) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_fill_metadata_dst: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_set_rx_headroom: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_ebpf::cty::c_int), + >, + pub ndo_bpf: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut netdev_bpf, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_xdp_xmit: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut *mut xdp_frame, + arg4: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_xdp_get_xmit_slave: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut xdp_buff) -> *mut net_device, + >, + pub ndo_xsk_wakeup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: u32_, + arg3: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_tunnel_ctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ip_tunnel_parm, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_peer_dev: + ::core::option::Option *mut net_device>, + pub ndo_fill_forward_path: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device_path_ctx, + arg2: *mut net_device_path, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_get_tstamp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *const skb_shared_hwtstamps, + arg3: bool_, + ) -> ktime_t, + >, + pub ndo_hwtstamp_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut kernel_hwtstamp_config, + ) -> ::aya_ebpf::cty::c_int, + >, + pub ndo_hwtstamp_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut kernel_hwtstamp_config, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] -#[derive(Debug)] -pub struct netprio_map { - pub rcu: callback_head, - pub priomap_len: u32_, - pub priomap: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct pcpu_lstats { + pub packets: u64_stats_t, + pub bytes: u64_stats_t, + pub syncp: u64_stats_sync, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xdp_mem_info { - pub type_: u32_, - pub id: u32_, +pub struct pcpu_sw_netstats { + pub rx_packets: u64_stats_t, + pub rx_bytes: u64_stats_t, + pub tx_packets: u64_stats_t, + pub tx_bytes: u64_stats_t, + pub syncp: u64_stats_sync, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xdp_rxq_info { - pub dev: *mut net_device, - pub queue_index: u32_, - pub reg_state: u32_, - pub mem: xdp_mem_info, - pub napi_id: ::aya_bpf::cty::c_uint, - pub frag_size: u32_, +pub struct pcpu_dstats { + pub rx_packets: u64_, + pub rx_bytes: u64_, + pub rx_drops: u64_, + pub tx_packets: u64_, + pub tx_bytes: u64_, + pub tx_drops: u64_, + pub syncp: u64_stats_sync, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, } -impl xdp_rxq_info { +impl pcpu_dstats { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); __bindgen_bitfield_unit } } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_txq_info { - pub dev: *mut net_device, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_buff { - pub data: *mut ::aya_bpf::cty::c_void, - pub data_end: *mut ::aya_bpf::cty::c_void, - pub data_meta: *mut ::aya_bpf::cty::c_void, - pub data_hard_start: *mut ::aya_bpf::cty::c_void, - pub rxq: *mut xdp_rxq_info, - pub txq: *mut xdp_txq_info, - pub frame_sz: u32_, - pub flags: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_frame { - pub data: *mut ::aya_bpf::cty::c_void, - pub len: u16_, - pub headroom: u16_, - pub metasize: u32_, - pub mem: xdp_mem_info, - pub dev_rx: *mut net_device, - pub frame_sz: u32_, - pub flags: u32_, -} pub mod xdp_rss_hash_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const XDP_RSS_L3_IPV4: Type = 1; pub const XDP_RSS_L3_IPV6: Type = 2; pub const XDP_RSS_L3_DYNHDR: Type = 4; @@ -18783,6 +19719,7 @@ pub mod xdp_rss_hash_type { pub const XDP_RSS_L4_UDP: Type = 32; pub const XDP_RSS_L4_SCTP: Type = 64; pub const XDP_RSS_L4_IPSEC: Type = 128; + pub const XDP_RSS_L4_ICMP: Type = 256; pub const XDP_RSS_TYPE_NONE: Type = 0; pub const XDP_RSS_TYPE_L2: Type = 0; pub const XDP_RSS_TYPE_L3_IPV4: Type = 1; @@ -18794,4382 +19731,2998 @@ pub mod xdp_rss_hash_type { pub const XDP_RSS_TYPE_L4_IPV4_UDP: Type = 41; pub const XDP_RSS_TYPE_L4_IPV4_SCTP: Type = 73; pub const XDP_RSS_TYPE_L4_IPV4_IPSEC: Type = 137; + pub const XDP_RSS_TYPE_L4_IPV4_ICMP: Type = 265; pub const XDP_RSS_TYPE_L4_IPV6_TCP: Type = 26; pub const XDP_RSS_TYPE_L4_IPV6_UDP: Type = 42; pub const XDP_RSS_TYPE_L4_IPV6_SCTP: Type = 74; pub const XDP_RSS_TYPE_L4_IPV6_IPSEC: Type = 138; + pub const XDP_RSS_TYPE_L4_IPV6_ICMP: Type = 266; pub const XDP_RSS_TYPE_L4_IPV6_TCP_EX: Type = 30; pub const XDP_RSS_TYPE_L4_IPV6_UDP_EX: Type = 46; pub const XDP_RSS_TYPE_L4_IPV6_SCTP_EX: Type = 78; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ndmsg { - pub ndm_family: __u8, - pub ndm_pad1: __u8, - pub ndm_pad2: __u16, - pub ndm_ifindex: __s32, - pub ndm_state: __u16, - pub ndm_flags: __u8, - pub ndm_type: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { - pub clock_rate: ::aya_bpf::cty::c_uint, - pub clock_type: ::aya_bpf::cty::c_uint, - pub loopback: ::aya_bpf::cty::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { - pub clock_rate: ::aya_bpf::cty::c_uint, - pub clock_type: ::aya_bpf::cty::c_uint, - pub loopback: ::aya_bpf::cty::c_ushort, - pub slot_map: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { - pub encoding: ::aya_bpf::cty::c_ushort, - pub parity: ::aya_bpf::cty::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { - pub t391: ::aya_bpf::cty::c_uint, - pub t392: ::aya_bpf::cty::c_uint, - pub n391: ::aya_bpf::cty::c_uint, - pub n392: ::aya_bpf::cty::c_uint, - pub n393: ::aya_bpf::cty::c_uint, - pub lmi: ::aya_bpf::cty::c_ushort, - pub dce: ::aya_bpf::cty::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { - pub dlci: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { - pub dlci: ::aya_bpf::cty::c_uint, - pub master: [::aya_bpf::cty::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { - pub interval: ::aya_bpf::cty::c_uint, - pub timeout: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { - pub dce: ::aya_bpf::cty::c_ushort, - pub modulo: ::aya_bpf::cty::c_uint, - pub window: ::aya_bpf::cty::c_uint, - pub t1: ::aya_bpf::cty::c_uint, - pub t2: ::aya_bpf::cty::c_uint, - pub n2: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { - pub mem_start: ::aya_bpf::cty::c_ulong, - pub mem_end: ::aya_bpf::cty::c_ulong, - pub base_addr: ::aya_bpf::cty::c_ushort, - pub irq: ::aya_bpf::cty::c_uchar, - pub dma: ::aya_bpf::cty::c_uchar, - pub port: ::aya_bpf::cty::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { - pub type_: ::aya_bpf::cty::c_uint, - pub size: ::aya_bpf::cty::c_uint, - pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { - pub raw_hdlc: *mut raw_hdlc_proto, - pub cisco: *mut cisco_proto, - pub fr: *mut fr_proto, - pub fr_pvc: *mut fr_proto_pvc, - pub fr_pvc_info: *mut fr_proto_pvc_info, - pub x25: *mut x25_hdlc_proto, - pub sync: *mut sync_serial_settings, - pub te1: *mut te1_settings, -} -#[repr(C)] -pub struct ifreq { - pub ifr_ifrn: ifreq__bindgen_ty_1, - pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { - pub ifrn_name: [::aya_bpf::cty::c_char; 16usize], -} -#[repr(C)] -pub struct ifreq__bindgen_ty_2 { - pub ifru_addr: __BindgenUnionField, - pub ifru_dstaddr: __BindgenUnionField, - pub ifru_broadaddr: __BindgenUnionField, - pub ifru_netmask: __BindgenUnionField, - pub ifru_hwaddr: __BindgenUnionField, - pub ifru_flags: __BindgenUnionField<::aya_bpf::cty::c_short>, - pub ifru_ivalue: __BindgenUnionField<::aya_bpf::cty::c_int>, - pub ifru_mtu: __BindgenUnionField<::aya_bpf::cty::c_int>, - pub ifru_map: __BindgenUnionField, - pub ifru_slave: __BindgenUnionField<[::aya_bpf::cty::c_char; 16usize]>, - pub ifru_newname: __BindgenUnionField<[::aya_bpf::cty::c_char; 16usize]>, - pub ifru_data: __BindgenUnionField<*mut ::aya_bpf::cty::c_void>, - pub ifru_settings: __BindgenUnionField, - pub bindgen_union_field: [u64; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnl_link_stats64 { - pub rx_packets: __u64, - pub tx_packets: __u64, - pub rx_bytes: __u64, - pub tx_bytes: __u64, - pub rx_errors: __u64, - pub tx_errors: __u64, - pub rx_dropped: __u64, - pub tx_dropped: __u64, - pub multicast: __u64, - pub collisions: __u64, - pub rx_length_errors: __u64, - pub rx_over_errors: __u64, - pub rx_crc_errors: __u64, - pub rx_frame_errors: __u64, - pub rx_fifo_errors: __u64, - pub rx_missed_errors: __u64, - pub tx_aborted_errors: __u64, - pub tx_carrier_errors: __u64, - pub tx_fifo_errors: __u64, - pub tx_heartbeat_errors: __u64, - pub tx_window_errors: __u64, - pub rx_compressed: __u64, - pub tx_compressed: __u64, - pub rx_nohandler: __u64, - pub rx_otherhost_dropped: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnl_hw_stats64 { - pub rx_packets: __u64, - pub tx_packets: __u64, - pub rx_bytes: __u64, - pub tx_bytes: __u64, - pub rx_errors: __u64, - pub tx_errors: __u64, - pub rx_dropped: __u64, - pub tx_dropped: __u64, - pub multicast: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_guid { - pub vf: __u32, - pub guid: __u64, +pub struct xdp_metadata_ops { + pub xmo_rx_timestamp: ::core::option::Option< + unsafe extern "C" fn(arg1: *const xdp_md, arg2: *mut u64_) -> ::aya_ebpf::cty::c_int, + >, + pub xmo_rx_hash: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const xdp_md, + arg2: *mut u32_, + arg3: *mut xdp_rss_hash_type::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub xmo_rx_vlan_tag: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const xdp_md, + arg2: *mut __be16, + arg3: *mut u16_, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ifla_vf_stats { - pub rx_packets: __u64, - pub tx_packets: __u64, - pub rx_bytes: __u64, - pub tx_bytes: __u64, - pub broadcast: __u64, - pub multicast: __u64, - pub rx_dropped: __u64, - pub tx_dropped: __u64, +pub struct xsk_tx_metadata_ops { + pub tmo_request_timestamp: + ::core::option::Option, + pub tmo_fill_timestamp: + ::core::option::Option u64_>, + pub tmo_request_checksum: ::core::option::Option< + unsafe extern "C" fn(arg1: u16_, arg2: u16_, arg3: *mut ::aya_ebpf::cty::c_void), + >, } +pub type iw_handler = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut iw_request_info, + arg3: *mut iwreq_data, + arg4: *mut ::aya_ebpf::cty::c_char, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ifla_vf_info { - pub vf: __u32, - pub mac: [__u8; 32usize], - pub vlan: __u32, - pub qos: __u32, - pub spoofchk: __u32, - pub linkstate: __u32, - pub min_tx_rate: __u32, - pub max_tx_rate: __u32, - pub rss_query_en: __u32, - pub trusted: __u32, - pub vlan_proto: __be16, -} -pub mod netdev_tx { - pub type Type = ::aya_bpf::cty::c_int; - pub const __NETDEV_TX_MIN: Type = -2147483648; - pub const NETDEV_TX_OK: Type = 0; - pub const NETDEV_TX_BUSY: Type = 16; +pub struct iw_handler_def { + pub standard: *const iw_handler, + pub num_standard: __u16, + pub num_private: __u16, + pub num_private_args: __u16, + pub private: *const iw_handler, + pub private_args: *const iw_priv_args, + pub get_wireless_stats: + ::core::option::Option *mut iw_statistics>, } -pub use self::netdev_tx::Type as netdev_tx_t; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_core_stats { - pub rx_dropped: ::aya_bpf::cty::c_ulong, - pub tx_dropped: ::aya_bpf::cty::c_ulong, - pub rx_nohandler: ::aya_bpf::cty::c_ulong, - pub rx_otherhost_dropped: ::aya_bpf::cty::c_ulong, +pub mod ethtool_phys_id_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_ID_INACTIVE: Type = 0; + pub const ETHTOOL_ID_ACTIVE: Type = 1; + pub const ETHTOOL_ID_ON: Type = 2; + pub const ETHTOOL_ID_OFF: Type = 3; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct header_ops { - pub create: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut net_device, - arg3: ::aya_bpf::cty::c_ushort, - arg4: *const ::aya_bpf::cty::c_void, - arg5: *const ::aya_bpf::cty::c_void, - arg6: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub parse: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const sk_buff, - arg2: *mut ::aya_bpf::cty::c_uchar, - ) -> ::aya_bpf::cty::c_int, +pub struct ethtool_ops { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub supported_coalesce_params: u32_, + pub supported_ring_params: u32_, + pub get_drvinfo: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_drvinfo), >, - pub cache: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const neighbour, - arg2: *mut hh_cache, - arg3: __be16, - ) -> ::aya_bpf::cty::c_int, + pub get_regs_len: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub cache_update: ::core::option::Option< + pub get_regs: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut hh_cache, - arg2: *const net_device, - arg3: *const ::aya_bpf::cty::c_uchar, + arg1: *mut net_device, + arg2: *mut ethtool_regs, + arg3: *mut ::aya_ebpf::cty::c_void, ), >, - pub validate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_char, - arg2: ::aya_bpf::cty::c_uint, - ) -> bool_, + pub get_wol: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_wolinfo), >, - pub parse_protocol: - ::core::option::Option __be16>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct netdev_queue { - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub qdisc: *mut Qdisc, - pub qdisc_sleeping: *mut Qdisc, - pub kobj: kobject, - pub numa_node: ::aya_bpf::cty::c_int, - pub tx_maxrate: ::aya_bpf::cty::c_ulong, - pub trans_timeout: atomic_long_t, - pub sb_dev: *mut net_device, - pub pool: *mut xsk_buff_pool, - pub _xmit_lock: spinlock_t, - pub xmit_lock_owner: ::aya_bpf::cty::c_int, - pub trans_start: ::aya_bpf::cty::c_ulong, - pub state: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, - pub dql: dql, -} -#[repr(C)] -#[derive(Debug)] -pub struct rps_map { - pub len: ::aya_bpf::cty::c_uint, - pub rcu: callback_head, - pub cpus: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rps_dev_flow { - pub cpu: u16_, - pub filter: u16_, - pub last_qtail: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug)] -pub struct rps_dev_flow_table { - pub mask: ::aya_bpf::cty::c_uint, - pub rcu: callback_head, - pub flows: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_rx_queue { - pub xdp_rxq: xdp_rxq_info, - pub rps_map: *mut rps_map, - pub rps_flow_table: *mut rps_dev_flow_table, - pub kobj: kobject, - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub pool: *mut xsk_buff_pool, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl netdev_rx_queue { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug)] -pub struct xps_map { - pub len: ::aya_bpf::cty::c_uint, - pub alloc_len: ::aya_bpf::cty::c_uint, - pub rcu: callback_head, - pub queues: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug)] -pub struct xps_dev_maps { - pub rcu: callback_head, - pub nr_ids: ::aya_bpf::cty::c_uint, - pub num_tc: s16, - pub attr_map: __IncompleteArrayField<*mut xps_map>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_fcoe_hbainfo { - pub manufacturer: [::aya_bpf::cty::c_char; 64usize], - pub serial_number: [::aya_bpf::cty::c_char; 64usize], - pub hardware_version: [::aya_bpf::cty::c_char; 64usize], - pub driver_version: [::aya_bpf::cty::c_char; 64usize], - pub optionrom_version: [::aya_bpf::cty::c_char; 64usize], - pub firmware_version: [::aya_bpf::cty::c_char; 64usize], - pub model: [::aya_bpf::cty::c_char; 256usize], - pub model_description: [::aya_bpf::cty::c_char; 256usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_phys_item_id { - pub id: [::aya_bpf::cty::c_uchar; 32usize], - pub id_len: ::aya_bpf::cty::c_uchar, -} -pub mod net_device_path_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEV_PATH_ETHERNET: Type = 0; - pub const DEV_PATH_VLAN: Type = 1; - pub const DEV_PATH_BRIDGE: Type = 2; - pub const DEV_PATH_PPPOE: Type = 3; - pub const DEV_PATH_DSA: Type = 4; - pub const DEV_PATH_MTK_WDMA: Type = 5; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct net_device_path { - pub type_: net_device_path_type::Type, - pub dev: *const net_device, - pub __bindgen_anon_1: net_device_path__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union net_device_path__bindgen_ty_1 { - pub encap: net_device_path__bindgen_ty_1__bindgen_ty_1, - pub bridge: net_device_path__bindgen_ty_1__bindgen_ty_2, - pub dsa: net_device_path__bindgen_ty_1__bindgen_ty_3, - pub mtk_wdma: net_device_path__bindgen_ty_1__bindgen_ty_4, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_path__bindgen_ty_1__bindgen_ty_1 { - pub id: u16_, - pub proto: __be16, - pub h_dest: [u8_; 6usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_path__bindgen_ty_1__bindgen_ty_2 { - pub vlan_mode: net_device_path__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1::Type, - pub vlan_id: u16_, - pub vlan_proto: __be16, -} -pub mod net_device_path__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEV_PATH_BR_VLAN_KEEP: Type = 0; - pub const DEV_PATH_BR_VLAN_TAG: Type = 1; - pub const DEV_PATH_BR_VLAN_UNTAG: Type = 2; - pub const DEV_PATH_BR_VLAN_UNTAG_HW: Type = 3; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_path__bindgen_ty_1__bindgen_ty_3 { - pub port: ::aya_bpf::cty::c_int, - pub proto: u16_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_path__bindgen_ty_1__bindgen_ty_4 { - pub wdma_idx: u8_, - pub queue: u8_, - pub wcid: u16_, - pub bss: u8_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_path_ctx { - pub dev: *const net_device, - pub daddr: [u8_; 6usize], - pub num_vlans: ::aya_bpf::cty::c_int, - pub vlan: [net_device_path_ctx__bindgen_ty_1; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_path_ctx__bindgen_ty_1 { - pub id: u16_, - pub proto: __be16, -} -pub mod tc_setup_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const TC_QUERY_CAPS: Type = 0; - pub const TC_SETUP_QDISC_MQPRIO: Type = 1; - pub const TC_SETUP_CLSU32: Type = 2; - pub const TC_SETUP_CLSFLOWER: Type = 3; - pub const TC_SETUP_CLSMATCHALL: Type = 4; - pub const TC_SETUP_CLSBPF: Type = 5; - pub const TC_SETUP_BLOCK: Type = 6; - pub const TC_SETUP_QDISC_CBS: Type = 7; - pub const TC_SETUP_QDISC_RED: Type = 8; - pub const TC_SETUP_QDISC_PRIO: Type = 9; - pub const TC_SETUP_QDISC_MQ: Type = 10; - pub const TC_SETUP_QDISC_ETF: Type = 11; - pub const TC_SETUP_ROOT_QDISC: Type = 12; - pub const TC_SETUP_QDISC_GRED: Type = 13; - pub const TC_SETUP_QDISC_TAPRIO: Type = 14; - pub const TC_SETUP_FT: Type = 15; - pub const TC_SETUP_QDISC_ETS: Type = 16; - pub const TC_SETUP_QDISC_TBF: Type = 17; - pub const TC_SETUP_QDISC_FIFO: Type = 18; - pub const TC_SETUP_QDISC_HTB: Type = 19; - pub const TC_SETUP_ACT: Type = 20; -} -pub mod bpf_netdev_command { - pub type Type = ::aya_bpf::cty::c_uint; - pub const XDP_SETUP_PROG: Type = 0; - pub const XDP_SETUP_PROG_HW: Type = 1; - pub const BPF_OFFLOAD_MAP_ALLOC: Type = 2; - pub const BPF_OFFLOAD_MAP_FREE: Type = 3; - pub const XDP_SETUP_XSK_POOL: Type = 4; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct netdev_bpf { - pub command: bpf_netdev_command::Type, - pub __bindgen_anon_1: netdev_bpf__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union netdev_bpf__bindgen_ty_1 { - pub __bindgen_anon_1: netdev_bpf__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: netdev_bpf__bindgen_ty_1__bindgen_ty_2, - pub xsk: netdev_bpf__bindgen_ty_1__bindgen_ty_3, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_bpf__bindgen_ty_1__bindgen_ty_1 { - pub flags: u32_, - pub prog: *mut bpf_prog, - pub extack: *mut netlink_ext_ack, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_bpf__bindgen_ty_1__bindgen_ty_2 { - pub offmap: *mut bpf_offloaded_map, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_bpf__bindgen_ty_1__bindgen_ty_3 { - pub pool: *mut xsk_buff_pool, - pub queue_id: u16_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrmdev_ops { - pub xdo_dev_state_add: ::core::option::Option< + pub set_wol: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut xfrm_state, - arg2: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut net_device, + arg2: *mut ethtool_wolinfo, + ) -> ::aya_ebpf::cty::c_int, >, - pub xdo_dev_state_delete: ::core::option::Option, - pub xdo_dev_state_free: ::core::option::Option, - pub xdo_dev_offload_ok: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut xfrm_state) -> bool_, + pub get_msglevel: ::core::option::Option u32_>, + pub set_msglevel: + ::core::option::Option, + pub nway_reset: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub xdo_dev_state_advance_esn: - ::core::option::Option, - pub xdo_dev_state_update_curlft: - ::core::option::Option, - pub xdo_dev_policy_add: ::core::option::Option< + pub get_link: ::core::option::Option u32_>, + pub get_link_ext_state: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut xfrm_policy, - arg2: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub xdo_dev_policy_delete: ::core::option::Option, - pub xdo_dev_policy_free: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug)] -pub struct dev_ifalias { - pub rcuhead: callback_head, - pub ifalias: __IncompleteArrayField<::aya_bpf::cty::c_char>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct net_device_ops { - pub ndo_init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, - >, - pub ndo_uninit: ::core::option::Option, - pub ndo_open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, - >, - pub ndo_stop: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + arg1: *mut net_device, + arg2: *mut ethtool_link_ext_state_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_start_xmit: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> netdev_tx_t, + pub get_link_ext_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_link_ext_stats), >, - pub ndo_features_check: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut net_device, - arg3: netdev_features_t, - ) -> netdev_features_t, + pub get_eeprom_len: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub ndo_select_queue: ::core::option::Option< + pub get_eeprom: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut sk_buff, - arg3: *mut net_device, - ) -> u16_, - >, - pub ndo_change_rx_flags: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int), + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_rx_mode: ::core::option::Option, - pub ndo_set_mac_address: ::core::option::Option< + pub set_eeprom: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_validate_addr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_do_ioctl: ::core::option::Option< + pub get_coalesce: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ifreq, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_coalesce, + arg3: *mut kernel_ethtool_coalesce, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_eth_ioctl: ::core::option::Option< + pub set_coalesce: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ifreq, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_coalesce, + arg3: *mut kernel_ethtool_coalesce, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_siocbond: ::core::option::Option< + pub get_ringparam: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ifreq, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_ringparam, + arg3: *mut kernel_ethtool_ringparam, + arg4: *mut netlink_ext_ack, + ), >, - pub ndo_siocwandev: ::core::option::Option< + pub set_ringparam: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut if_settings, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_ringparam, + arg3: *mut kernel_ethtool_ringparam, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_siocdevprivate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ifreq, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + pub get_pause_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_pause_stats), >, - pub ndo_set_config: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ifmap) -> ::aya_bpf::cty::c_int, + pub get_pauseparam: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_pauseparam), >, - pub ndo_change_mtu: ::core::option::Option< + pub set_pauseparam: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_pauseparam, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_neigh_setup: ::core::option::Option< + pub self_test: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_test, arg3: *mut u64_), + >, + pub get_strings: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: u32_, arg3: *mut u8_), + >, + pub set_phys_id: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut neigh_parms, - ) -> ::aya_bpf::cty::c_int, + arg2: ethtool_phys_id_state::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_tx_timeout: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_uint), + pub get_ethtool_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_stats, arg3: *mut u64_), >, - pub ndo_get_stats64: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut rtnl_link_stats64), + pub begin: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_ebpf::cty::c_int, >, - pub ndo_has_offload_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *const net_device, arg2: ::aya_bpf::cty::c_int) -> bool_, + pub complete: ::core::option::Option, + pub get_priv_flags: ::core::option::Option u32_>, + pub set_priv_flags: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: u32_) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_offload_stats: ::core::option::Option< + pub get_sset_count: ::core::option::Option< unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_int, - arg2: *const net_device, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_get_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> *mut net_device_stats, + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_vlan_rx_add_vid: ::core::option::Option< + pub get_rxnfc: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: __be16, - arg3: u16_, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_rxnfc, + arg3: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_vlan_rx_kill_vid: ::core::option::Option< + pub set_rxnfc: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: __be16, - arg3: u16_, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_rxnfc, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_poll_controller: ::core::option::Option, - pub ndo_netpoll_setup: ::core::option::Option< + pub flash_device: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut netpoll_info, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_flash, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_netpoll_cleanup: ::core::option::Option, - pub ndo_set_vf_mac: ::core::option::Option< + pub reset: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut u32_) -> ::aya_ebpf::cty::c_int, + >, + pub get_rxfh_key_size: + ::core::option::Option u32_>, + pub get_rxfh_indir_size: + ::core::option::Option u32_>, + pub get_rxfh: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_rxfh_param, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_vlan: ::core::option::Option< + pub set_rxfh: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u16_, - arg4: u8_, - arg5: __be16, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_rxfh_param, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_rate: ::core::option::Option< + pub get_channels: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_channels), + >, + pub set_channels: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_channels, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_spoofchk: ::core::option::Option< + pub get_dump_flag: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_dump, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_trust: ::core::option::Option< + pub get_dump_data: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_dump, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_vf_config: ::core::option::Option< + pub set_dump: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ifla_vf_info, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_dump, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_link_state: ::core::option::Option< + pub get_ts_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_ts_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_vf_stats: ::core::option::Option< + pub get_module_info: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ifla_vf_stats, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_modinfo, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_port: ::core::option::Option< + pub get_module_eeprom: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut *mut nlattr, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_vf_port: ::core::option::Option< + pub get_eee: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_eee, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_vf_guid: ::core::option::Option< + pub set_eee: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ifla_vf_guid, - arg4: *mut ifla_vf_guid, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_eee, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_guid: ::core::option::Option< + pub get_tunable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u64_, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ethtool_tunable, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_set_vf_rss_query_en: ::core::option::Option< + pub set_tunable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ethtool_tunable, + arg3: *const ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_setup_tc: ::core::option::Option< + pub get_per_queue_coalesce: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: tc_setup_type::Type, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: u32_, + arg3: *mut ethtool_coalesce, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fcoe_enable: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + pub set_per_queue_coalesce: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: u32_, + arg3: *mut ethtool_coalesce, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fcoe_disable: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + pub get_link_ksettings: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: *mut ethtool_link_ksettings, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fcoe_ddp_setup: ::core::option::Option< + pub set_link_ksettings: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: u16_, - arg3: *mut scatterlist, - arg4: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ethtool_link_ksettings, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fcoe_ddp_done: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: u16_) -> ::aya_bpf::cty::c_int, + pub get_fec_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_fec_stats), >, - pub ndo_fcoe_ddp_target: ::core::option::Option< + pub get_fecparam: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: u16_, - arg3: *mut scatterlist, - arg4: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_fecparam, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fcoe_get_hbainfo: ::core::option::Option< + pub set_fecparam: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut netdev_fcoe_hbainfo, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_fecparam, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fcoe_get_wwn: ::core::option::Option< + pub get_ethtool_phy_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_stats, arg3: *mut u64_), + >, + pub get_phy_tunable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut u64_, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ethtool_tunable, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_rx_flow_steer: ::core::option::Option< + pub set_phy_tunable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *const sk_buff, - arg3: u16_, - arg4: u32_, - ) -> ::aya_bpf::cty::c_int, + arg2: *const ethtool_tunable, + arg3: *const ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_add_slave: ::core::option::Option< + pub get_module_eeprom_by_page: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut net_device, + arg2: *const ethtool_module_eeprom, arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_del_slave: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut net_device) -> ::aya_bpf::cty::c_int, + pub get_eth_phy_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_eth_phy_stats), >, - pub ndo_get_xmit_slave: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut sk_buff, - arg3: bool_, - ) -> *mut net_device, - >, - pub ndo_sk_get_lower_dev: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut sock) -> *mut net_device, + pub get_eth_mac_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_eth_mac_stats), >, - pub ndo_fix_features: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: netdev_features_t) -> netdev_features_t, + pub get_eth_ctrl_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_eth_ctrl_stats), >, - pub ndo_set_features: ::core::option::Option< + pub get_rmon_stats: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: netdev_features_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_neigh_construct: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut neighbour) -> ::aya_bpf::cty::c_int, - >, - pub ndo_neigh_destroy: - ::core::option::Option, - pub ndo_fdb_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ndmsg, - arg2: *mut *mut nlattr, - arg3: *mut net_device, - arg4: *const ::aya_bpf::cty::c_uchar, - arg5: u16_, - arg6: u16_, - arg7: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_fdb_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ndmsg, - arg2: *mut *mut nlattr, - arg3: *mut net_device, - arg4: *const ::aya_bpf::cty::c_uchar, - arg5: u16_, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_fdb_del_bulk: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ndmsg, - arg2: *mut *mut nlattr, - arg3: *mut net_device, - arg4: u16_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_rmon_stats, + arg3: *mut *const ethtool_rmon_hist_range, + ), >, - pub ndo_fdb_dump: ::core::option::Option< + pub get_module_power_mode: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut netlink_callback, - arg3: *mut net_device, - arg4: *mut net_device, - arg5: *mut ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut net_device, + arg2: *mut ethtool_module_power_mode_params, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fdb_get: ::core::option::Option< + pub set_module_power_mode: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut *mut nlattr, - arg3: *mut net_device, - arg4: *const ::aya_bpf::cty::c_uchar, - arg5: u16_, - arg6: u32_, - arg7: u32_, - arg8: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut net_device, + arg2: *const ethtool_module_power_mode_params, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_mdb_add: ::core::option::Option< + pub get_mm: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut *mut nlattr, - arg3: u16_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ethtool_mm_state, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_mdb_del: ::core::option::Option< + pub set_mm: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut *mut nlattr, + arg2: *mut ethtool_mm_cfg, arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_mdb_dump: ::core::option::Option< + pub get_mm_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_mm_stats), + >, +} +impl ethtool_ops { + #[inline] + pub fn cap_link_lanes_supported(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_cap_link_lanes_supported(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_rss_ctx_supported(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_cap_rss_ctx_supported(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_rss_sym_xor_supported(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_cap_rss_sym_xor_supported(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + cap_link_lanes_supported: u32_, + cap_rss_ctx_supported: u32_, + cap_rss_sym_xor_supported: u32_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let cap_link_lanes_supported: u32 = + unsafe { ::core::mem::transmute(cap_link_lanes_supported) }; + cap_link_lanes_supported as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let cap_rss_ctx_supported: u32 = + unsafe { ::core::mem::transmute(cap_rss_ctx_supported) }; + cap_rss_ctx_supported as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let cap_rss_sym_xor_supported: u32 = + unsafe { ::core::mem::transmute(cap_rss_sym_xor_supported) }; + cap_rss_sym_xor_supported as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct l3mdev_ops { + pub l3mdev_fib_table: + ::core::option::Option u32_>, + pub l3mdev_l3_rcv: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut sk_buff, arg3: u16_) -> *mut sk_buff, + >, + pub l3mdev_l3_out: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut sk_buff, - arg3: *mut netlink_callback, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut sock, + arg3: *mut sk_buff, + arg4: u16_, + ) -> *mut sk_buff, >, - pub ndo_bridge_setlink: ::core::option::Option< + pub l3mdev_link_scope_lookup: ::core::option::Option< + unsafe extern "C" fn(arg1: *const net_device, arg2: *mut flowi6) -> *mut dst_entry, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ndisc_ops { + pub is_useropt: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub parse_options: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut nlmsghdr, - arg3: u16_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *const net_device, + arg2: *mut nd_opt_hdr, + arg3: *mut ndisc_options, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_bridge_getlink: ::core::option::Option< + pub update: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: u32_, + arg1: *const net_device, + arg2: *mut neighbour, arg3: u32_, - arg4: *mut net_device, - arg5: u32_, - arg6: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg4: u8_, + arg5: *const ndisc_options, + ), >, - pub ndo_bridge_dellink: ::core::option::Option< + pub opt_addr_space: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut nlmsghdr, - arg3: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_change_carrier: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: bool_) -> ::aya_bpf::cty::c_int, + arg1: *const net_device, + arg2: u8_, + arg3: *mut neighbour, + arg4: *mut u8_, + arg5: *mut *mut u8_, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_phys_port_id: ::core::option::Option< + pub fill_addr_option: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut netdev_phys_item_id, - ) -> ::aya_bpf::cty::c_int, + arg1: *const net_device, + arg2: *mut sk_buff, + arg3: u8_, + arg4: *const u8_, + ), >, - pub ndo_get_port_parent_id: ::core::option::Option< + pub prefix_rcv_add_addr: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut netdev_phys_item_id, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut net, + arg2: *mut net_device, + arg3: *const prefix_info, + arg4: *mut inet6_dev, + arg5: *mut in6_addr, + arg6: ::aya_ebpf::cty::c_int, + arg7: u32_, + arg8: bool_, + arg9: bool_, + arg10: __u32, + arg11: u32_, + arg12: bool_, + ), >, - pub ndo_get_phys_port_name: ::core::option::Option< +} +pub mod tls_offload_ctx_dir { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const TLS_OFFLOAD_CTX_DIR_RX: Type = 0; + pub const TLS_OFFLOAD_CTX_DIR_TX: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tlsdev_ops { + pub tls_dev_add: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut sock, + arg3: tls_offload_ctx_dir::Type, + arg4: *mut tls_crypto_info, + arg5: u32_, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_dfwd_add_station: ::core::option::Option< + pub tls_dev_del: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut net_device, - ) -> *mut ::aya_bpf::cty::c_void, - >, - pub ndo_dfwd_del_station: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ::aya_bpf::cty::c_void), + arg2: *mut tls_context, + arg3: tls_offload_ctx_dir::Type, + ), >, - pub ndo_set_tx_maxrate: ::core::option::Option< + pub tls_dev_resync: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, + arg2: *mut sock, arg3: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub ndo_get_iflink: ::core::option::Option< - unsafe extern "C" fn(arg1: *const net_device) -> ::aya_bpf::cty::c_int, + arg4: *mut u8_, + arg5: tls_offload_ctx_dir::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_fill_metadata_dst: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rtnl_link_ops { + pub list: list_head, + pub kind: *const ::aya_ebpf::cty::c_char, + pub priv_size: usize, + pub alloc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut *mut nlattr, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: ::aya_ebpf::cty::c_uchar, + arg4: ::aya_ebpf::cty::c_uint, + arg5: ::aya_ebpf::cty::c_uint, + ) -> *mut net_device, >, - pub ndo_set_rx_headroom: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: ::aya_bpf::cty::c_int), + pub setup: ::core::option::Option, + pub netns_refund: bool_, + pub maxtype: ::aya_ebpf::cty::c_uint, + pub policy: *const nla_policy, + pub validate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut *mut nlattr, + arg2: *mut *mut nlattr, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_bpf: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut netdev_bpf) -> ::aya_bpf::cty::c_int, + pub newlink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut net_device, + arg3: *mut *mut nlattr, + arg4: *mut *mut nlattr, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_xdp_xmit: ::core::option::Option< + pub changelink: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut *mut xdp_frame, - arg4: u32_, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut *mut nlattr, + arg3: *mut *mut nlattr, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_xdp_get_xmit_slave: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut xdp_buff) -> *mut net_device, + pub dellink: + ::core::option::Option, + pub get_size: ::core::option::Option usize>, + pub fill_info: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *const net_device) -> ::aya_ebpf::cty::c_int, >, - pub ndo_xsk_wakeup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: u32_, - arg3: u32_, - ) -> ::aya_bpf::cty::c_int, + pub get_xstats_size: + ::core::option::Option usize>, + pub fill_xstats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *const net_device) -> ::aya_ebpf::cty::c_int, >, - pub ndo_tunnel_ctl: ::core::option::Option< + pub get_num_tx_queues: + ::core::option::Option ::aya_ebpf::cty::c_uint>, + pub get_num_rx_queues: + ::core::option::Option ::aya_ebpf::cty::c_uint>, + pub slave_maxtype: ::aya_ebpf::cty::c_uint, + pub slave_policy: *const nla_policy, + pub slave_changelink: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ip_tunnel_parm, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut net_device, + arg3: *mut *mut nlattr, + arg4: *mut *mut nlattr, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub ndo_get_peer_dev: - ::core::option::Option *mut net_device>, - pub ndo_fill_forward_path: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device_path_ctx, - arg2: *mut net_device_path, - ) -> ::aya_bpf::cty::c_int, + pub get_slave_size: ::core::option::Option< + unsafe extern "C" fn(arg1: *const net_device, arg2: *const net_device) -> usize, >, - pub ndo_get_tstamp: ::core::option::Option< + pub fill_slave_info: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const skb_shared_hwtstamps, - arg3: bool_, - ) -> ktime_t, + arg1: *mut sk_buff, + arg2: *const net_device, + arg3: *const net_device, + ) -> ::aya_ebpf::cty::c_int, >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct neigh_parms { - pub net: possible_net_t, - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub list: list_head, - pub neigh_setup: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub tbl: *mut neigh_table, - pub sysctl_table: *mut ::aya_bpf::cty::c_void, - pub dead: ::aya_bpf::cty::c_int, - pub refcnt: refcount_t, - pub callback_head: callback_head, - pub reachable_time: ::aya_bpf::cty::c_int, - pub qlen: u32_, - pub data: [::aya_bpf::cty::c_int; 14usize], - pub data_state: [::aya_bpf::cty::c_ulong; 1usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_metadata_ops { - pub xmo_rx_timestamp: ::core::option::Option< - unsafe extern "C" fn(arg1: *const xdp_md, arg2: *mut u64_) -> ::aya_bpf::cty::c_int, + pub get_link_net: + ::core::option::Option *mut net>, + pub get_linkxstats_size: ::core::option::Option< + unsafe extern "C" fn(arg1: *const net_device, arg2: ::aya_ebpf::cty::c_int) -> usize, >, - pub xmo_rx_hash: ::core::option::Option< + pub fill_linkxstats: ::core::option::Option< unsafe extern "C" fn( - arg1: *const xdp_md, - arg2: *mut u32_, - arg3: *mut xdp_rss_hash_type::Type, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sk_buff, + arg2: *const net_device, + arg3: *mut ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xdp_md { - pub data: __u32, - pub data_end: __u32, - pub data_meta: __u32, - pub ingress_ifindex: __u32, - pub rx_queue_index: __u32, - pub egress_ifindex: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pcpu_lstats { - pub packets: u64_stats_t, - pub bytes: u64_stats_t, - pub syncp: u64_stats_sync, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pcpu_sw_netstats { - pub rx_packets: u64_stats_t, - pub rx_bytes: u64_stats_t, - pub tx_packets: u64_stats_t, - pub tx_bytes: u64_stats_t, - pub syncp: u64_stats_sync, -} -pub type iw_handler = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut iw_request_info, - arg3: *mut iwreq_data, - arg4: *mut ::aya_bpf::cty::c_char, - ) -> ::aya_bpf::cty::c_int, ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_handler_def { - pub standard: *const iw_handler, - pub num_standard: __u16, - pub num_private: __u16, - pub num_private_args: __u16, - pub private: *const iw_handler, - pub private_args: *const iw_priv_args, - pub get_wireless_stats: - ::core::option::Option *mut iw_statistics>, -} -pub mod ethtool_phys_id_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_ID_INACTIVE: Type = 0; - pub const ETHTOOL_ID_ACTIVE: Type = 1; - pub const ETHTOOL_ID_ON: Type = 2; - pub const ETHTOOL_ID_OFF: Type = 3; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_ops { - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub supported_coalesce_params: u32_, - pub supported_ring_params: u32_, - pub get_drvinfo: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_drvinfo), +pub struct macsec_ops { + pub mdo_dev_open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_regs_len: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + pub mdo_dev_stop: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_regs: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_regs, - arg3: *mut ::aya_bpf::cty::c_void, - ), + pub mdo_add_secy: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_wol: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_wolinfo), + pub mdo_upd_secy: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub set_wol: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_wolinfo, - ) -> ::aya_bpf::cty::c_int, + pub mdo_del_secy: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_msglevel: ::core::option::Option u32_>, - pub set_msglevel: - ::core::option::Option, - pub nway_reset: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + pub mdo_add_rxsc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_link: ::core::option::Option u32_>, - pub get_link_ext_state: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_link_ext_state_info, - ) -> ::aya_bpf::cty::c_int, + pub mdo_upd_rxsc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_link_ext_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_link_ext_stats), + pub mdo_del_rxsc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_eeprom_len: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, + pub mdo_add_rxsa: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, + pub mdo_upd_rxsa: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub set_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, + pub mdo_del_rxsa: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_coalesce: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_coalesce, - arg3: *mut kernel_ethtool_coalesce, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub mdo_add_txsa: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub set_coalesce: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_coalesce, - arg3: *mut kernel_ethtool_coalesce, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub mdo_upd_txsa: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_ringparam: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_ringparam, - arg3: *mut kernel_ethtool_ringparam, - arg4: *mut netlink_ext_ack, - ), + pub mdo_del_txsa: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub set_ringparam: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_ringparam, - arg3: *mut kernel_ethtool_ringparam, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub mdo_get_dev_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_pause_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_pause_stats), + pub mdo_get_tx_sc_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_pauseparam: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_pauseparam), + pub mdo_get_tx_sa_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub set_pauseparam: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_pauseparam, - ) -> ::aya_bpf::cty::c_int, + pub mdo_get_rx_sc_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub self_test: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_test, arg3: *mut u64_), + pub mdo_get_rx_sa_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_ebpf::cty::c_int, >, - pub get_strings: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: u32_, arg3: *mut u8_), + pub mdo_insert_tx_tag: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >, - pub set_phys_id: ::core::option::Option< + pub needed_headroom: ::aya_ebpf::cty::c_uint, + pub needed_tailroom: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct udp_tunnel_nic_table_info { + pub n_entries: ::aya_ebpf::cty::c_uint, + pub tunnel_types: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct udp_tunnel_nic_info { + pub set_port: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ethtool_phys_id_state::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_ethtool_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_stats, arg3: *mut u64_), - >, - pub begin: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device) -> ::aya_bpf::cty::c_int, - >, - pub complete: ::core::option::Option, - pub get_priv_flags: ::core::option::Option u32_>, - pub set_priv_flags: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: u32_) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut udp_tunnel_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub get_sset_count: ::core::option::Option< + pub unset_port: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut udp_tunnel_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub get_rxnfc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_rxnfc, - arg3: *mut u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_rxnfc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_rxnfc, - ) -> ::aya_bpf::cty::c_int, - >, - pub flash_device: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_flash, - ) -> ::aya_bpf::cty::c_int, - >, - pub reset: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut u32_) -> ::aya_bpf::cty::c_int, - >, - pub get_rxfh_key_size: - ::core::option::Option u32_>, - pub get_rxfh_indir_size: - ::core::option::Option u32_>, - pub get_rxfh: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut u32_, - arg3: *mut u8_, - arg4: *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_rxfh: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const u32_, - arg3: *const u8_, - arg4: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_rxfh_context: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut u32_, - arg3: *mut u8_, - arg4: *mut u8_, - arg5: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_rxfh_context: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const u32_, - arg3: *const u8_, - arg4: u8_, - arg5: *mut u32_, - arg6: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_channels: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_channels), - >, - pub set_channels: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_channels, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_dump_flag: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_dump, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_dump_data: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_dump, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_dump, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_ts_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_ts_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_module_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_modinfo, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_module_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_eee: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_eee, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_eee: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_eee, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_tunable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_tunable, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_tunable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_tunable, - arg3: *const ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_per_queue_coalesce: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: u32_, - arg3: *mut ethtool_coalesce, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_per_queue_coalesce: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: u32_, - arg3: *mut ethtool_coalesce, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_link_ksettings: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_link_ksettings, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_link_ksettings: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_link_ksettings, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_fec_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_fec_stats), - >, - pub get_fecparam: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_fecparam, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_fecparam: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_fecparam, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_ethtool_phy_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_stats, arg3: *mut u64_), - >, - pub get_phy_tunable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_tunable, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_phy_tunable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_tunable, - arg3: *const ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_module_eeprom_by_page: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_module_eeprom, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_eth_phy_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_eth_phy_stats), - >, - pub get_eth_mac_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_eth_mac_stats), - >, - pub get_eth_ctrl_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_eth_ctrl_stats), - >, - pub get_rmon_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_rmon_stats, - arg3: *mut *const ethtool_rmon_hist_range, - ), - >, - pub get_module_power_mode: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_module_power_mode_params, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_module_power_mode: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *const ethtool_module_power_mode_params, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_mm: ::core::option::Option< + pub sync_table: ::core::option::Option< unsafe extern "C" fn( arg1: *mut net_device, - arg2: *mut ethtool_mm_state, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub set_mm: ::core::option::Option< + pub shared: *mut udp_tunnel_nic_shared, + pub flags: ::aya_ebpf::cty::c_uint, + pub tables: [udp_tunnel_nic_table_info; 4usize], +} +pub type __be64 = __u64; +pub type u_int16_t = u16_; +pub type u_int32_t = u32_; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct msghdr { + pub msg_name: *mut ::aya_ebpf::cty::c_void, + pub msg_namelen: ::aya_ebpf::cty::c_int, + pub msg_inq: ::aya_ebpf::cty::c_int, + pub msg_iter: iov_iter, + pub __bindgen_anon_1: msghdr__bindgen_ty_1, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub msg_flags: ::aya_ebpf::cty::c_uint, + pub msg_controllen: __kernel_size_t, + pub msg_iocb: *mut kiocb, + pub msg_ubuf: *mut ubuf_info, + pub sg_from_iter: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut ethtool_mm_cfg, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_mm_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut ethtool_mm_stats), + arg1: *mut sock, + arg2: *mut sk_buff, + arg3: *mut iov_iter, + arg4: usize, + ) -> ::aya_ebpf::cty::c_int, >, } -impl ethtool_ops { +#[repr(C)] +#[derive(Copy, Clone)] +pub union msghdr__bindgen_ty_1 { + pub msg_control: *mut ::aya_ebpf::cty::c_void, + pub msg_control_user: *mut ::aya_ebpf::cty::c_void, +} +impl msghdr { #[inline] - pub fn cap_link_lanes_supported(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn msg_control_is_user(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_cap_link_lanes_supported(&mut self, val: u32_) { + pub fn set_msg_control_is_user(&mut self, val: bool_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(cap_link_lanes_supported: u32_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + pub fn msg_get_inq(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_msg_get_inq(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + msg_control_is_user: bool_, + msg_get_inq: bool_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let cap_link_lanes_supported: u32 = - unsafe { ::core::mem::transmute(cap_link_lanes_supported) }; - cap_link_lanes_supported as u64 + let msg_control_is_user: u8 = unsafe { ::core::mem::transmute(msg_control_is_user) }; + msg_control_is_user as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let msg_get_inq: u8 = unsafe { ::core::mem::transmute(msg_get_inq) }; + msg_get_inq as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct l3mdev_ops { - pub l3mdev_fib_table: - ::core::option::Option u32_>, - pub l3mdev_l3_rcv: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut net_device, arg2: *mut sk_buff, arg3: u16_) -> *mut sk_buff, - >, - pub l3mdev_l3_out: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut sock, - arg3: *mut sk_buff, - arg4: u16_, - ) -> *mut sk_buff, - >, - pub l3mdev_link_scope_lookup: ::core::option::Option< - unsafe extern "C" fn(arg1: *const net_device, arg2: *mut flowi6) -> *mut dst_entry, +pub struct ubuf_info { + pub callback: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ubuf_info, arg3: bool_), >, + pub refcnt: refcount_t, + pub flags: u8_, } +pub type __addrpair = __u64; +pub type __portpair = __u32; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ndisc_ops { - pub is_useropt: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub parse_options: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const net_device, - arg2: *mut nd_opt_hdr, - arg3: *mut ndisc_options, - ) -> ::aya_bpf::cty::c_int, - >, - pub update: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const net_device, - arg2: *mut neighbour, - arg3: u32_, - arg4: u8_, - arg5: *const ndisc_options, - ), - >, - pub opt_addr_space: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const net_device, - arg2: u8_, - arg3: *mut neighbour, - arg4: *mut u8_, - arg5: *mut *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub fill_addr_option: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const net_device, - arg2: *mut sk_buff, - arg3: u8_, - arg4: *const u8_, - ), - >, - pub prefix_rcv_add_addr: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut net_device, - arg3: *const prefix_info, - arg4: *mut inet6_dev, - arg5: *mut in6_addr, - arg6: ::aya_bpf::cty::c_int, - arg7: u32_, - arg8: bool_, - arg9: bool_, - arg10: __u32, - arg11: u32_, - arg12: bool_, - ), - >, +pub struct sock_common { + pub __bindgen_anon_1: sock_common__bindgen_ty_1, + pub __bindgen_anon_2: sock_common__bindgen_ty_2, + pub __bindgen_anon_3: sock_common__bindgen_ty_3, + pub skc_family: ::aya_ebpf::cty::c_ushort, + pub skc_state: ::aya_ebpf::cty::c_uchar, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub skc_bound_dev_if: ::aya_ebpf::cty::c_int, + pub __bindgen_anon_4: sock_common__bindgen_ty_4, + pub skc_prot: *mut proto, + pub skc_net: possible_net_t, + pub skc_v6_daddr: in6_addr, + pub skc_v6_rcv_saddr: in6_addr, + pub skc_cookie: atomic64_t, + pub __bindgen_anon_5: sock_common__bindgen_ty_5, + pub skc_dontcopy_begin: __IncompleteArrayField<::aya_ebpf::cty::c_int>, + pub __bindgen_anon_6: sock_common__bindgen_ty_6, + pub skc_tx_queue_mapping: ::aya_ebpf::cty::c_ushort, + pub skc_rx_queue_mapping: ::aya_ebpf::cty::c_ushort, + pub __bindgen_anon_7: sock_common__bindgen_ty_7, + pub skc_refcnt: refcount_t, + pub skc_dontcopy_end: __IncompleteArrayField<::aya_ebpf::cty::c_int>, + pub __bindgen_anon_8: sock_common__bindgen_ty_8, } -pub mod tls_offload_ctx_dir { - pub type Type = ::aya_bpf::cty::c_uint; - pub const TLS_OFFLOAD_CTX_DIR_RX: Type = 0; - pub const TLS_OFFLOAD_CTX_DIR_TX: Type = 1; +#[repr(C)] +#[derive(Copy, Clone)] +pub union sock_common__bindgen_ty_1 { + pub skc_addrpair: __addrpair, + pub __bindgen_anon_1: sock_common__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tlsdev_ops { - pub tls_dev_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut sock, - arg3: tls_offload_ctx_dir::Type, - arg4: *mut tls_crypto_info, - arg5: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub tls_dev_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut tls_context, - arg3: tls_offload_ctx_dir::Type, - ), - >, - pub tls_dev_resync: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut sock, - arg3: u32_, - arg4: *mut u8_, - arg5: tls_offload_ctx_dir::Type, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct sock_common__bindgen_ty_1__bindgen_ty_1 { + pub skc_daddr: __be32, + pub skc_rcv_saddr: __be32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ipv6_devstat { - pub proc_dir_entry: *mut proc_dir_entry, - pub ipv6: *mut ipstats_mib, - pub icmpv6dev: *mut icmpv6_mib_device, - pub icmpv6msgdev: *mut icmpv6msg_mib_device, +#[derive(Copy, Clone)] +pub union sock_common__bindgen_ty_2 { + pub skc_hash: ::aya_ebpf::cty::c_uint, + pub skc_u16hashes: [__u16; 2usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct inet6_dev { - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub addr_list: list_head, - pub mc_list: *mut ifmcaddr6, - pub mc_tomb: *mut ifmcaddr6, - pub mc_qrv: ::aya_bpf::cty::c_uchar, - pub mc_gq_running: ::aya_bpf::cty::c_uchar, - pub mc_ifc_count: ::aya_bpf::cty::c_uchar, - pub mc_dad_count: ::aya_bpf::cty::c_uchar, - pub mc_v1_seen: ::aya_bpf::cty::c_ulong, - pub mc_qi: ::aya_bpf::cty::c_ulong, - pub mc_qri: ::aya_bpf::cty::c_ulong, - pub mc_maxdelay: ::aya_bpf::cty::c_ulong, - pub mc_gq_work: delayed_work, - pub mc_ifc_work: delayed_work, - pub mc_dad_work: delayed_work, - pub mc_query_work: delayed_work, - pub mc_report_work: delayed_work, - pub mc_query_queue: sk_buff_head, - pub mc_report_queue: sk_buff_head, - pub mc_query_lock: spinlock_t, - pub mc_report_lock: spinlock_t, - pub mc_lock: mutex, - pub ac_list: *mut ifacaddr6, - pub lock: rwlock_t, - pub refcnt: refcount_t, - pub if_flags: __u32, - pub dead: ::aya_bpf::cty::c_int, - pub desync_factor: u32_, - pub tempaddr_list: list_head, - pub token: in6_addr, - pub nd_parms: *mut neigh_parms, - pub cnf: ipv6_devconf, - pub stats: ipv6_devstat, - pub rs_timer: timer_list, - pub rs_interval: __s32, - pub rs_probes: __u8, - pub tstamp: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, - pub ra_mtu: ::aya_bpf::cty::c_uint, +pub union sock_common__bindgen_ty_3 { + pub skc_portpair: __portpair, + pub __bindgen_anon_1: sock_common__bindgen_ty_3__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rtnl_link_ops { - pub list: list_head, - pub kind: *const ::aya_bpf::cty::c_char, - pub priv_size: usize, - pub alloc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut *mut nlattr, - arg2: *const ::aya_bpf::cty::c_char, - arg3: ::aya_bpf::cty::c_uchar, - arg4: ::aya_bpf::cty::c_uint, - arg5: ::aya_bpf::cty::c_uint, - ) -> *mut net_device, - >, - pub setup: ::core::option::Option, - pub netns_refund: bool_, - pub maxtype: ::aya_bpf::cty::c_uint, - pub policy: *const nla_policy, - pub validate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut *mut nlattr, - arg2: *mut *mut nlattr, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub newlink: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut net_device, - arg3: *mut *mut nlattr, - arg4: *mut *mut nlattr, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub changelink: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut *mut nlattr, - arg3: *mut *mut nlattr, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub dellink: - ::core::option::Option, - pub get_size: ::core::option::Option usize>, - pub fill_info: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *const net_device) -> ::aya_bpf::cty::c_int, - >, - pub get_xstats_size: - ::core::option::Option usize>, - pub fill_xstats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *const net_device) -> ::aya_bpf::cty::c_int, - >, - pub get_num_tx_queues: ::core::option::Option ::aya_bpf::cty::c_uint>, - pub get_num_rx_queues: ::core::option::Option ::aya_bpf::cty::c_uint>, - pub slave_maxtype: ::aya_bpf::cty::c_uint, - pub slave_policy: *const nla_policy, - pub slave_changelink: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: *mut net_device, - arg3: *mut *mut nlattr, - arg4: *mut *mut nlattr, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_slave_size: ::core::option::Option< - unsafe extern "C" fn(arg1: *const net_device, arg2: *const net_device) -> usize, - >, - pub fill_slave_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *const net_device, - arg3: *const net_device, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_link_net: - ::core::option::Option *mut net>, - pub get_linkxstats_size: ::core::option::Option< - unsafe extern "C" fn(arg1: *const net_device, arg2: ::aya_bpf::cty::c_int) -> usize, - >, - pub fill_linkxstats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *const net_device, - arg3: *mut ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_ops { - pub mdo_dev_open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_dev_stop: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_add_secy: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_upd_secy: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_del_secy: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_add_rxsc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_upd_rxsc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_del_rxsc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_add_rxsa: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_upd_rxsa: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_del_rxsa: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_add_txsa: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_upd_txsa: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_del_txsa: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_get_dev_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_get_tx_sc_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_get_tx_sa_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_get_rx_sc_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, - pub mdo_get_rx_sa_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut macsec_context) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct udp_tunnel_nic_table_info { - pub n_entries: ::aya_bpf::cty::c_uint, - pub tunnel_types: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct udp_tunnel_nic_info { - pub set_port: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut udp_tunnel_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub unset_port: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut udp_tunnel_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub sync_table: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub shared: *mut udp_tunnel_nic_shared, - pub flags: ::aya_bpf::cty::c_uint, - pub tables: [udp_tunnel_nic_table_info; 4usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct neigh_table { - pub family: ::aya_bpf::cty::c_int, - pub entry_size: ::aya_bpf::cty::c_uint, - pub key_len: ::aya_bpf::cty::c_uint, - pub protocol: __be16, - pub hash: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_void, - arg2: *const net_device, - arg3: *mut __u32, - ) -> __u32, - >, - pub key_eq: ::core::option::Option< - unsafe extern "C" fn(arg1: *const neighbour, arg2: *const ::aya_bpf::cty::c_void) -> bool_, - >, - pub constructor: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub pconstructor: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut pneigh_entry) -> ::aya_bpf::cty::c_int, - >, - pub pdestructor: ::core::option::Option, - pub proxy_redo: ::core::option::Option, - pub is_multicast: ::core::option::Option< - unsafe extern "C" fn(arg1: *const ::aya_bpf::cty::c_void) -> ::aya_bpf::cty::c_int, - >, - pub allow_add: ::core::option::Option< - unsafe extern "C" fn(arg1: *const net_device, arg2: *mut netlink_ext_ack) -> bool_, - >, - pub id: *mut ::aya_bpf::cty::c_char, - pub parms: neigh_parms, - pub parms_list: list_head, - pub gc_interval: ::aya_bpf::cty::c_int, - pub gc_thresh1: ::aya_bpf::cty::c_int, - pub gc_thresh2: ::aya_bpf::cty::c_int, - pub gc_thresh3: ::aya_bpf::cty::c_int, - pub last_flush: ::aya_bpf::cty::c_ulong, - pub gc_work: delayed_work, - pub managed_work: delayed_work, - pub proxy_timer: timer_list, - pub proxy_queue: sk_buff_head, - pub entries: atomic_t, - pub gc_entries: atomic_t, - pub gc_list: list_head, - pub managed_list: list_head, - pub lock: rwlock_t, - pub last_rand: ::aya_bpf::cty::c_ulong, - pub stats: *mut neigh_statistics, - pub nht: *mut neigh_hash_table, - pub phash_buckets: *mut *mut pneigh_entry, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct neigh_statistics { - pub allocs: ::aya_bpf::cty::c_ulong, - pub destroys: ::aya_bpf::cty::c_ulong, - pub hash_grows: ::aya_bpf::cty::c_ulong, - pub res_failed: ::aya_bpf::cty::c_ulong, - pub lookups: ::aya_bpf::cty::c_ulong, - pub hits: ::aya_bpf::cty::c_ulong, - pub rcv_probes_mcast: ::aya_bpf::cty::c_ulong, - pub rcv_probes_ucast: ::aya_bpf::cty::c_ulong, - pub periodic_gc_runs: ::aya_bpf::cty::c_ulong, - pub forced_gc_runs: ::aya_bpf::cty::c_ulong, - pub unres_discards: ::aya_bpf::cty::c_ulong, - pub table_fulls: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct neigh_ops { - pub family: ::aya_bpf::cty::c_int, - pub solicit: - ::core::option::Option, - pub error_report: - ::core::option::Option, - pub output: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut neighbour, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub connected_output: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut neighbour, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Debug)] -pub struct pneigh_entry { - pub next: *mut pneigh_entry, - pub net: possible_net_t, - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub flags: u32_, - pub protocol: u8_, - pub key: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct neigh_hash_table { - pub hash_buckets: *mut *mut neighbour, - pub hash_shift: ::aya_bpf::cty::c_uint, - pub hash_rnd: [__u32; 4usize], - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug)] -pub struct lwtunnel_state { - pub type_: __u16, - pub flags: __u16, - pub headroom: __u16, - pub refcnt: atomic_t, - pub orig_output: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut sock, - arg3: *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, - >, - pub orig_input: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub rcu: callback_head, - pub data: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fib_rule_hdr { - pub family: __u8, - pub dst_len: __u8, - pub src_len: __u8, - pub tos: __u8, - pub table: __u8, - pub res1: __u8, - pub res2: __u8, - pub action: __u8, - pub flags: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fib_rule_port_range { - pub start: __u16, - pub end: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fib_kuid_range { - pub start: kuid_t, - pub end: kuid_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fib_rule { - pub list: list_head, - pub iifindex: ::aya_bpf::cty::c_int, - pub oifindex: ::aya_bpf::cty::c_int, - pub mark: u32_, - pub mark_mask: u32_, - pub flags: u32_, - pub table: u32_, - pub action: u8_, - pub l3mdev: u8_, - pub proto: u8_, - pub ip_proto: u8_, - pub target: u32_, - pub tun_id: __be64, - pub ctarget: *mut fib_rule, - pub fr_net: *mut net, - pub refcnt: refcount_t, - pub pref: u32_, - pub suppress_ifgroup: ::aya_bpf::cty::c_int, - pub suppress_prefixlen: ::aya_bpf::cty::c_int, - pub iifname: [::aya_bpf::cty::c_char; 16usize], - pub oifname: [::aya_bpf::cty::c_char; 16usize], - pub uid_range: fib_kuid_range, - pub sport_range: fib_rule_port_range, - pub dport_range: fib_rule_port_range, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fib_lookup_arg { - pub lookup_ptr: *mut ::aya_bpf::cty::c_void, - pub lookup_data: *const ::aya_bpf::cty::c_void, - pub result: *mut ::aya_bpf::cty::c_void, - pub rule: *mut fib_rule, - pub table: u32_, - pub flags: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct smc_hashinfo { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct proto { - pub close: - ::core::option::Option, - pub pre_connect: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub connect: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub disconnect: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, - >, - pub accept: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ::aya_bpf::cty::c_int, - arg4: bool_, - ) -> *mut sock, - >, - pub ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub init: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub destroy: ::core::option::Option, - pub shutdown: - ::core::option::Option, - pub setsockopt: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: sockptr_t, - arg5: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub getsockopt: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut ::aya_bpf::cty::c_char, - arg5: *mut ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub keepalive: - ::core::option::Option, - pub compat_ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub sendmsg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut msghdr, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub recvmsg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut msghdr, - arg3: usize, - arg4: ::aya_bpf::cty::c_int, - arg5: *mut ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub sendpage: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut page, - arg3: ::aya_bpf::cty::c_int, - arg4: usize, - arg5: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub bind: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub bind_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sockaddr, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub backlog_rcv: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub bpf_bypass_getsockopt: ::core::option::Option< - unsafe extern "C" fn(arg1: ::aya_bpf::cty::c_int, arg2: ::aya_bpf::cty::c_int) -> bool_, - >, - pub release_cb: ::core::option::Option, - pub hash: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub unhash: ::core::option::Option, - pub rehash: ::core::option::Option, - pub get_port: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: ::aya_bpf::cty::c_ushort, - ) -> ::aya_bpf::cty::c_int, - >, - pub put_port: ::core::option::Option, - pub psock_update_sk_prot: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sk_psock, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub inuse_idx: ::aya_bpf::cty::c_uint, - pub forward_alloc_get: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub stream_memory_free: ::core::option::Option< - unsafe extern "C" fn(arg1: *const sock, arg2: ::aya_bpf::cty::c_int) -> bool_, - >, - pub sock_is_readable: ::core::option::Option bool_>, - pub enter_memory_pressure: ::core::option::Option, - pub leave_memory_pressure: ::core::option::Option, - pub memory_allocated: *mut atomic_long_t, - pub per_cpu_fw_alloc: *mut ::aya_bpf::cty::c_int, - pub sockets_allocated: *mut percpu_counter, - pub memory_pressure: *mut ::aya_bpf::cty::c_ulong, - pub sysctl_mem: *mut ::aya_bpf::cty::c_long, - pub sysctl_wmem: *mut ::aya_bpf::cty::c_int, - pub sysctl_rmem: *mut ::aya_bpf::cty::c_int, - pub sysctl_wmem_offset: u32_, - pub sysctl_rmem_offset: u32_, - pub max_header: ::aya_bpf::cty::c_int, - pub no_autobind: bool_, - pub slab: *mut kmem_cache, - pub obj_size: ::aya_bpf::cty::c_uint, - pub slab_flags: slab_flags_t, - pub useroffset: ::aya_bpf::cty::c_uint, - pub usersize: ::aya_bpf::cty::c_uint, - pub orphan_count: *mut ::aya_bpf::cty::c_uint, - pub rsk_prot: *mut request_sock_ops, - pub twsk_prot: *mut timewait_sock_ops, - pub h: proto__bindgen_ty_1, - pub owner: *mut module, - pub name: [::aya_bpf::cty::c_char; 32usize], - pub node: list_head, - pub diag_destroy: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, - >, +pub struct sock_common__bindgen_ty_3__bindgen_ty_1 { + pub skc_dport: __be16, + pub skc_num: __u16, } #[repr(C)] #[derive(Copy, Clone)] -pub union proto__bindgen_ty_1 { - pub hashinfo: *mut inet_hashinfo, - pub udp_table: *mut udp_table, - pub raw_hash: *mut raw_hashinfo, - pub smc_hash: *mut smc_hashinfo, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct request_sock_ops { - pub family: ::aya_bpf::cty::c_int, - pub obj_size: ::aya_bpf::cty::c_uint, - pub slab: *mut kmem_cache, - pub slab_name: *mut ::aya_bpf::cty::c_char, - pub rtx_syn_ack: ::core::option::Option< - unsafe extern "C" fn(arg1: *const sock, arg2: *mut request_sock) -> ::aya_bpf::cty::c_int, - >, - pub send_ack: ::core::option::Option< - unsafe extern "C" fn(arg1: *const sock, arg2: *mut sk_buff, arg3: *mut request_sock), - >, - pub send_reset: - ::core::option::Option, - pub destructor: ::core::option::Option, - pub syn_ack_timeout: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timewait_sock_ops { - pub twsk_slab: *mut kmem_cache, - pub twsk_slab_name: *mut ::aya_bpf::cty::c_char, - pub twsk_obj_size: ::aya_bpf::cty::c_uint, - pub twsk_unique: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sock, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub twsk_destructor: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug)] -pub struct saved_syn { - pub mac_hdrlen: u32_, - pub network_hdrlen: u32_, - pub tcp_hdrlen: u32_, - pub data: __IncompleteArrayField, +pub union sock_common__bindgen_ty_4 { + pub skc_bind_node: hlist_node, + pub skc_portaddr_node: hlist_node, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ip6_sf_list { - pub sf_next: *mut ip6_sf_list, - pub sf_addr: in6_addr, - pub sf_count: [::aya_bpf::cty::c_ulong; 2usize], - pub sf_gsresp: ::aya_bpf::cty::c_uchar, - pub sf_oldin: ::aya_bpf::cty::c_uchar, - pub sf_crcount: ::aya_bpf::cty::c_uchar, - pub rcu: callback_head, +pub union sock_common__bindgen_ty_5 { + pub skc_flags: ::aya_ebpf::cty::c_ulong, + pub skc_listener: *mut sock, + pub skc_tw_dr: *mut inet_timewait_death_row, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ifmcaddr6 { - pub mca_addr: in6_addr, - pub idev: *mut inet6_dev, - pub next: *mut ifmcaddr6, - pub mca_sources: *mut ip6_sf_list, - pub mca_tomb: *mut ip6_sf_list, - pub mca_sfmode: ::aya_bpf::cty::c_uint, - pub mca_crcount: ::aya_bpf::cty::c_uchar, - pub mca_sfcount: [::aya_bpf::cty::c_ulong; 2usize], - pub mca_work: delayed_work, - pub mca_flags: ::aya_bpf::cty::c_uint, - pub mca_users: ::aya_bpf::cty::c_int, - pub mca_refcnt: refcount_t, - pub mca_cstamp: ::aya_bpf::cty::c_ulong, - pub mca_tstamp: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, +pub union sock_common__bindgen_ty_6 { + pub skc_node: hlist_node, + pub skc_nulls_node: hlist_nulls_node, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ifacaddr6 { - pub aca_addr: in6_addr, - pub aca_rt: *mut fib6_info, - pub aca_next: *mut ifacaddr6, - pub aca_addr_lst: hlist_node, - pub aca_users: ::aya_bpf::cty::c_int, - pub aca_refcnt: refcount_t, - pub aca_cstamp: ::aya_bpf::cty::c_ulong, - pub aca_tstamp: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nd_opt_hdr { - pub nd_opt_type: __u8, - pub nd_opt_len: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ndisc_options { - pub nd_opt_array: [*mut nd_opt_hdr; 15usize], - pub nd_opts_ri: *mut nd_opt_hdr, - pub nd_opts_ri_end: *mut nd_opt_hdr, - pub nd_useropts: *mut nd_opt_hdr, - pub nd_useropts_end: *mut nd_opt_hdr, - pub nd_802154_opt_array: [*mut nd_opt_hdr; 3usize], +pub union sock_common__bindgen_ty_7 { + pub skc_incoming_cpu: ::aya_ebpf::cty::c_int, + pub skc_rcv_wnd: u32_, + pub skc_tw_rcv_nxt: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct prefix_info { - pub type_: __u8, - pub length: __u8, - pub prefix_len: __u8, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub valid: __be32, - pub prefered: __be32, - pub reserved2: __be32, - pub prefix: in6_addr, +pub union sock_common__bindgen_ty_8 { + pub skc_rxhash: u32_, + pub skc_window_clamp: u32_, + pub skc_tw_snd_nxt: u32_, } -impl prefix_info { +impl sock_common { #[inline] - pub fn reserved(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 6u8) as u8) } + pub fn skc_reuse(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } } #[inline] - pub fn set_reserved(&mut self, val: __u8) { + pub fn set_skc_reuse(&mut self, val: ::aya_ebpf::cty::c_uchar) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 6u8, val as u64) + self._bitfield_1.set(0usize, 4u8, val as u64) } } #[inline] - pub fn autoconf(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + pub fn skc_reuseport(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } } #[inline] - pub fn set_autoconf(&mut self, val: __u8) { + pub fn set_skc_reuseport(&mut self, val: ::aya_ebpf::cty::c_uchar) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) + self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] - pub fn onlink(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + pub fn skc_ipv6only(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } } #[inline] - pub fn set_onlink(&mut self, val: __u8) { + pub fn set_skc_ipv6only(&mut self, val: ::aya_ebpf::cty::c_uchar) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn skc_net_refcnt(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + } + #[inline] + pub fn set_skc_net_refcnt(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - reserved: __u8, - autoconf: __u8, - onlink: __u8, + skc_reuse: ::aya_ebpf::cty::c_uchar, + skc_reuseport: ::aya_ebpf::cty::c_uchar, + skc_ipv6only: ::aya_ebpf::cty::c_uchar, + skc_net_refcnt: ::aya_ebpf::cty::c_uchar, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 6u8, { - let reserved: u8 = unsafe { ::core::mem::transmute(reserved) }; - reserved as u64 + __bindgen_bitfield_unit.set(0usize, 4u8, { + let skc_reuse: u8 = unsafe { ::core::mem::transmute(skc_reuse) }; + skc_reuse as u64 }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let autoconf: u8 = unsafe { ::core::mem::transmute(autoconf) }; - autoconf as u64 + __bindgen_bitfield_unit.set(4usize, 1u8, { + let skc_reuseport: u8 = unsafe { ::core::mem::transmute(skc_reuseport) }; + skc_reuseport as u64 }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let onlink: u8 = unsafe { ::core::mem::transmute(onlink) }; - onlink as u64 + __bindgen_bitfield_unit.set(5usize, 1u8, { + let skc_ipv6only: u8 = unsafe { ::core::mem::transmute(skc_ipv6only) }; + skc_ipv6only as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let skc_net_refcnt: u8 = unsafe { ::core::mem::transmute(skc_net_refcnt) }; + skc_net_refcnt as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Copy, Clone)] -pub struct udp_hslot { - pub head: hlist_head, - pub count: ::aya_bpf::cty::c_int, - pub lock: spinlock_t, -} -#[repr(C)] -#[derive(Debug)] -pub struct crypto_tfm { - pub refcnt: refcount_t, - pub crt_flags: u32_, - pub node: ::aya_bpf::cty::c_int, - pub exit: ::core::option::Option, - pub __crt_alg: *mut crypto_alg, - pub __crt_ctx: __IncompleteArrayField<*mut ::aya_bpf::cty::c_void>, +pub struct socket_lock_t { + pub slock: spinlock_t, + pub owned: ::aya_ebpf::cty::c_int, + pub wq: wait_queue_head_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cipher_alg { - pub cia_min_keysize: ::aya_bpf::cty::c_uint, - pub cia_max_keysize: ::aya_bpf::cty::c_uint, - pub cia_setkey: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut crypto_tfm, - arg2: *const u8_, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub cia_encrypt: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut crypto_tfm, arg2: *mut u8_, arg3: *const u8_), - >, - pub cia_decrypt: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut crypto_tfm, arg2: *mut u8_, arg3: *const u8_), - >, +pub struct sock_cgroup_data { + pub cgroup: *mut cgroup, + pub classid: u32_, + pub prioidx: u16_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct compress_alg { - pub coa_compress: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut crypto_tfm, - arg2: *const u8_, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut u8_, - arg5: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub coa_decompress: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut crypto_tfm, - arg2: *const u8_, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut u8_, - arg5: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, -} +pub struct netns_tracker {} #[repr(C)] -#[derive(Copy, Clone)] -pub struct crypto_alg { - pub cra_list: list_head, - pub cra_users: list_head, - pub cra_flags: u32_, - pub cra_blocksize: ::aya_bpf::cty::c_uint, - pub cra_ctxsize: ::aya_bpf::cty::c_uint, - pub cra_alignmask: ::aya_bpf::cty::c_uint, - pub cra_priority: ::aya_bpf::cty::c_int, - pub cra_refcnt: refcount_t, - pub cra_name: [::aya_bpf::cty::c_char; 128usize], - pub cra_driver_name: [::aya_bpf::cty::c_char; 128usize], - pub cra_type: *const crypto_type, - pub cra_u: crypto_alg__bindgen_ty_1, - pub cra_init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut crypto_tfm) -> ::aya_bpf::cty::c_int, - >, - pub cra_exit: ::core::option::Option, - pub cra_destroy: ::core::option::Option, - pub cra_module: *mut module, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union crypto_alg__bindgen_ty_1 { - pub cipher: cipher_alg, - pub compress: compress_alg, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct crypto_type { - pub ctxsize: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut crypto_alg, - arg2: u32_, - arg3: u32_, - ) -> ::aya_bpf::cty::c_uint, - >, - pub extsize: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut crypto_alg) -> ::aya_bpf::cty::c_uint, +pub struct sock { + pub __sk_common: sock_common, + pub sk_rx_dst: *mut dst_entry, + pub sk_rx_dst_ifindex: ::aya_ebpf::cty::c_int, + pub sk_rx_dst_cookie: u32_, + pub sk_lock: socket_lock_t, + pub sk_drops: atomic_t, + pub sk_rcvlowat: ::aya_ebpf::cty::c_int, + pub sk_error_queue: sk_buff_head, + pub sk_receive_queue: sk_buff_head, + pub sk_backlog: sock__bindgen_ty_1, + pub sk_forward_alloc: ::aya_ebpf::cty::c_int, + pub sk_reserved_mem: u32_, + pub sk_ll_usec: ::aya_ebpf::cty::c_uint, + pub sk_napi_id: ::aya_ebpf::cty::c_uint, + pub sk_rcvbuf: ::aya_ebpf::cty::c_int, + pub sk_disconnects: ::aya_ebpf::cty::c_int, + pub sk_filter: *mut sk_filter, + pub __bindgen_anon_1: sock__bindgen_ty_2, + pub sk_policy: [*mut xfrm_policy; 2usize], + pub sk_dst_cache: *mut dst_entry, + pub sk_omem_alloc: atomic_t, + pub sk_sndbuf: ::aya_ebpf::cty::c_int, + pub sk_wmem_queued: ::aya_ebpf::cty::c_int, + pub sk_wmem_alloc: refcount_t, + pub sk_tsq_flags: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_2: sock__bindgen_ty_3, + pub sk_write_queue: sk_buff_head, + pub sk_peek_off: __s32, + pub sk_write_pending: ::aya_ebpf::cty::c_int, + pub sk_dst_pending_confirm: __u32, + pub sk_pacing_status: u32_, + pub sk_sndtimeo: ::aya_ebpf::cty::c_long, + pub sk_timer: timer_list, + pub sk_priority: __u32, + pub sk_mark: __u32, + pub sk_pacing_rate: ::aya_ebpf::cty::c_ulong, + pub sk_max_pacing_rate: ::aya_ebpf::cty::c_ulong, + pub sk_frag: page_frag, + pub sk_route_caps: netdev_features_t, + pub sk_gso_type: ::aya_ebpf::cty::c_int, + pub sk_gso_max_size: ::aya_ebpf::cty::c_uint, + pub sk_allocation: gfp_t, + pub sk_txhash: __u32, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub sk_pacing_shift: u8_, + pub sk_type: u16_, + pub sk_protocol: u16_, + pub sk_gso_max_segs: u16_, + pub sk_lingertime: ::aya_ebpf::cty::c_ulong, + pub sk_prot_creator: *mut proto, + pub sk_callback_lock: rwlock_t, + pub sk_err: ::aya_ebpf::cty::c_int, + pub sk_err_soft: ::aya_ebpf::cty::c_int, + pub sk_ack_backlog: u32_, + pub sk_max_ack_backlog: u32_, + pub sk_uid: kuid_t, + pub sk_txrehash: u8_, + pub sk_prefer_busy_poll: u8_, + pub sk_busy_poll_budget: u16_, + pub sk_peer_lock: spinlock_t, + pub sk_bind_phc: ::aya_ebpf::cty::c_int, + pub sk_peer_pid: *mut pid, + pub sk_peer_cred: *const cred, + pub sk_rcvtimeo: ::aya_ebpf::cty::c_long, + pub sk_stamp: ktime_t, + pub sk_tskey: atomic_t, + pub sk_zckey: atomic_t, + pub sk_tsflags: u32_, + pub sk_shutdown: u8_, + pub sk_clockid: u8_, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, + pub sk_use_task_frag: bool_, + pub sk_socket: *mut socket, + pub sk_user_data: *mut ::aya_ebpf::cty::c_void, + pub sk_security: *mut ::aya_ebpf::cty::c_void, + pub sk_cgrp_data: sock_cgroup_data, + pub sk_memcg: *mut mem_cgroup, + pub sk_state_change: ::core::option::Option, + pub sk_data_ready: ::core::option::Option, + pub sk_write_space: ::core::option::Option, + pub sk_error_report: ::core::option::Option, + pub sk_backlog_rcv: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sock, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >, - pub init: ::core::option::Option< + pub sk_validate_xmit_skb: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut crypto_tfm, - arg2: u32_, - arg3: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub init_tfm: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut crypto_tfm) -> ::aya_bpf::cty::c_int, - >, - pub show: - ::core::option::Option, - pub report: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut crypto_alg) -> ::aya_bpf::cty::c_int, - >, - pub free: ::core::option::Option, - pub report_stat: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut crypto_alg) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: *mut net_device, + arg3: *mut sk_buff, + ) -> *mut sk_buff, >, - pub type_: ::aya_bpf::cty::c_uint, - pub maskclear: ::aya_bpf::cty::c_uint, - pub maskset: ::aya_bpf::cty::c_uint, - pub tfmsize: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -pub struct crypto_instance { - pub alg: crypto_alg, - pub tmpl: *mut crypto_template, - pub __bindgen_anon_1: crypto_instance__bindgen_ty_1, - pub __ctx: __IncompleteArrayField<*mut ::aya_bpf::cty::c_void>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union crypto_instance__bindgen_ty_1 { - pub list: hlist_node, - pub spawns: *mut crypto_spawn, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct crypto_spawn { - pub list: list_head, - pub alg: *mut crypto_alg, - pub __bindgen_anon_1: crypto_spawn__bindgen_ty_1, - pub frontend: *const crypto_type, - pub mask: u32_, - pub dead: bool_, - pub registered: bool_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union crypto_spawn__bindgen_ty_1 { - pub inst: *mut crypto_instance, - pub next: *mut crypto_spawn, + pub sk_destruct: ::core::option::Option, + pub sk_reuseport_cb: *mut sock_reuseport, + pub sk_bpf_storage: *mut bpf_local_storage, + pub sk_rcu: callback_head, + pub ns_tracker: netns_tracker, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct crypto_template { - pub list: list_head, - pub instances: hlist_head, - pub module: *mut module, - pub create: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut crypto_template, - arg2: *mut *mut rtattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub name: [::aya_bpf::cty::c_char; 128usize], -} -#[repr(C)] -#[derive(Debug)] -pub struct crypto_shash { - pub descsize: ::aya_bpf::cty::c_uint, - pub base: crypto_tfm, +pub struct sock__bindgen_ty_1 { + pub rmem_alloc: atomic_t, + pub len: ::aya_ebpf::cty::c_int, + pub head: *mut sk_buff, + pub tail: *mut sk_buff, } #[repr(C)] #[derive(Copy, Clone)] -pub struct __call_single_data { - pub node: __call_single_node, - pub func: smp_call_func_t, - pub info: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_plug { - pub mq_list: *mut request, - pub cached_rq: *mut request, - pub nr_ios: ::aya_bpf::cty::c_ushort, - pub rq_count: ::aya_bpf::cty::c_ushort, - pub multiple_queues: bool_, - pub has_elevator: bool_, - pub nowait: bool_, - pub cb_list: list_head, +pub union sock__bindgen_ty_2 { + pub sk_wq: *mut socket_wq, + pub sk_wq_raw: *mut socket_wq, } #[repr(C)] #[derive(Copy, Clone)] -pub struct gendisk { - pub major: ::aya_bpf::cty::c_int, - pub first_minor: ::aya_bpf::cty::c_int, - pub minors: ::aya_bpf::cty::c_int, - pub disk_name: [::aya_bpf::cty::c_char; 32usize], - pub events: ::aya_bpf::cty::c_ushort, - pub event_flags: ::aya_bpf::cty::c_ushort, - pub part_tbl: xarray, - pub part0: *mut block_device, - pub fops: *const block_device_operations, - pub queue: *mut request_queue, - pub private_data: *mut ::aya_bpf::cty::c_void, - pub bio_split: bio_set, - pub flags: ::aya_bpf::cty::c_int, - pub state: ::aya_bpf::cty::c_ulong, - pub open_mutex: mutex, - pub open_partitions: ::aya_bpf::cty::c_uint, - pub bdi: *mut backing_dev_info, - pub queue_kobj: kobject, - pub slave_dir: *mut kobject, - pub slave_bdevs: list_head, - pub random: *mut timer_rand_state, - pub sync_io: atomic_t, - pub ev: *mut disk_events, - pub nr_zones: ::aya_bpf::cty::c_uint, - pub max_open_zones: ::aya_bpf::cty::c_uint, - pub max_active_zones: ::aya_bpf::cty::c_uint, - pub conv_zones_bitmap: *mut ::aya_bpf::cty::c_ulong, - pub seq_zones_wlock: *mut ::aya_bpf::cty::c_ulong, - pub cdi: *mut cdrom_device_info, - pub node_id: ::aya_bpf::cty::c_int, - pub bb: *mut badblocks, - pub lockdep_map: lockdep_map, - pub diskseq: u64_, - pub ia_ranges: *mut blk_independent_access_ranges, +pub union sock__bindgen_ty_3 { + pub sk_send_head: *mut sk_buff, + pub tcp_rtx_queue: rb_root, +} +impl sock { + #[inline] + pub fn sk_gso_disabled(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_sk_gso_disabled(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn sk_kern_sock(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_sk_kern_sock(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn sk_no_check_tx(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_sk_no_check_tx(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn sk_no_check_rx(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_sk_no_check_rx(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn sk_userlocks(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } + } + #[inline] + pub fn set_sk_userlocks(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 4u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + sk_gso_disabled: u8_, + sk_kern_sock: u8_, + sk_no_check_tx: u8_, + sk_no_check_rx: u8_, + sk_userlocks: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let sk_gso_disabled: u8 = unsafe { ::core::mem::transmute(sk_gso_disabled) }; + sk_gso_disabled as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let sk_kern_sock: u8 = unsafe { ::core::mem::transmute(sk_kern_sock) }; + sk_kern_sock as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let sk_no_check_tx: u8 = unsafe { ::core::mem::transmute(sk_no_check_tx) }; + sk_no_check_tx as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let sk_no_check_rx: u8 = unsafe { ::core::mem::transmute(sk_no_check_rx) }; + sk_no_check_rx as u64 + }); + __bindgen_bitfield_unit.set(4usize, 4u8, { + let sk_userlocks: u8 = unsafe { ::core::mem::transmute(sk_userlocks) }; + sk_userlocks as u64 + }); + __bindgen_bitfield_unit + } + #[inline] + pub fn sk_txtime_deadline_mode(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_sk_txtime_deadline_mode(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn sk_txtime_report_errors(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_2.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_sk_txtime_report_errors(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn sk_txtime_unused(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 6u8) as u8) } + } + #[inline] + pub fn set_sk_txtime_unused(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_2.set(2usize, 6u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_2( + sk_txtime_deadline_mode: u8_, + sk_txtime_report_errors: u8_, + sk_txtime_unused: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let sk_txtime_deadline_mode: u8 = + unsafe { ::core::mem::transmute(sk_txtime_deadline_mode) }; + sk_txtime_deadline_mode as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let sk_txtime_report_errors: u8 = + unsafe { ::core::mem::transmute(sk_txtime_report_errors) }; + sk_txtime_report_errors as u64 + }); + __bindgen_bitfield_unit.set(2usize, 6u8, { + let sk_txtime_unused: u8 = unsafe { ::core::mem::transmute(sk_txtime_unused) }; + sk_txtime_unused as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_integrity { - pub profile: *const blk_integrity_profile, - pub flags: ::aya_bpf::cty::c_uchar, - pub tuple_size: ::aya_bpf::cty::c_uchar, - pub interval_exp: ::aya_bpf::cty::c_uchar, - pub tag_size: ::aya_bpf::cty::c_uchar, -} -pub mod blk_bounce { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BLK_BOUNCE_NONE: Type = 0; - pub const BLK_BOUNCE_HIGH: Type = 1; -} -pub mod blk_zoned_model { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BLK_ZONED_NONE: Type = 0; - pub const BLK_ZONED_HA: Type = 1; - pub const BLK_ZONED_HM: Type = 2; +pub struct flowi_tunnel { + pub tun_id: __be64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct queue_limits { - pub bounce: blk_bounce::Type, - pub seg_boundary_mask: ::aya_bpf::cty::c_ulong, - pub virt_boundary_mask: ::aya_bpf::cty::c_ulong, - pub max_hw_sectors: ::aya_bpf::cty::c_uint, - pub max_dev_sectors: ::aya_bpf::cty::c_uint, - pub chunk_sectors: ::aya_bpf::cty::c_uint, - pub max_sectors: ::aya_bpf::cty::c_uint, - pub max_user_sectors: ::aya_bpf::cty::c_uint, - pub max_segment_size: ::aya_bpf::cty::c_uint, - pub physical_block_size: ::aya_bpf::cty::c_uint, - pub logical_block_size: ::aya_bpf::cty::c_uint, - pub alignment_offset: ::aya_bpf::cty::c_uint, - pub io_min: ::aya_bpf::cty::c_uint, - pub io_opt: ::aya_bpf::cty::c_uint, - pub max_discard_sectors: ::aya_bpf::cty::c_uint, - pub max_hw_discard_sectors: ::aya_bpf::cty::c_uint, - pub max_secure_erase_sectors: ::aya_bpf::cty::c_uint, - pub max_write_zeroes_sectors: ::aya_bpf::cty::c_uint, - pub max_zone_append_sectors: ::aya_bpf::cty::c_uint, - pub discard_granularity: ::aya_bpf::cty::c_uint, - pub discard_alignment: ::aya_bpf::cty::c_uint, - pub zone_write_granularity: ::aya_bpf::cty::c_uint, - pub max_segments: ::aya_bpf::cty::c_ushort, - pub max_integrity_segments: ::aya_bpf::cty::c_ushort, - pub max_discard_segments: ::aya_bpf::cty::c_ushort, - pub misaligned: ::aya_bpf::cty::c_uchar, - pub discard_misaligned: ::aya_bpf::cty::c_uchar, - pub raid_partial_stripes_expensive: ::aya_bpf::cty::c_uchar, - pub zoned: blk_zoned_model::Type, - pub dma_alignment: ::aya_bpf::cty::c_uint, +pub struct flowi_common { + pub flowic_oif: ::aya_ebpf::cty::c_int, + pub flowic_iif: ::aya_ebpf::cty::c_int, + pub flowic_l3mdev: ::aya_ebpf::cty::c_int, + pub flowic_mark: __u32, + pub flowic_tos: __u8, + pub flowic_scope: __u8, + pub flowic_proto: __u8, + pub flowic_flags: __u8, + pub flowic_secid: __u32, + pub flowic_uid: kuid_t, + pub flowic_multipath_hash: __u32, + pub flowic_tun_key: flowi_tunnel, } #[repr(C)] #[derive(Copy, Clone)] -pub struct request_queue { - pub last_merge: *mut request, - pub elevator: *mut elevator_queue, - pub q_usage_counter: percpu_ref, - pub stats: *mut blk_queue_stats, - pub rq_qos: *mut rq_qos, - pub rq_qos_mutex: mutex, - pub mq_ops: *const blk_mq_ops, - pub queue_ctx: *mut blk_mq_ctx, - pub queue_depth: ::aya_bpf::cty::c_uint, - pub hctx_table: xarray, - pub nr_hw_queues: ::aya_bpf::cty::c_uint, - pub queuedata: *mut ::aya_bpf::cty::c_void, - pub queue_flags: ::aya_bpf::cty::c_ulong, - pub pm_only: atomic_t, - pub id: ::aya_bpf::cty::c_int, - pub queue_lock: spinlock_t, - pub disk: *mut gendisk, - pub refs: refcount_t, - pub mq_kobj: *mut kobject, - pub integrity: blk_integrity, - pub dev: *mut device, - pub rpm_status: rpm_status::Type, - pub nr_requests: ::aya_bpf::cty::c_ulong, - pub dma_pad_mask: ::aya_bpf::cty::c_uint, - pub crypto_profile: *mut blk_crypto_profile, - pub crypto_kobject: *mut kobject, - pub rq_timeout: ::aya_bpf::cty::c_uint, - pub timeout: timer_list, - pub timeout_work: work_struct, - pub nr_active_requests_shared_tags: atomic_t, - pub sched_shared_tags: *mut blk_mq_tags, - pub icq_list: list_head, - pub blkcg_pols: [::aya_bpf::cty::c_ulong; 1usize], - pub root_blkg: *mut blkcg_gq, - pub blkg_list: list_head, - pub blkcg_mutex: mutex, - pub limits: queue_limits, - pub required_elevator_features: ::aya_bpf::cty::c_uint, - pub node: ::aya_bpf::cty::c_int, - pub blk_trace: *mut blk_trace, - pub fq: *mut blk_flush_queue, - pub requeue_list: list_head, - pub requeue_lock: spinlock_t, - pub requeue_work: delayed_work, - pub sysfs_lock: mutex, - pub sysfs_dir_lock: mutex, - pub unused_hctx_list: list_head, - pub unused_hctx_lock: spinlock_t, - pub mq_freeze_depth: ::aya_bpf::cty::c_int, - pub td: *mut throtl_data, - pub callback_head: callback_head, - pub mq_freeze_wq: wait_queue_head_t, - pub mq_freeze_lock: mutex, - pub quiesce_depth: ::aya_bpf::cty::c_int, - pub tag_set: *mut blk_mq_tag_set, - pub tag_set_list: list_head, - pub debugfs_dir: *mut dentry, - pub sched_debugfs_dir: *mut dentry, - pub rqos_debugfs_dir: *mut dentry, - pub debugfs_mutex: mutex, - pub mq_sysfs_init_done: bool_, +pub union flowi_uli { + pub ports: flowi_uli__bindgen_ty_1, + pub icmpt: flowi_uli__bindgen_ty_2, + pub gre_key: __be32, + pub mht: flowi_uli__bindgen_ty_3, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_comp_batch { - pub req_list: *mut request, - pub need_ts: bool_, - pub complete: ::core::option::Option, +pub struct flowi_uli__bindgen_ty_1 { + pub dport: __be16, + pub sport: __be16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct partition_meta_info { - pub uuid: [::aya_bpf::cty::c_char; 37usize], - pub volname: [u8_; 64usize], +pub struct flowi_uli__bindgen_ty_2 { + pub type_: __u8, + pub code: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blkg_iostat { - pub bytes: [u64_; 3usize], - pub ios: [u64_; 3usize], +pub struct flowi_uli__bindgen_ty_3 { + pub type_: __u8, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blkg_iostat_set { - pub sync: u64_stats_sync, - pub blkg: *mut blkcg_gq, - pub lnode: llist_node, - pub lqueued: ::aya_bpf::cty::c_int, - pub cur: blkg_iostat, - pub last: blkg_iostat, +#[derive(Copy, Clone)] +pub struct flowi4 { + pub __fl_common: flowi_common, + pub saddr: __be32, + pub daddr: __be32, + pub uli: flowi_uli, } #[repr(C)] #[derive(Copy, Clone)] -pub struct blkcg_gq { - pub q: *mut request_queue, - pub q_node: list_head, - pub blkcg_node: hlist_node, - pub blkcg: *mut blkcg, - pub parent: *mut blkcg_gq, - pub refcnt: percpu_ref, - pub online: bool_, - pub iostat_cpu: *mut blkg_iostat_set, - pub iostat: blkg_iostat_set, - pub pd: [*mut blkg_policy_data; 6usize], - pub async_bio_lock: spinlock_t, - pub async_bios: bio_list, - pub __bindgen_anon_1: blkcg_gq__bindgen_ty_1, - pub use_delay: atomic_t, - pub delay_nsec: atomic64_t, - pub delay_start: atomic64_t, - pub last_delay: u64_, - pub last_use: ::aya_bpf::cty::c_int, - pub callback_head: callback_head, +pub struct flowi6 { + pub __fl_common: flowi_common, + pub daddr: in6_addr, + pub saddr: in6_addr, + pub flowlabel: __be32, + pub uli: flowi_uli, + pub mp_hash: __u32, } #[repr(C)] #[derive(Copy, Clone)] -pub union blkcg_gq__bindgen_ty_1 { - pub async_bio_work: work_struct, - pub free_work: work_struct, +pub struct flowi { + pub u: flowi__bindgen_ty_1, } -pub type blk_mq_req_flags_t = __u32; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_zone { - pub start: __u64, - pub len: __u64, - pub wp: __u64, - pub type_: __u8, - pub cond: __u8, - pub non_seq: __u8, - pub reset: __u8, - pub resv: [__u8; 4usize], - pub capacity: __u64, - pub reserved: [__u8; 24usize], +#[derive(Copy, Clone)] +pub union flowi__bindgen_ty_1 { + pub __fl_common: flowi_common, + pub ip4: flowi4, + pub ip6: flowi6, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sbitmap_word { - pub word: ::aya_bpf::cty::c_ulong, +#[derive(Copy, Clone)] +pub struct sockptr_t { + pub __bindgen_anon_1: sockptr_t__bindgen_ty_1, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub cleared: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sbitmap { - pub depth: ::aya_bpf::cty::c_uint, - pub shift: ::aya_bpf::cty::c_uint, - pub map_nr: ::aya_bpf::cty::c_uint, - pub round_robin: bool_, - pub map: *mut sbitmap_word, - pub alloc_hint: *mut ::aya_bpf::cty::c_uint, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 7usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct sbq_wait_state { - pub wait: wait_queue_head_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, +pub union sockptr_t__bindgen_ty_1 { + pub kernel: *mut ::aya_ebpf::cty::c_void, + pub user: *mut ::aya_ebpf::cty::c_void, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sbitmap_queue { - pub sb: sbitmap, - pub wake_batch: ::aya_bpf::cty::c_uint, - pub wake_index: atomic_t, - pub ws: *mut sbq_wait_state, - pub ws_active: atomic_t, - pub min_shallow_depth: ::aya_bpf::cty::c_uint, - pub completion_cnt: atomic_t, - pub wakeup_cnt: atomic_t, +impl sockptr_t { + #[inline] + pub fn is_kernel(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_kernel(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(is_kernel: bool_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_kernel: u8 = unsafe { ::core::mem::transmute(is_kernel) }; + is_kernel as u64 + }); + __bindgen_bitfield_unit + } +} +pub mod socket_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const SS_FREE: Type = 0; + pub const SS_UNCONNECTED: Type = 1; + pub const SS_CONNECTING: Type = 2; + pub const SS_CONNECTED: Type = 3; + pub const SS_DISCONNECTING: Type = 4; } -pub type integrity_processing_fn = - ::core::option::Option blk_status_t>; -pub type integrity_prepare_fn = ::core::option::Option; -pub type integrity_complete_fn = - ::core::option::Option; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_integrity_profile { - pub generate_fn: integrity_processing_fn, - pub verify_fn: integrity_processing_fn, - pub prepare_fn: integrity_prepare_fn, - pub complete_fn: integrity_complete_fn, - pub name: *const ::aya_bpf::cty::c_char, +#[derive(Copy, Clone)] +pub struct socket_wq { + pub wait: wait_queue_head_t, + pub fasync_list: *mut fasync_struct, + pub flags: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } -pub type report_zones_cb = ::core::option::Option< +impl socket_wq { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct socket { + pub state: socket_state::Type, + pub type_: ::aya_ebpf::cty::c_short, + pub flags: ::aya_ebpf::cty::c_ulong, + pub file: *mut file, + pub sk: *mut sock, + pub ops: *const proto_ops, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub wq: socket_wq, +} +impl socket { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct read_descriptor_t { + pub written: usize, + pub count: usize, + pub arg: read_descriptor_t__bindgen_ty_1, + pub error: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union read_descriptor_t__bindgen_ty_1 { + pub buf: *mut ::aya_ebpf::cty::c_char, + pub data: *mut ::aya_ebpf::cty::c_void, +} +pub type sk_read_actor_t = ::core::option::Option< unsafe extern "C" fn( - arg1: *mut blk_zone, - arg2: ::aya_bpf::cty::c_uint, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut read_descriptor_t, + arg2: *mut sk_buff, + arg3: ::aya_ebpf::cty::c_uint, + arg4: usize, + ) -> ::aya_ebpf::cty::c_int, +>; +pub type skb_read_actor_t = ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sock, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >; -pub mod blk_unique_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BLK_UID_T10: Type = 1; - pub const BLK_UID_EUI64: Type = 2; - pub const BLK_UID_NAA: Type = 3; -} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct block_device_operations { - pub submit_bio: ::core::option::Option, - pub poll_bio: ::core::option::Option< +pub struct proto_ops { + pub family: ::aya_ebpf::cty::c_int, + pub owner: *mut module, + pub release: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub bind: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bio, - arg2: *mut io_comp_batch, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut socket, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut block_device, arg2: fmode_t) -> ::aya_bpf::cty::c_int, + pub connect: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub socketpair: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut socket, arg2: *mut socket) -> ::aya_ebpf::cty::c_int, + >, + pub accept: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: *mut socket, + arg3: ::aya_ebpf::cty::c_int, + arg4: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub getname: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub poll: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut socket, + arg3: *mut poll_table_struct, + ) -> __poll_t, >, - pub release: ::core::option::Option, pub ioctl: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut block_device, - arg2: fmode_t, - arg3: ::aya_bpf::cty::c_uint, - arg4: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut socket, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, pub compat_ioctl: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut block_device, - arg2: fmode_t, - arg3: ::aya_bpf::cty::c_uint, - arg4: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut socket, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub check_events: ::core::option::Option< + pub gettstamp: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut gendisk, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_uint, + arg1: *mut socket, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: bool_, + arg4: bool_, + ) -> ::aya_ebpf::cty::c_int, >, - pub unlock_native_capacity: ::core::option::Option, - pub getgeo: ::core::option::Option< + pub listen: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut block_device, - arg2: *mut hd_geometry, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut socket, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub set_read_only: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut block_device, arg2: bool_) -> ::aya_bpf::cty::c_int, + pub shutdown: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub free_disk: ::core::option::Option, - pub swap_slot_free_notify: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut block_device, arg2: ::aya_bpf::cty::c_ulong), + pub setsockopt: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: sockptr_t, + arg5: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub report_zones: ::core::option::Option< + pub getsockopt: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut gendisk, - arg2: sector_t, - arg3: ::aya_bpf::cty::c_uint, - arg4: report_zones_cb, - arg5: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut socket, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_char, + arg5: *mut ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub devnode: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut gendisk, arg2: *mut umode_t) -> *mut ::aya_bpf::cty::c_char, + pub show_fdinfo: + ::core::option::Option, + pub sendmsg: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: *mut msghdr, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, >, - pub get_unique_id: ::core::option::Option< + pub recvmsg: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut gendisk, - arg2: *mut u8_, - arg3: blk_unique_id::Type, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut socket, + arg2: *mut msghdr, + arg3: usize, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub owner: *mut module, - pub pr_ops: *const pr_ops, - pub alternative_gpt_sector: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut gendisk, arg2: *mut sector_t) -> ::aya_bpf::cty::c_int, + pub mmap: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut socket, + arg3: *mut vm_area_struct, + ) -> ::aya_ebpf::cty::c_int, + >, + pub splice_read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut socket, + arg2: *mut loff_t, + arg3: *mut pipe_inode_info, + arg4: usize, + arg5: ::aya_ebpf::cty::c_uint, + ) -> isize, + >, + pub splice_eof: ::core::option::Option, + pub set_peek_off: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub peek_len: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub read_sock: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut read_descriptor_t, + arg3: sk_read_actor_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub read_skb: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sock, arg2: skb_read_actor_t) -> ::aya_ebpf::cty::c_int, + >, + pub sendmsg_locked: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut msghdr, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_rcvlowat: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_independent_access_range { - pub kobj: kobject, - pub sector: sector_t, - pub nr_sectors: sector_t, +pub struct prot_inuse { + pub all: ::aya_ebpf::cty::c_int, + pub val: [::aya_ebpf::cty::c_int; 64usize], } #[repr(C)] -#[derive(Debug)] -pub struct blk_independent_access_ranges { - pub kobj: kobject, - pub sysfs_registered: bool_, - pub nr_ia_ranges: ::aya_bpf::cty::c_uint, - pub ia_range: __IncompleteArrayField, -} -pub type req_flags_t = __u32; -pub mod mq_rq_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const MQ_RQ_IDLE: Type = 0; - pub const MQ_RQ_IN_FLIGHT: Type = 1; - pub const MQ_RQ_COMPLETE: Type = 2; -} -pub mod rq_end_io_ret { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RQ_END_IO_NONE: Type = 0; - pub const RQ_END_IO_FREE: Type = 1; +#[derive(Debug, Copy, Clone)] +pub struct fib_rules_ops { + pub family: ::aya_ebpf::cty::c_int, + pub list: list_head, + pub rule_size: ::aya_ebpf::cty::c_int, + pub addr_size: ::aya_ebpf::cty::c_int, + pub unresolved_rules: ::aya_ebpf::cty::c_int, + pub nr_goto_rules: ::aya_ebpf::cty::c_int, + pub fib_rules_seq: ::aya_ebpf::cty::c_uint, + pub action: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fib_rule, + arg2: *mut flowi, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut fib_lookup_arg, + ) -> ::aya_ebpf::cty::c_int, + >, + pub suppress: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fib_rule, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut fib_lookup_arg, + ) -> bool_, + >, + pub match_: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fib_rule, + arg2: *mut flowi, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub configure: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fib_rule, + arg2: *mut sk_buff, + arg3: *mut fib_rule_hdr, + arg4: *mut *mut nlattr, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub delete: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub compare: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fib_rule, + arg2: *mut fib_rule_hdr, + arg3: *mut *mut nlattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub fill: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fib_rule, + arg2: *mut sk_buff, + arg3: *mut fib_rule_hdr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub nlmsg_payload: ::core::option::Option usize>, + pub flush_cache: ::core::option::Option, + pub nlgroup: ::aya_ebpf::cty::c_int, + pub rules_list: list_head, + pub owner: *mut module, + pub fro_net: *mut net, + pub rcu: callback_head, } -pub type rq_end_io_fn = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request, arg2: blk_status_t) -> rq_end_io_ret::Type, ->; #[repr(C)] -#[derive(Copy, Clone)] -pub struct request { - pub q: *mut request_queue, - pub mq_ctx: *mut blk_mq_ctx, - pub mq_hctx: *mut blk_mq_hw_ctx, - pub cmd_flags: blk_opf_t, - pub rq_flags: req_flags_t, - pub tag: ::aya_bpf::cty::c_int, - pub internal_tag: ::aya_bpf::cty::c_int, - pub timeout: ::aya_bpf::cty::c_uint, - pub __data_len: ::aya_bpf::cty::c_uint, - pub __sector: sector_t, - pub bio: *mut bio, - pub biotail: *mut bio, - pub __bindgen_anon_1: request__bindgen_ty_1, - pub part: *mut block_device, - pub alloc_time_ns: u64_, - pub start_time_ns: u64_, - pub io_start_time_ns: u64_, - pub wbt_flags: ::aya_bpf::cty::c_ushort, - pub stats_sectors: ::aya_bpf::cty::c_ushort, - pub nr_phys_segments: ::aya_bpf::cty::c_ushort, - pub nr_integrity_segments: ::aya_bpf::cty::c_ushort, - pub crypt_ctx: *mut bio_crypt_ctx, - pub crypt_keyslot: *mut blk_crypto_keyslot, - pub ioprio: ::aya_bpf::cty::c_ushort, - pub state: mq_rq_state::Type, - pub ref_: atomic_t, - pub deadline: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_2: request__bindgen_ty_2, - pub __bindgen_anon_3: request__bindgen_ty_3, - pub __bindgen_anon_4: request__bindgen_ty_4, - pub __bindgen_anon_5: request__bindgen_ty_5, - pub end_io: rq_end_io_fn, - pub end_io_data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct fib_notifier_ops { + pub family: ::aya_ebpf::cty::c_int, + pub list: list_head, + pub fib_seq_read: + ::core::option::Option ::aya_ebpf::cty::c_uint>, + pub fib_dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut notifier_block, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub owner: *mut module, + pub rcu: callback_head, } #[repr(C)] #[derive(Copy, Clone)] -pub union request__bindgen_ty_1 { - pub queuelist: list_head, - pub rq_next: *mut request, +pub struct ipv6_stable_secret { + pub initialized: bool_, + pub secret: in6_addr, } #[repr(C)] #[derive(Copy, Clone)] -pub union request__bindgen_ty_2 { - pub hash: hlist_node, - pub ipi_list: llist_node, +pub struct ipv6_devconf { + pub forwarding: __s32, + pub hop_limit: __s32, + pub mtu6: __s32, + pub accept_ra: __s32, + pub accept_redirects: __s32, + pub autoconf: __s32, + pub dad_transmits: __s32, + pub rtr_solicits: __s32, + pub rtr_solicit_interval: __s32, + pub rtr_solicit_max_interval: __s32, + pub rtr_solicit_delay: __s32, + pub force_mld_version: __s32, + pub mldv1_unsolicited_report_interval: __s32, + pub mldv2_unsolicited_report_interval: __s32, + pub use_tempaddr: __s32, + pub temp_valid_lft: __s32, + pub temp_prefered_lft: __s32, + pub regen_max_retry: __s32, + pub max_desync_factor: __s32, + pub max_addresses: __s32, + pub accept_ra_defrtr: __s32, + pub ra_defrtr_metric: __u32, + pub accept_ra_min_hop_limit: __s32, + pub accept_ra_min_lft: __s32, + pub accept_ra_pinfo: __s32, + pub ignore_routes_with_linkdown: __s32, + pub accept_ra_rtr_pref: __s32, + pub rtr_probe_interval: __s32, + pub accept_ra_rt_info_min_plen: __s32, + pub accept_ra_rt_info_max_plen: __s32, + pub proxy_ndp: __s32, + pub accept_source_route: __s32, + pub accept_ra_from_local: __s32, + pub optimistic_dad: __s32, + pub use_optimistic: __s32, + pub mc_forwarding: atomic_t, + pub disable_ipv6: __s32, + pub drop_unicast_in_l2_multicast: __s32, + pub accept_dad: __s32, + pub force_tllao: __s32, + pub ndisc_notify: __s32, + pub suppress_frag_ndisc: __s32, + pub accept_ra_mtu: __s32, + pub drop_unsolicited_na: __s32, + pub accept_untracked_na: __s32, + pub stable_secret: ipv6_stable_secret, + pub use_oif_addrs_only: __s32, + pub keep_addr_on_down: __s32, + pub seg6_enabled: __s32, + pub seg6_require_hmac: __s32, + pub enhanced_dad: __u32, + pub addr_gen_mode: __u32, + pub disable_policy: __s32, + pub ndisc_tclass: __s32, + pub rpl_seg_enabled: __s32, + pub ioam6_id: __u32, + pub ioam6_id_wide: __u32, + pub ioam6_enabled: __u8, + pub ndisc_evict_nocarrier: __u8, + pub ra_honor_pio_life: __u8, + pub sysctl_header: *mut ctl_table_header, } +pub type nf_hookfn = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: *mut sk_buff, + arg3: *const nf_hook_state, + ) -> ::aya_ebpf::cty::c_uint, +>; #[repr(C)] -#[derive(Copy, Clone)] -pub union request__bindgen_ty_3 { - pub rb_node: rb_node, - pub special_vec: bio_vec, - pub completion_data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct nf_hook_entry { + pub hook: nf_hookfn, + pub priv_: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Copy, Clone)] -pub union request__bindgen_ty_4 { - pub elv: request__bindgen_ty_4__bindgen_ty_1, - pub flush: request__bindgen_ty_4__bindgen_ty_2, +#[derive(Debug)] +pub struct nf_hook_entries { + pub num_hook_entries: u16_, + pub hooks: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct request__bindgen_ty_4__bindgen_ty_1 { - pub icq: *mut io_cq, - pub priv_: [*mut ::aya_bpf::cty::c_void; 2usize], +pub struct neigh_parms { + pub net: possible_net_t, + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub list: list_head, + pub neigh_setup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut neighbour) -> ::aya_ebpf::cty::c_int, + >, + pub tbl: *mut neigh_table, + pub sysctl_table: *mut ::aya_ebpf::cty::c_void, + pub dead: ::aya_ebpf::cty::c_int, + pub refcnt: refcount_t, + pub callback_head: callback_head, + pub reachable_time: ::aya_ebpf::cty::c_int, + pub qlen: u32_, + pub data: [::aya_ebpf::cty::c_int; 14usize], + pub data_state: [::aya_ebpf::cty::c_ulong; 1usize], +} +pub mod hwtstamp_source { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const HWTSTAMP_SOURCE_NETDEV: Type = 0; + pub const HWTSTAMP_SOURCE_PHYLIB: Type = 1; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct request__bindgen_ty_4__bindgen_ty_2 { - pub seq: ::aya_bpf::cty::c_uint, - pub list: list_head, - pub saved_end_io: rq_end_io_fn, +pub struct kernel_hwtstamp_config { + pub flags: ::aya_ebpf::cty::c_int, + pub tx_type: ::aya_ebpf::cty::c_int, + pub rx_filter: ::aya_ebpf::cty::c_int, + pub ifr: *mut ifreq, + pub copied_to_user: bool_, + pub source: hwtstamp_source::Type, } #[repr(C)] -#[derive(Copy, Clone)] -pub union request__bindgen_ty_5 { - pub csd: __call_single_data, - pub fifo_time: u64_, -} -pub mod rq_qos_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RQ_QOS_WBT: Type = 0; - pub const RQ_QOS_LATENCY: Type = 1; - pub const RQ_QOS_COST: Type = 2; +#[derive(Debug, Copy, Clone)] +pub struct nf_hook_state { + pub hook: u8_, + pub pf: u8_, + pub in_: *mut net_device, + pub out: *mut net_device, + pub sk: *mut sock, + pub net: *mut net, + pub okfn: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut sock, + arg3: *mut sk_buff, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rq_qos { - pub ops: *const rq_qos_ops, - pub disk: *mut gendisk, - pub id: rq_qos_id::Type, - pub next: *mut rq_qos, - pub debugfs_dir: *mut dentry, -} -pub mod blk_eh_timer_return { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BLK_EH_DONE: Type = 0; - pub const BLK_EH_RESET_TIMER: Type = 1; +pub struct netlink_range_validation { + pub min: u64_, + pub max: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_mq_ops { - pub queue_rq: ::core::option::Option< +pub struct netlink_range_validation_signed { + pub min: s64, + pub max: s64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct neigh_table { + pub family: ::aya_ebpf::cty::c_int, + pub entry_size: ::aya_ebpf::cty::c_uint, + pub key_len: ::aya_ebpf::cty::c_uint, + pub protocol: __be16, + pub hash: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut blk_mq_hw_ctx, - arg2: *const blk_mq_queue_data, - ) -> blk_status_t, - >, - pub commit_rqs: ::core::option::Option, - pub queue_rqs: ::core::option::Option, - pub get_budget: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue) -> ::aya_bpf::cty::c_int, - >, - pub put_budget: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue, arg2: ::aya_bpf::cty::c_int), - >, - pub set_rq_budget_token: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request, arg2: ::aya_bpf::cty::c_int), + arg1: *const ::aya_ebpf::cty::c_void, + arg2: *const net_device, + arg3: *mut __u32, + ) -> __u32, >, - pub get_rq_budget_token: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub timeout: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request) -> blk_eh_timer_return::Type, + pub key_eq: ::core::option::Option< + unsafe extern "C" fn(arg1: *const neighbour, arg2: *const ::aya_ebpf::cty::c_void) -> bool_, >, - pub poll: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_mq_hw_ctx, - arg2: *mut io_comp_batch, - ) -> ::aya_bpf::cty::c_int, + pub constructor: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut neighbour) -> ::aya_ebpf::cty::c_int, >, - pub complete: ::core::option::Option, - pub init_hctx: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_mq_hw_ctx, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + pub pconstructor: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut pneigh_entry) -> ::aya_ebpf::cty::c_int, >, - pub exit_hctx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut blk_mq_hw_ctx, arg2: ::aya_bpf::cty::c_uint), + pub pdestructor: ::core::option::Option, + pub proxy_redo: ::core::option::Option, + pub is_multicast: ::core::option::Option< + unsafe extern "C" fn(arg1: *const ::aya_ebpf::cty::c_void) -> ::aya_ebpf::cty::c_int, >, - pub init_request: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_mq_tag_set, - arg2: *mut request, - arg3: ::aya_bpf::cty::c_uint, - arg4: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + pub allow_add: ::core::option::Option< + unsafe extern "C" fn(arg1: *const net_device, arg2: *mut netlink_ext_ack) -> bool_, >, - pub exit_request: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_mq_tag_set, - arg2: *mut request, - arg3: ::aya_bpf::cty::c_uint, - ), - >, - pub cleanup_rq: ::core::option::Option, - pub busy: ::core::option::Option bool_>, - pub map_queues: ::core::option::Option, - pub show_rq: - ::core::option::Option, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blk_mq_tags { - pub nr_tags: ::aya_bpf::cty::c_uint, - pub nr_reserved_tags: ::aya_bpf::cty::c_uint, - pub active_queues: ::aya_bpf::cty::c_uint, - pub bitmap_tags: sbitmap_queue, - pub breserved_tags: sbitmap_queue, - pub rqs: *mut *mut request, - pub static_rqs: *mut *mut request, - pub page_list: list_head, - pub lock: spinlock_t, + pub id: *mut ::aya_ebpf::cty::c_char, + pub parms: neigh_parms, + pub parms_list: list_head, + pub gc_interval: ::aya_ebpf::cty::c_int, + pub gc_thresh1: ::aya_ebpf::cty::c_int, + pub gc_thresh2: ::aya_ebpf::cty::c_int, + pub gc_thresh3: ::aya_ebpf::cty::c_int, + pub last_flush: ::aya_ebpf::cty::c_ulong, + pub gc_work: delayed_work, + pub managed_work: delayed_work, + pub proxy_timer: timer_list, + pub proxy_queue: sk_buff_head, + pub entries: atomic_t, + pub gc_entries: atomic_t, + pub gc_list: list_head, + pub managed_list: list_head, + pub lock: rwlock_t, + pub last_rand: ::aya_ebpf::cty::c_ulong, + pub stats: *mut neigh_statistics, + pub nht: *mut neigh_hash_table, + pub phash_buckets: *mut *mut pneigh_entry, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_mq_queue_map { - pub mq_map: *mut ::aya_bpf::cty::c_uint, - pub nr_queues: ::aya_bpf::cty::c_uint, - pub queue_offset: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blk_mq_tag_set { - pub ops: *const blk_mq_ops, - pub map: [blk_mq_queue_map; 3usize], - pub nr_maps: ::aya_bpf::cty::c_uint, - pub nr_hw_queues: ::aya_bpf::cty::c_uint, - pub queue_depth: ::aya_bpf::cty::c_uint, - pub reserved_tags: ::aya_bpf::cty::c_uint, - pub cmd_size: ::aya_bpf::cty::c_uint, - pub numa_node: ::aya_bpf::cty::c_int, - pub timeout: ::aya_bpf::cty::c_uint, - pub flags: ::aya_bpf::cty::c_uint, - pub driver_data: *mut ::aya_bpf::cty::c_void, - pub tags: *mut *mut blk_mq_tags, - pub shared_tags: *mut blk_mq_tags, - pub tag_list_lock: mutex, - pub tag_list: list_head, - pub srcu: *mut srcu_struct, -} -pub mod pr_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PR_WRITE_EXCLUSIVE: Type = 1; - pub const PR_EXCLUSIVE_ACCESS: Type = 2; - pub const PR_WRITE_EXCLUSIVE_REG_ONLY: Type = 3; - pub const PR_EXCLUSIVE_ACCESS_REG_ONLY: Type = 4; - pub const PR_WRITE_EXCLUSIVE_ALL_REGS: Type = 5; - pub const PR_EXCLUSIVE_ACCESS_ALL_REGS: Type = 6; +pub struct neigh_statistics { + pub allocs: ::aya_ebpf::cty::c_ulong, + pub destroys: ::aya_ebpf::cty::c_ulong, + pub hash_grows: ::aya_ebpf::cty::c_ulong, + pub res_failed: ::aya_ebpf::cty::c_ulong, + pub lookups: ::aya_ebpf::cty::c_ulong, + pub hits: ::aya_ebpf::cty::c_ulong, + pub rcv_probes_mcast: ::aya_ebpf::cty::c_ulong, + pub rcv_probes_ucast: ::aya_ebpf::cty::c_ulong, + pub periodic_gc_runs: ::aya_ebpf::cty::c_ulong, + pub forced_gc_runs: ::aya_ebpf::cty::c_ulong, + pub unres_discards: ::aya_ebpf::cty::c_ulong, + pub table_fulls: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pr_ops { - pub pr_register: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut block_device, - arg2: u64_, - arg3: u64_, - arg4: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub pr_reserve: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut block_device, - arg2: u64_, - arg3: pr_type::Type, - arg4: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub pr_release: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut block_device, - arg2: u64_, - arg3: pr_type::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub pr_preempt: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut block_device, - arg2: u64_, - arg3: u64_, - arg4: pr_type::Type, - arg5: bool_, - ) -> ::aya_bpf::cty::c_int, +pub struct neigh_ops { + pub family: ::aya_ebpf::cty::c_int, + pub solicit: + ::core::option::Option, + pub error_report: + ::core::option::Option, + pub output: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut neighbour, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >, - pub pr_clear: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut block_device, arg2: u64_) -> ::aya_bpf::cty::c_int, + pub connected_output: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut neighbour, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct blk_mq_hw_ctx { - pub __bindgen_anon_1: blk_mq_hw_ctx__bindgen_ty_1, - pub run_work: delayed_work, - pub cpumask: cpumask_var_t, - pub next_cpu: ::aya_bpf::cty::c_int, - pub next_cpu_batch: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_ulong, - pub sched_data: *mut ::aya_bpf::cty::c_void, - pub queue: *mut request_queue, - pub fq: *mut blk_flush_queue, - pub driver_data: *mut ::aya_bpf::cty::c_void, - pub ctx_map: sbitmap, - pub dispatch_from: *mut blk_mq_ctx, - pub dispatch_busy: ::aya_bpf::cty::c_uint, - pub type_: ::aya_bpf::cty::c_ushort, - pub nr_ctx: ::aya_bpf::cty::c_ushort, - pub ctxs: *mut *mut blk_mq_ctx, - pub dispatch_wait_lock: spinlock_t, - pub dispatch_wait: wait_queue_entry_t, - pub wait_index: atomic_t, - pub tags: *mut blk_mq_tags, - pub sched_tags: *mut blk_mq_tags, - pub queued: ::aya_bpf::cty::c_ulong, - pub run: ::aya_bpf::cty::c_ulong, - pub numa_node: ::aya_bpf::cty::c_uint, - pub queue_num: ::aya_bpf::cty::c_uint, - pub nr_active: atomic_t, - pub cpuhp_online: hlist_node, - pub cpuhp_dead: hlist_node, - pub kobj: kobject, - pub debugfs_dir: *mut dentry, - pub sched_debugfs_dir: *mut dentry, - pub hctx_list: list_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blk_mq_hw_ctx__bindgen_ty_1 { - pub lock: spinlock_t, - pub dispatch: list_head, - pub state: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl blk_mq_hw_ctx__bindgen_ty_1 { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_mq_queue_data { - pub rq: *mut request, - pub last: bool_, +#[derive(Debug)] +pub struct pneigh_entry { + pub next: *mut pneigh_entry, + pub net: possible_net_t, + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub flags: u32_, + pub protocol: u8_, + pub key: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_mq_debugfs_attr { - pub name: *const ::aya_bpf::cty::c_char, - pub mode: umode_t, - pub show: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: *mut seq_file, - ) -> ::aya_bpf::cty::c_int, - >, - pub write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: *const ::aya_bpf::cty::c_char, - arg3: usize, - arg4: *mut loff_t, - ) -> isize, - >, - pub seq_ops: *const seq_operations, +pub struct neigh_hash_table { + pub hash_buckets: *mut *mut neighbour, + pub hash_shift: ::aya_ebpf::cty::c_uint, + pub hash_rnd: [__u32; 4usize], + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rq_qos_ops { - pub throttle: ::core::option::Option, - pub track: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq_qos, arg2: *mut request, arg3: *mut bio), - >, - pub merge: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rq_qos, arg2: *mut request, arg3: *mut bio), - >, - pub issue: ::core::option::Option, - pub requeue: - ::core::option::Option, - pub done: ::core::option::Option, - pub done_bio: ::core::option::Option, - pub cleanup: ::core::option::Option, - pub queue_depth_changed: ::core::option::Option, - pub exit: ::core::option::Option, - pub debugfs_attrs: *const blk_mq_debugfs_attr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blkcg { - pub css: cgroup_subsys_state, - pub lock: spinlock_t, - pub online_pin: refcount_t, - pub blkg_tree: xarray, - pub blkg_hint: *mut blkcg_gq, - pub blkg_list: hlist_head, - pub cpd: [*mut blkcg_policy_data; 6usize], - pub all_blkcgs_node: list_head, - pub lhead: *mut llist_head, - pub fc_app_id: [::aya_bpf::cty::c_char; 129usize], - pub cgwb_list: list_head, +pub struct fib_rule_hdr { + pub family: __u8, + pub dst_len: __u8, + pub src_len: __u8, + pub tos: __u8, + pub table: __u8, + pub res1: __u8, + pub res2: __u8, + pub action: __u8, + pub flags: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blkg_policy_data { - pub blkg: *mut blkcg_gq, - pub plid: ::aya_bpf::cty::c_int, - pub online: bool_, +pub struct fib_rule_port_range { + pub start: __u16, + pub end: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blkcg_policy_data { - pub blkcg: *mut blkcg, - pub plid: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ida { - pub xa: xarray, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ld_semaphore { - pub count: atomic_long_t, - pub wait_lock: raw_spinlock_t, - pub wait_readers: ::aya_bpf::cty::c_uint, - pub read_wait: list_head, - pub write_wait: list_head, +pub struct fib_kuid_range { + pub start: kuid_t, + pub end: kuid_t, } -pub type tcflag_t = ::aya_bpf::cty::c_uint; -pub type cc_t = ::aya_bpf::cty::c_uchar; -pub type speed_t = ::aya_bpf::cty::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ktermios { - pub c_iflag: tcflag_t, - pub c_oflag: tcflag_t, - pub c_cflag: tcflag_t, - pub c_lflag: tcflag_t, - pub c_line: cc_t, - pub c_cc: [cc_t; 19usize], - pub c_ispeed: speed_t, - pub c_ospeed: speed_t, +pub struct fib_rule { + pub list: list_head, + pub iifindex: ::aya_ebpf::cty::c_int, + pub oifindex: ::aya_ebpf::cty::c_int, + pub mark: u32_, + pub mark_mask: u32_, + pub flags: u32_, + pub table: u32_, + pub action: u8_, + pub l3mdev: u8_, + pub proto: u8_, + pub ip_proto: u8_, + pub target: u32_, + pub tun_id: __be64, + pub ctarget: *mut fib_rule, + pub fr_net: *mut net, + pub refcnt: refcount_t, + pub pref: u32_, + pub suppress_ifgroup: ::aya_ebpf::cty::c_int, + pub suppress_prefixlen: ::aya_ebpf::cty::c_int, + pub iifname: [::aya_ebpf::cty::c_char; 16usize], + pub oifname: [::aya_ebpf::cty::c_char; 16usize], + pub uid_range: fib_kuid_range, + pub sport_range: fib_rule_port_range, + pub dport_range: fib_rule_port_range, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct winsize { - pub ws_row: ::aya_bpf::cty::c_ushort, - pub ws_col: ::aya_bpf::cty::c_ushort, - pub ws_xpixel: ::aya_bpf::cty::c_ushort, - pub ws_ypixel: ::aya_bpf::cty::c_ushort, -} -#[repr(C)] -pub struct tty_struct { - pub kref: kref, - pub dev: *mut device, - pub driver: *mut tty_driver, - pub ops: *const tty_operations, - pub index: ::aya_bpf::cty::c_int, - pub ldisc_sem: ld_semaphore, - pub ldisc: *mut tty_ldisc, - pub atomic_write_lock: mutex, - pub legacy_mutex: mutex, - pub throttle_mutex: mutex, - pub termios_rwsem: rw_semaphore, - pub winsize_mutex: mutex, - pub termios: ktermios, - pub termios_locked: ktermios, - pub name: [::aya_bpf::cty::c_char; 64usize], - pub flags: ::aya_bpf::cty::c_ulong, - pub count: ::aya_bpf::cty::c_int, - pub winsize: winsize, - pub flow: tty_struct__bindgen_ty_1, - pub ctrl: tty_struct__bindgen_ty_2, - pub hw_stopped: bool_, - pub receive_room: ::aya_bpf::cty::c_uint, - pub flow_change: ::aya_bpf::cty::c_int, - pub link: *mut tty_struct, - pub fasync: *mut fasync_struct, - pub write_wait: wait_queue_head_t, - pub read_wait: wait_queue_head_t, - pub hangup_work: work_struct, - pub disc_data: *mut ::aya_bpf::cty::c_void, - pub driver_data: *mut ::aya_bpf::cty::c_void, - pub files_lock: spinlock_t, - pub tty_files: list_head, - pub closing: ::aya_bpf::cty::c_int, - pub write_buf: *mut ::aya_bpf::cty::c_uchar, - pub write_cnt: ::aya_bpf::cty::c_int, - pub SAK_work: work_struct, - pub port: *mut tty_port, -} -#[repr(C)] -pub struct tty_struct__bindgen_ty_1 { - pub lock: spinlock_t, - pub stopped: bool_, - pub tco_stopped: bool_, - pub unused: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -pub struct tty_struct__bindgen_ty_2 { - pub lock: spinlock_t, - pub pgrp: *mut pid, - pub session: *mut pid, - pub pktstatus: ::aya_bpf::cty::c_uchar, - pub packet: bool_, - pub unused: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, +pub struct fib_lookup_arg { + pub lookup_ptr: *mut ::aya_ebpf::cty::c_void, + pub lookup_data: *const ::aya_ebpf::cty::c_void, + pub result: *mut ::aya_ebpf::cty::c_void, + pub rule: *mut fib_rule, + pub table: u32_, + pub flags: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tty_driver { - pub kref: kref, - pub cdevs: *mut *mut cdev, - pub owner: *mut module, - pub driver_name: *const ::aya_bpf::cty::c_char, - pub name: *const ::aya_bpf::cty::c_char, - pub name_base: ::aya_bpf::cty::c_int, - pub major: ::aya_bpf::cty::c_int, - pub minor_start: ::aya_bpf::cty::c_int, - pub num: ::aya_bpf::cty::c_uint, - pub type_: ::aya_bpf::cty::c_short, - pub subtype: ::aya_bpf::cty::c_short, - pub init_termios: ktermios, - pub flags: ::aya_bpf::cty::c_ulong, - pub proc_entry: *mut proc_dir_entry, - pub other: *mut tty_driver, - pub ttys: *mut *mut tty_struct, - pub ports: *mut *mut tty_port, - pub termios: *mut *mut ktermios, - pub driver_state: *mut ::aya_bpf::cty::c_void, - pub ops: *const tty_operations, - pub tty_drivers: list_head, -} -#[repr(C)] -pub struct tty_buffer { - pub __bindgen_anon_1: tty_buffer__bindgen_ty_1, - pub used: ::aya_bpf::cty::c_int, - pub size: ::aya_bpf::cty::c_int, - pub commit: ::aya_bpf::cty::c_int, - pub lookahead: ::aya_bpf::cty::c_int, - pub read: ::aya_bpf::cty::c_int, - pub flags: bool_, - pub data: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, +pub struct smc_hashinfo { + _unused: [u8; 0], } #[repr(C)] #[derive(Copy, Clone)] -pub union tty_buffer__bindgen_ty_1 { - pub next: *mut tty_buffer, - pub free: llist_node, -} -#[repr(C)] -pub struct tty_bufhead { - pub head: *mut tty_buffer, - pub work: work_struct, - pub lock: mutex, - pub priority: atomic_t, - pub sentinel: tty_buffer, - pub free: llist_head, - pub mem_used: atomic_t, - pub mem_limit: ::aya_bpf::cty::c_int, - pub tail: *mut tty_buffer, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tty_operations { - pub lookup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_driver, - arg2: *mut file, - arg3: ::aya_bpf::cty::c_int, - ) -> *mut tty_struct, +pub struct proto { + pub close: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_ebpf::cty::c_long), >, - pub install: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_driver, arg2: *mut tty_struct) -> ::aya_bpf::cty::c_int, + pub pre_connect: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub remove: - ::core::option::Option, - pub open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct, arg2: *mut file) -> ::aya_bpf::cty::c_int, + pub connect: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub close: ::core::option::Option, - pub shutdown: ::core::option::Option, - pub cleanup: ::core::option::Option, - pub write: ::core::option::Option< + pub disconnect: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *const ::aya_bpf::cty::c_uchar, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub put_char: ::core::option::Option< + pub accept: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_uchar, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_int, + arg4: bool_, + ) -> *mut sock, >, - pub flush_chars: ::core::option::Option, - pub write_room: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_bpf::cty::c_uint, + pub ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub chars_in_buffer: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_bpf::cty::c_uint, + pub init: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub destroy: ::core::option::Option, + pub shutdown: + ::core::option::Option, + pub setsockopt: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: sockptr_t, + arg5: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, - pub ioctl: ::core::option::Option< + pub getsockopt: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_char, + arg5: *mut ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, + pub keepalive: + ::core::option::Option, pub compat_ioctl: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_long, + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub set_termios: - ::core::option::Option, - pub throttle: ::core::option::Option, - pub unthrottle: ::core::option::Option, - pub stop: ::core::option::Option, - pub start: ::core::option::Option, - pub hangup: ::core::option::Option, - pub break_ctl: ::core::option::Option< + pub sendmsg: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub flush_buffer: ::core::option::Option, - pub set_ldisc: ::core::option::Option, - pub wait_until_sent: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct, arg2: ::aya_bpf::cty::c_int), + arg1: *mut sock, + arg2: *mut msghdr, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, >, - pub send_xchar: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct, arg2: ::aya_bpf::cty::c_char), + pub recvmsg: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut msghdr, + arg3: usize, + arg4: ::aya_ebpf::cty::c_int, + arg5: *mut ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub tiocmget: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_bpf::cty::c_int, + pub splice_eof: ::core::option::Option, + pub bind: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub tiocmset: ::core::option::Option< + pub bind_add: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: *mut sockaddr, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub resize: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct, arg2: *mut winsize) -> ::aya_bpf::cty::c_int, + pub backlog_rcv: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sock, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >, - pub get_icount: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *mut serial_icounter_struct, - ) -> ::aya_bpf::cty::c_int, + pub bpf_bypass_getsockopt: ::core::option::Option< + unsafe extern "C" fn(arg1: ::aya_ebpf::cty::c_int, arg2: ::aya_ebpf::cty::c_int) -> bool_, >, - pub get_serial: ::core::option::Option< + pub release_cb: ::core::option::Option, + pub hash: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub unhash: ::core::option::Option, + pub rehash: ::core::option::Option, + pub get_port: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *mut serial_struct, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_ushort, + ) -> ::aya_ebpf::cty::c_int, >, - pub set_serial: ::core::option::Option< + pub put_port: ::core::option::Option, + pub psock_update_sk_prot: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *mut serial_struct, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: *mut sk_psock, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, >, - pub show_fdinfo: - ::core::option::Option, - pub proc_show: ::core::option::Option< + pub inuse_idx: ::aya_ebpf::cty::c_uint, + pub forward_alloc_get: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub stream_memory_free: ::core::option::Option< + unsafe extern "C" fn(arg1: *const sock, arg2: ::aya_ebpf::cty::c_int) -> bool_, + >, + pub sock_is_readable: ::core::option::Option bool_>, + pub enter_memory_pressure: ::core::option::Option, + pub leave_memory_pressure: ::core::option::Option, + pub memory_allocated: *mut atomic_long_t, + pub per_cpu_fw_alloc: *mut ::aya_ebpf::cty::c_int, + pub sockets_allocated: *mut percpu_counter, + pub memory_pressure: *mut ::aya_ebpf::cty::c_ulong, + pub sysctl_mem: *mut ::aya_ebpf::cty::c_long, + pub sysctl_wmem: *mut ::aya_ebpf::cty::c_int, + pub sysctl_rmem: *mut ::aya_ebpf::cty::c_int, + pub sysctl_wmem_offset: u32_, + pub sysctl_rmem_offset: u32_, + pub max_header: ::aya_ebpf::cty::c_int, + pub no_autobind: bool_, + pub slab: *mut kmem_cache, + pub obj_size: ::aya_ebpf::cty::c_uint, + pub ipv6_pinfo_offset: ::aya_ebpf::cty::c_uint, + pub slab_flags: slab_flags_t, + pub useroffset: ::aya_ebpf::cty::c_uint, + pub usersize: ::aya_ebpf::cty::c_uint, + pub orphan_count: *mut ::aya_ebpf::cty::c_uint, + pub rsk_prot: *mut request_sock_ops, + pub twsk_prot: *mut timewait_sock_ops, + pub h: proto__bindgen_ty_1, + pub owner: *mut module, + pub name: [::aya_ebpf::cty::c_char; 32usize], + pub node: list_head, + pub diag_destroy: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct serial_icounter_struct { - pub cts: ::aya_bpf::cty::c_int, - pub dsr: ::aya_bpf::cty::c_int, - pub rng: ::aya_bpf::cty::c_int, - pub dcd: ::aya_bpf::cty::c_int, - pub rx: ::aya_bpf::cty::c_int, - pub tx: ::aya_bpf::cty::c_int, - pub frame: ::aya_bpf::cty::c_int, - pub overrun: ::aya_bpf::cty::c_int, - pub parity: ::aya_bpf::cty::c_int, - pub brk: ::aya_bpf::cty::c_int, - pub buf_overrun: ::aya_bpf::cty::c_int, - pub reserved: [::aya_bpf::cty::c_int; 9usize], +#[derive(Copy, Clone)] +pub union proto__bindgen_ty_1 { + pub hashinfo: *mut inet_hashinfo, + pub udp_table: *mut udp_table, + pub raw_hash: *mut raw_hashinfo, + pub smc_hash: *mut smc_hashinfo, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct serial_struct { - pub type_: ::aya_bpf::cty::c_int, - pub line: ::aya_bpf::cty::c_int, - pub port: ::aya_bpf::cty::c_uint, - pub irq: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, - pub xmit_fifo_size: ::aya_bpf::cty::c_int, - pub custom_divisor: ::aya_bpf::cty::c_int, - pub baud_base: ::aya_bpf::cty::c_int, - pub close_delay: ::aya_bpf::cty::c_ushort, - pub io_type: ::aya_bpf::cty::c_char, - pub reserved_char: [::aya_bpf::cty::c_char; 1usize], - pub hub6: ::aya_bpf::cty::c_int, - pub closing_wait: ::aya_bpf::cty::c_ushort, - pub closing_wait2: ::aya_bpf::cty::c_ushort, - pub iomem_base: *mut ::aya_bpf::cty::c_uchar, - pub iomem_reg_shift: ::aya_bpf::cty::c_ushort, - pub port_high: ::aya_bpf::cty::c_uint, - pub iomap_base: ::aya_bpf::cty::c_ulong, +pub struct request_sock_ops { + pub family: ::aya_ebpf::cty::c_int, + pub obj_size: ::aya_ebpf::cty::c_uint, + pub slab: *mut kmem_cache, + pub slab_name: *mut ::aya_ebpf::cty::c_char, + pub rtx_syn_ack: ::core::option::Option< + unsafe extern "C" fn(arg1: *const sock, arg2: *mut request_sock) -> ::aya_ebpf::cty::c_int, + >, + pub send_ack: ::core::option::Option< + unsafe extern "C" fn(arg1: *const sock, arg2: *mut sk_buff, arg3: *mut request_sock), + >, + pub send_reset: + ::core::option::Option, + pub destructor: ::core::option::Option, + pub syn_ack_timeout: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct __kfifo { - pub in_: ::aya_bpf::cty::c_uint, - pub out: ::aya_bpf::cty::c_uint, - pub mask: ::aya_bpf::cty::c_uint, - pub esize: ::aya_bpf::cty::c_uint, - pub data: *mut ::aya_bpf::cty::c_void, +pub struct timewait_sock_ops { + pub twsk_slab: *mut kmem_cache, + pub twsk_slab_name: *mut ::aya_ebpf::cty::c_char, + pub twsk_obj_size: ::aya_ebpf::cty::c_uint, + pub twsk_unique: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: *mut sock, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub twsk_destructor: ::core::option::Option, } #[repr(C)] -pub struct tty_port { - pub buf: tty_bufhead, - pub tty: *mut tty_struct, - pub itty: *mut tty_struct, - pub ops: *const tty_port_operations, - pub client_ops: *const tty_port_client_operations, - pub lock: spinlock_t, - pub blocked_open: ::aya_bpf::cty::c_int, - pub count: ::aya_bpf::cty::c_int, - pub open_wait: wait_queue_head_t, - pub delta_msr_wait: wait_queue_head_t, - pub flags: ::aya_bpf::cty::c_ulong, - pub iflags: ::aya_bpf::cty::c_ulong, +pub struct request_sock { + pub __req_common: sock_common, + pub dl_next: *mut request_sock, + pub mss: u16_, + pub num_retrans: u8_, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub mutex: mutex, - pub buf_mutex: mutex, - pub xmit_buf: *mut ::aya_bpf::cty::c_uchar, - pub xmit_fifo: tty_port__bindgen_ty_1, - pub close_delay: ::aya_bpf::cty::c_uint, - pub closing_wait: ::aya_bpf::cty::c_uint, - pub drain_delay: ::aya_bpf::cty::c_int, - pub kref: kref, - pub client_data: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -pub struct tty_port__bindgen_ty_1 { - pub __bindgen_anon_1: tty_port__bindgen_ty_1__bindgen_ty_1, - pub buf: __IncompleteArrayField<::aya_bpf::cty::c_uchar>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union tty_port__bindgen_ty_1__bindgen_ty_1 { - pub kfifo: __kfifo, - pub type_: *mut ::aya_bpf::cty::c_uchar, - pub const_type: *const ::aya_bpf::cty::c_uchar, - pub rectype: *mut [::aya_bpf::cty::c_char; 0usize], - pub ptr: *mut ::aya_bpf::cty::c_uchar, - pub ptr_const: *const ::aya_bpf::cty::c_uchar, + pub ts_recent: u32_, + pub rsk_timer: timer_list, + pub rsk_ops: *const request_sock_ops, + pub sk: *mut sock, + pub saved_syn: *mut saved_syn, + pub secid: u32_, + pub peer_secid: u32_, + pub timeout: u32_, } -impl tty_port { +impl request_sock { #[inline] - pub fn console(&self) -> ::aya_bpf::cty::c_uchar { + pub fn syncookie(&self) -> u8_ { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_console(&mut self, val: ::aya_bpf::cty::c_uchar) { + pub fn set_syncookie(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(console: ::aya_bpf::cty::c_uchar) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let console: u8 = unsafe { ::core::mem::transmute(console) }; - console as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tty_ldisc_ops { - pub name: *mut ::aya_bpf::cty::c_char, - pub num: ::aya_bpf::cty::c_int, - pub open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_bpf::cty::c_int, - >, - pub close: ::core::option::Option, - pub flush_buffer: ::core::option::Option, - pub read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *mut file, - arg3: *mut ::aya_bpf::cty::c_uchar, - arg4: usize, - arg5: *mut *mut ::aya_bpf::cty::c_void, - arg6: ::aya_bpf::cty::c_ulong, - ) -> isize, - >, - pub write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *mut file, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: usize, - ) -> isize, - >, - pub ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub compat_ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_termios: - ::core::option::Option, - pub poll: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *mut file, - arg3: *mut poll_table_struct, - ) -> __poll_t, - >, - pub hangup: ::core::option::Option, - pub receive_buf: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *const ::aya_bpf::cty::c_uchar, - arg3: *const ::aya_bpf::cty::c_char, - arg4: ::aya_bpf::cty::c_int, - ), - >, - pub write_wakeup: ::core::option::Option, - pub dcd_change: - ::core::option::Option, - pub receive_buf2: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *const ::aya_bpf::cty::c_uchar, - arg3: *const ::aya_bpf::cty::c_char, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub lookahead_buf: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_struct, - arg2: *const ::aya_bpf::cty::c_uchar, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: ::aya_bpf::cty::c_uint, - ), - >, - pub owner: *mut module, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tty_ldisc { - pub ops: *mut tty_ldisc_ops, - pub tty: *mut tty_struct, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tty_port_operations { - pub carrier_raised: ::core::option::Option bool_>, - pub dtr_rts: ::core::option::Option, - pub shutdown: ::core::option::Option, - pub activate: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tty_port, arg2: *mut tty_struct) -> ::aya_bpf::cty::c_int, - >, - pub destruct: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tty_port_client_operations { - pub receive_buf: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_port, - arg2: *const ::aya_bpf::cty::c_uchar, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub lookahead_buf: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tty_port, - arg2: *const ::aya_bpf::cty::c_uchar, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: ::aya_bpf::cty::c_uint, - ), - >, - pub write_wakeup: ::core::option::Option, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct dev_iommu { - pub lock: mutex, - pub fault_param: *mut iommu_fault_param, - pub iopf_param: *mut iopf_device_param, - pub fwspec: *mut iommu_fwspec, - pub iommu_dev: *mut iommu_device, - pub priv_: *mut ::aya_bpf::cty::c_void, - pub max_pasids: u32_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 3usize], -} -impl dev_iommu { - #[inline] - pub fn attach_deferred(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn num_timeout(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 7u8) as u8) } } #[inline] - pub fn set_attach_deferred(&mut self, val: u32_) { + pub fn set_num_timeout(&mut self, val: u8_) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 7u8, val as u64) } } #[inline] - pub fn new_bitfield_1(attach_deferred: u32_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + pub fn new_bitfield_1(syncookie: u8_, num_timeout: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let attach_deferred: u32 = unsafe { ::core::mem::transmute(attach_deferred) }; - attach_deferred as u64 + let syncookie: u8 = unsafe { ::core::mem::transmute(syncookie) }; + syncookie as u64 + }); + __bindgen_bitfield_unit.set(1usize, 7u8, { + let num_timeout: u8 = unsafe { ::core::mem::transmute(num_timeout) }; + num_timeout as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct of_phandle_args { - pub np: *mut device_node, - pub args_count: ::aya_bpf::cty::c_int, - pub args: [u32; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iommu_fault_unrecoverable { - pub reason: __u32, - pub flags: __u32, - pub pasid: __u32, - pub perm: __u32, - pub addr: __u64, - pub fetch_addr: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iommu_fault_page_request { - pub flags: __u32, - pub pasid: __u32, - pub grpid: __u32, - pub perm: __u32, - pub addr: __u64, - pub private_data: [__u64; 2usize], +#[derive(Debug)] +pub struct saved_syn { + pub mac_hdrlen: u32_, + pub network_hdrlen: u32_, + pub tcp_hdrlen: u32_, + pub data: __IncompleteArrayField, } #[repr(C)] #[derive(Copy, Clone)] -pub struct iommu_fault { - pub type_: __u32, - pub padding: __u32, - pub __bindgen_anon_1: iommu_fault__bindgen_ty_1, +pub struct nf_loginfo { + pub type_: u_int8_t, + pub u: nf_loginfo__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union iommu_fault__bindgen_ty_1 { - pub event: iommu_fault_unrecoverable, - pub prm: iommu_fault_page_request, - pub padding2: [__u8; 56usize], -} -pub mod iommu_page_response_code { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IOMMU_PAGE_RESP_SUCCESS: Type = 0; - pub const IOMMU_PAGE_RESP_INVALID: Type = 1; - pub const IOMMU_PAGE_RESP_FAILURE: Type = 2; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iommu_page_response { - pub argsz: __u32, - pub version: __u32, - pub flags: __u32, - pub pasid: __u32, - pub grpid: __u32, - pub code: __u32, +pub union nf_loginfo__bindgen_ty_1 { + pub ulog: nf_loginfo__bindgen_ty_1__bindgen_ty_1, + pub log: nf_loginfo__bindgen_ty_1__bindgen_ty_2, } -pub type iommu_fault_handler_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: *mut device, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_int, - arg5: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_domain_geometry { - pub aperture_start: dma_addr_t, - pub aperture_end: dma_addr_t, - pub force_aperture: bool_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct iommu_domain { - pub type_: ::aya_bpf::cty::c_uint, - pub ops: *const iommu_domain_ops, - pub pgsize_bitmap: ::aya_bpf::cty::c_ulong, - pub geometry: iommu_domain_geometry, - pub iova_cookie: *mut iommu_dma_cookie, - pub iopf_handler: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_fault, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> iommu_page_response_code::Type, - >, - pub fault_data: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: iommu_domain__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union iommu_domain__bindgen_ty_1 { - pub __bindgen_anon_1: iommu_domain__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: iommu_domain__bindgen_ty_1__bindgen_ty_2, +pub struct nf_loginfo__bindgen_ty_1__bindgen_ty_1 { + pub copy_len: u_int32_t, + pub group: u_int16_t, + pub qthreshold: u_int16_t, + pub flags: u_int16_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_domain__bindgen_ty_1__bindgen_ty_1 { - pub handler: iommu_fault_handler_t, - pub handler_token: *mut ::aya_bpf::cty::c_void, +pub struct nf_loginfo__bindgen_ty_1__bindgen_ty_2 { + pub level: u_int8_t, + pub logflags: u_int8_t, } +pub type __sum16 = __u16; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_domain__bindgen_ty_1__bindgen_ty_2 { - pub mm: *mut mm_struct, - pub users: ::aya_bpf::cty::c_int, -} -pub type iommu_dev_fault_handler_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_fault, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; +pub struct bpf_run_ctx {} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_domain_ops { - pub attach_dev: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: *mut device) -> ::aya_bpf::cty::c_int, - >, - pub set_dev_pasid: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: *mut device, - arg3: ioasid_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub map: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: ::aya_bpf::cty::c_ulong, - arg3: phys_addr_t, - arg4: usize, - arg5: ::aya_bpf::cty::c_int, - arg6: gfp_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub map_pages: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: ::aya_bpf::cty::c_ulong, - arg3: phys_addr_t, - arg4: usize, - arg5: usize, - arg6: ::aya_bpf::cty::c_int, - arg7: gfp_t, - arg8: *mut usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub unmap: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: ::aya_bpf::cty::c_ulong, - arg3: usize, - arg4: *mut iommu_iotlb_gather, - ) -> usize, - >, - pub unmap_pages: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: ::aya_bpf::cty::c_ulong, - arg3: usize, - arg4: usize, - arg5: *mut iommu_iotlb_gather, - ) -> usize, - >, - pub flush_iotlb_all: ::core::option::Option, - pub iotlb_sync_map: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: ::aya_bpf::cty::c_ulong, arg3: usize), - >, - pub iotlb_sync: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: *mut iommu_iotlb_gather), - >, - pub iova_to_phys: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: dma_addr_t) -> phys_addr_t, - >, - pub enforce_cache_coherency: - ::core::option::Option bool_>, - pub enable_nesting: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut iommu_domain) -> ::aya_bpf::cty::c_int, - >, - pub set_pgtable_quirks: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iommu_domain, - arg2: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub free: ::core::option::Option, +pub struct icmpv6_mib_device { + pub mibs: [atomic_long_t; 7usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_iotlb_gather { - pub start: ::aya_bpf::cty::c_ulong, - pub end: ::aya_bpf::cty::c_ulong, - pub pgsize: usize, - pub freelist: list_head, - pub queued: bool_, +pub struct icmpv6msg_mib_device { + pub mibs: [atomic_long_t; 512usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iommu_device { - pub list: list_head, - pub ops: *const iommu_ops, - pub fwnode: *mut fwnode_handle, - pub dev: *mut device, - pub max_pasids: u32_, +pub struct inet_hashinfo { + pub ehash: *mut inet_ehash_bucket, + pub ehash_locks: *mut spinlock_t, + pub ehash_mask: ::aya_ebpf::cty::c_uint, + pub ehash_locks_mask: ::aya_ebpf::cty::c_uint, + pub bind_bucket_cachep: *mut kmem_cache, + pub bhash: *mut inet_bind_hashbucket, + pub bind2_bucket_cachep: *mut kmem_cache, + pub bhash2: *mut inet_bind_hashbucket, + pub bhash_size: ::aya_ebpf::cty::c_uint, + pub lhash2_mask: ::aya_ebpf::cty::c_uint, + pub lhash2: *mut inet_listen_hashbucket, + pub pernet: bool_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, + pub __bindgen_padding_0: [u8; 7usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct iommu_fault_event { - pub fault: iommu_fault, - pub list: list_head, +pub struct ip_ra_chain { + pub next: *mut ip_ra_chain, + pub sk: *mut sock, + pub __bindgen_anon_1: ip_ra_chain__bindgen_ty_1, + pub rcu: callback_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct iommu_fault_param { - pub handler: iommu_dev_fault_handler_t, - pub data: *mut ::aya_bpf::cty::c_void, - pub faults: list_head, - pub lock: mutex, +pub union ip_ra_chain__bindgen_ty_1 { + pub destructor: ::core::option::Option, + pub saved_sk: *mut sock, } #[repr(C)] #[derive(Debug)] -pub struct iommu_fwspec { - pub ops: *const iommu_ops, - pub iommu_fwnode: *mut fwnode_handle, - pub flags: u32_, - pub num_ids: ::aya_bpf::cty::c_uint, - pub ids: __IncompleteArrayField, +pub struct fib_table { + pub tb_hlist: hlist_node, + pub tb_id: u32_, + pub tb_num_default: ::aya_ebpf::cty::c_int, + pub rcu: callback_head, + pub tb_data: *mut ::aya_ebpf::cty::c_ulong, + pub __data: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wake_irq { - pub dev: *mut device, - pub status: ::aya_bpf::cty::c_uint, - pub irq: ::aya_bpf::cty::c_int, - pub name: *const ::aya_bpf::cty::c_char, +#[derive(Copy, Clone)] +pub struct inet_peer_base { + pub rb_root: rb_root, + pub lock: seqlock_t, + pub total: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cpuidle_state_usage { - pub disable: ::aya_bpf::cty::c_ulonglong, - pub usage: ::aya_bpf::cty::c_ulonglong, - pub time_ns: u64_, - pub above: ::aya_bpf::cty::c_ulonglong, - pub below: ::aya_bpf::cty::c_ulonglong, - pub rejected: ::aya_bpf::cty::c_ulonglong, - pub s2idle_usage: ::aya_bpf::cty::c_ulonglong, - pub s2idle_time: ::aya_bpf::cty::c_ulonglong, +pub struct tcp_fastopen_context { + pub key: [siphash_key_t; 2usize], + pub num: ::aya_ebpf::cty::c_int, + pub rcu: callback_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cpuidle_state { - pub name: [::aya_bpf::cty::c_char; 16usize], - pub desc: [::aya_bpf::cty::c_char; 32usize], - pub exit_latency_ns: s64, - pub target_residency_ns: s64, - pub flags: ::aya_bpf::cty::c_uint, - pub exit_latency: ::aya_bpf::cty::c_uint, - pub power_usage: ::aya_bpf::cty::c_int, - pub target_residency: ::aya_bpf::cty::c_uint, - pub enter: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cpuidle_device, - arg2: *mut cpuidle_driver, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub enter_dead: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cpuidle_device, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub enter_s2idle: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cpuidle_device, - arg2: *mut cpuidle_driver, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, +#[derive(Copy, Clone)] +pub struct bpf_prog_array_item { + pub prog: *mut bpf_prog, + pub __bindgen_anon_1: bpf_prog_array_item__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_prog_array_item__bindgen_ty_1 { + pub cgroup_storage: [*mut bpf_cgroup_storage; 2usize], + pub bpf_cookie: u64_, +} +#[repr(C)] +pub struct bpf_prog_array { + pub rcu: callback_head, + pub items: __IncompleteArrayField, +} +pub mod bpf_prog_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_PROG_TYPE_UNSPEC: Type = 0; + pub const BPF_PROG_TYPE_SOCKET_FILTER: Type = 1; + pub const BPF_PROG_TYPE_KPROBE: Type = 2; + pub const BPF_PROG_TYPE_SCHED_CLS: Type = 3; + pub const BPF_PROG_TYPE_SCHED_ACT: Type = 4; + pub const BPF_PROG_TYPE_TRACEPOINT: Type = 5; + pub const BPF_PROG_TYPE_XDP: Type = 6; + pub const BPF_PROG_TYPE_PERF_EVENT: Type = 7; + pub const BPF_PROG_TYPE_CGROUP_SKB: Type = 8; + pub const BPF_PROG_TYPE_CGROUP_SOCK: Type = 9; + pub const BPF_PROG_TYPE_LWT_IN: Type = 10; + pub const BPF_PROG_TYPE_LWT_OUT: Type = 11; + pub const BPF_PROG_TYPE_LWT_XMIT: Type = 12; + pub const BPF_PROG_TYPE_SOCK_OPS: Type = 13; + pub const BPF_PROG_TYPE_SK_SKB: Type = 14; + pub const BPF_PROG_TYPE_CGROUP_DEVICE: Type = 15; + pub const BPF_PROG_TYPE_SK_MSG: Type = 16; + pub const BPF_PROG_TYPE_RAW_TRACEPOINT: Type = 17; + pub const BPF_PROG_TYPE_CGROUP_SOCK_ADDR: Type = 18; + pub const BPF_PROG_TYPE_LWT_SEG6LOCAL: Type = 19; + pub const BPF_PROG_TYPE_LIRC_MODE2: Type = 20; + pub const BPF_PROG_TYPE_SK_REUSEPORT: Type = 21; + pub const BPF_PROG_TYPE_FLOW_DISSECTOR: Type = 22; + pub const BPF_PROG_TYPE_CGROUP_SYSCTL: Type = 23; + pub const BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE: Type = 24; + pub const BPF_PROG_TYPE_CGROUP_SOCKOPT: Type = 25; + pub const BPF_PROG_TYPE_TRACING: Type = 26; + pub const BPF_PROG_TYPE_STRUCT_OPS: Type = 27; + pub const BPF_PROG_TYPE_EXT: Type = 28; + pub const BPF_PROG_TYPE_LSM: Type = 29; + pub const BPF_PROG_TYPE_SK_LOOKUP: Type = 30; + pub const BPF_PROG_TYPE_SYSCALL: Type = 31; + pub const BPF_PROG_TYPE_NETFILTER: Type = 32; +} +pub mod bpf_attach_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_CGROUP_INET_INGRESS: Type = 0; + pub const BPF_CGROUP_INET_EGRESS: Type = 1; + pub const BPF_CGROUP_INET_SOCK_CREATE: Type = 2; + pub const BPF_CGROUP_SOCK_OPS: Type = 3; + pub const BPF_SK_SKB_STREAM_PARSER: Type = 4; + pub const BPF_SK_SKB_STREAM_VERDICT: Type = 5; + pub const BPF_CGROUP_DEVICE: Type = 6; + pub const BPF_SK_MSG_VERDICT: Type = 7; + pub const BPF_CGROUP_INET4_BIND: Type = 8; + pub const BPF_CGROUP_INET6_BIND: Type = 9; + pub const BPF_CGROUP_INET4_CONNECT: Type = 10; + pub const BPF_CGROUP_INET6_CONNECT: Type = 11; + pub const BPF_CGROUP_INET4_POST_BIND: Type = 12; + pub const BPF_CGROUP_INET6_POST_BIND: Type = 13; + pub const BPF_CGROUP_UDP4_SENDMSG: Type = 14; + pub const BPF_CGROUP_UDP6_SENDMSG: Type = 15; + pub const BPF_LIRC_MODE2: Type = 16; + pub const BPF_FLOW_DISSECTOR: Type = 17; + pub const BPF_CGROUP_SYSCTL: Type = 18; + pub const BPF_CGROUP_UDP4_RECVMSG: Type = 19; + pub const BPF_CGROUP_UDP6_RECVMSG: Type = 20; + pub const BPF_CGROUP_GETSOCKOPT: Type = 21; + pub const BPF_CGROUP_SETSOCKOPT: Type = 22; + pub const BPF_TRACE_RAW_TP: Type = 23; + pub const BPF_TRACE_FENTRY: Type = 24; + pub const BPF_TRACE_FEXIT: Type = 25; + pub const BPF_MODIFY_RETURN: Type = 26; + pub const BPF_LSM_MAC: Type = 27; + pub const BPF_TRACE_ITER: Type = 28; + pub const BPF_CGROUP_INET4_GETPEERNAME: Type = 29; + pub const BPF_CGROUP_INET6_GETPEERNAME: Type = 30; + pub const BPF_CGROUP_INET4_GETSOCKNAME: Type = 31; + pub const BPF_CGROUP_INET6_GETSOCKNAME: Type = 32; + pub const BPF_XDP_DEVMAP: Type = 33; + pub const BPF_CGROUP_INET_SOCK_RELEASE: Type = 34; + pub const BPF_XDP_CPUMAP: Type = 35; + pub const BPF_SK_LOOKUP: Type = 36; + pub const BPF_XDP: Type = 37; + pub const BPF_SK_SKB_VERDICT: Type = 38; + pub const BPF_SK_REUSEPORT_SELECT: Type = 39; + pub const BPF_SK_REUSEPORT_SELECT_OR_MIGRATE: Type = 40; + pub const BPF_PERF_EVENT: Type = 41; + pub const BPF_TRACE_KPROBE_MULTI: Type = 42; + pub const BPF_LSM_CGROUP: Type = 43; + pub const BPF_STRUCT_OPS: Type = 44; + pub const BPF_NETFILTER: Type = 45; + pub const BPF_TCX_INGRESS: Type = 46; + pub const BPF_TCX_EGRESS: Type = 47; + pub const BPF_TRACE_UPROBE_MULTI: Type = 48; + pub const BPF_CGROUP_UNIX_CONNECT: Type = 49; + pub const BPF_CGROUP_UNIX_SENDMSG: Type = 50; + pub const BPF_CGROUP_UNIX_RECVMSG: Type = 51; + pub const BPF_CGROUP_UNIX_GETPEERNAME: Type = 52; + pub const BPF_CGROUP_UNIX_GETSOCKNAME: Type = 53; + pub const BPF_NETKIT_PRIMARY: Type = 54; + pub const BPF_NETKIT_PEER: Type = 55; + pub const __MAX_BPF_ATTACH_TYPE: Type = 56; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cpuidle_driver_kobj { - _unused: [u8; 0], +pub struct sock_filter { + pub code: __u16, + pub jt: __u8, + pub jf: __u8, + pub k: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cpuidle_device { +pub struct bpf_insn { + pub code: __u8, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub cpu: ::aya_bpf::cty::c_uint, - pub next_hrtimer: ktime_t, - pub last_state_idx: ::aya_bpf::cty::c_int, - pub last_residency_ns: u64_, - pub poll_limit_ns: u64_, - pub forced_idle_latency_limit_ns: u64_, - pub states_usage: [cpuidle_state_usage; 10usize], - pub kobjs: [*mut cpuidle_state_kobj; 10usize], - pub kobj_driver: *mut cpuidle_driver_kobj, - pub kobj_dev: *mut cpuidle_device_kobj, - pub device_list: list_head, + pub off: __s16, + pub imm: __s32, } -impl cpuidle_device { - #[inline] - pub fn registered(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_registered(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } +impl bpf_insn { #[inline] - pub fn enabled(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + pub fn dst_reg(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } } #[inline] - pub fn set_enabled(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dst_reg(&mut self, val: __u8) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 4u8, val as u64) } } #[inline] - pub fn poll_time_limit(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn src_reg(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } } #[inline] - pub fn set_poll_time_limit(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_src_reg(&mut self, val: __u8) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 4u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - registered: ::aya_bpf::cty::c_uint, - enabled: ::aya_bpf::cty::c_uint, - poll_time_limit: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + pub fn new_bitfield_1(dst_reg: __u8, src_reg: __u8) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let registered: u32 = unsafe { ::core::mem::transmute(registered) }; - registered as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let enabled: u32 = unsafe { ::core::mem::transmute(enabled) }; - enabled as u64 + __bindgen_bitfield_unit.set(0usize, 4u8, { + let dst_reg: u8 = unsafe { ::core::mem::transmute(dst_reg) }; + dst_reg as u64 }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let poll_time_limit: u32 = unsafe { ::core::mem::transmute(poll_time_limit) }; - poll_time_limit as u64 + __bindgen_bitfield_unit.set(4usize, 4u8, { + let src_reg: u8 = unsafe { ::core::mem::transmute(src_reg) }; + src_reg as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cpuidle_driver { - pub name: *const ::aya_bpf::cty::c_char, - pub owner: *mut module, +pub struct bpf_prog { + pub pages: u16_, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub states: [cpuidle_state; 10usize], - pub state_count: ::aya_bpf::cty::c_int, - pub safe_state_index: ::aya_bpf::cty::c_int, - pub cpumask: *mut cpumask, - pub governor: *const ::aya_bpf::cty::c_char, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, + pub type_: bpf_prog_type::Type, + pub expected_attach_type: bpf_attach_type::Type, + pub len: u32_, + pub jited_len: u32_, + pub tag: [u8_; 8usize], + pub stats: *mut bpf_prog_stats, + pub active: *mut ::aya_ebpf::cty::c_int, + pub bpf_func: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_void, + arg2: *const bpf_insn, + ) -> ::aya_ebpf::cty::c_uint, + >, + pub aux: *mut bpf_prog_aux, + pub orig_prog: *mut sock_fprog_kern, + pub __bindgen_anon_1: bpf_prog__bindgen_ty_1, } -impl cpuidle_driver { +#[repr(C)] +pub struct bpf_prog__bindgen_ty_1 { + pub __bindgen_anon_1: __BindgenUnionField, + pub __bindgen_anon_2: __BindgenUnionField, + pub bindgen_union_field: [u32; 0usize], +} +#[repr(C)] +#[derive(Debug)] +pub struct bpf_prog__bindgen_ty_1__bindgen_ty_1 { + pub __empty_insns: bpf_prog__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub insns: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_prog__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {} +#[repr(C)] +#[derive(Debug)] +pub struct bpf_prog__bindgen_ty_1__bindgen_ty_2 { + pub __empty_insnsi: bpf_prog__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, + pub insnsi: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_prog__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} +impl bpf_prog { #[inline] - pub fn bctimer(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn jited(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u16) } } #[inline] - pub fn set_bctimer(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_jited(&mut self, val: u16_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u16 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(bctimer: ::aya_bpf::cty::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let bctimer: u32 = unsafe { ::core::mem::transmute(bctimer) }; - bctimer as u64 - }); - __bindgen_bitfield_unit + pub fn jit_requested(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u16) } } -} -pub type __le64 = __u64; -pub type __sum16 = __u16; -pub type u_int16_t = u16_; -pub type u_int32_t = u32_; -pub type u_int64_t = u64_; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_insn { - pub code: __u8, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub off: __s16, - pub imm: __s32, -} -impl bpf_insn { #[inline] - pub fn dst_reg(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } + pub fn set_jit_requested(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } } #[inline] - pub fn set_dst_reg(&mut self, val: __u8) { + pub fn gpl_compatible(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u16) } + } + #[inline] + pub fn set_gpl_compatible(&mut self, val: u16_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 4u8, val as u64) + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn src_reg(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } + pub fn cb_access(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u16) } } #[inline] - pub fn set_src_reg(&mut self, val: __u8) { + pub fn set_cb_access(&mut self, val: u16_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 4u8, val as u64) + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(dst_reg: __u8, src_reg: __u8) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 4u8, { - let dst_reg: u8 = unsafe { ::core::mem::transmute(dst_reg) }; - dst_reg as u64 + pub fn dst_needed(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u16) } + } + #[inline] + pub fn set_dst_needed(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn blinding_requested(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u16) } + } + #[inline] + pub fn set_blinding_requested(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn blinded(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u16) } + } + #[inline] + pub fn set_blinded(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_func(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u16) } + } + #[inline] + pub fn set_is_func(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn kprobe_override(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u16) } + } + #[inline] + pub fn set_kprobe_override(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 1u8, val as u64) + } + } + #[inline] + pub fn has_callchain_buf(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u16) } + } + #[inline] + pub fn set_has_callchain_buf(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(9usize, 1u8, val as u64) + } + } + #[inline] + pub fn enforce_expected_attach_type(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u16) } + } + #[inline] + pub fn set_enforce_expected_attach_type(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(10usize, 1u8, val as u64) + } + } + #[inline] + pub fn call_get_stack(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u16) } + } + #[inline] + pub fn set_call_get_stack(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 1u8, val as u64) + } + } + #[inline] + pub fn call_get_func_ip(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u16) } + } + #[inline] + pub fn set_call_get_func_ip(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(12usize, 1u8, val as u64) + } + } + #[inline] + pub fn tstamp_type_access(&self) -> u16_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u16) } + } + #[inline] + pub fn set_tstamp_type_access(&mut self, val: u16_) { + unsafe { + let val: u16 = ::core::mem::transmute(val); + self._bitfield_1.set(13usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + jited: u16_, + jit_requested: u16_, + gpl_compatible: u16_, + cb_access: u16_, + dst_needed: u16_, + blinding_requested: u16_, + blinded: u16_, + is_func: u16_, + kprobe_override: u16_, + has_callchain_buf: u16_, + enforce_expected_attach_type: u16_, + call_get_stack: u16_, + call_get_func_ip: u16_, + tstamp_type_access: u16_, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let jited: u16 = unsafe { ::core::mem::transmute(jited) }; + jited as u64 }); - __bindgen_bitfield_unit.set(4usize, 4u8, { - let src_reg: u8 = unsafe { ::core::mem::transmute(src_reg) }; - src_reg as u64 + __bindgen_bitfield_unit.set(1usize, 1u8, { + let jit_requested: u16 = unsafe { ::core::mem::transmute(jit_requested) }; + jit_requested as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let gpl_compatible: u16 = unsafe { ::core::mem::transmute(gpl_compatible) }; + gpl_compatible as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let cb_access: u16 = unsafe { ::core::mem::transmute(cb_access) }; + cb_access as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let dst_needed: u16 = unsafe { ::core::mem::transmute(dst_needed) }; + dst_needed as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let blinding_requested: u16 = unsafe { ::core::mem::transmute(blinding_requested) }; + blinding_requested as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let blinded: u16 = unsafe { ::core::mem::transmute(blinded) }; + blinded as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let is_func: u16 = unsafe { ::core::mem::transmute(is_func) }; + is_func as u64 + }); + __bindgen_bitfield_unit.set(8usize, 1u8, { + let kprobe_override: u16 = unsafe { ::core::mem::transmute(kprobe_override) }; + kprobe_override as u64 + }); + __bindgen_bitfield_unit.set(9usize, 1u8, { + let has_callchain_buf: u16 = unsafe { ::core::mem::transmute(has_callchain_buf) }; + has_callchain_buf as u64 + }); + __bindgen_bitfield_unit.set(10usize, 1u8, { + let enforce_expected_attach_type: u16 = + unsafe { ::core::mem::transmute(enforce_expected_attach_type) }; + enforce_expected_attach_type as u64 + }); + __bindgen_bitfield_unit.set(11usize, 1u8, { + let call_get_stack: u16 = unsafe { ::core::mem::transmute(call_get_stack) }; + call_get_stack as u64 + }); + __bindgen_bitfield_unit.set(12usize, 1u8, { + let call_get_func_ip: u16 = unsafe { ::core::mem::transmute(call_get_func_ip) }; + call_get_func_ip as u64 + }); + __bindgen_bitfield_unit.set(13usize, 1u8, { + let tstamp_type_access: u16 = unsafe { ::core::mem::transmute(tstamp_type_access) }; + tstamp_type_access as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_cgroup_storage_key { - pub cgroup_inode_id: __u64, - pub attach_type: __u32, +pub struct tc_stats { + pub bytes: __u64, + pub packets: __u32, + pub drops: __u32, + pub overlimits: __u32, + pub bps: __u32, + pub pps: __u32, + pub qlen: __u32, + pub backlog: __u32, } -pub mod bpf_cgroup_iter_order { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_CGROUP_ITER_ORDER_UNSPEC: Type = 0; - pub const BPF_CGROUP_ITER_SELF_ONLY: Type = 1; - pub const BPF_CGROUP_ITER_DESCENDANTS_PRE: Type = 2; - pub const BPF_CGROUP_ITER_DESCENDANTS_POST: Type = 3; - pub const BPF_CGROUP_ITER_ANCESTORS_UP: Type = 4; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tc_sizespec { + pub cell_log: ::aya_ebpf::cty::c_uchar, + pub size_log: ::aya_ebpf::cty::c_uchar, + pub cell_align: ::aya_ebpf::cty::c_short, + pub overhead: ::aya_ebpf::cty::c_int, + pub linklayer: ::aya_ebpf::cty::c_uint, + pub mpu: ::aya_ebpf::cty::c_uint, + pub mtu: ::aya_ebpf::cty::c_uint, + pub tsize: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct qdisc_skb_head { + pub head: *mut sk_buff, + pub tail: *mut sk_buff, + pub qlen: __u32, + pub lock: spinlock_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct gnet_stats_basic_sync { + pub bytes: u64_stats_t, + pub packets: u64_stats_t, + pub syncp: u64_stats_sync, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct gnet_stats_queue { + pub qlen: __u32, + pub backlog: __u32, + pub drops: __u32, + pub requeues: __u32, + pub overlimits: __u32, +} +#[repr(C)] +pub struct Qdisc { + pub enqueue: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut Qdisc, + arg3: *mut *mut sk_buff, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dequeue: ::core::option::Option *mut sk_buff>, + pub flags: ::aya_ebpf::cty::c_uint, + pub limit: u32_, + pub ops: *const Qdisc_ops, + pub stab: *mut qdisc_size_table, + pub hash: hlist_node, + pub handle: u32_, + pub parent: u32_, + pub dev_queue: *mut netdev_queue, + pub rate_est: *mut net_rate_estimator, + pub cpu_bstats: *mut gnet_stats_basic_sync, + pub cpu_qstats: *mut gnet_stats_queue, + pub pad: ::aya_ebpf::cty::c_int, + pub refcnt: refcount_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub gso_skb: sk_buff_head, + pub q: qdisc_skb_head, + pub bstats: gnet_stats_basic_sync, + pub qstats: gnet_stats_queue, + pub state: ::aya_ebpf::cty::c_ulong, + pub state2: ::aya_ebpf::cty::c_ulong, + pub next_sched: *mut Qdisc, + pub skb_bad_txq: sk_buff_head, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, + pub busylock: spinlock_t, + pub seqlock: spinlock_t, + pub rcu: callback_head, + pub dev_tracker: netdevice_tracker, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 40usize]>, + pub privdata: __IncompleteArrayField<::aya_ebpf::cty::c_long>, +} +impl Qdisc { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } } pub mod bpf_map_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const BPF_MAP_TYPE_UNSPEC: Type = 0; pub const BPF_MAP_TYPE_HASH: Type = 1; pub const BPF_MAP_TYPE_ARRAY: Type = 2; @@ -23192,6 +22745,7 @@ pub mod bpf_map_type { pub const BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED: Type = 19; pub const BPF_MAP_TYPE_CGROUP_STORAGE: Type = 19; pub const BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: Type = 20; + pub const BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE_DEPRECATED: Type = 21; pub const BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: Type = 21; pub const BPF_MAP_TYPE_QUEUE: Type = 22; pub const BPF_MAP_TYPE_STACK: Type = 23; @@ -23205,91 +22759,401 @@ pub mod bpf_map_type { pub const BPF_MAP_TYPE_USER_RINGBUF: Type = 31; pub const BPF_MAP_TYPE_CGRP_STORAGE: Type = 32; } -pub mod bpf_prog_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_PROG_TYPE_UNSPEC: Type = 0; - pub const BPF_PROG_TYPE_SOCKET_FILTER: Type = 1; - pub const BPF_PROG_TYPE_KPROBE: Type = 2; - pub const BPF_PROG_TYPE_SCHED_CLS: Type = 3; - pub const BPF_PROG_TYPE_SCHED_ACT: Type = 4; - pub const BPF_PROG_TYPE_TRACEPOINT: Type = 5; - pub const BPF_PROG_TYPE_XDP: Type = 6; - pub const BPF_PROG_TYPE_PERF_EVENT: Type = 7; - pub const BPF_PROG_TYPE_CGROUP_SKB: Type = 8; - pub const BPF_PROG_TYPE_CGROUP_SOCK: Type = 9; - pub const BPF_PROG_TYPE_LWT_IN: Type = 10; - pub const BPF_PROG_TYPE_LWT_OUT: Type = 11; - pub const BPF_PROG_TYPE_LWT_XMIT: Type = 12; - pub const BPF_PROG_TYPE_SOCK_OPS: Type = 13; - pub const BPF_PROG_TYPE_SK_SKB: Type = 14; - pub const BPF_PROG_TYPE_CGROUP_DEVICE: Type = 15; - pub const BPF_PROG_TYPE_SK_MSG: Type = 16; - pub const BPF_PROG_TYPE_RAW_TRACEPOINT: Type = 17; - pub const BPF_PROG_TYPE_CGROUP_SOCK_ADDR: Type = 18; - pub const BPF_PROG_TYPE_LWT_SEG6LOCAL: Type = 19; - pub const BPF_PROG_TYPE_LIRC_MODE2: Type = 20; - pub const BPF_PROG_TYPE_SK_REUSEPORT: Type = 21; - pub const BPF_PROG_TYPE_FLOW_DISSECTOR: Type = 22; - pub const BPF_PROG_TYPE_CGROUP_SYSCTL: Type = 23; - pub const BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE: Type = 24; - pub const BPF_PROG_TYPE_CGROUP_SOCKOPT: Type = 25; - pub const BPF_PROG_TYPE_TRACING: Type = 26; - pub const BPF_PROG_TYPE_STRUCT_OPS: Type = 27; - pub const BPF_PROG_TYPE_EXT: Type = 28; - pub const BPF_PROG_TYPE_LSM: Type = 29; - pub const BPF_PROG_TYPE_SK_LOOKUP: Type = 30; - pub const BPF_PROG_TYPE_SYSCALL: Type = 31; - pub const BPF_PROG_TYPE_NETFILTER: Type = 32; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_map { + pub ops: *const bpf_map_ops, + pub inner_map_meta: *mut bpf_map, + pub security: *mut ::aya_ebpf::cty::c_void, + pub map_type: bpf_map_type::Type, + pub key_size: u32_, + pub value_size: u32_, + pub max_entries: u32_, + pub map_extra: u64_, + pub map_flags: u32_, + pub id: u32_, + pub record: *mut btf_record, + pub numa_node: ::aya_ebpf::cty::c_int, + pub btf_key_type_id: u32_, + pub btf_value_type_id: u32_, + pub btf_vmlinux_value_type_id: u32_, + pub btf: *mut btf, + pub objcg: *mut obj_cgroup, + pub name: [::aya_ebpf::cty::c_char; 16usize], + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub refcnt: atomic64_t, + pub usercnt: atomic64_t, + pub __bindgen_anon_1: bpf_map__bindgen_ty_1, + pub freeze_mutex: mutex, + pub writecnt: atomic64_t, + pub owner: bpf_map__bindgen_ty_2, + pub bypass_spec_v1: bool_, + pub frozen: bool_, + pub free_after_mult_rcu_gp: bool_, + pub free_after_rcu_gp: bool_, + pub sleepable_refcnt: atomic64_t, + pub elem_count: *mut s64, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 8usize]>, } -pub mod bpf_attach_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_CGROUP_INET_INGRESS: Type = 0; - pub const BPF_CGROUP_INET_EGRESS: Type = 1; - pub const BPF_CGROUP_INET_SOCK_CREATE: Type = 2; - pub const BPF_CGROUP_SOCK_OPS: Type = 3; - pub const BPF_SK_SKB_STREAM_PARSER: Type = 4; - pub const BPF_SK_SKB_STREAM_VERDICT: Type = 5; - pub const BPF_CGROUP_DEVICE: Type = 6; - pub const BPF_SK_MSG_VERDICT: Type = 7; - pub const BPF_CGROUP_INET4_BIND: Type = 8; - pub const BPF_CGROUP_INET6_BIND: Type = 9; - pub const BPF_CGROUP_INET4_CONNECT: Type = 10; - pub const BPF_CGROUP_INET6_CONNECT: Type = 11; - pub const BPF_CGROUP_INET4_POST_BIND: Type = 12; - pub const BPF_CGROUP_INET6_POST_BIND: Type = 13; - pub const BPF_CGROUP_UDP4_SENDMSG: Type = 14; - pub const BPF_CGROUP_UDP6_SENDMSG: Type = 15; - pub const BPF_LIRC_MODE2: Type = 16; - pub const BPF_FLOW_DISSECTOR: Type = 17; - pub const BPF_CGROUP_SYSCTL: Type = 18; - pub const BPF_CGROUP_UDP4_RECVMSG: Type = 19; - pub const BPF_CGROUP_UDP6_RECVMSG: Type = 20; - pub const BPF_CGROUP_GETSOCKOPT: Type = 21; - pub const BPF_CGROUP_SETSOCKOPT: Type = 22; - pub const BPF_TRACE_RAW_TP: Type = 23; - pub const BPF_TRACE_FENTRY: Type = 24; - pub const BPF_TRACE_FEXIT: Type = 25; - pub const BPF_MODIFY_RETURN: Type = 26; - pub const BPF_LSM_MAC: Type = 27; - pub const BPF_TRACE_ITER: Type = 28; - pub const BPF_CGROUP_INET4_GETPEERNAME: Type = 29; - pub const BPF_CGROUP_INET6_GETPEERNAME: Type = 30; - pub const BPF_CGROUP_INET4_GETSOCKNAME: Type = 31; - pub const BPF_CGROUP_INET6_GETSOCKNAME: Type = 32; - pub const BPF_XDP_DEVMAP: Type = 33; - pub const BPF_CGROUP_INET_SOCK_RELEASE: Type = 34; - pub const BPF_XDP_CPUMAP: Type = 35; - pub const BPF_SK_LOOKUP: Type = 36; - pub const BPF_XDP: Type = 37; - pub const BPF_SK_SKB_VERDICT: Type = 38; - pub const BPF_SK_REUSEPORT_SELECT: Type = 39; - pub const BPF_SK_REUSEPORT_SELECT_OR_MIGRATE: Type = 40; - pub const BPF_PERF_EVENT: Type = 41; - pub const BPF_TRACE_KPROBE_MULTI: Type = 42; - pub const BPF_LSM_CGROUP: Type = 43; - pub const BPF_STRUCT_OPS: Type = 44; - pub const BPF_NETFILTER: Type = 45; - pub const __MAX_BPF_ATTACH_TYPE: Type = 46; +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_map__bindgen_ty_1 { + pub work: work_struct, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_map__bindgen_ty_2 { + pub lock: spinlock_t, + pub type_: bpf_prog_type::Type, + pub jited: bool_, + pub xdp_has_frags: bool_, +} +impl bpf_map { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_offloaded_map { + pub map: bpf_map, + pub netdev: *mut net_device, + pub dev_ops: *const bpf_map_dev_ops, + pub dev_priv: *mut ::aya_ebpf::cty::c_void, + pub offloads: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl bpf_offloaded_map { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ipv6_devstat { + pub proc_dir_entry: *mut proc_dir_entry, + pub ipv6: *mut ipstats_mib, + pub icmpv6dev: *mut icmpv6_mib_device, + pub icmpv6msgdev: *mut icmpv6msg_mib_device, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct inet6_dev { + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub addr_list: list_head, + pub mc_list: *mut ifmcaddr6, + pub mc_tomb: *mut ifmcaddr6, + pub mc_qrv: ::aya_ebpf::cty::c_uchar, + pub mc_gq_running: ::aya_ebpf::cty::c_uchar, + pub mc_ifc_count: ::aya_ebpf::cty::c_uchar, + pub mc_dad_count: ::aya_ebpf::cty::c_uchar, + pub mc_v1_seen: ::aya_ebpf::cty::c_ulong, + pub mc_qi: ::aya_ebpf::cty::c_ulong, + pub mc_qri: ::aya_ebpf::cty::c_ulong, + pub mc_maxdelay: ::aya_ebpf::cty::c_ulong, + pub mc_gq_work: delayed_work, + pub mc_ifc_work: delayed_work, + pub mc_dad_work: delayed_work, + pub mc_query_work: delayed_work, + pub mc_report_work: delayed_work, + pub mc_query_queue: sk_buff_head, + pub mc_report_queue: sk_buff_head, + pub mc_query_lock: spinlock_t, + pub mc_report_lock: spinlock_t, + pub mc_lock: mutex, + pub ac_list: *mut ifacaddr6, + pub lock: rwlock_t, + pub refcnt: refcount_t, + pub if_flags: __u32, + pub dead: ::aya_ebpf::cty::c_int, + pub desync_factor: u32_, + pub tempaddr_list: list_head, + pub token: in6_addr, + pub nd_parms: *mut neigh_parms, + pub cnf: ipv6_devconf, + pub stats: ipv6_devstat, + pub rs_timer: timer_list, + pub rs_interval: __s32, + pub rs_probes: __u8, + pub tstamp: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, + pub ra_mtu: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tcmsg { + pub tcm_family: ::aya_ebpf::cty::c_uchar, + pub tcm__pad1: ::aya_ebpf::cty::c_uchar, + pub tcm__pad2: ::aya_ebpf::cty::c_ushort, + pub tcm_ifindex: ::aya_ebpf::cty::c_int, + pub tcm_handle: __u32, + pub tcm_parent: __u32, + pub tcm_info: __u32, +} +#[repr(C)] +#[derive(Debug)] +pub struct lwtunnel_state { + pub type_: __u16, + pub flags: __u16, + pub headroom: __u16, + pub refcnt: atomic_t, + pub orig_output: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut sock, + arg3: *mut sk_buff, + ) -> ::aya_ebpf::cty::c_int, + >, + pub orig_input: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub rcu: callback_head, + pub data: __IncompleteArrayField<__u8>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_filter { + pub refcnt: refcount_t, + pub rcu: callback_head, + pub prog: *mut bpf_prog, +} +#[repr(C)] +#[derive(Debug)] +pub struct sock_reuseport { + pub rcu: callback_head, + pub max_socks: u16_, + pub num_socks: u16_, + pub num_closed_socks: u16_, + pub incoming_cpu: u16_, + pub synq_overflow_ts: ::aya_ebpf::cty::c_uint, + pub reuseport_id: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub prog: *mut bpf_prog, + pub socks: __IncompleteArrayField<*mut sock>, +} +impl sock_reuseport { + #[inline] + pub fn bind_inany(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_bind_inany(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn has_conns(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_has_conns(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + bind_inany: ::aya_ebpf::cty::c_uint, + has_conns: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let bind_inany: u32 = unsafe { ::core::mem::transmute(bind_inany) }; + bind_inany as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let has_conns: u32 = unsafe { ::core::mem::transmute(has_conns) }; + has_conns as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ip6_sf_list { + pub sf_next: *mut ip6_sf_list, + pub sf_addr: in6_addr, + pub sf_count: [::aya_ebpf::cty::c_ulong; 2usize], + pub sf_gsresp: ::aya_ebpf::cty::c_uchar, + pub sf_oldin: ::aya_ebpf::cty::c_uchar, + pub sf_crcount: ::aya_ebpf::cty::c_uchar, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ifmcaddr6 { + pub mca_addr: in6_addr, + pub idev: *mut inet6_dev, + pub next: *mut ifmcaddr6, + pub mca_sources: *mut ip6_sf_list, + pub mca_tomb: *mut ip6_sf_list, + pub mca_sfmode: ::aya_ebpf::cty::c_uint, + pub mca_crcount: ::aya_ebpf::cty::c_uchar, + pub mca_sfcount: [::aya_ebpf::cty::c_ulong; 2usize], + pub mca_work: delayed_work, + pub mca_flags: ::aya_ebpf::cty::c_uint, + pub mca_users: ::aya_ebpf::cty::c_int, + pub mca_refcnt: refcount_t, + pub mca_cstamp: ::aya_ebpf::cty::c_ulong, + pub mca_tstamp: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ifacaddr6 { + pub aca_addr: in6_addr, + pub aca_rt: *mut fib6_info, + pub aca_next: *mut ifacaddr6, + pub aca_addr_lst: hlist_node, + pub aca_users: ::aya_ebpf::cty::c_int, + pub aca_refcnt: refcount_t, + pub aca_cstamp: ::aya_ebpf::cty::c_ulong, + pub aca_tstamp: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nd_opt_hdr { + pub nd_opt_type: __u8, + pub nd_opt_len: __u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ndisc_options { + pub nd_opt_array: [*mut nd_opt_hdr; 15usize], + pub nd_opts_ri: *mut nd_opt_hdr, + pub nd_opts_ri_end: *mut nd_opt_hdr, + pub nd_useropts: *mut nd_opt_hdr, + pub nd_useropts_end: *mut nd_opt_hdr, + pub nd_802154_opt_array: [*mut nd_opt_hdr; 3usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct prefix_info { + pub type_: __u8, + pub length: __u8, + pub prefix_len: __u8, + pub __bindgen_anon_1: prefix_info__bindgen_ty_1, + pub valid: __be32, + pub prefered: __be32, + pub reserved2: __be32, + pub prefix: in6_addr, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union prefix_info__bindgen_ty_1 { + pub flags: __u8, + pub __bindgen_anon_1: prefix_info__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct prefix_info__bindgen_ty_1__bindgen_ty_1 { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, +} +impl prefix_info__bindgen_ty_1__bindgen_ty_1 { + #[inline] + pub fn reserved(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 6u8) as u8) } + } + #[inline] + pub fn set_reserved(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 6u8, val as u64) + } + } + #[inline] + pub fn autoconf(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + } + #[inline] + pub fn set_autoconf(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn onlink(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + } + #[inline] + pub fn set_onlink(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + reserved: __u8, + autoconf: __u8, + onlink: __u8, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 6u8, { + let reserved: u8 = unsafe { ::core::mem::transmute(reserved) }; + reserved as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let autoconf: u8 = unsafe { ::core::mem::transmute(autoconf) }; + autoconf as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let onlink: u8 = unsafe { ::core::mem::transmute(onlink) }; + onlink as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct inet_ehash_bucket { + pub chain: hlist_nulls_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct inet_bind_hashbucket { + pub lock: spinlock_t, + pub chain: hlist_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct inet_listen_hashbucket { + pub lock: spinlock_t, + pub nulls_head: hlist_nulls_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_cgroup_storage_key { + pub cgroup_inode_id: __u64, + pub attach_type: __u32, +} +pub mod bpf_cgroup_iter_order { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_CGROUP_ITER_ORDER_UNSPEC: Type = 0; + pub const BPF_CGROUP_ITER_SELF_ONLY: Type = 1; + pub const BPF_CGROUP_ITER_DESCENDANTS_PRE: Type = 2; + pub const BPF_CGROUP_ITER_DESCENDANTS_POST: Type = 3; + pub const BPF_CGROUP_ITER_ANCESTORS_UP: Type = 4; } #[repr(C)] #[derive(Copy, Clone)] @@ -23324,7 +23188,7 @@ pub struct bpf_attr__bindgen_ty_1 { pub map_flags: __u32, pub inner_map_fd: __u32, pub numa_node: __u32, - pub map_name: [::aya_bpf::cty::c_char; 16usize], + pub map_name: [::aya_ebpf::cty::c_char; 16usize], pub map_ifindex: __u32, pub btf_fd: __u32, pub btf_key_type_id: __u32, @@ -23370,7 +23234,7 @@ pub struct bpf_attr__bindgen_ty_4 { pub log_buf: __u64, pub kern_version: __u32, pub prog_flags: __u32, - pub prog_name: [::aya_bpf::cty::c_char; 16usize], + pub prog_name: [::aya_ebpf::cty::c_char; 16usize], pub prog_ifindex: __u32, pub expected_attach_type: __u32, pub prog_btf_fd: __u32, @@ -23400,15 +23264,30 @@ pub struct bpf_attr__bindgen_ty_5 { pub pathname: __u64, pub bpf_fd: __u32, pub file_flags: __u32, + pub path_fd: __s32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Copy, Clone)] pub struct bpf_attr__bindgen_ty_6 { - pub target_fd: __u32, + pub __bindgen_anon_1: bpf_attr__bindgen_ty_6__bindgen_ty_1, pub attach_bpf_fd: __u32, pub attach_type: __u32, pub attach_flags: __u32, pub replace_bpf_fd: __u32, + pub __bindgen_anon_2: bpf_attr__bindgen_ty_6__bindgen_ty_2, + pub expected_revision: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_attr__bindgen_ty_6__bindgen_ty_1 { + pub target_fd: __u32, + pub target_ifindex: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_attr__bindgen_ty_6__bindgen_ty_2 { + pub relative_fd: __u32, + pub relative_id: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -23453,15 +23332,30 @@ pub struct bpf_attr__bindgen_ty_9 { pub info: __u64, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Copy, Clone)] pub struct bpf_attr__bindgen_ty_10 { - pub target_fd: __u32, + pub __bindgen_anon_1: bpf_attr__bindgen_ty_10__bindgen_ty_1, pub attach_type: __u32, pub query_flags: __u32, pub attach_flags: __u32, pub prog_ids: __u64, - pub prog_cnt: __u32, + pub __bindgen_anon_2: bpf_attr__bindgen_ty_10__bindgen_ty_2, pub prog_attach_flags: __u64, + pub link_ids: __u64, + pub link_attach_flags: __u64, + pub revision: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_attr__bindgen_ty_10__bindgen_ty_1 { + pub target_fd: __u32, + pub target_ifindex: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_attr__bindgen_ty_10__bindgen_ty_2 { + pub prog_cnt: __u32, + pub count: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -23522,6 +23416,9 @@ pub union bpf_attr__bindgen_ty_14__bindgen_ty_3 { pub kprobe_multi: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_3, pub tracing: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_4, pub netfilter: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_5, + pub tcx: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_6, + pub uprobe_multi: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_7, + pub netkit: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_8, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -23559,6 +23456,41 @@ pub struct bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_5 { } #[repr(C)] #[derive(Copy, Clone)] +pub struct bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_6 { + pub __bindgen_anon_1: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_6__bindgen_ty_1, + pub expected_revision: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_6__bindgen_ty_1 { + pub relative_fd: __u32, + pub relative_id: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_7 { + pub path: __u64, + pub offsets: __u64, + pub ref_ctr_offsets: __u64, + pub cookies: __u64, + pub cnt: __u32, + pub flags: __u32, + pub pid: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_8 { + pub __bindgen_anon_1: bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_8__bindgen_ty_1, + pub expected_revision: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_attr__bindgen_ty_14__bindgen_ty_3__bindgen_ty_8__bindgen_ty_1 { + pub relative_fd: __u32, + pub relative_id: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] pub struct bpf_attr__bindgen_ty_15 { pub link_fd: __u32, pub __bindgen_anon_1: bpf_attr__bindgen_ty_15__bindgen_ty_1, @@ -23600,222 +23532,6 @@ pub struct bpf_attr__bindgen_ty_19 { pub map_fd: __u32, pub flags: __u32, } -pub mod bpf_func_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_FUNC_unspec: Type = 0; - pub const BPF_FUNC_map_lookup_elem: Type = 1; - pub const BPF_FUNC_map_update_elem: Type = 2; - pub const BPF_FUNC_map_delete_elem: Type = 3; - pub const BPF_FUNC_probe_read: Type = 4; - pub const BPF_FUNC_ktime_get_ns: Type = 5; - pub const BPF_FUNC_trace_printk: Type = 6; - pub const BPF_FUNC_get_prandom_u32: Type = 7; - pub const BPF_FUNC_get_smp_processor_id: Type = 8; - pub const BPF_FUNC_skb_store_bytes: Type = 9; - pub const BPF_FUNC_l3_csum_replace: Type = 10; - pub const BPF_FUNC_l4_csum_replace: Type = 11; - pub const BPF_FUNC_tail_call: Type = 12; - pub const BPF_FUNC_clone_redirect: Type = 13; - pub const BPF_FUNC_get_current_pid_tgid: Type = 14; - pub const BPF_FUNC_get_current_uid_gid: Type = 15; - pub const BPF_FUNC_get_current_comm: Type = 16; - pub const BPF_FUNC_get_cgroup_classid: Type = 17; - pub const BPF_FUNC_skb_vlan_push: Type = 18; - pub const BPF_FUNC_skb_vlan_pop: Type = 19; - pub const BPF_FUNC_skb_get_tunnel_key: Type = 20; - pub const BPF_FUNC_skb_set_tunnel_key: Type = 21; - pub const BPF_FUNC_perf_event_read: Type = 22; - pub const BPF_FUNC_redirect: Type = 23; - pub const BPF_FUNC_get_route_realm: Type = 24; - pub const BPF_FUNC_perf_event_output: Type = 25; - pub const BPF_FUNC_skb_load_bytes: Type = 26; - pub const BPF_FUNC_get_stackid: Type = 27; - pub const BPF_FUNC_csum_diff: Type = 28; - pub const BPF_FUNC_skb_get_tunnel_opt: Type = 29; - pub const BPF_FUNC_skb_set_tunnel_opt: Type = 30; - pub const BPF_FUNC_skb_change_proto: Type = 31; - pub const BPF_FUNC_skb_change_type: Type = 32; - pub const BPF_FUNC_skb_under_cgroup: Type = 33; - pub const BPF_FUNC_get_hash_recalc: Type = 34; - pub const BPF_FUNC_get_current_task: Type = 35; - pub const BPF_FUNC_probe_write_user: Type = 36; - pub const BPF_FUNC_current_task_under_cgroup: Type = 37; - pub const BPF_FUNC_skb_change_tail: Type = 38; - pub const BPF_FUNC_skb_pull_data: Type = 39; - pub const BPF_FUNC_csum_update: Type = 40; - pub const BPF_FUNC_set_hash_invalid: Type = 41; - pub const BPF_FUNC_get_numa_node_id: Type = 42; - pub const BPF_FUNC_skb_change_head: Type = 43; - pub const BPF_FUNC_xdp_adjust_head: Type = 44; - pub const BPF_FUNC_probe_read_str: Type = 45; - pub const BPF_FUNC_get_socket_cookie: Type = 46; - pub const BPF_FUNC_get_socket_uid: Type = 47; - pub const BPF_FUNC_set_hash: Type = 48; - pub const BPF_FUNC_setsockopt: Type = 49; - pub const BPF_FUNC_skb_adjust_room: Type = 50; - pub const BPF_FUNC_redirect_map: Type = 51; - pub const BPF_FUNC_sk_redirect_map: Type = 52; - pub const BPF_FUNC_sock_map_update: Type = 53; - pub const BPF_FUNC_xdp_adjust_meta: Type = 54; - pub const BPF_FUNC_perf_event_read_value: Type = 55; - pub const BPF_FUNC_perf_prog_read_value: Type = 56; - pub const BPF_FUNC_getsockopt: Type = 57; - pub const BPF_FUNC_override_return: Type = 58; - pub const BPF_FUNC_sock_ops_cb_flags_set: Type = 59; - pub const BPF_FUNC_msg_redirect_map: Type = 60; - pub const BPF_FUNC_msg_apply_bytes: Type = 61; - pub const BPF_FUNC_msg_cork_bytes: Type = 62; - pub const BPF_FUNC_msg_pull_data: Type = 63; - pub const BPF_FUNC_bind: Type = 64; - pub const BPF_FUNC_xdp_adjust_tail: Type = 65; - pub const BPF_FUNC_skb_get_xfrm_state: Type = 66; - pub const BPF_FUNC_get_stack: Type = 67; - pub const BPF_FUNC_skb_load_bytes_relative: Type = 68; - pub const BPF_FUNC_fib_lookup: Type = 69; - pub const BPF_FUNC_sock_hash_update: Type = 70; - pub const BPF_FUNC_msg_redirect_hash: Type = 71; - pub const BPF_FUNC_sk_redirect_hash: Type = 72; - pub const BPF_FUNC_lwt_push_encap: Type = 73; - pub const BPF_FUNC_lwt_seg6_store_bytes: Type = 74; - pub const BPF_FUNC_lwt_seg6_adjust_srh: Type = 75; - pub const BPF_FUNC_lwt_seg6_action: Type = 76; - pub const BPF_FUNC_rc_repeat: Type = 77; - pub const BPF_FUNC_rc_keydown: Type = 78; - pub const BPF_FUNC_skb_cgroup_id: Type = 79; - pub const BPF_FUNC_get_current_cgroup_id: Type = 80; - pub const BPF_FUNC_get_local_storage: Type = 81; - pub const BPF_FUNC_sk_select_reuseport: Type = 82; - pub const BPF_FUNC_skb_ancestor_cgroup_id: Type = 83; - pub const BPF_FUNC_sk_lookup_tcp: Type = 84; - pub const BPF_FUNC_sk_lookup_udp: Type = 85; - pub const BPF_FUNC_sk_release: Type = 86; - pub const BPF_FUNC_map_push_elem: Type = 87; - pub const BPF_FUNC_map_pop_elem: Type = 88; - pub const BPF_FUNC_map_peek_elem: Type = 89; - pub const BPF_FUNC_msg_push_data: Type = 90; - pub const BPF_FUNC_msg_pop_data: Type = 91; - pub const BPF_FUNC_rc_pointer_rel: Type = 92; - pub const BPF_FUNC_spin_lock: Type = 93; - pub const BPF_FUNC_spin_unlock: Type = 94; - pub const BPF_FUNC_sk_fullsock: Type = 95; - pub const BPF_FUNC_tcp_sock: Type = 96; - pub const BPF_FUNC_skb_ecn_set_ce: Type = 97; - pub const BPF_FUNC_get_listener_sock: Type = 98; - pub const BPF_FUNC_skc_lookup_tcp: Type = 99; - pub const BPF_FUNC_tcp_check_syncookie: Type = 100; - pub const BPF_FUNC_sysctl_get_name: Type = 101; - pub const BPF_FUNC_sysctl_get_current_value: Type = 102; - pub const BPF_FUNC_sysctl_get_new_value: Type = 103; - pub const BPF_FUNC_sysctl_set_new_value: Type = 104; - pub const BPF_FUNC_strtol: Type = 105; - pub const BPF_FUNC_strtoul: Type = 106; - pub const BPF_FUNC_sk_storage_get: Type = 107; - pub const BPF_FUNC_sk_storage_delete: Type = 108; - pub const BPF_FUNC_send_signal: Type = 109; - pub const BPF_FUNC_tcp_gen_syncookie: Type = 110; - pub const BPF_FUNC_skb_output: Type = 111; - pub const BPF_FUNC_probe_read_user: Type = 112; - pub const BPF_FUNC_probe_read_kernel: Type = 113; - pub const BPF_FUNC_probe_read_user_str: Type = 114; - pub const BPF_FUNC_probe_read_kernel_str: Type = 115; - pub const BPF_FUNC_tcp_send_ack: Type = 116; - pub const BPF_FUNC_send_signal_thread: Type = 117; - pub const BPF_FUNC_jiffies64: Type = 118; - pub const BPF_FUNC_read_branch_records: Type = 119; - pub const BPF_FUNC_get_ns_current_pid_tgid: Type = 120; - pub const BPF_FUNC_xdp_output: Type = 121; - pub const BPF_FUNC_get_netns_cookie: Type = 122; - pub const BPF_FUNC_get_current_ancestor_cgroup_id: Type = 123; - pub const BPF_FUNC_sk_assign: Type = 124; - pub const BPF_FUNC_ktime_get_boot_ns: Type = 125; - pub const BPF_FUNC_seq_printf: Type = 126; - pub const BPF_FUNC_seq_write: Type = 127; - pub const BPF_FUNC_sk_cgroup_id: Type = 128; - pub const BPF_FUNC_sk_ancestor_cgroup_id: Type = 129; - pub const BPF_FUNC_ringbuf_output: Type = 130; - pub const BPF_FUNC_ringbuf_reserve: Type = 131; - pub const BPF_FUNC_ringbuf_submit: Type = 132; - pub const BPF_FUNC_ringbuf_discard: Type = 133; - pub const BPF_FUNC_ringbuf_query: Type = 134; - pub const BPF_FUNC_csum_level: Type = 135; - pub const BPF_FUNC_skc_to_tcp6_sock: Type = 136; - pub const BPF_FUNC_skc_to_tcp_sock: Type = 137; - pub const BPF_FUNC_skc_to_tcp_timewait_sock: Type = 138; - pub const BPF_FUNC_skc_to_tcp_request_sock: Type = 139; - pub const BPF_FUNC_skc_to_udp6_sock: Type = 140; - pub const BPF_FUNC_get_task_stack: Type = 141; - pub const BPF_FUNC_load_hdr_opt: Type = 142; - pub const BPF_FUNC_store_hdr_opt: Type = 143; - pub const BPF_FUNC_reserve_hdr_opt: Type = 144; - pub const BPF_FUNC_inode_storage_get: Type = 145; - pub const BPF_FUNC_inode_storage_delete: Type = 146; - pub const BPF_FUNC_d_path: Type = 147; - pub const BPF_FUNC_copy_from_user: Type = 148; - pub const BPF_FUNC_snprintf_btf: Type = 149; - pub const BPF_FUNC_seq_printf_btf: Type = 150; - pub const BPF_FUNC_skb_cgroup_classid: Type = 151; - pub const BPF_FUNC_redirect_neigh: Type = 152; - pub const BPF_FUNC_per_cpu_ptr: Type = 153; - pub const BPF_FUNC_this_cpu_ptr: Type = 154; - pub const BPF_FUNC_redirect_peer: Type = 155; - pub const BPF_FUNC_task_storage_get: Type = 156; - pub const BPF_FUNC_task_storage_delete: Type = 157; - pub const BPF_FUNC_get_current_task_btf: Type = 158; - pub const BPF_FUNC_bprm_opts_set: Type = 159; - pub const BPF_FUNC_ktime_get_coarse_ns: Type = 160; - pub const BPF_FUNC_ima_inode_hash: Type = 161; - pub const BPF_FUNC_sock_from_file: Type = 162; - pub const BPF_FUNC_check_mtu: Type = 163; - pub const BPF_FUNC_for_each_map_elem: Type = 164; - pub const BPF_FUNC_snprintf: Type = 165; - pub const BPF_FUNC_sys_bpf: Type = 166; - pub const BPF_FUNC_btf_find_by_name_kind: Type = 167; - pub const BPF_FUNC_sys_close: Type = 168; - pub const BPF_FUNC_timer_init: Type = 169; - pub const BPF_FUNC_timer_set_callback: Type = 170; - pub const BPF_FUNC_timer_start: Type = 171; - pub const BPF_FUNC_timer_cancel: Type = 172; - pub const BPF_FUNC_get_func_ip: Type = 173; - pub const BPF_FUNC_get_attach_cookie: Type = 174; - pub const BPF_FUNC_task_pt_regs: Type = 175; - pub const BPF_FUNC_get_branch_snapshot: Type = 176; - pub const BPF_FUNC_trace_vprintk: Type = 177; - pub const BPF_FUNC_skc_to_unix_sock: Type = 178; - pub const BPF_FUNC_kallsyms_lookup_name: Type = 179; - pub const BPF_FUNC_find_vma: Type = 180; - pub const BPF_FUNC_loop: Type = 181; - pub const BPF_FUNC_strncmp: Type = 182; - pub const BPF_FUNC_get_func_arg: Type = 183; - pub const BPF_FUNC_get_func_ret: Type = 184; - pub const BPF_FUNC_get_func_arg_cnt: Type = 185; - pub const BPF_FUNC_get_retval: Type = 186; - pub const BPF_FUNC_set_retval: Type = 187; - pub const BPF_FUNC_xdp_get_buff_len: Type = 188; - pub const BPF_FUNC_xdp_load_bytes: Type = 189; - pub const BPF_FUNC_xdp_store_bytes: Type = 190; - pub const BPF_FUNC_copy_from_user_task: Type = 191; - pub const BPF_FUNC_skb_set_tstamp: Type = 192; - pub const BPF_FUNC_ima_file_hash: Type = 193; - pub const BPF_FUNC_kptr_xchg: Type = 194; - pub const BPF_FUNC_map_lookup_percpu_elem: Type = 195; - pub const BPF_FUNC_skc_to_mptcp_sock: Type = 196; - pub const BPF_FUNC_dynptr_from_mem: Type = 197; - pub const BPF_FUNC_ringbuf_reserve_dynptr: Type = 198; - pub const BPF_FUNC_ringbuf_submit_dynptr: Type = 199; - pub const BPF_FUNC_ringbuf_discard_dynptr: Type = 200; - pub const BPF_FUNC_dynptr_read: Type = 201; - pub const BPF_FUNC_dynptr_write: Type = 202; - pub const BPF_FUNC_dynptr_data: Type = 203; - pub const BPF_FUNC_tcp_raw_gen_syncookie_ipv4: Type = 204; - pub const BPF_FUNC_tcp_raw_gen_syncookie_ipv6: Type = 205; - pub const BPF_FUNC_tcp_raw_check_syncookie_ipv4: Type = 206; - pub const BPF_FUNC_tcp_raw_check_syncookie_ipv6: Type = 207; - pub const BPF_FUNC_ktime_get_tai_ns: Type = 208; - pub const BPF_FUNC_user_ringbuf_drain: Type = 209; - pub const BPF_FUNC_cgrp_storage_get: Type = 210; - pub const BPF_FUNC_cgrp_storage_delete: Type = 211; - pub const __BPF_FUNC_MAX_ID: Type = 212; -} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct bpf_func_info { @@ -23831,63 +23547,6 @@ pub struct bpf_line_info { pub line_col: __u32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sock_filter { - pub code: __u16, - pub jt: __u8, - pub jf: __u8, - pub k: __u32, -} -pub type call_single_data_t = __call_single_data; -#[repr(C)] -#[derive(Debug)] -pub struct bucket_table { - pub size: ::aya_bpf::cty::c_uint, - pub nest: ::aya_bpf::cty::c_uint, - pub hash_rnd: u32_, - pub walkers: list_head, - pub rcu: callback_head, - pub future_tbl: *mut bucket_table, - pub dep_map: lockdep_map, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, - pub buckets: __IncompleteArrayField<*mut rhash_lock_head>, -} -impl bucket_table { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_local_storage { - pub cache: [*mut bpf_local_storage_data; 16usize], - pub smap: *mut bpf_local_storage_map, - pub list: hlist_head, - pub owner: *mut ::aya_bpf::cty::c_void, - pub rcu: callback_head, - pub lock: raw_spinlock_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_run_ctx {} -pub type bpfptr_t = sockptr_t; -#[repr(C)] -#[derive(Debug)] -pub struct btf_id_set8 { - pub cnt: u32_, - pub flags: u32_, - pub pairs: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct btf_id_set8__bindgen_ty_1 { - pub id: u32_, - pub flags: u32_, -} -#[repr(C)] #[derive(Copy, Clone)] pub struct btf_type { pub name_off: __u32, @@ -23900,28 +23559,24 @@ pub union btf_type__bindgen_ty_1 { pub size: __u32, pub type_: __u32, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct btf_struct_meta { - pub btf_id: u32_, - pub record: *mut btf_record, -} pub mod btf_field_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const BPF_SPIN_LOCK: Type = 1; pub const BPF_TIMER: Type = 2; pub const BPF_KPTR_UNREF: Type = 4; pub const BPF_KPTR_REF: Type = 8; - pub const BPF_KPTR: Type = 12; - pub const BPF_LIST_HEAD: Type = 16; - pub const BPF_LIST_NODE: Type = 32; - pub const BPF_RB_ROOT: Type = 64; - pub const BPF_RB_NODE: Type = 128; - pub const BPF_GRAPH_NODE_OR_ROOT: Type = 240; - pub const BPF_REFCOUNT: Type = 256; + pub const BPF_KPTR_PERCPU: Type = 16; + pub const BPF_KPTR: Type = 28; + pub const BPF_LIST_HEAD: Type = 32; + pub const BPF_LIST_NODE: Type = 64; + pub const BPF_RB_ROOT: Type = 128; + pub const BPF_RB_NODE: Type = 256; + pub const BPF_GRAPH_NODE: Type = 320; + pub const BPF_GRAPH_ROOT: Type = 160; + pub const BPF_REFCOUNT: Type = 512; } pub type btf_dtor_kfunc_t = - ::core::option::Option; + ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct btf_field_kptr { @@ -23956,46 +23611,22 @@ pub union btf_field__bindgen_ty_1 { pub struct btf_record { pub cnt: u32_, pub field_mask: u32_, - pub spin_lock_off: ::aya_bpf::cty::c_int, - pub timer_off: ::aya_bpf::cty::c_int, - pub refcount_off: ::aya_bpf::cty::c_int, + pub spin_lock_off: ::aya_ebpf::cty::c_int, + pub timer_off: ::aya_ebpf::cty::c_int, + pub refcount_off: ::aya_ebpf::cty::c_int, pub fields: __IncompleteArrayField, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_prog_array_item { - pub prog: *mut bpf_prog, - pub __bindgen_anon_1: bpf_prog_array_item__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union bpf_prog_array_item__bindgen_ty_1 { - pub cgroup_storage: [*mut bpf_cgroup_storage; 2usize], - pub bpf_cookie: u64_, -} -#[repr(C)] -pub struct bpf_prog_array { - pub rcu: callback_head, - pub items: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_mem_alloc { - pub caches: *mut bpf_mem_caches, - pub cache: *mut bpf_mem_cache, - pub work: work_struct, -} pub type bpf_callback_t = ::core::option::Option< unsafe extern "C" fn(arg1: u64_, arg2: u64_, arg3: u64_, arg4: u64_, arg5: u64_) -> u64_, >; pub type bpf_iter_init_seq_priv_t = ::core::option::Option< unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, + arg1: *mut ::aya_ebpf::cty::c_void, arg2: *mut bpf_iter_aux_info, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >; pub mod bpf_iter_task_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const BPF_TASK_ITER_ALL: Type = 0; pub const BPF_TASK_ITER_TID: Type = 1; pub const BPF_TASK_ITER_TGID: Type = 2; @@ -24020,7 +23651,7 @@ pub struct bpf_iter_aux_info__bindgen_ty_2 { pub pid: u32_, } pub type bpf_iter_fini_seq_priv_t = - ::core::option::Option; + ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct bpf_iter_seq_info { @@ -24033,7 +23664,7 @@ pub struct bpf_iter_seq_info { #[derive(Debug, Copy, Clone)] pub struct bpf_map_ops { pub map_alloc_check: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub map_alloc: ::core::option::Option *mut bpf_map>, pub map_release: @@ -24042,38 +23673,38 @@ pub struct bpf_map_ops { pub map_get_next_key: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub map_release_uref: ::core::option::Option, pub map_lookup_elem_sys_only: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> *mut ::aya_ebpf::cty::c_void, >, pub map_lookup_batch: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, arg2: *const bpf_attr, arg3: *mut bpf_attr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_lookup_and_delete_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: u64_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_lookup_and_delete_batch: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, arg2: *const bpf_attr, arg3: *mut bpf_attr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_update_batch: ::core::option::Option< unsafe extern "C" fn( @@ -24081,79 +23712,80 @@ pub struct bpf_map_ops { arg2: *mut file, arg3: *const bpf_attr, arg4: *mut bpf_attr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_delete_batch: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, arg2: *const bpf_attr, arg3: *mut bpf_attr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_lookup_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> *mut ::aya_ebpf::cty::c_void, >, pub map_update_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: u64_, - ) -> ::aya_bpf::cty::c_long, + ) -> ::aya_ebpf::cty::c_long, >, pub map_delete_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_long, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_long, >, pub map_push_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: u64_, - ) -> ::aya_bpf::cty::c_long, + ) -> ::aya_ebpf::cty::c_long, >, pub map_pop_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_long, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_long, >, pub map_peek_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_long, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_long, >, pub map_lookup_percpu_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: u32_, - ) -> *mut ::aya_bpf::cty::c_void, + ) -> *mut ::aya_ebpf::cty::c_void, >, pub map_fd_get_ptr: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, arg2: *mut file, - arg3: ::aya_bpf::cty::c_int, - ) -> *mut ::aya_bpf::cty::c_void, + arg3: ::aya_ebpf::cty::c_int, + ) -> *mut ::aya_ebpf::cty::c_void, + >, + pub map_fd_put_ptr: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut bpf_map, arg2: *mut ::aya_ebpf::cty::c_void, arg3: bool_), >, - pub map_fd_put_ptr: - ::core::option::Option, pub map_gen_lookup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut bpf_map, arg2: *mut bpf_insn) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut bpf_map, arg2: *mut bpf_insn) -> ::aya_ebpf::cty::c_int, >, pub map_fd_sys_lookup_elem: - ::core::option::Option u32_>, + ::core::option::Option u32_>, pub map_seq_show_elem: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: *mut seq_file, ), >, @@ -24163,10 +23795,10 @@ pub struct bpf_map_ops { arg2: *const btf, arg3: *const btf_type, arg4: *const btf_type, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_poke_track: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut bpf_map, arg2: *mut bpf_prog_aux) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut bpf_map, arg2: *mut bpf_prog_aux) -> ::aya_ebpf::cty::c_int, >, pub map_poke_untrack: ::core::option::Option, @@ -24183,20 +23815,20 @@ pub struct bpf_map_ops { arg1: *const bpf_map, arg2: *mut u64_, arg3: u32_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_direct_value_meta: ::core::option::Option< unsafe extern "C" fn( arg1: *const bpf_map, arg2: u64_, arg3: *mut u32_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_mmap: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, arg2: *mut vm_area_struct, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_poll: ::core::option::Option< unsafe extern "C" fn( @@ -24208,22 +23840,22 @@ pub struct bpf_map_ops { pub map_local_storage_charge: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_local_storage_map, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: u32_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_local_storage_uncharge: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_local_storage_map, - arg2: *mut ::aya_bpf::cty::c_void, + arg2: *mut ::aya_ebpf::cty::c_void, arg3: u32_, ), >, pub map_owner_storage_ptr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void) -> *mut *mut bpf_local_storage, + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void) -> *mut *mut bpf_local_storage, >, pub map_redirect: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut bpf_map, arg2: u64_, arg3: u64_) -> ::aya_bpf::cty::c_long, + unsafe extern "C" fn(arg1: *mut bpf_map, arg2: u64_, arg3: u64_) -> ::aya_ebpf::cty::c_long, >, pub map_meta_equal: ::core::option::Option< unsafe extern "C" fn(arg1: *const bpf_map, arg2: *const bpf_map) -> bool_, @@ -24233,76 +23865,21 @@ pub struct bpf_map_ops { arg1: *mut bpf_verifier_env, arg2: *mut bpf_func_state, arg3: *mut bpf_func_state, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_for_each_callback: ::core::option::Option< unsafe extern "C" fn( arg1: *mut bpf_map, arg2: bpf_callback_t, - arg3: *mut ::aya_bpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, arg4: u64_, - ) -> ::aya_bpf::cty::c_long, + ) -> ::aya_ebpf::cty::c_long, >, pub map_mem_usage: ::core::option::Option u64_>, - pub map_btf_id: *mut ::aya_bpf::cty::c_int, + pub map_btf_id: *mut ::aya_ebpf::cty::c_int, pub iter_seq_info: *const bpf_iter_seq_info, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_map { - pub ops: *const bpf_map_ops, - pub inner_map_meta: *mut bpf_map, - pub security: *mut ::aya_bpf::cty::c_void, - pub map_type: bpf_map_type::Type, - pub key_size: u32_, - pub value_size: u32_, - pub max_entries: u32_, - pub map_extra: u64_, - pub map_flags: u32_, - pub id: u32_, - pub record: *mut btf_record, - pub numa_node: ::aya_bpf::cty::c_int, - pub btf_key_type_id: u32_, - pub btf_value_type_id: u32_, - pub btf_vmlinux_value_type_id: u32_, - pub btf: *mut btf, - pub objcg: *mut obj_cgroup, - pub name: [::aya_bpf::cty::c_char; 16usize], - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, - pub refcnt: atomic64_t, - pub usercnt: atomic64_t, - pub work: work_struct, - pub freeze_mutex: mutex, - pub writecnt: atomic64_t, - pub owner: bpf_map__bindgen_ty_1, - pub bypass_spec_v1: bool_, - pub frozen: bool_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, - pub __bindgen_padding_0: u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_map__bindgen_ty_1 { - pub lock: spinlock_t, - pub type_: bpf_prog_type::Type, - pub jited: bool_, - pub xdp_has_frags: bool_, -} -impl bpf_map { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] #[derive(Debug, Copy, Clone)] pub struct btf_header { pub magic: __u16, @@ -24317,12 +23894,12 @@ pub struct btf_header { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct btf { - pub data: *mut ::aya_bpf::cty::c_void, + pub data: *mut ::aya_ebpf::cty::c_void, pub types: *mut *mut btf_type, pub resolved_ids: *mut u32_, pub resolved_sizes: *mut u32_, - pub strings: *const ::aya_bpf::cty::c_char, - pub nohdr_data: *mut ::aya_bpf::cty::c_void, + pub strings: *const ::aya_ebpf::cty::c_char, + pub nohdr_data: *mut ::aya_ebpf::cty::c_void, pub hdr: btf_header, pub nr_types: u32_, pub types_size: u32_, @@ -24336,15 +23913,15 @@ pub struct btf { pub base_btf: *mut btf, pub start_id: u32_, pub start_str_off: u32_, - pub name: [::aya_bpf::cty::c_char; 56usize], + pub name: [::aya_ebpf::cty::c_char; 56usize], pub kernel_btf: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct bpf_ksym { - pub start: ::aya_bpf::cty::c_ulong, - pub end: ::aya_bpf::cty::c_ulong, - pub name: [::aya_bpf::cty::c_char; 512usize], + pub start: ::aya_ebpf::cty::c_ulong, + pub end: ::aya_ebpf::cty::c_ulong, + pub name: [::aya_ebpf::cty::c_char; 512usize], pub lnode: list_head, pub tnode: latch_tree_node, pub prog: bool_, @@ -24361,6 +23938,7 @@ pub struct bpf_prog_aux { pub stack_depth: u32_, pub id: u32_, pub func_cnt: u32_, + pub real_func_cnt: u32_, pub func_idx: u32_, pub attach_btf_id: u32_, pub ctx_arg_info_size: u32_, @@ -24377,14 +23955,17 @@ pub struct bpf_prog_aux { pub dev_bound: bool_, pub offload_requested: bool_, pub attach_btf_trace: bool_, + pub attach_tracing_prog: bool_, pub func_proto_unreliable: bool_, pub sleepable: bool_, pub tail_call_reachable: bool_, pub xdp_has_frags: bool_, + pub exception_cb: bool_, + pub exception_boundary: bool_, pub attach_func_proto: *const btf_type, - pub attach_func_name: *const ::aya_bpf::cty::c_char, + pub attach_func_name: *const ::aya_ebpf::cty::c_char, pub func: *mut *mut bpf_prog, - pub jit_data: *mut ::aya_bpf::cty::c_void, + pub jit_data: *mut ::aya_ebpf::cty::c_void, pub poke_tab: *mut bpf_jit_poke_descriptor, pub kfunc_tab: *mut bpf_kfunc_desc_tab, pub kfunc_btf_tab: *mut bpf_kfunc_btf_tab, @@ -24398,16 +23979,19 @@ pub struct bpf_prog_aux { pub user: *mut user_struct, pub load_time: u64_, pub verified_insns: u32_, - pub cgroup_atype: ::aya_bpf::cty::c_int, + pub cgroup_atype: ::aya_ebpf::cty::c_int, pub cgroup_storage: [*mut bpf_map; 2usize], - pub name: [::aya_bpf::cty::c_char; 16usize], - pub security: *mut ::aya_bpf::cty::c_void, + pub name: [::aya_ebpf::cty::c_char; 16usize], + pub bpf_exception_cb: ::core::option::Option< + unsafe extern "C" fn(arg1: u64_, arg2: u64_, arg3: u64_, arg4: u64_, arg5: u64_) -> u64_, + >, + pub security: *mut ::aya_ebpf::cty::c_void, pub offload: *mut bpf_prog_offload, pub btf: *mut btf, pub func_info: *mut bpf_func_info, pub func_info_aux: *mut bpf_func_info_aux, pub linfo: *mut bpf_line_info, - pub jited_linfo: *mut *mut ::aya_bpf::cty::c_void, + pub jited_linfo: *mut *mut ::aya_ebpf::cty::c_void, pub func_info_cnt: u32_, pub nr_linfo: u32_, pub linfo_idx: u32_, @@ -24423,4515 +24007,5140 @@ pub union bpf_prog_aux__bindgen_ty_1 { pub rcu: callback_head, } #[repr(C)] -pub struct bpf_prog { - pub pages: u16_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, - pub type_: bpf_prog_type::Type, - pub expected_attach_type: bpf_attach_type::Type, - pub len: u32_, - pub jited_len: u32_, - pub tag: [u8_; 8usize], - pub stats: *mut bpf_prog_stats, - pub active: *mut ::aya_bpf::cty::c_int, - pub bpf_func: ::core::option::Option< +#[derive(Debug, Copy, Clone)] +pub struct bpf_map_dev_ops { + pub map_get_next_key: ::core::option::Option< unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_void, - arg2: *const bpf_insn, - ) -> ::aya_bpf::cty::c_uint, + arg1: *mut bpf_offloaded_map, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub aux: *mut bpf_prog_aux, - pub orig_prog: *mut sock_fprog_kern, - pub __bindgen_anon_1: bpf_prog__bindgen_ty_1, + pub map_lookup_elem: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_offloaded_map, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub map_update_elem: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_offloaded_map, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: u64_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub map_delete_elem: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_offloaded_map, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, +} +pub mod bpf_reg_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NOT_INIT: Type = 0; + pub const SCALAR_VALUE: Type = 1; + pub const PTR_TO_CTX: Type = 2; + pub const CONST_PTR_TO_MAP: Type = 3; + pub const PTR_TO_MAP_VALUE: Type = 4; + pub const PTR_TO_MAP_KEY: Type = 5; + pub const PTR_TO_STACK: Type = 6; + pub const PTR_TO_PACKET_META: Type = 7; + pub const PTR_TO_PACKET: Type = 8; + pub const PTR_TO_PACKET_END: Type = 9; + pub const PTR_TO_FLOW_KEYS: Type = 10; + pub const PTR_TO_SOCKET: Type = 11; + pub const PTR_TO_SOCK_COMMON: Type = 12; + pub const PTR_TO_TCP_SOCK: Type = 13; + pub const PTR_TO_TP_BUFFER: Type = 14; + pub const PTR_TO_XDP_SOCK: Type = 15; + pub const PTR_TO_BTF_ID: Type = 16; + pub const PTR_TO_MEM: Type = 17; + pub const PTR_TO_BUF: Type = 18; + pub const PTR_TO_FUNC: Type = 19; + pub const CONST_PTR_TO_DYNPTR: Type = 20; + pub const __BPF_REG_TYPE_MAX: Type = 21; + pub const PTR_TO_MAP_VALUE_OR_NULL: Type = 260; + pub const PTR_TO_SOCKET_OR_NULL: Type = 267; + pub const PTR_TO_SOCK_COMMON_OR_NULL: Type = 268; + pub const PTR_TO_TCP_SOCK_OR_NULL: Type = 269; + pub const PTR_TO_BTF_ID_OR_NULL: Type = 272; + pub const __BPF_REG_TYPE_LIMIT: Type = 33554431; } #[repr(C)] -pub struct bpf_prog__bindgen_ty_1 { - pub __bindgen_anon_1: __BindgenUnionField, - pub __bindgen_anon_2: __BindgenUnionField, - pub bindgen_union_field: [u32; 0usize], +#[derive(Debug, Copy, Clone)] +pub struct bpf_prog_ops { + pub test_run: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_prog, + arg2: *const bpf_attr, + arg3: *mut bpf_attr, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Debug)] -pub struct bpf_prog__bindgen_ty_1__bindgen_ty_1 { - pub __empty_insns: bpf_prog__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub insns: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct bpf_prog_offload { + pub prog: *mut bpf_prog, + pub netdev: *mut net_device, + pub offdev: *mut bpf_offload_dev, + pub dev_priv: *mut ::aya_ebpf::cty::c_void, + pub offloads: list_head, + pub dev_state: bool_, + pub opt_failed: bool_, + pub jited_image: *mut ::aya_ebpf::cty::c_void, + pub jited_len: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_prog__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {} +pub struct btf_func_model { + pub ret_size: u8_, + pub ret_flags: u8_, + pub nr_args: u8_, + pub arg_size: [u8_; 12usize], + pub arg_flags: [u8_; 12usize], +} #[repr(C)] -#[derive(Debug)] -pub struct bpf_prog__bindgen_ty_1__bindgen_ty_2 { - pub __empty_insnsi: bpf_prog__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, - pub insnsi: __IncompleteArrayField, +#[derive(Copy, Clone)] +pub struct bpf_tramp_image { + pub image: *mut ::aya_ebpf::cty::c_void, + pub size: ::aya_ebpf::cty::c_int, + pub ksym: bpf_ksym, + pub pcref: percpu_ref, + pub ip_after_call: *mut ::aya_ebpf::cty::c_void, + pub ip_epilogue: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: bpf_tramp_image__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_tramp_image__bindgen_ty_1 { + pub rcu: callback_head, + pub work: work_struct, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_trampoline { + pub hlist: hlist_node, + pub fops: *mut ftrace_ops, + pub mutex: mutex, + pub refcnt: refcount_t, + pub flags: u32_, + pub key: u64_, + pub func: bpf_trampoline__bindgen_ty_1, + pub extension_prog: *mut bpf_prog, + pub progs_hlist: [hlist_head; 3usize], + pub progs_cnt: [::aya_ebpf::cty::c_int; 3usize], + pub cur_image: *mut bpf_tramp_image, + pub mod_: *mut module, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_prog__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} -impl bpf_prog { +pub struct bpf_trampoline__bindgen_ty_1 { + pub model: btf_func_model, + pub addr: *mut ::aya_ebpf::cty::c_void, + pub ftrace_managed: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_func_info_aux { + pub linkage: u16_, + pub unreliable: bool_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, +} +impl bpf_func_info_aux { #[inline] - pub fn jited(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u16) } + pub fn called(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_jited(&mut self, val: u16_) { + pub fn set_called(&mut self, val: bool_) { unsafe { - let val: u16 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn jit_requested(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u16) } + pub fn verified(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } } #[inline] - pub fn set_jit_requested(&mut self, val: u16_) { + pub fn set_verified(&mut self, val: bool_) { unsafe { - let val: u16 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn gpl_compatible(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u16) } - } - #[inline] - pub fn set_gpl_compatible(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn cb_access(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u16) } - } - #[inline] - pub fn set_cb_access(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn dst_needed(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u16) } - } - #[inline] - pub fn set_dst_needed(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn blinding_requested(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u16) } - } - #[inline] - pub fn set_blinding_requested(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) - } - } - #[inline] - pub fn blinded(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u16) } - } - #[inline] - pub fn set_blinded(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) - } - } - #[inline] - pub fn is_func(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u16) } - } - #[inline] - pub fn set_is_func(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) - } - } - #[inline] - pub fn kprobe_override(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u16) } - } - #[inline] - pub fn set_kprobe_override(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 1u8, val as u64) - } + pub fn new_bitfield_1(called: bool_, verified: bool_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let called: u8 = unsafe { ::core::mem::transmute(called) }; + called as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let verified: u8 = unsafe { ::core::mem::transmute(verified) }; + verified as u64 + }); + __bindgen_bitfield_unit } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_jit_poke_descriptor { + pub tailcall_target: *mut ::aya_ebpf::cty::c_void, + pub tailcall_bypass: *mut ::aya_ebpf::cty::c_void, + pub bypass_addr: *mut ::aya_ebpf::cty::c_void, + pub aux: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: bpf_jit_poke_descriptor__bindgen_ty_1, + pub tailcall_target_stable: bool_, + pub adj_off: u8_, + pub reason: u16_, + pub insn_idx: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_jit_poke_descriptor__bindgen_ty_1 { + pub tail_call: bpf_jit_poke_descriptor__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_jit_poke_descriptor__bindgen_ty_1__bindgen_ty_1 { + pub map: *mut bpf_map, + pub key: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_ctx_arg_aux { + pub offset: u32_, + pub reg_type: bpf_reg_type::Type, + pub btf_id: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct btf_mod_pair { + pub btf: *mut btf, + pub module: *mut module, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_prog_stats { + pub cnt: u64_stats_t, + pub nsecs: u64_stats_t, + pub misses: u64_stats_t, + pub syncp: u64_stats_sync, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +} +impl bpf_prog_stats { #[inline] - pub fn has_callchain_buf(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u16) } - } - #[inline] - pub fn set_has_callchain_buf(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(9usize, 1u8, val as u64) - } - } - #[inline] - pub fn enforce_expected_attach_type(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u16) } - } - #[inline] - pub fn set_enforce_expected_attach_type(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(10usize, 1u8, val as u64) - } - } - #[inline] - pub fn call_get_stack(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u16) } - } - #[inline] - pub fn set_call_get_stack(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 1u8, val as u64) - } - } - #[inline] - pub fn call_get_func_ip(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u16) } - } - #[inline] - pub fn set_call_get_func_ip(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(12usize, 1u8, val as u64) - } - } - #[inline] - pub fn tstamp_type_access(&self) -> u16_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u16) } - } - #[inline] - pub fn set_tstamp_type_access(&mut self, val: u16_) { - unsafe { - let val: u16 = ::core::mem::transmute(val); - self._bitfield_1.set(13usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - jited: u16_, - jit_requested: u16_, - gpl_compatible: u16_, - cb_access: u16_, - dst_needed: u16_, - blinding_requested: u16_, - blinded: u16_, - is_func: u16_, - kprobe_override: u16_, - has_callchain_buf: u16_, - enforce_expected_attach_type: u16_, - call_get_stack: u16_, - call_get_func_ip: u16_, - tstamp_type_access: u16_, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let jited: u16 = unsafe { ::core::mem::transmute(jited) }; - jited as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let jit_requested: u16 = unsafe { ::core::mem::transmute(jit_requested) }; - jit_requested as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let gpl_compatible: u16 = unsafe { ::core::mem::transmute(gpl_compatible) }; - gpl_compatible as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let cb_access: u16 = unsafe { ::core::mem::transmute(cb_access) }; - cb_access as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let dst_needed: u16 = unsafe { ::core::mem::transmute(dst_needed) }; - dst_needed as u64 - }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let blinding_requested: u16 = unsafe { ::core::mem::transmute(blinding_requested) }; - blinding_requested as u64 - }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let blinded: u16 = unsafe { ::core::mem::transmute(blinded) }; - blinded as u64 - }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let is_func: u16 = unsafe { ::core::mem::transmute(is_func) }; - is_func as u64 - }); - __bindgen_bitfield_unit.set(8usize, 1u8, { - let kprobe_override: u16 = unsafe { ::core::mem::transmute(kprobe_override) }; - kprobe_override as u64 - }); - __bindgen_bitfield_unit.set(9usize, 1u8, { - let has_callchain_buf: u16 = unsafe { ::core::mem::transmute(has_callchain_buf) }; - has_callchain_buf as u64 - }); - __bindgen_bitfield_unit.set(10usize, 1u8, { - let enforce_expected_attach_type: u16 = - unsafe { ::core::mem::transmute(enforce_expected_attach_type) }; - enforce_expected_attach_type as u64 - }); - __bindgen_bitfield_unit.set(11usize, 1u8, { - let call_get_stack: u16 = unsafe { ::core::mem::transmute(call_get_stack) }; - call_get_stack as u64 - }); - __bindgen_bitfield_unit.set(12usize, 1u8, { - let call_get_func_ip: u16 = unsafe { ::core::mem::transmute(call_get_func_ip) }; - call_get_func_ip as u64 - }); - __bindgen_bitfield_unit.set(13usize, 1u8, { - let tstamp_type_access: u16 = unsafe { ::core::mem::transmute(tstamp_type_access) }; - tstamp_type_access as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_local_storage_map { - pub map: bpf_map, - pub buckets: *mut bpf_local_storage_map_bucket, - pub bucket_log: u32_, - pub elem_size: u16_, - pub cache_idx: u16_, - pub selem_ma: bpf_mem_alloc, - pub storage_ma: bpf_mem_alloc, - pub bpf_ma: bool_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, - pub __bindgen_padding_0: [u8; 7usize], -} -impl bpf_local_storage_map { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct btf_mod_pair { - pub btf: *mut btf, - pub module: *mut module, +pub struct sock_fprog_kern { + pub len: u16_, + pub filter: *mut sock_filter, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_verifier_log { - pub start_pos: u64_, - pub end_pos: u64_, - pub ubuf: *mut ::aya_bpf::cty::c_char, - pub level: u32_, - pub len_total: u32_, - pub len_max: u32_, - pub kbuf: [::aya_bpf::cty::c_char; 1024usize], +#[derive(Copy, Clone)] +pub struct bpf_cgroup_storage { + pub __bindgen_anon_1: bpf_cgroup_storage__bindgen_ty_1, + pub map: *mut bpf_cgroup_storage_map, + pub key: bpf_cgroup_storage_key, + pub list_map: list_head, + pub list_cg: list_head, + pub node: rb_node, + pub rcu: callback_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_subprog_info { - pub start: u32_, - pub linfo_idx: u32_, - pub stack_depth: u16_, - pub has_tail_call: bool_, - pub tail_call_reachable: bool_, - pub has_ld_abs: bool_, - pub is_async_cb: bool_, +#[derive(Copy, Clone)] +pub union bpf_cgroup_storage__bindgen_ty_1 { + pub buf: *mut bpf_storage_buffer, + pub percpu_buf: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_id_pair { - pub old: u32_, - pub cur: u32_, +pub struct gnet_dump { + pub lock: *mut spinlock_t, + pub skb: *mut sk_buff, + pub tail: *mut nlattr, + pub compat_tc_stats: ::aya_ebpf::cty::c_int, + pub compat_xstats: ::aya_ebpf::cty::c_int, + pub padattr: ::aya_ebpf::cty::c_int, + pub xstats: *mut ::aya_ebpf::cty::c_void, + pub xstats_len: ::aya_ebpf::cty::c_int, + pub tc_stats: tc_stats, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_idmap { - pub tmp_id_gen: u32_, - pub map: [bpf_id_pair; 600usize], +pub struct flow_block { + pub cb_list: list_head, } +pub type flow_setup_cb_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: tc_setup_type::Type, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_idset { - pub count: u32_, - pub ids: [u32_; 600usize], +#[derive(Debug)] +pub struct qdisc_size_table { + pub rcu: callback_head, + pub list: list_head, + pub szopts: tc_sizespec, + pub refcnt: ::aya_ebpf::cty::c_int, + pub data: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct backtrack_state { - pub env: *mut bpf_verifier_env, - pub frame: u32_, - pub reg_masks: [u32_; 8usize], - pub stack_masks: [u64_; 8usize], +pub struct Qdisc_ops { + pub next: *mut Qdisc_ops, + pub cl_ops: *const Qdisc_class_ops, + pub id: [::aya_ebpf::cty::c_char; 16usize], + pub priv_size: ::aya_ebpf::cty::c_int, + pub static_flags: ::aya_ebpf::cty::c_uint, + pub enqueue: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut Qdisc, + arg3: *mut *mut sk_buff, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dequeue: ::core::option::Option *mut sk_buff>, + pub peek: ::core::option::Option *mut sk_buff>, + pub init: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: *mut nlattr, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub reset: ::core::option::Option, + pub destroy: ::core::option::Option, + pub change: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: *mut nlattr, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub attach: ::core::option::Option, + pub change_tx_queue_len: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub change_real_num_tx: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_ebpf::cty::c_uint), + >, + pub dump: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, + >, + pub dump_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: *mut gnet_dump) -> ::aya_ebpf::cty::c_int, + >, + pub ingress_block_set: + ::core::option::Option, + pub egress_block_set: + ::core::option::Option, + pub ingress_block_get: ::core::option::Option u32_>, + pub egress_block_get: ::core::option::Option u32_>, + pub owner: *mut module, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_verifier_env { - pub insn_idx: u32_, - pub prev_insn_idx: u32_, - pub prog: *mut bpf_prog, - pub ops: *const bpf_verifier_ops, - pub head: *mut bpf_verifier_stack_elem, - pub stack_size: ::aya_bpf::cty::c_int, - pub strict_alignment: bool_, - pub test_state_freq: bool_, - pub cur_state: *mut bpf_verifier_state, - pub explored_states: *mut *mut bpf_verifier_state_list, - pub free_list: *mut bpf_verifier_state_list, - pub used_maps: [*mut bpf_map; 64usize], - pub used_btfs: [btf_mod_pair; 64usize], - pub used_map_cnt: u32_, - pub used_btf_cnt: u32_, - pub id_gen: u32_, - pub explore_alu_limits: bool_, - pub allow_ptr_leaks: bool_, - pub allow_uninit_stack: bool_, - pub bpf_capable: bool_, - pub bypass_spec_v1: bool_, - pub bypass_spec_v4: bool_, - pub seen_direct_write: bool_, - pub insn_aux_data: *mut bpf_insn_aux_data, - pub prev_linfo: *const bpf_line_info, - pub log: bpf_verifier_log, - pub subprog_info: [bpf_subprog_info; 257usize], - pub __bindgen_anon_1: bpf_verifier_env__bindgen_ty_1, - pub cfg: bpf_verifier_env__bindgen_ty_2, - pub bt: backtrack_state, - pub pass_cnt: u32_, - pub subprog_cnt: u32_, - pub prev_insn_processed: u32_, - pub insn_processed: u32_, - pub prev_jmps_processed: u32_, - pub jmps_processed: u32_, - pub verification_time: u64_, - pub max_states_per_insn: u32_, - pub total_states: u32_, - pub peak_states: u32_, - pub longest_mark_read_walk: u32_, - pub fd_array: bpfptr_t, - pub scratched_regs: u32_, - pub scratched_stack_slots: u64_, - pub prev_log_pos: u64_, - pub prev_insn_print_pos: u64_, - pub tmp_str_buf: [::aya_bpf::cty::c_char; 320usize], +#[derive(Debug, Copy, Clone)] +pub struct Qdisc_class_ops { + pub flags: ::aya_ebpf::cty::c_uint, + pub select_queue: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: *mut tcmsg) -> *mut netdev_queue, + >, + pub graft: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut Qdisc, + arg4: *mut *mut Qdisc, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub leaf: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_ebpf::cty::c_ulong) -> *mut Qdisc, + >, + pub qlen_notify: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_ebpf::cty::c_ulong), + >, + pub find: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: u32_) -> ::aya_ebpf::cty::c_ulong, + >, + pub change: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: u32_, + arg3: u32_, + arg4: *mut *mut nlattr, + arg5: *mut ::aya_ebpf::cty::c_ulong, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub delete: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub walk: + ::core::option::Option, + pub tcf_block: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut netlink_ext_ack, + ) -> *mut tcf_block, + >, + pub bind_tcf: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: u32_, + ) -> ::aya_ebpf::cty::c_ulong, + >, + pub unbind_tcf: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_ebpf::cty::c_ulong), + >, + pub dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut sk_buff, + arg4: *mut tcmsg, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dump_stats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut gnet_dump, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_verifier_env__bindgen_ty_1 { - pub idmap_scratch: bpf_idmap, - pub idset_scratch: bpf_idset, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_verifier_env__bindgen_ty_2 { - pub insn_state: *mut ::aya_bpf::cty::c_int, - pub insn_stack: *mut ::aya_bpf::cty::c_int, - pub cur_stack: ::aya_bpf::cty::c_int, -} -pub mod bpf_reg_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NOT_INIT: Type = 0; - pub const SCALAR_VALUE: Type = 1; - pub const PTR_TO_CTX: Type = 2; - pub const CONST_PTR_TO_MAP: Type = 3; - pub const PTR_TO_MAP_VALUE: Type = 4; - pub const PTR_TO_MAP_KEY: Type = 5; - pub const PTR_TO_STACK: Type = 6; - pub const PTR_TO_PACKET_META: Type = 7; - pub const PTR_TO_PACKET: Type = 8; - pub const PTR_TO_PACKET_END: Type = 9; - pub const PTR_TO_FLOW_KEYS: Type = 10; - pub const PTR_TO_SOCKET: Type = 11; - pub const PTR_TO_SOCK_COMMON: Type = 12; - pub const PTR_TO_TCP_SOCK: Type = 13; - pub const PTR_TO_TP_BUFFER: Type = 14; - pub const PTR_TO_XDP_SOCK: Type = 15; - pub const PTR_TO_BTF_ID: Type = 16; - pub const PTR_TO_MEM: Type = 17; - pub const PTR_TO_BUF: Type = 18; - pub const PTR_TO_FUNC: Type = 19; - pub const CONST_PTR_TO_DYNPTR: Type = 20; - pub const __BPF_REG_TYPE_MAX: Type = 21; - pub const PTR_TO_MAP_VALUE_OR_NULL: Type = 260; - pub const PTR_TO_SOCKET_OR_NULL: Type = 267; - pub const PTR_TO_SOCK_COMMON_OR_NULL: Type = 268; - pub const PTR_TO_TCP_SOCK_OR_NULL: Type = 269; - pub const PTR_TO_BTF_ID_OR_NULL: Type = 272; - pub const __BPF_REG_TYPE_LIMIT: Type = 33554431; -} -pub mod bpf_dynptr_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_DYNPTR_TYPE_INVALID: Type = 0; - pub const BPF_DYNPTR_TYPE_LOCAL: Type = 1; - pub const BPF_DYNPTR_TYPE_RINGBUF: Type = 2; - pub const BPF_DYNPTR_TYPE_SKB: Type = 3; - pub const BPF_DYNPTR_TYPE_XDP: Type = 4; -} -pub mod bpf_iter_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_ITER_STATE_INVALID: Type = 0; - pub const BPF_ITER_STATE_ACTIVE: Type = 1; - pub const BPF_ITER_STATE_DRAINED: Type = 2; +pub struct tcf_block { + pub ports: xarray, + pub lock: mutex, + pub chain_list: list_head, + pub index: u32_, + pub classid: u32_, + pub refcnt: refcount_t, + pub net: *mut net, + pub q: *mut Qdisc, + pub cb_lock: rw_semaphore, + pub flow_block: flow_block, + pub owner_list: list_head, + pub keep_dst: bool_, + pub offloadcnt: atomic_t, + pub nooffloaddevcnt: ::aya_ebpf::cty::c_uint, + pub lockeddevcnt: ::aya_ebpf::cty::c_uint, + pub chain0: tcf_block__bindgen_ty_1, + pub rcu: callback_head, + pub proto_destroy_ht: [hlist_head; 128usize], + pub proto_destroy_lock: mutex, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tnum { - pub value: u64_, - pub mask: u64_, -} -pub mod bpf_reg_liveness { - pub type Type = ::aya_bpf::cty::c_uint; - pub const REG_LIVE_NONE: Type = 0; - pub const REG_LIVE_READ32: Type = 1; - pub const REG_LIVE_READ64: Type = 2; - pub const REG_LIVE_READ: Type = 3; - pub const REG_LIVE_WRITTEN: Type = 4; - pub const REG_LIVE_DONE: Type = 8; +pub struct tcf_block__bindgen_ty_1 { + pub chain: *mut tcf_chain, + pub filter_chain_list: list_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_reg_state { - pub type_: bpf_reg_type::Type, - pub off: s32, - pub __bindgen_anon_1: bpf_reg_state__bindgen_ty_1, - pub var_off: tnum, - pub smin_value: s64, - pub smax_value: s64, - pub umin_value: u64_, - pub umax_value: u64_, - pub s32_min_value: s32, - pub s32_max_value: s32, - pub u32_min_value: u32_, - pub u32_max_value: u32_, - pub id: u32_, - pub ref_obj_id: u32_, - pub parent: *mut bpf_reg_state, - pub frameno: u32_, - pub subreg_def: s32, - pub live: bpf_reg_liveness::Type, - pub precise: bool_, +pub struct tcf_proto { + pub next: *mut tcf_proto, + pub root: *mut ::aya_ebpf::cty::c_void, + pub classify: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *const tcf_proto, + arg3: *mut tcf_result, + ) -> ::aya_ebpf::cty::c_int, + >, + pub protocol: __be16, + pub prio: u32_, + pub data: *mut ::aya_ebpf::cty::c_void, + pub ops: *const tcf_proto_ops, + pub chain: *mut tcf_chain, + pub lock: spinlock_t, + pub deleting: bool_, + pub refcnt: refcount_t, + pub rcu: callback_head, + pub destroy_ht_node: hlist_node, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_reg_state__bindgen_ty_1 { - pub range: ::aya_bpf::cty::c_int, - pub __bindgen_anon_1: bpf_reg_state__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: bpf_reg_state__bindgen_ty_1__bindgen_ty_2, - pub __bindgen_anon_3: bpf_reg_state__bindgen_ty_1__bindgen_ty_3, - pub dynptr: bpf_reg_state__bindgen_ty_1__bindgen_ty_4, - pub iter: bpf_reg_state__bindgen_ty_1__bindgen_ty_5, - pub raw: bpf_reg_state__bindgen_ty_1__bindgen_ty_6, - pub subprogno: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_1 { - pub map_ptr: *mut bpf_map, - pub map_uid: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_2 { - pub btf: *mut btf, - pub btf_id: u32_, +pub struct tcf_result { + pub __bindgen_anon_1: tcf_result__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_3 { - pub mem_size: u32_, - pub dynptr_id: u32_, +#[derive(Copy, Clone)] +pub union tcf_result__bindgen_ty_1 { + pub __bindgen_anon_1: tcf_result__bindgen_ty_1__bindgen_ty_1, + pub goto_tp: *const tcf_proto, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_4 { - pub type_: bpf_dynptr_type::Type, - pub first_slot: bool_, +pub struct tcf_result__bindgen_ty_1__bindgen_ty_1 { + pub class: ::aya_ebpf::cty::c_ulong, + pub classid: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_5 { - pub btf: *mut btf, - pub btf_id: u32_, - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, -} -impl bpf_reg_state__bindgen_ty_1__bindgen_ty_5 { - #[inline] - pub fn state(&self) -> bpf_iter_state::Type { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u32) } - } - #[inline] - pub fn set_state(&mut self, val: bpf_iter_state::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 2u8, val as u64) - } - } - #[inline] - pub fn depth(&self) -> ::aya_bpf::cty::c_int { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 30u8) as u32) } - } - #[inline] - pub fn set_depth(&mut self, val: ::aya_bpf::cty::c_int) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 30u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - state: bpf_iter_state::Type, - depth: ::aya_bpf::cty::c_int, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 2u8, { - let state: u32 = unsafe { ::core::mem::transmute(state) }; - state as u64 - }); - __bindgen_bitfield_unit.set(2usize, 30u8, { - let depth: u32 = unsafe { ::core::mem::transmute(depth) }; - depth as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_6 { - pub raw1: ::aya_bpf::cty::c_ulong, - pub raw2: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_func_state { - pub regs: [bpf_reg_state; 11usize], - pub callsite: ::aya_bpf::cty::c_int, - pub frameno: u32_, - pub subprogno: u32_, - pub async_entry_cnt: u32_, - pub in_callback_fn: bool_, - pub callback_ret_range: tnum, - pub in_async_callback_fn: bool_, - pub acquired_refs: ::aya_bpf::cty::c_int, - pub refs: *mut bpf_reference_state, - pub allocated_stack: ::aya_bpf::cty::c_int, - pub stack: *mut bpf_stack_state, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_map_dev_ops { - pub map_get_next_key: ::core::option::Option< +pub struct tcf_proto_ops { + pub head: list_head, + pub kind: [::aya_ebpf::cty::c_char; 16usize], + pub classify: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_offloaded_map, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut sk_buff, + arg2: *const tcf_proto, + arg3: *mut tcf_result, + ) -> ::aya_ebpf::cty::c_int, >, - pub map_lookup_elem: ::core::option::Option< + pub init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto) -> ::aya_ebpf::cty::c_int, + >, + pub destroy: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: bool_, arg3: *mut netlink_ext_ack), + >, + pub get: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: u32_) -> *mut ::aya_ebpf::cty::c_void, + >, + pub put: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub change: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_offloaded_map, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut net, + arg2: *mut sk_buff, + arg3: *mut tcf_proto, + arg4: ::aya_ebpf::cty::c_ulong, + arg5: u32_, + arg6: *mut *mut nlattr, + arg7: *mut *mut ::aya_ebpf::cty::c_void, + arg8: u32_, + arg9: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub map_update_elem: ::core::option::Option< + pub delete: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_offloaded_map, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: u64_, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut tcf_proto, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut bool_, + arg4: bool_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub map_delete_elem: ::core::option::Option< + pub delete_empty: ::core::option::Option bool_>, + pub walk: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut tcf_walker, arg3: bool_), + >, + pub reoffload: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_offloaded_map, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut tcf_proto, + arg2: bool_, + arg3: flow_setup_cb_t, + arg4: *mut ::aya_ebpf::cty::c_void, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub hw_add: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub hw_del: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub bind_class: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: u32_, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: *mut ::aya_ebpf::cty::c_void, + arg5: ::aya_ebpf::cty::c_ulong, + ), + >, + pub tmplt_create: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut tcf_chain, + arg3: *mut *mut nlattr, + arg4: *mut netlink_ext_ack, + ) -> *mut ::aya_ebpf::cty::c_void, + >, + pub tmplt_destroy: + ::core::option::Option, + pub tmplt_reoffload: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tcf_chain, + arg2: bool_, + arg3: flow_setup_cb_t, + arg4: *mut ::aya_ebpf::cty::c_void, + ), + >, + pub get_exts: ::core::option::Option< + unsafe extern "C" fn(arg1: *const tcf_proto, arg2: u32_) -> *mut tcf_exts, + >, + pub dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut tcf_proto, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: *mut sk_buff, + arg5: *mut tcmsg, + arg6: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub terse_dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut tcf_proto, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: *mut sk_buff, + arg5: *mut tcmsg, + arg6: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub tmplt_dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut net, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, + pub owner: *mut module, + pub flags: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_offloaded_map { - pub map: bpf_map, - pub netdev: *mut net_device, - pub dev_ops: *const bpf_map_dev_ops, - pub dev_priv: *mut ::aya_bpf::cty::c_void, - pub offloads: list_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, -} -impl bpf_offloaded_map { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -pub mod bpf_arg_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ARG_DONTCARE: Type = 0; - pub const ARG_CONST_MAP_PTR: Type = 1; - pub const ARG_PTR_TO_MAP_KEY: Type = 2; - pub const ARG_PTR_TO_MAP_VALUE: Type = 3; - pub const ARG_PTR_TO_MEM: Type = 4; - pub const ARG_CONST_SIZE: Type = 5; - pub const ARG_CONST_SIZE_OR_ZERO: Type = 6; - pub const ARG_PTR_TO_CTX: Type = 7; - pub const ARG_ANYTHING: Type = 8; - pub const ARG_PTR_TO_SPIN_LOCK: Type = 9; - pub const ARG_PTR_TO_SOCK_COMMON: Type = 10; - pub const ARG_PTR_TO_INT: Type = 11; - pub const ARG_PTR_TO_LONG: Type = 12; - pub const ARG_PTR_TO_SOCKET: Type = 13; - pub const ARG_PTR_TO_BTF_ID: Type = 14; - pub const ARG_PTR_TO_RINGBUF_MEM: Type = 15; - pub const ARG_CONST_ALLOC_SIZE_OR_ZERO: Type = 16; - pub const ARG_PTR_TO_BTF_ID_SOCK_COMMON: Type = 17; - pub const ARG_PTR_TO_PERCPU_BTF_ID: Type = 18; - pub const ARG_PTR_TO_FUNC: Type = 19; - pub const ARG_PTR_TO_STACK: Type = 20; - pub const ARG_PTR_TO_CONST_STR: Type = 21; - pub const ARG_PTR_TO_TIMER: Type = 22; - pub const ARG_PTR_TO_KPTR: Type = 23; - pub const ARG_PTR_TO_DYNPTR: Type = 24; - pub const __BPF_ARG_TYPE_MAX: Type = 25; - pub const ARG_PTR_TO_MAP_VALUE_OR_NULL: Type = 259; - pub const ARG_PTR_TO_MEM_OR_NULL: Type = 260; - pub const ARG_PTR_TO_CTX_OR_NULL: Type = 263; - pub const ARG_PTR_TO_SOCKET_OR_NULL: Type = 269; - pub const ARG_PTR_TO_STACK_OR_NULL: Type = 276; - pub const ARG_PTR_TO_BTF_ID_OR_NULL: Type = 270; - pub const ARG_PTR_TO_UNINIT_MEM: Type = 32772; - pub const ARG_PTR_TO_FIXED_SIZE_MEM: Type = 262148; - pub const __BPF_ARG_TYPE_LIMIT: Type = 33554431; +pub struct tcf_chain { + pub filter_chain_lock: mutex, + pub filter_chain: *mut tcf_proto, + pub list: list_head, + pub block: *mut tcf_block, + pub index: u32_, + pub refcnt: ::aya_ebpf::cty::c_uint, + pub action_refcnt: ::aya_ebpf::cty::c_uint, + pub explicitly_created: bool_, + pub flushing: bool_, + pub tmplt_ops: *const tcf_proto_ops, + pub tmplt_priv: *mut ::aya_ebpf::cty::c_void, + pub rcu: callback_head, } -pub mod bpf_return_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RET_INTEGER: Type = 0; - pub const RET_VOID: Type = 1; - pub const RET_PTR_TO_MAP_VALUE: Type = 2; - pub const RET_PTR_TO_SOCKET: Type = 3; - pub const RET_PTR_TO_TCP_SOCK: Type = 4; - pub const RET_PTR_TO_SOCK_COMMON: Type = 5; - pub const RET_PTR_TO_MEM: Type = 6; - pub const RET_PTR_TO_MEM_OR_BTF_ID: Type = 7; - pub const RET_PTR_TO_BTF_ID: Type = 8; - pub const __BPF_RET_TYPE_MAX: Type = 9; - pub const RET_PTR_TO_MAP_VALUE_OR_NULL: Type = 258; - pub const RET_PTR_TO_SOCKET_OR_NULL: Type = 259; - pub const RET_PTR_TO_TCP_SOCK_OR_NULL: Type = 260; - pub const RET_PTR_TO_SOCK_COMMON_OR_NULL: Type = 261; - pub const RET_PTR_TO_RINGBUF_MEM_OR_NULL: Type = 1286; - pub const RET_PTR_TO_DYNPTR_MEM_OR_NULL: Type = 262; - pub const RET_PTR_TO_BTF_ID_OR_NULL: Type = 264; - pub const RET_PTR_TO_BTF_ID_TRUSTED: Type = 1048584; - pub const __BPF_RET_TYPE_LIMIT: Type = 33554431; +#[repr(C)] +#[derive(Debug)] +pub struct bpf_storage_buffer { + pub rcu: callback_head, + pub data: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_func_proto { - pub func: ::core::option::Option< - unsafe extern "C" fn(arg1: u64_, arg2: u64_, arg3: u64_, arg4: u64_, arg5: u64_) -> u64_, - >, - pub gpl_only: bool_, - pub pkt_access: bool_, - pub might_sleep: bool_, - pub ret_type: bpf_return_type::Type, - pub __bindgen_anon_1: bpf_func_proto__bindgen_ty_1, - pub __bindgen_anon_2: bpf_func_proto__bindgen_ty_2, - pub ret_btf_id: *mut ::aya_bpf::cty::c_int, - pub allowed: ::core::option::Option bool_>, +#[derive(Debug, Copy, Clone)] +pub struct ack_sample { + pub pkts_acked: u32_, + pub rtt_us: s32, + pub in_flight: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union bpf_func_proto__bindgen_ty_1 { - pub __bindgen_anon_1: bpf_func_proto__bindgen_ty_1__bindgen_ty_1, - pub arg_type: [bpf_arg_type::Type; 5usize], +#[derive(Debug, Copy, Clone)] +pub struct rate_sample { + pub prior_mstamp: u64_, + pub prior_delivered: u32_, + pub prior_delivered_ce: u32_, + pub delivered: s32, + pub delivered_ce: s32, + pub interval_us: ::aya_ebpf::cty::c_long, + pub snd_interval_us: u32_, + pub rcv_interval_us: u32_, + pub rtt_us: ::aya_ebpf::cty::c_long, + pub losses: ::aya_ebpf::cty::c_int, + pub acked_sacked: u32_, + pub prior_in_flight: u32_, + pub last_end_seq: u32_, + pub is_app_limited: bool_, + pub is_retrans: bool_, + pub is_ack_delayed: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_func_proto__bindgen_ty_1__bindgen_ty_1 { - pub arg1_type: bpf_arg_type::Type, - pub arg2_type: bpf_arg_type::Type, - pub arg3_type: bpf_arg_type::Type, - pub arg4_type: bpf_arg_type::Type, - pub arg5_type: bpf_arg_type::Type, +pub struct ldt_struct { + pub entries: *mut desc_struct, + pub nr_entries: ::aya_ebpf::cty::c_uint, + pub slot: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub union bpf_func_proto__bindgen_ty_2 { - pub __bindgen_anon_1: bpf_func_proto__bindgen_ty_2__bindgen_ty_1, - pub arg_btf_id: [*mut u32_; 5usize], - pub __bindgen_anon_2: bpf_func_proto__bindgen_ty_2__bindgen_ty_2, - pub arg_size: [usize; 5usize], +#[derive(Debug, Copy, Clone)] +pub struct cdev { + pub kobj: kobject, + pub owner: *mut module, + pub ops: *const file_operations, + pub list: list_head, + pub dev: dev_t, + pub count: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_func_proto__bindgen_ty_2__bindgen_ty_1 { - pub arg1_btf_id: *mut u32_, - pub arg2_btf_id: *mut u32_, - pub arg3_btf_id: *mut u32_, - pub arg4_btf_id: *mut u32_, - pub arg5_btf_id: *mut u32_, +pub struct new_utsname { + pub sysname: [::aya_ebpf::cty::c_char; 65usize], + pub nodename: [::aya_ebpf::cty::c_char; 65usize], + pub release: [::aya_ebpf::cty::c_char; 65usize], + pub version: [::aya_ebpf::cty::c_char; 65usize], + pub machine: [::aya_ebpf::cty::c_char; 65usize], + pub domainname: [::aya_ebpf::cty::c_char; 65usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_func_proto__bindgen_ty_2__bindgen_ty_2 { - pub arg1_size: usize, - pub arg2_size: usize, - pub arg3_size: usize, - pub arg4_size: usize, - pub arg5_size: usize, +pub struct uts_namespace { + pub name: new_utsname, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub ns: ns_common, } -pub mod bpf_access_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_READ: Type = 1; - pub const BPF_WRITE: Type = 2; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nsset { + pub flags: ::aya_ebpf::cty::c_uint, + pub nsproxy: *mut nsproxy, + pub fs: *mut fs_struct, + pub cred: *const cred, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_insn_access_aux { - pub reg_type: bpf_reg_type::Type, - pub __bindgen_anon_1: bpf_insn_access_aux__bindgen_ty_1, - pub log: *mut bpf_verifier_log, +pub struct fs_parse_result { + pub negated: bool_, + pub __bindgen_anon_1: fs_parse_result__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_insn_access_aux__bindgen_ty_1 { - pub ctx_field_size: ::aya_bpf::cty::c_int, - pub __bindgen_anon_1: bpf_insn_access_aux__bindgen_ty_1__bindgen_ty_1, +pub union fs_parse_result__bindgen_ty_1 { + pub boolean: bool_, + pub int_32: ::aya_ebpf::cty::c_int, + pub uint_32: ::aya_ebpf::cty::c_uint, + pub uint_64: u64_, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_insn_access_aux__bindgen_ty_1__bindgen_ty_1 { - pub btf: *mut btf, - pub btf_id: u32_, +pub mod ip_conntrack_dir { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IP_CT_DIR_ORIGINAL: Type = 0; + pub const IP_CT_DIR_REPLY: Type = 1; + pub const IP_CT_DIR_MAX: Type = 2; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_prog_ops { - pub test_run: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut bpf_prog, - arg2: *const bpf_attr, - arg3: *mut bpf_attr, - ) -> ::aya_bpf::cty::c_int, - >, +pub mod sctp_conntrack { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const SCTP_CONNTRACK_NONE: Type = 0; + pub const SCTP_CONNTRACK_CLOSED: Type = 1; + pub const SCTP_CONNTRACK_COOKIE_WAIT: Type = 2; + pub const SCTP_CONNTRACK_COOKIE_ECHOED: Type = 3; + pub const SCTP_CONNTRACK_ESTABLISHED: Type = 4; + pub const SCTP_CONNTRACK_SHUTDOWN_SENT: Type = 5; + pub const SCTP_CONNTRACK_SHUTDOWN_RECD: Type = 6; + pub const SCTP_CONNTRACK_SHUTDOWN_ACK_SENT: Type = 7; + pub const SCTP_CONNTRACK_HEARTBEAT_SENT: Type = 8; + pub const SCTP_CONNTRACK_HEARTBEAT_ACKED: Type = 9; + pub const SCTP_CONNTRACK_MAX: Type = 10; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_verifier_ops { - pub get_func_proto: ::core::option::Option< - unsafe extern "C" fn( - arg1: bpf_func_id::Type, - arg2: *const bpf_prog, - ) -> *const bpf_func_proto, - >, - pub is_valid_access: ::core::option::Option< - unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_int, - arg2: ::aya_bpf::cty::c_int, - arg3: bpf_access_type::Type, - arg4: *const bpf_prog, - arg5: *mut bpf_insn_access_aux, - ) -> bool_, - >, - pub gen_prologue: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut bpf_insn, - arg2: bool_, - arg3: *const bpf_prog, - ) -> ::aya_bpf::cty::c_int, - >, - pub gen_ld_abs: ::core::option::Option< - unsafe extern "C" fn(arg1: *const bpf_insn, arg2: *mut bpf_insn) -> ::aya_bpf::cty::c_int, - >, - pub convert_ctx_access: ::core::option::Option< - unsafe extern "C" fn( - arg1: bpf_access_type::Type, - arg2: *const bpf_insn, - arg3: *mut bpf_insn, - arg4: *mut bpf_prog, - arg5: *mut u32_, - ) -> u32_, - >, - pub btf_struct_access: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut bpf_verifier_log, - arg2: *const bpf_reg_state, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct plist_head { + pub node_list: list_head, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_prog_offload { - pub prog: *mut bpf_prog, - pub netdev: *mut net_device, - pub offdev: *mut bpf_offload_dev, - pub dev_priv: *mut ::aya_bpf::cty::c_void, - pub offloads: list_head, - pub dev_state: bool_, - pub opt_failed: bool_, - pub jited_image: *mut ::aya_bpf::cty::c_void, - pub jited_len: u32_, +pub mod pm_qos_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const PM_QOS_UNITIALIZED: Type = 0; + pub const PM_QOS_MAX: Type = 1; + pub const PM_QOS_MIN: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct btf_func_model { - pub ret_size: u8_, - pub ret_flags: u8_, - pub nr_args: u8_, - pub arg_size: [u8_; 12usize], - pub arg_flags: [u8_; 12usize], +pub struct pm_qos_constraints { + pub list: plist_head, + pub target_value: s32, + pub default_value: s32, + pub no_constraint_value: s32, + pub type_: pm_qos_type::Type, + pub notifiers: *mut blocking_notifier_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_tramp_image { - pub image: *mut ::aya_bpf::cty::c_void, - pub ksym: bpf_ksym, - pub pcref: percpu_ref, - pub ip_after_call: *mut ::aya_bpf::cty::c_void, - pub ip_epilogue: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: bpf_tramp_image__bindgen_ty_1, +pub struct freq_constraints { + pub min_freq: pm_qos_constraints, + pub min_freq_notifiers: blocking_notifier_head, + pub max_freq: pm_qos_constraints, + pub max_freq_notifiers: blocking_notifier_head, } #[repr(C)] -#[derive(Copy, Clone)] -pub union bpf_tramp_image__bindgen_ty_1 { - pub rcu: callback_head, - pub work: work_struct, +#[derive(Debug, Copy, Clone)] +pub struct pm_qos_flags { + pub list: list_head, + pub effective_flags: s32, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_trampoline { - pub hlist: hlist_node, - pub fops: *mut ftrace_ops, - pub mutex: mutex, - pub refcnt: refcount_t, - pub flags: u32_, - pub key: u64_, - pub func: bpf_trampoline__bindgen_ty_1, - pub extension_prog: *mut bpf_prog, - pub progs_hlist: [hlist_head; 3usize], - pub progs_cnt: [::aya_bpf::cty::c_int; 3usize], - pub cur_image: *mut bpf_tramp_image, - pub mod_: *mut module, +pub struct dev_pm_qos { + pub resume_latency: pm_qos_constraints, + pub latency_tolerance: pm_qos_constraints, + pub freq: freq_constraints, + pub flags: pm_qos_flags, + pub resume_latency_req: *mut dev_pm_qos_request, + pub latency_tolerance_req: *mut dev_pm_qos_request, + pub flags_req: *mut dev_pm_qos_request, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_trampoline__bindgen_ty_1 { - pub model: btf_func_model, - pub addr: *mut ::aya_bpf::cty::c_void, - pub ftrace_managed: bool_, +pub struct pm_qos_flags_request { + pub node: list_head, + pub flags: s32, +} +pub mod freq_qos_req_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FREQ_QOS_MIN: Type = 1; + pub const FREQ_QOS_MAX: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_func_info_aux { - pub linkage: u16_, - pub unreliable: bool_, +pub struct freq_qos_request { + pub type_: freq_qos_req_type::Type, + pub pnode: plist_node, + pub qos: *mut freq_constraints, +} +pub mod dev_pm_qos_req_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEV_PM_QOS_RESUME_LATENCY: Type = 1; + pub const DEV_PM_QOS_LATENCY_TOLERANCE: Type = 2; + pub const DEV_PM_QOS_MIN_FREQUENCY: Type = 3; + pub const DEV_PM_QOS_MAX_FREQUENCY: Type = 4; + pub const DEV_PM_QOS_FLAGS: Type = 5; } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_jit_poke_descriptor { - pub tailcall_target: *mut ::aya_bpf::cty::c_void, - pub tailcall_bypass: *mut ::aya_bpf::cty::c_void, - pub bypass_addr: *mut ::aya_bpf::cty::c_void, - pub aux: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: bpf_jit_poke_descriptor__bindgen_ty_1, - pub tailcall_target_stable: bool_, - pub adj_off: u8_, - pub reason: u16_, - pub insn_idx: u32_, +pub struct dev_pm_qos_request { + pub type_: dev_pm_qos_req_type::Type, + pub data: dev_pm_qos_request__bindgen_ty_1, + pub dev: *mut device, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_jit_poke_descriptor__bindgen_ty_1 { - pub tail_call: bpf_jit_poke_descriptor__bindgen_ty_1__bindgen_ty_1, +pub union dev_pm_qos_request__bindgen_ty_1 { + pub pnode: plist_node, + pub flr: pm_qos_flags_request, + pub freq: freq_qos_request, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_jit_poke_descriptor__bindgen_ty_1__bindgen_ty_1 { - pub map: *mut bpf_map, - pub key: u32_, +pub struct fdtable { + pub max_fds: ::aya_ebpf::cty::c_uint, + pub fd: *mut *mut file, + pub close_on_exec: *mut ::aya_ebpf::cty::c_ulong, + pub open_fds: *mut ::aya_ebpf::cty::c_ulong, + pub full_fds_bits: *mut ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_ctx_arg_aux { - pub offset: u32_, - pub reg_type: bpf_reg_type::Type, - pub btf_id: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_prog_stats { - pub cnt: u64_stats_t, - pub nsecs: u64_stats_t, - pub misses: u64_stats_t, - pub syncp: u64_stats_sync, +#[derive(Copy, Clone)] +pub struct files_struct { + pub count: atomic_t, + pub resize_in_progress: bool_, + pub resize_wait: wait_queue_head_t, + pub fdt: *mut fdtable, + pub fdtab: fdtable, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, + pub file_lock: spinlock_t, + pub next_fd: ::aya_ebpf::cty::c_uint, + pub close_on_exec_init: [::aya_ebpf::cty::c_ulong; 1usize], + pub open_fds_init: [::aya_ebpf::cty::c_ulong; 1usize], + pub full_fds_bits_init: [::aya_ebpf::cty::c_ulong; 1usize], + pub fd_array: [*mut file; 64usize], + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, } -impl bpf_prog_stats { +impl files_struct { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); __bindgen_bitfield_unit } } +pub mod task_work_notify_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const TWA_NONE: Type = 0; + pub const TWA_RESUME: Type = 1; + pub const TWA_SIGNAL: Type = 2; + pub const TWA_SIGNAL_NO_IPI: Type = 3; +} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sock_fprog_kern { - pub len: u16_, - pub filter: *mut sock_filter, +pub struct crypto_instance { + pub alg: crypto_alg, + pub tmpl: *mut crypto_template, + pub __bindgen_anon_1: crypto_instance__bindgen_ty_1, + pub free_work: work_struct, + pub __ctx: __IncompleteArrayField<*mut ::aya_ebpf::cty::c_void>, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_cgroup_storage { - pub __bindgen_anon_1: bpf_cgroup_storage__bindgen_ty_1, - pub map: *mut bpf_cgroup_storage_map, - pub key: bpf_cgroup_storage_key, - pub list_map: list_head, - pub list_cg: list_head, - pub node: rb_node, - pub rcu: callback_head, +pub union crypto_instance__bindgen_ty_1 { + pub list: hlist_node, + pub spawns: *mut crypto_spawn, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_cgroup_storage__bindgen_ty_1 { - pub buf: *mut bpf_storage_buffer, - pub percpu_buf: *mut ::aya_bpf::cty::c_void, +pub struct crypto_spawn { + pub list: list_head, + pub alg: *mut crypto_alg, + pub __bindgen_anon_1: crypto_spawn__bindgen_ty_1, + pub frontend: *const crypto_type, + pub mask: u32_, + pub dead: bool_, + pub registered: bool_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethhdr { - pub h_dest: [::aya_bpf::cty::c_uchar; 6usize], - pub h_source: [::aya_bpf::cty::c_uchar; 6usize], - pub h_proto: __be16, +#[derive(Copy, Clone)] +pub union crypto_spawn__bindgen_ty_1 { + pub inst: *mut crypto_instance, + pub next: *mut crypto_spawn, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack { - pub use_: refcount_t, +pub struct crypto_template { + pub list: list_head, + pub instances: hlist_head, + pub module: *mut module, + pub create: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut crypto_template, + arg2: *mut *mut rtattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub name: [::aya_ebpf::cty::c_char; 128usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct inet_hashinfo { - pub ehash: *mut inet_ehash_bucket, - pub ehash_locks: *mut spinlock_t, - pub ehash_mask: ::aya_bpf::cty::c_uint, - pub ehash_locks_mask: ::aya_bpf::cty::c_uint, - pub bind_bucket_cachep: *mut kmem_cache, - pub bhash: *mut inet_bind_hashbucket, - pub bind2_bucket_cachep: *mut kmem_cache, - pub bhash2: *mut inet_bind_hashbucket, - pub bhash_size: ::aya_bpf::cty::c_uint, - pub lhash2_mask: ::aya_bpf::cty::c_uint, - pub lhash2: *mut inet_listen_hashbucket, - pub pernet: bool_, +#[derive(Debug)] +pub struct crypto_skcipher { + pub reqsize: ::aya_ebpf::cty::c_uint, + pub base: crypto_tfm, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ipv4_devconf { - pub sysctl: *mut ::aya_bpf::cty::c_void, - pub data: [::aya_bpf::cty::c_int; 33usize], - pub state: [::aya_bpf::cty::c_ulong; 1usize], +pub struct blk_crypto_ll_ops { + pub keyslot_program: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_crypto_profile, + arg2: *const blk_crypto_key, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub keyslot_evict: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut blk_crypto_profile, + arg2: *const blk_crypto_key, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcp_fastopen_context { - pub key: [siphash_key_t; 2usize], - pub num: ::aya_bpf::cty::c_int, - pub rcu: callback_head, +#[derive(Copy, Clone)] +pub struct blk_crypto_profile { + pub ll_ops: blk_crypto_ll_ops, + pub max_dun_bytes_supported: ::aya_ebpf::cty::c_uint, + pub modes_supported: [::aya_ebpf::cty::c_uint; 5usize], + pub dev: *mut device, + pub num_slots: ::aya_ebpf::cty::c_uint, + pub lock: rw_semaphore, + pub lockdep_key: lock_class_key, + pub idle_slots_wait_queue: wait_queue_head_t, + pub idle_slots: list_head, + pub idle_slots_lock: spinlock_t, + pub slot_hashtable: *mut hlist_head, + pub log_slot_ht_size: ::aya_ebpf::cty::c_uint, + pub slots: *mut blk_crypto_keyslot, } #[repr(C)] #[derive(Copy, Clone)] -pub struct rt6key { - pub addr: in6_addr, - pub plen: ::aya_bpf::cty::c_int, +pub struct msi_dev_domain { + pub store: xarray, + pub domain: *mut irq_domain, } #[repr(C)] #[derive(Copy, Clone)] -pub struct fib_nh_common { - pub nhc_dev: *mut net_device, - pub nhc_dev_tracker: netdevice_tracker, - pub nhc_oif: ::aya_bpf::cty::c_int, - pub nhc_scope: ::aya_bpf::cty::c_uchar, - pub nhc_family: u8_, - pub nhc_gw_family: u8_, - pub nhc_flags: ::aya_bpf::cty::c_uchar, - pub nhc_lwtstate: *mut lwtunnel_state, - pub nhc_gw: fib_nh_common__bindgen_ty_1, - pub nhc_weight: ::aya_bpf::cty::c_int, - pub nhc_upper_bound: atomic_t, - pub nhc_pcpu_rth_output: *mut *mut rtable, - pub nhc_rth_input: *mut rtable, - pub nhc_exceptions: *mut fnhe_hash_bucket, +pub struct msi_device_data { + pub properties: ::aya_ebpf::cty::c_ulong, + pub platform_data: *mut platform_msi_priv_data, + pub mutex: mutex, + pub __domains: [msi_dev_domain; 2usize], + pub __iter_idx: ::aya_ebpf::cty::c_ulong, } +pub type irq_handler_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: ::aya_ebpf::cty::c_int, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> irqreturn_t, +>; #[repr(C)] -#[derive(Copy, Clone)] -pub union fib_nh_common__bindgen_ty_1 { - pub ipv4: __be32, - pub ipv6: in6_addr, +#[derive(Debug, Copy, Clone)] +pub struct irqaction { + pub handler: irq_handler_t, + pub dev_id: *mut ::aya_ebpf::cty::c_void, + pub percpu_dev_id: *mut ::aya_ebpf::cty::c_void, + pub next: *mut irqaction, + pub thread_fn: irq_handler_t, + pub thread: *mut task_struct, + pub secondary: *mut irqaction, + pub irq: ::aya_ebpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, + pub thread_flags: ::aya_ebpf::cty::c_ulong, + pub thread_mask: ::aya_ebpf::cty::c_ulong, + pub name: *const ::aya_ebpf::cty::c_char, + pub dir: *mut proc_dir_entry, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl irqaction { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct fib6_nh { - pub nh_common: fib_nh_common, - pub last_probe: ::aya_bpf::cty::c_ulong, - pub rt6i_pcpu: *mut *mut rt6_info, - pub rt6i_exception_bucket: *mut rt6_exception_bucket, +#[derive(Debug, Copy, Clone)] +pub struct irq_affinity_notify { + pub irq: ::aya_ebpf::cty::c_uint, + pub kref: kref, + pub work: work_struct, + pub notify: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut irq_affinity_notify, arg2: *const cpumask_t), + >, + pub release: ::core::option::Option, } #[repr(C)] -pub struct fib6_info { - pub fib6_table: *mut fib6_table, - pub fib6_next: *mut fib6_info, - pub fib6_node: *mut fib6_node, - pub __bindgen_anon_1: fib6_info__bindgen_ty_1, - pub fib6_nsiblings: ::aya_bpf::cty::c_uint, - pub fib6_ref: refcount_t, - pub expires: ::aya_bpf::cty::c_ulong, - pub fib6_metrics: *mut dst_metrics, - pub fib6_dst: rt6key, - pub fib6_flags: u32_, - pub fib6_src: rt6key, - pub fib6_prefsrc: rt6key, - pub fib6_metric: u32_, - pub fib6_protocol: u8_, - pub fib6_type: u8_, - pub offload: u8_, - pub trap: u8_, - pub offload_failed: u8_, +#[derive(Debug, Copy, Clone)] +pub struct irq_affinity_desc { + pub mask: cpumask, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub rcu: callback_head, - pub nh: *mut nexthop, - pub fib6_nh: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fib6_info__bindgen_ty_1 { - pub fib6_siblings: list_head, - pub nh_list: list_head, + pub __bindgen_padding_0: [u8; 7usize], } -impl fib6_info { +impl irq_affinity_desc { #[inline] - pub fn should_flush(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn is_managed(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_should_flush(&mut self, val: u8_) { + pub fn set_is_managed(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn dst_nocount(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + pub fn new_bitfield_1( + is_managed: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_managed: u32 = unsafe { ::core::mem::transmute(is_managed) }; + is_managed as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union msi_instance_cookie { + pub value: u64_, + pub ptr: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct x86_msi_addr_lo { + pub __bindgen_anon_1: x86_msi_addr_lo__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union x86_msi_addr_lo__bindgen_ty_1 { + pub __bindgen_anon_1: x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_2, +} +#[repr(C)] +#[repr(align(4))] +#[derive(Debug, Copy, Clone)] +pub struct x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_1 { + pub _bitfield_align_1: [u16; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, +} +impl x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_1 { + #[inline] + pub fn reserved_0(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u32) } } #[inline] - pub fn set_dst_nocount(&mut self, val: u8_) { + pub fn set_reserved_0(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 2u8, val as u64) } } #[inline] - pub fn dst_nopolicy(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + pub fn dest_mode_logical(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_dst_nopolicy(&mut self, val: u8_) { + pub fn set_dest_mode_logical(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn fib6_destroying(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + pub fn redirect_hint(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_fib6_destroying(&mut self, val: u8_) { + pub fn set_redirect_hint(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn unused(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } + pub fn reserved_1(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_unused(&mut self, val: u8_) { + pub fn set_reserved_1(&mut self, val: u32_) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 4u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn virt_destid_8_14(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 7u8) as u32) } + } + #[inline] + pub fn set_virt_destid_8_14(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 7u8, val as u64) + } + } + #[inline] + pub fn destid_0_7(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 8u8) as u32) } + } + #[inline] + pub fn set_destid_0_7(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(12usize, 8u8, val as u64) + } + } + #[inline] + pub fn base_address(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 12u8) as u32) } + } + #[inline] + pub fn set_base_address(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(20usize, 12u8, val as u64) } } #[inline] pub fn new_bitfield_1( - should_flush: u8_, - dst_nocount: u8_, - dst_nopolicy: u8_, - fib6_destroying: u8_, - unused: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let should_flush: u8 = unsafe { ::core::mem::transmute(should_flush) }; - should_flush as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let dst_nocount: u8 = unsafe { ::core::mem::transmute(dst_nocount) }; - dst_nocount as u64 + reserved_0: u32_, + dest_mode_logical: u32_, + redirect_hint: u32_, + reserved_1: u32_, + virt_destid_8_14: u32_, + destid_0_7: u32_, + base_address: u32_, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 2u8, { + let reserved_0: u32 = unsafe { ::core::mem::transmute(reserved_0) }; + reserved_0 as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { - let dst_nopolicy: u8 = unsafe { ::core::mem::transmute(dst_nopolicy) }; - dst_nopolicy as u64 + let dest_mode_logical: u32 = unsafe { ::core::mem::transmute(dest_mode_logical) }; + dest_mode_logical as u64 }); __bindgen_bitfield_unit.set(3usize, 1u8, { - let fib6_destroying: u8 = unsafe { ::core::mem::transmute(fib6_destroying) }; - fib6_destroying as u64 + let redirect_hint: u32 = unsafe { ::core::mem::transmute(redirect_hint) }; + redirect_hint as u64 }); - __bindgen_bitfield_unit.set(4usize, 4u8, { - let unused: u8 = unsafe { ::core::mem::transmute(unused) }; - unused as u64 + __bindgen_bitfield_unit.set(4usize, 1u8, { + let reserved_1: u32 = unsafe { ::core::mem::transmute(reserved_1) }; + reserved_1 as u64 + }); + __bindgen_bitfield_unit.set(5usize, 7u8, { + let virt_destid_8_14: u32 = unsafe { ::core::mem::transmute(virt_destid_8_14) }; + virt_destid_8_14 as u64 + }); + __bindgen_bitfield_unit.set(12usize, 8u8, { + let destid_0_7: u32 = unsafe { ::core::mem::transmute(destid_0_7) }; + destid_0_7 as u64 + }); + __bindgen_bitfield_unit.set(20usize, 12u8, { + let base_address: u32 = unsafe { ::core::mem::transmute(base_address) }; + base_address as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct rt6_info { - pub dst: dst_entry, - pub from: *mut fib6_info, - pub sernum: ::aya_bpf::cty::c_int, - pub rt6i_dst: rt6key, - pub rt6i_src: rt6key, - pub rt6i_gateway: in6_addr, - pub rt6i_idev: *mut inet6_dev, - pub rt6i_flags: u32_, - pub rt6i_nfheader_len: ::aya_bpf::cty::c_ushort, -} -#[repr(C)] +#[repr(align(4))] #[derive(Debug, Copy, Clone)] -pub struct rt6_statistics { - pub fib_nodes: __u32, - pub fib_route_nodes: __u32, - pub fib_rt_entries: __u32, - pub fib_rt_cache: __u32, - pub fib_discarded_routes: __u32, - pub fib_rt_alloc: atomic_t, +pub struct x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_2 { + pub _bitfield_align_1: [u16; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, +} +impl x86_msi_addr_lo__bindgen_ty_1__bindgen_ty_2 { + #[inline] + pub fn dmar_reserved_0(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u32) } + } + #[inline] + pub fn set_dmar_reserved_0(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 2u8, val as u64) + } + } + #[inline] + pub fn dmar_index_15(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_dmar_index_15(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn dmar_subhandle_valid(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_dmar_subhandle_valid(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn dmar_format(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + } + #[inline] + pub fn set_dmar_format(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn dmar_index_0_14(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 15u8) as u32) } + } + #[inline] + pub fn set_dmar_index_0_14(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 15u8, val as u64) + } + } + #[inline] + pub fn dmar_base_address(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(20usize, 12u8) as u32) } + } + #[inline] + pub fn set_dmar_base_address(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(20usize, 12u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + dmar_reserved_0: u32_, + dmar_index_15: u32_, + dmar_subhandle_valid: u32_, + dmar_format: u32_, + dmar_index_0_14: u32_, + dmar_base_address: u32_, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 2u8, { + let dmar_reserved_0: u32 = unsafe { ::core::mem::transmute(dmar_reserved_0) }; + dmar_reserved_0 as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let dmar_index_15: u32 = unsafe { ::core::mem::transmute(dmar_index_15) }; + dmar_index_15 as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let dmar_subhandle_valid: u32 = unsafe { ::core::mem::transmute(dmar_subhandle_valid) }; + dmar_subhandle_valid as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let dmar_format: u32 = unsafe { ::core::mem::transmute(dmar_format) }; + dmar_format as u64 + }); + __bindgen_bitfield_unit.set(5usize, 15u8, { + let dmar_index_0_14: u32 = unsafe { ::core::mem::transmute(dmar_index_0_14) }; + dmar_index_0_14 as u64 + }); + __bindgen_bitfield_unit.set(20usize, 12u8, { + let dmar_base_address: u32 = unsafe { ::core::mem::transmute(dmar_base_address) }; + dmar_base_address as u64 + }); + __bindgen_bitfield_unit + } } +pub type arch_msi_msg_addr_lo_t = x86_msi_addr_lo; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fib6_node { - pub parent: *mut fib6_node, - pub left: *mut fib6_node, - pub right: *mut fib6_node, - pub subtree: *mut fib6_node, - pub leaf: *mut fib6_info, - pub fn_bit: __u16, - pub fn_flags: __u16, - pub fn_sernum: ::aya_bpf::cty::c_int, - pub rr_ptr: *mut fib6_info, - pub rcu: callback_head, +pub struct x86_msi_addr_hi { + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, +} +impl x86_msi_addr_hi { + #[inline] + pub fn reserved(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_reserved(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn destid_8_31(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 24u8) as u32) } + } + #[inline] + pub fn set_destid_8_31(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 24u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + reserved: u32_, + destid_8_31: u32_, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let reserved: u32 = unsafe { ::core::mem::transmute(reserved) }; + reserved as u64 + }); + __bindgen_bitfield_unit.set(8usize, 24u8, { + let destid_8_31: u32 = unsafe { ::core::mem::transmute(destid_8_31) }; + destid_8_31 as u64 + }); + __bindgen_bitfield_unit + } } +pub type arch_msi_msg_addr_hi_t = x86_msi_addr_hi; #[repr(C)] #[derive(Copy, Clone)] -pub struct fib6_table { - pub tb6_hlist: hlist_node, - pub tb6_id: u32_, - pub tb6_lock: spinlock_t, - pub tb6_root: fib6_node, - pub tb6_peers: inet_peer_base, - pub flags: ::aya_bpf::cty::c_uint, - pub fib_seq: ::aya_bpf::cty::c_uint, +pub struct x86_msi_data { + pub __bindgen_anon_1: x86_msi_data__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct seg6_pernet_data { - pub lock: mutex, - pub tun_src: *mut in6_addr, - pub hmac_infos: rhashtable, +pub union x86_msi_data__bindgen_ty_1 { + pub __bindgen_anon_1: x86_msi_data__bindgen_ty_1__bindgen_ty_1, + pub dmar_subhandle: u32_, } #[repr(C)] +#[repr(align(4))] #[derive(Debug, Copy, Clone)] -pub struct in_addr { - pub s_addr: __be32, +pub struct x86_msi_data__bindgen_ty_1__bindgen_ty_1 { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, + pub __bindgen_padding_0: u16, +} +impl x86_msi_data__bindgen_ty_1__bindgen_ty_1 { + #[inline] + pub fn vector(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_vector(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn delivery_mode(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 3u8) as u32) } + } + #[inline] + pub fn set_delivery_mode(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 3u8, val as u64) + } + } + #[inline] + pub fn dest_mode_logical(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) } + } + #[inline] + pub fn set_dest_mode_logical(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 1u8, val as u64) + } + } + #[inline] + pub fn reserved(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 2u8) as u32) } + } + #[inline] + pub fn set_reserved(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(12usize, 2u8, val as u64) + } + } + #[inline] + pub fn active_low(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) } + } + #[inline] + pub fn set_active_low(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(14usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_level(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_level(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(15usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + vector: u32_, + delivery_mode: u32_, + dest_mode_logical: u32_, + reserved: u32_, + active_low: u32_, + is_level: u32_, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let vector: u32 = unsafe { ::core::mem::transmute(vector) }; + vector as u64 + }); + __bindgen_bitfield_unit.set(8usize, 3u8, { + let delivery_mode: u32 = unsafe { ::core::mem::transmute(delivery_mode) }; + delivery_mode as u64 + }); + __bindgen_bitfield_unit.set(11usize, 1u8, { + let dest_mode_logical: u32 = unsafe { ::core::mem::transmute(dest_mode_logical) }; + dest_mode_logical as u64 + }); + __bindgen_bitfield_unit.set(12usize, 2u8, { + let reserved: u32 = unsafe { ::core::mem::transmute(reserved) }; + reserved as u64 + }); + __bindgen_bitfield_unit.set(14usize, 1u8, { + let active_low: u32 = unsafe { ::core::mem::transmute(active_low) }; + active_low as u64 + }); + __bindgen_bitfield_unit.set(15usize, 1u8, { + let is_level: u32 = unsafe { ::core::mem::transmute(is_level) }; + is_level as u64 + }); + __bindgen_bitfield_unit + } } +pub type arch_msi_msg_data_t = x86_msi_data; #[repr(C)] #[derive(Copy, Clone)] -pub union nf_inet_addr { - pub all: [__u32; 4usize], - pub ip: __be32, - pub ip6: [__be32; 4usize], - pub in_: in_addr, - pub in6: in6_addr, +pub struct msi_msg { + pub __bindgen_anon_1: msi_msg__bindgen_ty_1, + pub __bindgen_anon_2: msi_msg__bindgen_ty_2, + pub __bindgen_anon_3: msi_msg__bindgen_ty_3, } -pub type nf_hookfn = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: *mut sk_buff, - arg3: *const nf_hook_state, - ) -> ::aya_bpf::cty::c_uint, ->; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_hook_entry { - pub hook: nf_hookfn, - pub priv_: *mut ::aya_bpf::cty::c_void, +#[derive(Copy, Clone)] +pub union msi_msg__bindgen_ty_1 { + pub address_lo: u32_, + pub arch_addr_lo: arch_msi_msg_addr_lo_t, } #[repr(C)] -#[derive(Debug)] -pub struct nf_hook_entries { - pub num_hook_entries: u16_, - pub hooks: __IncompleteArrayField, +#[derive(Copy, Clone)] +pub union msi_msg__bindgen_ty_2 { + pub address_hi: u32_, + pub arch_addr_hi: arch_msi_msg_addr_hi_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_ct_tcp_state { - pub td_end: u_int32_t, - pub td_maxend: u_int32_t, - pub td_maxwin: u_int32_t, - pub td_maxack: u_int32_t, - pub td_scale: u_int8_t, - pub flags: u_int8_t, +#[derive(Copy, Clone)] +pub union msi_msg__bindgen_ty_3 { + pub data: u32_, + pub arch_data: arch_msi_msg_data_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_ct_tcp { - pub seen: [ip_ct_tcp_state; 2usize], - pub state: u_int8_t, - pub last_dir: u_int8_t, - pub retrans: u_int8_t, - pub last_index: u_int8_t, - pub last_seq: u_int32_t, - pub last_ack: u_int32_t, - pub last_end: u_int32_t, - pub last_win: u_int16_t, - pub last_wscale: u_int8_t, - pub last_flags: u_int8_t, +#[derive(Copy, Clone)] +pub struct pci_msi_desc { + pub __bindgen_anon_1: pci_msi_desc__bindgen_ty_1, + pub msi_attrib: pci_msi_desc__bindgen_ty_2, + pub __bindgen_anon_2: pci_msi_desc__bindgen_ty_3, } #[repr(C)] #[derive(Copy, Clone)] -pub union nf_conntrack_man_proto { - pub all: __be16, - pub tcp: nf_conntrack_man_proto__bindgen_ty_1, - pub udp: nf_conntrack_man_proto__bindgen_ty_2, - pub icmp: nf_conntrack_man_proto__bindgen_ty_3, - pub dccp: nf_conntrack_man_proto__bindgen_ty_4, - pub sctp: nf_conntrack_man_proto__bindgen_ty_5, - pub gre: nf_conntrack_man_proto__bindgen_ty_6, +pub union pci_msi_desc__bindgen_ty_1 { + pub msi_mask: u32_, + pub msix_ctrl: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_man_proto__bindgen_ty_1 { - pub port: __be16, +pub struct pci_msi_desc__bindgen_ty_2 { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, + pub default_irq: ::aya_ebpf::cty::c_uint, +} +impl pci_msi_desc__bindgen_ty_2 { + #[inline] + pub fn is_msix(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_msix(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn multiple(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 3u8) as u8) } + } + #[inline] + pub fn set_multiple(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 3u8, val as u64) + } + } + #[inline] + pub fn multi_cap(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 3u8) as u8) } + } + #[inline] + pub fn set_multi_cap(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 3u8, val as u64) + } + } + #[inline] + pub fn can_mask(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + } + #[inline] + pub fn set_can_mask(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_64(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_64(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_virtual(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_virtual(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(9usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + is_msix: u8_, + multiple: u8_, + multi_cap: u8_, + can_mask: u8_, + is_64: u8_, + is_virtual: u8_, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_msix: u8 = unsafe { ::core::mem::transmute(is_msix) }; + is_msix as u64 + }); + __bindgen_bitfield_unit.set(1usize, 3u8, { + let multiple: u8 = unsafe { ::core::mem::transmute(multiple) }; + multiple as u64 + }); + __bindgen_bitfield_unit.set(4usize, 3u8, { + let multi_cap: u8 = unsafe { ::core::mem::transmute(multi_cap) }; + multi_cap as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let can_mask: u8 = unsafe { ::core::mem::transmute(can_mask) }; + can_mask as u64 + }); + __bindgen_bitfield_unit.set(8usize, 1u8, { + let is_64: u8 = unsafe { ::core::mem::transmute(is_64) }; + is_64 as u64 + }); + __bindgen_bitfield_unit.set(9usize, 1u8, { + let is_virtual: u8 = unsafe { ::core::mem::transmute(is_virtual) }; + is_virtual as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_man_proto__bindgen_ty_2 { - pub port: __be16, +#[derive(Copy, Clone)] +pub union pci_msi_desc__bindgen_ty_3 { + pub mask_pos: u8_, + pub mask_base: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_man_proto__bindgen_ty_3 { - pub id: __be16, +#[derive(Copy, Clone)] +pub union msi_domain_cookie { + pub value: u64_, + pub ptr: *mut ::aya_ebpf::cty::c_void, + pub iobase: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_man_proto__bindgen_ty_4 { - pub port: __be16, +#[derive(Copy, Clone)] +pub struct msi_desc_data { + pub dcookie: msi_domain_cookie, + pub icookie: msi_instance_cookie, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct msi_desc { + pub irq: ::aya_ebpf::cty::c_uint, + pub nvec_used: ::aya_ebpf::cty::c_uint, + pub dev: *mut device, + pub msg: msi_msg, + pub affinity: *mut irq_affinity_desc, + pub iommu_cookie: *const ::aya_ebpf::cty::c_void, + pub sysfs_attrs: *mut device_attribute, + pub write_msi_msg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut msi_desc, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub write_msi_msg_data: *mut ::aya_ebpf::cty::c_void, + pub msi_index: u16_, + pub __bindgen_anon_1: msi_desc__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union msi_desc__bindgen_ty_1 { + pub pci: pci_msi_desc, + pub data: msi_desc_data, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_man_proto__bindgen_ty_5 { - pub port: __be16, +pub struct msi_domain_ops { + pub get_hwirq: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut msi_domain_info, + arg2: *mut msi_alloc_info_t, + ) -> irq_hw_number_t, + >, + pub msi_init: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut msi_domain_info, + arg3: ::aya_ebpf::cty::c_uint, + arg4: irq_hw_number_t, + arg5: *mut msi_alloc_info_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub msi_free: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut msi_domain_info, + arg3: ::aya_ebpf::cty::c_uint, + ), + >, + pub msi_prepare: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut device, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut msi_alloc_info_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub prepare_desc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut msi_alloc_info_t, + arg3: *mut msi_desc, + ), + >, + pub set_desc: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut msi_alloc_info_t, arg2: *mut msi_desc), + >, + pub domain_alloc_irqs: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_domain, + arg2: *mut device, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub domain_free_irqs: + ::core::option::Option, + pub msi_post_free: + ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_man_proto__bindgen_ty_6 { - pub key: __be16, +pub struct msi_domain_info { + pub flags: u32_, + pub bus_token: irq_domain_bus_token::Type, + pub hwsize: ::aya_ebpf::cty::c_uint, + pub ops: *mut msi_domain_ops, + pub chip: *mut irq_chip, + pub chip_data: *mut ::aya_ebpf::cty::c_void, + pub handler: irq_flow_handler_t, + pub handler_data: *mut ::aya_ebpf::cty::c_void, + pub handler_name: *const ::aya_ebpf::cty::c_char, + pub data: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_ct_dccp { - pub role: [u_int8_t; 2usize], - pub state: u_int8_t, - pub last_pkt: u_int8_t, - pub last_dir: u_int8_t, - pub handshake_seq: u_int64_t, +pub struct io_tlb_pool { + pub start: phys_addr_t, + pub end: phys_addr_t, + pub vaddr: *mut ::aya_ebpf::cty::c_void, + pub nslabs: ::aya_ebpf::cty::c_ulong, + pub late_alloc: bool_, + pub nareas: ::aya_ebpf::cty::c_uint, + pub area_nslabs: ::aya_ebpf::cty::c_uint, + pub areas: *mut io_tlb_area, + pub slots: *mut io_tlb_slot, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ip_ct_sctp { - pub state: sctp_conntrack::Type, - pub vtag: [__be32; 2usize], - pub last_dir: u8_, - pub flags: u8_, +pub struct io_tlb_mem { + pub defpool: io_tlb_pool, + pub nslabs: ::aya_ebpf::cty::c_ulong, + pub debugfs: *mut dentry, + pub force_bounce: bool_, + pub for_alloc: bool_, + pub total_used: atomic_long_t, + pub used_hiwater: atomic_long_t, } #[repr(C)] #[derive(Copy, Clone)] -pub union xfrm_address_t { - pub a4: __be32, - pub a6: [__be32; 4usize], - pub in6: in6_addr, +pub struct ld_semaphore { + pub count: atomic_long_t, + pub wait_lock: raw_spinlock_t, + pub wait_readers: ::aya_ebpf::cty::c_uint, + pub read_wait: list_head, + pub write_wait: list_head, } +pub type tcflag_t = ::aya_ebpf::cty::c_uint; +pub type cc_t = ::aya_ebpf::cty::c_uchar; +pub type speed_t = ::aya_ebpf::cty::c_uint; #[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_id { - pub daddr: xfrm_address_t, - pub spi: __be32, - pub proto: __u8, +#[derive(Debug, Copy, Clone)] +pub struct ktermios { + pub c_iflag: tcflag_t, + pub c_oflag: tcflag_t, + pub c_cflag: tcflag_t, + pub c_lflag: tcflag_t, + pub c_line: cc_t, + pub c_cc: [cc_t; 19usize], + pub c_ispeed: speed_t, + pub c_ospeed: speed_t, } #[repr(C)] -#[derive(Debug)] -pub struct xfrm_sec_ctx { - pub ctx_doi: __u8, - pub ctx_alg: __u8, - pub ctx_len: __u16, - pub ctx_sid: __u32, - pub ctx_str: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Debug, Copy, Clone)] +pub struct winsize { + pub ws_row: ::aya_ebpf::cty::c_ushort, + pub ws_col: ::aya_ebpf::cty::c_ushort, + pub ws_xpixel: ::aya_ebpf::cty::c_ushort, + pub ws_ypixel: ::aya_ebpf::cty::c_ushort, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_selector { - pub daddr: xfrm_address_t, - pub saddr: xfrm_address_t, - pub dport: __be16, - pub dport_mask: __be16, - pub sport: __be16, - pub sport_mask: __be16, - pub family: __u16, - pub prefixlen_d: __u8, - pub prefixlen_s: __u8, - pub proto: __u8, - pub ifindex: ::aya_bpf::cty::c_int, - pub user: __kernel_uid32_t, +pub struct tty_struct { + pub kref: kref, + pub index: ::aya_ebpf::cty::c_int, + pub dev: *mut device, + pub driver: *mut tty_driver, + pub port: *mut tty_port, + pub ops: *const tty_operations, + pub ldisc: *mut tty_ldisc, + pub ldisc_sem: ld_semaphore, + pub atomic_write_lock: mutex, + pub legacy_mutex: mutex, + pub throttle_mutex: mutex, + pub termios_rwsem: rw_semaphore, + pub winsize_mutex: mutex, + pub termios: ktermios, + pub termios_locked: ktermios, + pub name: [::aya_ebpf::cty::c_char; 64usize], + pub flags: ::aya_ebpf::cty::c_ulong, + pub count: ::aya_ebpf::cty::c_int, + pub receive_room: ::aya_ebpf::cty::c_uint, + pub winsize: winsize, + pub flow: tty_struct__bindgen_ty_1, + pub ctrl: tty_struct__bindgen_ty_2, + pub hw_stopped: bool_, + pub closing: bool_, + pub flow_change: ::aya_ebpf::cty::c_int, + pub link: *mut tty_struct, + pub fasync: *mut fasync_struct, + pub write_wait: wait_queue_head_t, + pub read_wait: wait_queue_head_t, + pub hangup_work: work_struct, + pub disc_data: *mut ::aya_ebpf::cty::c_void, + pub driver_data: *mut ::aya_ebpf::cty::c_void, + pub files_lock: spinlock_t, + pub write_cnt: ::aya_ebpf::cty::c_int, + pub write_buf: *mut u8_, + pub tty_files: list_head, + pub SAK_work: work_struct, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrm_lifetime_cfg { - pub soft_byte_limit: __u64, - pub hard_byte_limit: __u64, - pub soft_packet_limit: __u64, - pub hard_packet_limit: __u64, - pub soft_add_expires_seconds: __u64, - pub hard_add_expires_seconds: __u64, - pub soft_use_expires_seconds: __u64, - pub hard_use_expires_seconds: __u64, +pub struct tty_struct__bindgen_ty_1 { + pub lock: spinlock_t, + pub stopped: bool_, + pub tco_stopped: bool_, + pub unused: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrm_lifetime_cur { - pub bytes: __u64, - pub packets: __u64, - pub add_time: __u64, - pub use_time: __u64, +pub struct tty_struct__bindgen_ty_2 { + pub pgrp: *mut pid, + pub session: *mut pid, + pub lock: spinlock_t, + pub pktstatus: ::aya_ebpf::cty::c_uchar, + pub packet: bool_, + pub unused: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrm_replay_state { - pub oseq: __u32, - pub seq: __u32, - pub bitmap: __u32, +pub struct tty_buffer { + pub __bindgen_anon_1: tty_buffer__bindgen_ty_1, + pub used: ::aya_ebpf::cty::c_uint, + pub size: ::aya_ebpf::cty::c_uint, + pub commit: ::aya_ebpf::cty::c_uint, + pub lookahead: ::aya_ebpf::cty::c_uint, + pub read: ::aya_ebpf::cty::c_uint, + pub flags: bool_, + pub __bindgen_padding_0: [u8; 3usize], + pub data: __IncompleteArrayField, } #[repr(C)] -#[derive(Debug)] -pub struct xfrm_replay_state_esn { - pub bmp_len: ::aya_bpf::cty::c_uint, - pub oseq: __u32, - pub seq: __u32, - pub oseq_hi: __u32, - pub seq_hi: __u32, - pub replay_window: __u32, - pub bmp: __IncompleteArrayField<__u32>, +#[derive(Copy, Clone)] +pub union tty_buffer__bindgen_ty_1 { + pub next: *mut tty_buffer, + pub free: llist_node, } #[repr(C)] -#[derive(Debug)] -pub struct xfrm_algo { - pub alg_name: [::aya_bpf::cty::c_char; 64usize], - pub alg_key_len: ::aya_bpf::cty::c_uint, - pub alg_key: __IncompleteArrayField<::aya_bpf::cty::c_char>, +pub struct tty_bufhead { + pub head: *mut tty_buffer, + pub work: work_struct, + pub lock: mutex, + pub priority: atomic_t, + pub sentinel: tty_buffer, + pub free: llist_head, + pub mem_used: atomic_t, + pub mem_limit: ::aya_ebpf::cty::c_int, + pub tail: *mut tty_buffer, } #[repr(C)] -#[derive(Debug)] -pub struct xfrm_algo_auth { - pub alg_name: [::aya_bpf::cty::c_char; 64usize], - pub alg_key_len: ::aya_bpf::cty::c_uint, - pub alg_trunc_len: ::aya_bpf::cty::c_uint, - pub alg_key: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Debug, Copy, Clone)] +pub struct tty_operations { + pub lookup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_driver, + arg2: *mut file, + arg3: ::aya_ebpf::cty::c_int, + ) -> *mut tty_struct, + >, + pub install: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_driver, + arg2: *mut tty_struct, + ) -> ::aya_ebpf::cty::c_int, + >, + pub remove: + ::core::option::Option, + pub open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct, arg2: *mut file) -> ::aya_ebpf::cty::c_int, + >, + pub close: ::core::option::Option, + pub shutdown: ::core::option::Option, + pub cleanup: ::core::option::Option, + pub write: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct, arg2: *const u8_, arg3: usize) -> isize, + >, + pub put_char: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct, arg2: u8_) -> ::aya_ebpf::cty::c_int, + >, + pub flush_chars: ::core::option::Option, + pub write_room: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_ebpf::cty::c_uint, + >, + pub chars_in_buffer: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_ebpf::cty::c_uint, + >, + pub ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub compat_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_long, + >, + pub set_termios: + ::core::option::Option, + pub throttle: ::core::option::Option, + pub unthrottle: ::core::option::Option, + pub stop: ::core::option::Option, + pub start: ::core::option::Option, + pub hangup: ::core::option::Option, + pub break_ctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub flush_buffer: ::core::option::Option, + pub set_ldisc: ::core::option::Option, + pub wait_until_sent: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct, arg2: ::aya_ebpf::cty::c_int), + >, + pub send_xchar: ::core::option::Option, + pub tiocmget: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_ebpf::cty::c_int, + >, + pub tiocmset: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub resize: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct, arg2: *mut winsize) -> ::aya_ebpf::cty::c_int, + >, + pub get_icount: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *mut serial_icounter_struct, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_serial: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *mut serial_struct, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_serial: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *mut serial_struct, + ) -> ::aya_ebpf::cty::c_int, + >, + pub show_fdinfo: + ::core::option::Option, + pub proc_show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Debug)] -pub struct xfrm_algo_aead { - pub alg_name: [::aya_bpf::cty::c_char; 64usize], - pub alg_key_len: ::aya_bpf::cty::c_uint, - pub alg_icv_len: ::aya_bpf::cty::c_uint, - pub alg_key: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Debug, Copy, Clone)] +pub struct tty_driver { + pub kref: kref, + pub cdevs: *mut *mut cdev, + pub owner: *mut module, + pub driver_name: *const ::aya_ebpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, + pub name_base: ::aya_ebpf::cty::c_int, + pub major: ::aya_ebpf::cty::c_int, + pub minor_start: ::aya_ebpf::cty::c_int, + pub num: ::aya_ebpf::cty::c_uint, + pub type_: ::aya_ebpf::cty::c_short, + pub subtype: ::aya_ebpf::cty::c_short, + pub init_termios: ktermios, + pub flags: ::aya_ebpf::cty::c_ulong, + pub proc_entry: *mut proc_dir_entry, + pub other: *mut tty_driver, + pub ttys: *mut *mut tty_struct, + pub ports: *mut *mut tty_port, + pub termios: *mut *mut ktermios, + pub driver_state: *mut ::aya_ebpf::cty::c_void, + pub ops: *const tty_operations, + pub tty_drivers: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_stats { - pub replay_window: __u32, - pub replay: __u32, - pub integrity_failed: __u32, +pub struct __kfifo { + pub in_: ::aya_ebpf::cty::c_uint, + pub out: ::aya_ebpf::cty::c_uint, + pub mask: ::aya_ebpf::cty::c_uint, + pub esize: ::aya_ebpf::cty::c_uint, + pub data: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_encap_tmpl { - pub encap_type: __u16, - pub encap_sport: __be16, - pub encap_dport: __be16, - pub encap_oa: xfrm_address_t, +pub struct tty_port { + pub buf: tty_bufhead, + pub tty: *mut tty_struct, + pub itty: *mut tty_struct, + pub ops: *const tty_port_operations, + pub client_ops: *const tty_port_client_operations, + pub lock: spinlock_t, + pub blocked_open: ::aya_ebpf::cty::c_int, + pub count: ::aya_ebpf::cty::c_int, + pub open_wait: wait_queue_head_t, + pub delta_msr_wait: wait_queue_head_t, + pub flags: ::aya_ebpf::cty::c_ulong, + pub iflags: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub mutex: mutex, + pub buf_mutex: mutex, + pub xmit_buf: *mut u8_, + pub xmit_fifo: tty_port__bindgen_ty_1, + pub close_delay: ::aya_ebpf::cty::c_uint, + pub closing_wait: ::aya_ebpf::cty::c_uint, + pub drain_delay: ::aya_ebpf::cty::c_int, + pub kref: kref, + pub client_data: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrm_mark { - pub v: __u32, - pub m: __u32, +pub struct tty_port__bindgen_ty_1 { + pub __bindgen_anon_1: tty_port__bindgen_ty_1__bindgen_ty_1, + pub buf: __IncompleteArrayField, } #[repr(C)] #[derive(Copy, Clone)] -pub struct xfrm_address_filter { - pub saddr: xfrm_address_t, - pub daddr: xfrm_address_t, - pub family: __u16, - pub splen: __u8, - pub dplen: __u8, +pub union tty_port__bindgen_ty_1__bindgen_ty_1 { + pub kfifo: __kfifo, + pub type_: *mut u8_, + pub const_type: *const u8_, + pub rectype: *mut [::aya_ebpf::cty::c_char; 0usize], + pub ptr: *mut u8_, + pub ptr_const: *const u8_, } -#[repr(C)] -pub struct net_generic { - pub __bindgen_anon_1: net_generic__bindgen_ty_1, +impl tty_port { + #[inline] + pub fn console(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_console(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + console: ::aya_ebpf::cty::c_uchar, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let console: u8 = unsafe { ::core::mem::transmute(console) }; + console as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] -pub struct net_generic__bindgen_ty_1 { - pub s: __BindgenUnionField, - pub __bindgen_anon_1: __BindgenUnionField, - pub bindgen_union_field: [u64; 3usize], +#[derive(Debug, Copy, Clone)] +pub struct tty_ldisc_ops { + pub name: *mut ::aya_ebpf::cty::c_char, + pub num: ::aya_ebpf::cty::c_int, + pub open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_struct) -> ::aya_ebpf::cty::c_int, + >, + pub close: ::core::option::Option, + pub flush_buffer: ::core::option::Option, + pub read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *mut file, + arg3: *mut u8_, + arg4: usize, + arg5: *mut *mut ::aya_ebpf::cty::c_void, + arg6: ::aya_ebpf::cty::c_ulong, + ) -> isize, + >, + pub write: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *mut file, + arg3: *const u8_, + arg4: usize, + ) -> isize, + >, + pub ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub compat_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_termios: + ::core::option::Option, + pub poll: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *mut file, + arg3: *mut poll_table_struct, + ) -> __poll_t, + >, + pub hangup: ::core::option::Option, + pub receive_buf: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *const u8_, + arg3: *const u8_, + arg4: usize, + ), + >, + pub write_wakeup: ::core::option::Option, + pub dcd_change: + ::core::option::Option, + pub receive_buf2: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *const u8_, + arg3: *const u8_, + arg4: usize, + ) -> usize, + >, + pub lookahead_buf: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_struct, + arg2: *const u8_, + arg3: *const u8_, + arg4: usize, + ), + >, + pub owner: *mut module, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct net_generic__bindgen_ty_1__bindgen_ty_1 { - pub len: ::aya_bpf::cty::c_uint, - pub rcu: callback_head, +pub struct tty_ldisc { + pub ops: *mut tty_ldisc_ops, + pub tty: *mut tty_struct, } #[repr(C)] -#[derive(Debug)] -pub struct net_generic__bindgen_ty_1__bindgen_ty_2 { - pub __empty_ptr: net_generic__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, - pub ptr: __IncompleteArrayField<*mut ::aya_bpf::cty::c_void>, +#[derive(Debug, Copy, Clone)] +pub struct tty_port_operations { + pub carrier_raised: ::core::option::Option bool_>, + pub dtr_rts: ::core::option::Option, + pub shutdown: ::core::option::Option, + pub activate: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_port, arg2: *mut tty_struct) -> ::aya_ebpf::cty::c_int, + >, + pub destruct: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct net_generic__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} -pub mod macsec_validation_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const MACSEC_VALIDATE_DISABLED: Type = 0; - pub const MACSEC_VALIDATE_CHECK: Type = 1; - pub const MACSEC_VALIDATE_STRICT: Type = 2; - pub const __MACSEC_VALIDATE_END: Type = 3; - pub const MACSEC_VALIDATE_MAX: Type = 2; +pub struct tty_port_client_operations { + pub receive_buf: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tty_port, + arg2: *const u8_, + arg3: *const u8_, + arg4: usize, + ) -> usize, + >, + pub lookahead_buf: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut tty_port, arg2: *const u8_, arg3: *const u8_, arg4: usize), + >, + pub write_wakeup: ::core::option::Option, } -pub mod macsec_offload { - pub type Type = ::aya_bpf::cty::c_uint; - pub const MACSEC_OFFLOAD_OFF: Type = 0; - pub const MACSEC_OFFLOAD_PHY: Type = 1; - pub const MACSEC_OFFLOAD_MAC: Type = 2; - pub const __MACSEC_OFFLOAD_END: Type = 3; - pub const MACSEC_OFFLOAD_MAX: Type = 2; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rt_mutex_base { + pub wait_lock: raw_spinlock_t, + pub waiters: rb_root_cached, + pub owner: *mut task_struct, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rt_mutex { + pub rtmutex: rt_mutex_base, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tc_stats { - pub bytes: __u64, - pub packets: __u32, - pub drops: __u32, - pub overlimits: __u32, - pub bps: __u32, - pub pps: __u32, - pub qlen: __u32, - pub backlog: __u32, +pub struct dev_pin_info { + pub p: *mut pinctrl, + pub default_state: *mut pinctrl_state, + pub init_state: *mut pinctrl_state, + pub sleep_state: *mut pinctrl_state, + pub idle_state: *mut pinctrl_state, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tc_sizespec { - pub cell_log: ::aya_bpf::cty::c_uchar, - pub size_log: ::aya_bpf::cty::c_uchar, - pub cell_align: ::aya_bpf::cty::c_short, - pub overhead: ::aya_bpf::cty::c_int, - pub linklayer: ::aya_bpf::cty::c_uint, - pub mpu: ::aya_bpf::cty::c_uint, - pub mtu: ::aya_bpf::cty::c_uint, - pub tsize: ::aya_bpf::cty::c_uint, +pub struct firmware { + pub size: usize, + pub data: *const u8_, + pub priv_: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct qdisc_skb_head { - pub head: *mut sk_buff, - pub tail: *mut sk_buff, - pub qlen: __u32, - pub lock: spinlock_t, +#[derive(Debug, Copy, Clone)] +pub struct ethhdr { + pub h_dest: [::aya_ebpf::cty::c_uchar; 6usize], + pub h_source: [::aya_ebpf::cty::c_uchar; 6usize], + pub h_proto: __be16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct gnet_stats_basic_sync { - pub bytes: u64_stats_t, - pub packets: u64_stats_t, - pub syncp: u64_stats_sync, +pub struct ethtool_drvinfo { + pub cmd: __u32, + pub driver: [::aya_ebpf::cty::c_char; 32usize], + pub version: [::aya_ebpf::cty::c_char; 32usize], + pub fw_version: [::aya_ebpf::cty::c_char; 32usize], + pub bus_info: [::aya_ebpf::cty::c_char; 32usize], + pub erom_version: [::aya_ebpf::cty::c_char; 32usize], + pub reserved2: [::aya_ebpf::cty::c_char; 12usize], + pub n_priv_flags: __u32, + pub n_stats: __u32, + pub testinfo_len: __u32, + pub eedump_len: __u32, + pub regdump_len: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct gnet_stats_queue { - pub qlen: __u32, - pub backlog: __u32, - pub drops: __u32, - pub requeues: __u32, - pub overlimits: __u32, +pub struct ethtool_wolinfo { + pub cmd: __u32, + pub supported: __u32, + pub wolopts: __u32, + pub sopass: [__u8; 6usize], } #[repr(C)] -pub struct Qdisc { - pub enqueue: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut Qdisc, - arg3: *mut *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, - >, - pub dequeue: ::core::option::Option *mut sk_buff>, - pub flags: ::aya_bpf::cty::c_uint, - pub limit: u32_, - pub ops: *const Qdisc_ops, - pub stab: *mut qdisc_size_table, - pub hash: hlist_node, - pub handle: u32_, - pub parent: u32_, - pub dev_queue: *mut netdev_queue, - pub rate_est: *mut net_rate_estimator, - pub cpu_bstats: *mut gnet_stats_basic_sync, - pub cpu_qstats: *mut gnet_stats_queue, - pub pad: ::aya_bpf::cty::c_int, - pub refcnt: refcount_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub gso_skb: sk_buff_head, - pub q: qdisc_skb_head, - pub bstats: gnet_stats_basic_sync, - pub qstats: gnet_stats_queue, - pub state: ::aya_bpf::cty::c_ulong, - pub state2: ::aya_bpf::cty::c_ulong, - pub next_sched: *mut Qdisc, - pub skb_bad_txq: sk_buff_head, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, - pub busylock: spinlock_t, - pub seqlock: spinlock_t, - pub rcu: callback_head, - pub dev_tracker: netdevice_tracker, - pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 40usize]>, - pub privdata: __IncompleteArrayField<::aya_bpf::cty::c_long>, +#[derive(Debug)] +pub struct ethtool_tunable { + pub cmd: __u32, + pub id: __u32, + pub type_id: __u32, + pub len: __u32, + pub data: __IncompleteArrayField<*mut ::aya_ebpf::cty::c_void>, } -impl Qdisc { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug)] +pub struct ethtool_regs { + pub cmd: __u32, + pub version: __u32, + pub len: __u32, + pub data: __IncompleteArrayField<__u8>, +} +#[repr(C)] +#[derive(Debug)] +pub struct ethtool_eeprom { + pub cmd: __u32, + pub magic: __u32, + pub offset: __u32, + pub len: __u32, + pub data: __IncompleteArrayField<__u8>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_state_walk { - pub all: list_head, - pub state: u8_, - pub dying: u8_, - pub proto: u8_, - pub seq: u32_, - pub filter: *mut xfrm_address_filter, +pub struct ethtool_eee { + pub cmd: __u32, + pub supported: __u32, + pub advertised: __u32, + pub lp_advertised: __u32, + pub eee_active: __u32, + pub eee_enabled: __u32, + pub tx_lpi_enabled: __u32, + pub tx_lpi_timer: __u32, + pub reserved: [__u32; 2usize], } -pub mod xfrm_replay_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const XFRM_REPLAY_MODE_LEGACY: Type = 0; - pub const XFRM_REPLAY_MODE_BMP: Type = 1; - pub const XFRM_REPLAY_MODE_ESN: Type = 2; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ethtool_modinfo { + pub cmd: __u32, + pub type_: __u32, + pub eeprom_len: __u32, + pub reserved: [__u32; 8usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_dev_offload { - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub real_dev: *mut net_device, - pub offload_handle: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 7usize], -} -impl xfrm_dev_offload { - #[inline] - pub fn dir(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u8) } - } - #[inline] - pub fn set_dir(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 2u8, val as u64) - } - } - #[inline] - pub fn type_(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 2u8) as u8) } - } - #[inline] - pub fn set_type(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 2u8, val as u64) - } - } - #[inline] - pub fn flags(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 2u8) as u8) } - } - #[inline] - pub fn set_flags(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 2u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(dir: u8_, type_: u8_, flags: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 2u8, { - let dir: u8 = unsafe { ::core::mem::transmute(dir) }; - dir as u64 - }); - __bindgen_bitfield_unit.set(2usize, 2u8, { - let type_: u8 = unsafe { ::core::mem::transmute(type_) }; - type_ as u64 - }); - __bindgen_bitfield_unit.set(4usize, 2u8, { - let flags: u8 = unsafe { ::core::mem::transmute(flags) }; - flags as u64 - }); - __bindgen_bitfield_unit - } +pub struct ethtool_coalesce { + pub cmd: __u32, + pub rx_coalesce_usecs: __u32, + pub rx_max_coalesced_frames: __u32, + pub rx_coalesce_usecs_irq: __u32, + pub rx_max_coalesced_frames_irq: __u32, + pub tx_coalesce_usecs: __u32, + pub tx_max_coalesced_frames: __u32, + pub tx_coalesce_usecs_irq: __u32, + pub tx_max_coalesced_frames_irq: __u32, + pub stats_block_coalesce_usecs: __u32, + pub use_adaptive_rx_coalesce: __u32, + pub use_adaptive_tx_coalesce: __u32, + pub pkt_rate_low: __u32, + pub rx_coalesce_usecs_low: __u32, + pub rx_max_coalesced_frames_low: __u32, + pub tx_coalesce_usecs_low: __u32, + pub tx_max_coalesced_frames_low: __u32, + pub pkt_rate_high: __u32, + pub rx_coalesce_usecs_high: __u32, + pub rx_max_coalesced_frames_high: __u32, + pub tx_coalesce_usecs_high: __u32, + pub tx_max_coalesced_frames_high: __u32, + pub rate_sample_interval: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_mode { - pub encap: u8_, - pub family: u8_, - pub flags: u8_, +pub struct ethtool_ringparam { + pub cmd: __u32, + pub rx_max_pending: __u32, + pub rx_mini_max_pending: __u32, + pub rx_jumbo_max_pending: __u32, + pub tx_max_pending: __u32, + pub rx_pending: __u32, + pub rx_mini_pending: __u32, + pub rx_jumbo_pending: __u32, + pub tx_pending: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_state { - pub xs_net: possible_net_t, - pub __bindgen_anon_1: xfrm_state__bindgen_ty_1, - pub bysrc: hlist_node, - pub byspi: hlist_node, - pub byseq: hlist_node, - pub refcnt: refcount_t, - pub lock: spinlock_t, - pub id: xfrm_id, - pub sel: xfrm_selector, - pub mark: xfrm_mark, - pub if_id: u32_, - pub tfcpad: u32_, - pub genid: u32_, - pub km: xfrm_state_walk, - pub props: xfrm_state__bindgen_ty_2, - pub lft: xfrm_lifetime_cfg, - pub aalg: *mut xfrm_algo_auth, - pub ealg: *mut xfrm_algo, - pub calg: *mut xfrm_algo, - pub aead: *mut xfrm_algo_aead, - pub geniv: *const ::aya_bpf::cty::c_char, - pub new_mapping_sport: __be16, - pub new_mapping: u32_, - pub mapping_maxage: u32_, - pub encap: *mut xfrm_encap_tmpl, - pub encap_sk: *mut sock, - pub coaddr: *mut xfrm_address_t, - pub tunnel: *mut xfrm_state, - pub tunnel_users: atomic_t, - pub replay: xfrm_replay_state, - pub replay_esn: *mut xfrm_replay_state_esn, - pub preplay: xfrm_replay_state, - pub preplay_esn: *mut xfrm_replay_state_esn, - pub repl_mode: xfrm_replay_mode::Type, - pub xflags: u32_, - pub replay_maxage: u32_, - pub replay_maxdiff: u32_, - pub rtimer: timer_list, - pub stats: xfrm_stats, - pub curlft: xfrm_lifetime_cur, - pub mtimer: hrtimer, - pub xso: xfrm_dev_offload, - pub saved_tmo: ::aya_bpf::cty::c_long, - pub lastused: time64_t, - pub xfrag: page_frag, - pub type_: *const xfrm_type, - pub inner_mode: xfrm_mode, - pub inner_mode_iaf: xfrm_mode, - pub outer_mode: xfrm_mode, - pub type_offload: *const xfrm_type_offload, - pub security: *mut xfrm_sec_ctx, - pub data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_channels { + pub cmd: __u32, + pub max_rx: __u32, + pub max_tx: __u32, + pub max_other: __u32, + pub max_combined: __u32, + pub rx_count: __u32, + pub tx_count: __u32, + pub other_count: __u32, + pub combined_count: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub union xfrm_state__bindgen_ty_1 { - pub gclist: hlist_node, - pub bydst: hlist_node, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_pauseparam { + pub cmd: __u32, + pub autoneg: __u32, + pub rx_pause: __u32, + pub tx_pause: __u32, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_state__bindgen_ty_2 { - pub reqid: u32_, - pub mode: u8_, - pub replay_window: u8_, - pub aalgo: u8_, - pub ealgo: u8_, - pub calgo: u8_, - pub flags: u8_, - pub family: u16_, - pub saddr: xfrm_address_t, - pub header_len: ::aya_bpf::cty::c_int, - pub trailer_len: ::aya_bpf::cty::c_int, - pub extra_flags: u32_, - pub smark: xfrm_mark, +pub mod ethtool_link_ext_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_STATE_AUTONEG: Type = 0; + pub const ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE: Type = 1; + pub const ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH: Type = 2; + pub const ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY: Type = 3; + pub const ETHTOOL_LINK_EXT_STATE_NO_CABLE: Type = 4; + pub const ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE: Type = 5; + pub const ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE: Type = 6; + pub const ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE: Type = 7; + pub const ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED: Type = 8; + pub const ETHTOOL_LINK_EXT_STATE_OVERHEAT: Type = 9; + pub const ETHTOOL_LINK_EXT_STATE_MODULE: Type = 10; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrm_policy_walk_entry { - pub all: list_head, - pub dead: u8_, +pub mod ethtool_link_ext_substate_autoneg { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED: Type = 1; + pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED: Type = 2; + pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED: Type = 3; + pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE: Type = 4; + pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE: Type = 5; + pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD: Type = 6; } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_policy_queue { - pub hold_queue: sk_buff_head, - pub hold_timer: timer_list, - pub timeout: ::aya_bpf::cty::c_ulong, +pub mod ethtool_link_ext_substate_link_training { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED: Type = 1; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT: Type = 2; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY: Type = 3; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT: Type = 4; } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_tmpl { - pub id: xfrm_id, - pub saddr: xfrm_address_t, - pub encap_family: ::aya_bpf::cty::c_ushort, - pub reqid: u32_, - pub mode: u8_, - pub share: u8_, - pub optional: u8_, - pub allalgs: u8_, - pub aalgos: u32_, - pub ealgos: u32_, - pub calgos: u32_, +pub mod ethtool_link_ext_substate_link_logical_mismatch { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK: Type = 1; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK: Type = 2; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS: Type = 3; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED: Type = 4; + pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED: Type = 5; } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct xfrm_policy { - pub xp_net: possible_net_t, - pub bydst: hlist_node, - pub byidx: hlist_node, - pub lock: rwlock_t, - pub refcnt: refcount_t, - pub pos: u32_, - pub timer: timer_list, - pub genid: atomic_t, - pub priority: u32_, - pub index: u32_, - pub if_id: u32_, - pub mark: xfrm_mark, - pub selector: xfrm_selector, - pub lft: xfrm_lifetime_cfg, - pub curlft: xfrm_lifetime_cur, - pub walk: xfrm_policy_walk_entry, - pub polq: xfrm_policy_queue, - pub bydst_reinsert: bool_, - pub type_: u8_, - pub action: u8_, - pub flags: u8_, - pub xfrm_nr: u8_, - pub family: u16_, - pub security: *mut xfrm_sec_ctx, - pub xfrm_vec: [xfrm_tmpl; 6usize], - pub bydst_inexact_list: hlist_node, - pub rcu: callback_head, - pub xdo: xfrm_dev_offload, +pub mod ethtool_link_ext_substate_bad_signal_integrity { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS: Type = 1; + pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE: Type = 2; + pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST: Type = 3; + pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS: Type = 4; } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct iphdr { - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub tos: __u8, - pub tot_len: __be16, - pub id: __be16, - pub frag_off: __be16, - pub ttl: __u8, - pub protocol: __u8, - pub check: __sum16, - pub __bindgen_anon_1: iphdr__bindgen_ty_1, +pub mod ethtool_link_ext_substate_cable_issue { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE: Type = 1; + pub const ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE: Type = 2; } -#[repr(C)] -#[derive(Copy, Clone)] -pub union iphdr__bindgen_ty_1 { - pub __bindgen_anon_1: iphdr__bindgen_ty_1__bindgen_ty_1, - pub addrs: iphdr__bindgen_ty_1__bindgen_ty_2, +pub mod ethtool_link_ext_substate_module { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY: Type = 1; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iphdr__bindgen_ty_1__bindgen_ty_1 { - pub saddr: __be32, - pub daddr: __be32, +pub mod ethtool_mac_stats_src { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_MAC_STATS_SRC_AGGREGATE: Type = 0; + pub const ETHTOOL_MAC_STATS_SRC_EMAC: Type = 1; + pub const ETHTOOL_MAC_STATS_SRC_PMAC: Type = 2; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iphdr__bindgen_ty_1__bindgen_ty_2 { - pub saddr: __be32, - pub daddr: __be32, +pub mod ethtool_module_power_mode_policy { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH: Type = 1; + pub const ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO: Type = 2; } -impl iphdr { - #[inline] - pub fn ihl(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } - } - #[inline] - pub fn set_ihl(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 4u8, val as u64) - } - } - #[inline] - pub fn version(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } - } - #[inline] - pub fn set_version(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 4u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(ihl: __u8, version: __u8) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 4u8, { - let ihl: u8 = unsafe { ::core::mem::transmute(ihl) }; - ihl as u64 - }); - __bindgen_bitfield_unit.set(4usize, 4u8, { - let version: u8 = unsafe { ::core::mem::transmute(version) }; - version as u64 - }); - __bindgen_bitfield_unit - } +pub mod ethtool_module_power_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_MODULE_POWER_MODE_LOW: Type = 1; + pub const ETHTOOL_MODULE_POWER_MODE_HIGH: Type = 2; +} +pub mod ethtool_mm_verify_status { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_MM_VERIFY_STATUS_UNKNOWN: Type = 0; + pub const ETHTOOL_MM_VERIFY_STATUS_INITIAL: Type = 1; + pub const ETHTOOL_MM_VERIFY_STATUS_VERIFYING: Type = 2; + pub const ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED: Type = 3; + pub const ETHTOOL_MM_VERIFY_STATUS_FAILED: Type = 4; + pub const ETHTOOL_MM_VERIFY_STATUS_DISABLED: Type = 5; } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ip_tunnel_parm { - pub name: [::aya_bpf::cty::c_char; 16usize], - pub link: ::aya_bpf::cty::c_int, - pub i_flags: __be16, - pub o_flags: __be16, - pub i_key: __be32, - pub o_key: __be32, - pub iph: iphdr, +#[derive(Debug)] +pub struct ethtool_test { + pub cmd: __u32, + pub flags: __u32, + pub reserved: __u32, + pub len: __u32, + pub data: __IncompleteArrayField<__u64>, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct in_device { - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub refcnt: refcount_t, - pub dead: ::aya_bpf::cty::c_int, - pub ifa_list: *mut in_ifaddr, - pub mc_list: *mut ip_mc_list, - pub mc_hash: *mut *mut ip_mc_list, - pub mc_count: ::aya_bpf::cty::c_int, - pub mc_tomb_lock: spinlock_t, - pub mc_tomb: *mut ip_mc_list, - pub mr_v1_seen: ::aya_bpf::cty::c_ulong, - pub mr_v2_seen: ::aya_bpf::cty::c_ulong, - pub mr_maxdelay: ::aya_bpf::cty::c_ulong, - pub mr_qi: ::aya_bpf::cty::c_ulong, - pub mr_qri: ::aya_bpf::cty::c_ulong, - pub mr_qrv: ::aya_bpf::cty::c_uchar, - pub mr_gq_running: ::aya_bpf::cty::c_uchar, - pub mr_ifc_count: u32_, - pub mr_gq_timer: timer_list, - pub mr_ifc_timer: timer_list, - pub arp_parms: *mut neigh_parms, - pub cnf: ipv4_devconf, - pub callback_head: callback_head, +#[derive(Debug)] +pub struct ethtool_stats { + pub cmd: __u32, + pub n_stats: __u32, + pub data: __IncompleteArrayField<__u64>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mini_Qdisc { - pub filter_list: *mut tcf_proto, - pub block: *mut tcf_block, - pub cpu_bstats: *mut gnet_stats_basic_sync, - pub cpu_qstats: *mut gnet_stats_queue, - pub rcu_state: ::aya_bpf::cty::c_ulong, +pub struct ethtool_tcpip4_spec { + pub ip4src: __be32, + pub ip4dst: __be32, + pub psrc: __be16, + pub pdst: __be16, + pub tos: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcmsg { - pub tcm_family: ::aya_bpf::cty::c_uchar, - pub tcm__pad1: ::aya_bpf::cty::c_uchar, - pub tcm__pad2: ::aya_bpf::cty::c_ushort, - pub tcm_ifindex: ::aya_bpf::cty::c_int, - pub tcm_handle: __u32, - pub tcm_parent: __u32, - pub tcm_info: __u32, +pub struct ethtool_ah_espip4_spec { + pub ip4src: __be32, + pub ip4dst: __be32, + pub spi: __be32, + pub tos: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct gnet_dump { - pub lock: *mut spinlock_t, - pub skb: *mut sk_buff, - pub tail: *mut nlattr, - pub compat_tc_stats: ::aya_bpf::cty::c_int, - pub compat_xstats: ::aya_bpf::cty::c_int, - pub padattr: ::aya_bpf::cty::c_int, - pub xstats: *mut ::aya_bpf::cty::c_void, - pub xstats_len: ::aya_bpf::cty::c_int, - pub tc_stats: tc_stats, +pub struct ethtool_usrip4_spec { + pub ip4src: __be32, + pub ip4dst: __be32, + pub l4_4_bytes: __be32, + pub tos: __u8, + pub ip_ver: __u8, + pub proto: __u8, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ip_tunnel_key { - pub tun_id: __be64, - pub u: ip_tunnel_key__bindgen_ty_1, - pub tun_flags: __be16, - pub tos: u8_, - pub ttl: u8_, - pub label: __be32, - pub tp_src: __be16, - pub tp_dst: __be16, - pub flow_flags: __u8, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_tcpip6_spec { + pub ip6src: [__be32; 4usize], + pub ip6dst: [__be32; 4usize], + pub psrc: __be16, + pub pdst: __be16, + pub tclass: __u8, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ip_tunnel_key__bindgen_ty_1 { - pub ipv4: ip_tunnel_key__bindgen_ty_1__bindgen_ty_1, - pub ipv6: ip_tunnel_key__bindgen_ty_1__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_ah_espip6_spec { + pub ip6src: [__be32; 4usize], + pub ip6dst: [__be32; 4usize], + pub spi: __be32, + pub tclass: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ip_tunnel_key__bindgen_ty_1__bindgen_ty_1 { - pub src: __be32, - pub dst: __be32, +pub struct ethtool_usrip6_spec { + pub ip6src: [__be32; 4usize], + pub ip6dst: [__be32; 4usize], + pub l4_4_bytes: __be32, + pub tclass: __u8, + pub l4_proto: __u8, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ip_tunnel_key__bindgen_ty_1__bindgen_ty_2 { - pub src: in6_addr, - pub dst: in6_addr, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_tunnel_encap { - pub type_: u16_, - pub flags: u16_, - pub sport: __be16, - pub dport: __be16, +pub union ethtool_flow_union { + pub tcp_ip4_spec: ethtool_tcpip4_spec, + pub udp_ip4_spec: ethtool_tcpip4_spec, + pub sctp_ip4_spec: ethtool_tcpip4_spec, + pub ah_ip4_spec: ethtool_ah_espip4_spec, + pub esp_ip4_spec: ethtool_ah_espip4_spec, + pub usr_ip4_spec: ethtool_usrip4_spec, + pub tcp_ip6_spec: ethtool_tcpip6_spec, + pub udp_ip6_spec: ethtool_tcpip6_spec, + pub sctp_ip6_spec: ethtool_tcpip6_spec, + pub ah_ip6_spec: ethtool_ah_espip6_spec, + pub esp_ip6_spec: ethtool_ah_espip6_spec, + pub usr_ip6_spec: ethtool_usrip6_spec, + pub ether_spec: ethhdr, + pub hdata: [__u8; 52usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dst_cache { - pub cache: *mut dst_cache_pcpu, - pub reset_ts: ::aya_bpf::cty::c_ulong, +pub struct ethtool_flow_ext { + pub padding: [__u8; 2usize], + pub h_dest: [::aya_ebpf::cty::c_uchar; 6usize], + pub vlan_etype: __be16, + pub vlan_tci: __be16, + pub data: [__be32; 2usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct ip_tunnel_info { - pub key: ip_tunnel_key, - pub encap: ip_tunnel_encap, - pub dst_cache: dst_cache, - pub options_len: u8_, - pub mode: u8_, +pub struct ethtool_rx_flow_spec { + pub flow_type: __u32, + pub h_u: ethtool_flow_union, + pub h_ext: ethtool_flow_ext, + pub m_u: ethtool_flow_union, + pub m_ext: ethtool_flow_ext, + pub ring_cookie: __u64, + pub location: __u32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_block { - pub cb_list: list_head, -} -pub type flow_setup_cb_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: tc_setup_type::Type, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; +pub struct ethtool_rxnfc { + pub cmd: __u32, + pub flow_type: __u32, + pub data: __u64, + pub fs: ethtool_rx_flow_spec, + pub __bindgen_anon_1: ethtool_rxnfc__bindgen_ty_1, + pub rule_locs: __IncompleteArrayField<__u32>, +} #[repr(C)] -#[derive(Debug)] -pub struct qdisc_size_table { - pub rcu: callback_head, - pub list: list_head, - pub szopts: tc_sizespec, - pub refcnt: ::aya_bpf::cty::c_int, - pub data: __IncompleteArrayField, +#[derive(Copy, Clone)] +pub union ethtool_rxnfc__bindgen_ty_1 { + pub rule_cnt: __u32, + pub rss_context: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Qdisc_ops { - pub next: *mut Qdisc_ops, - pub cl_ops: *const Qdisc_class_ops, - pub id: [::aya_bpf::cty::c_char; 16usize], - pub priv_size: ::aya_bpf::cty::c_int, - pub static_flags: ::aya_bpf::cty::c_uint, - pub enqueue: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut Qdisc, - arg3: *mut *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, - >, - pub dequeue: ::core::option::Option *mut sk_buff>, - pub peek: ::core::option::Option *mut sk_buff>, - pub init: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: *mut nlattr, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub reset: ::core::option::Option, - pub destroy: ::core::option::Option, - pub change: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: *mut nlattr, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub attach: ::core::option::Option, - pub change_tx_queue_len: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub change_real_num_tx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_bpf::cty::c_uint), - >, - pub dump: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub dump_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: *mut gnet_dump) -> ::aya_bpf::cty::c_int, - >, - pub ingress_block_set: - ::core::option::Option, - pub egress_block_set: - ::core::option::Option, - pub ingress_block_get: ::core::option::Option u32_>, - pub egress_block_get: ::core::option::Option u32_>, - pub owner: *mut module, +pub struct ethtool_flash { + pub cmd: __u32, + pub region: __u32, + pub data: [::aya_ebpf::cty::c_char; 128usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Qdisc_class_ops { - pub flags: ::aya_bpf::cty::c_uint, - pub select_queue: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: *mut tcmsg) -> *mut netdev_queue, - >, - pub graft: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut Qdisc, - arg4: *mut *mut Qdisc, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub leaf: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_bpf::cty::c_ulong) -> *mut Qdisc, - >, - pub qlen_notify: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_bpf::cty::c_ulong), - >, - pub find: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: u32_) -> ::aya_bpf::cty::c_ulong, - >, - pub change: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: u32_, - arg3: u32_, - arg4: *mut *mut nlattr, - arg5: *mut ::aya_bpf::cty::c_ulong, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub delete: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub walk: - ::core::option::Option, - pub tcf_block: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut netlink_ext_ack, - ) -> *mut tcf_block, - >, - pub bind_tcf: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: u32_, - ) -> ::aya_bpf::cty::c_ulong, - >, - pub unbind_tcf: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut Qdisc, arg2: ::aya_bpf::cty::c_ulong), - >, - pub dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut sk_buff, - arg4: *mut tcmsg, - ) -> ::aya_bpf::cty::c_int, - >, - pub dump_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut gnet_dump, - ) -> ::aya_bpf::cty::c_int, - >, +#[derive(Debug)] +pub struct ethtool_dump { + pub cmd: __u32, + pub version: __u32, + pub flag: __u32, + pub len: __u32, + pub data: __IncompleteArrayField<__u8>, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct tcf_block { - pub lock: mutex, - pub chain_list: list_head, - pub index: u32_, - pub classid: u32_, - pub refcnt: refcount_t, - pub net: *mut net, - pub q: *mut Qdisc, - pub cb_lock: rw_semaphore, - pub flow_block: flow_block, - pub owner_list: list_head, - pub keep_dst: bool_, - pub offloadcnt: atomic_t, - pub nooffloaddevcnt: ::aya_bpf::cty::c_uint, - pub lockeddevcnt: ::aya_bpf::cty::c_uint, - pub chain0: tcf_block__bindgen_ty_1, - pub rcu: callback_head, - pub proto_destroy_ht: [hlist_head; 128usize], - pub proto_destroy_lock: mutex, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_ts_info { + pub cmd: __u32, + pub so_timestamping: __u32, + pub phc_index: __s32, + pub tx_types: __u32, + pub tx_reserved: [__u32; 3usize], + pub rx_filters: __u32, + pub rx_reserved: [__u32; 3usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcf_block__bindgen_ty_1 { - pub chain: *mut tcf_chain, - pub filter_chain_list: list_head, +pub struct ethtool_fecparam { + pub cmd: __u32, + pub active_fec: __u32, + pub fec: __u32, + pub reserved: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct tcf_proto { - pub next: *mut tcf_proto, - pub root: *mut ::aya_bpf::cty::c_void, - pub classify: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *const tcf_proto, - arg3: *mut tcf_result, - ) -> ::aya_bpf::cty::c_int, - >, - pub protocol: __be16, - pub prio: u32_, - pub data: *mut ::aya_bpf::cty::c_void, - pub ops: *const tcf_proto_ops, - pub chain: *mut tcf_chain, - pub lock: spinlock_t, - pub deleting: bool_, - pub refcnt: refcount_t, - pub rcu: callback_head, - pub destroy_ht_node: hlist_node, +#[derive(Debug)] +pub struct ethtool_link_settings { + pub cmd: __u32, + pub speed: __u32, + pub duplex: __u8, + pub port: __u8, + pub phy_address: __u8, + pub autoneg: __u8, + pub mdio_support: __u8, + pub eth_tp_mdix: __u8, + pub eth_tp_mdix_ctrl: __u8, + pub link_mode_masks_nwords: __s8, + pub transceiver: __u8, + pub master_slave_cfg: __u8, + pub master_slave_state: __u8, + pub rate_matching: __u8, + pub reserved: [__u32; 7usize], + pub link_mode_masks: __IncompleteArrayField<__u32>, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct tcf_result { - pub __bindgen_anon_1: tcf_result__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct kernel_ethtool_ringparam { + pub rx_buf_len: u32_, + pub tcp_data_split: u8_, + pub tx_push: u8_, + pub rx_push: u8_, + pub cqe_size: u32_, + pub tx_push_buf_len: u32_, + pub tx_push_buf_max_len: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub union tcf_result__bindgen_ty_1 { - pub __bindgen_anon_1: tcf_result__bindgen_ty_1__bindgen_ty_1, - pub goto_tp: *const tcf_proto, +pub struct ethtool_link_ext_state_info { + pub link_ext_state: ethtool_link_ext_state::Type, + pub __bindgen_anon_1: ethtool_link_ext_state_info__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcf_result__bindgen_ty_1__bindgen_ty_1 { - pub class: ::aya_bpf::cty::c_ulong, - pub classid: u32_, +#[derive(Copy, Clone)] +pub union ethtool_link_ext_state_info__bindgen_ty_1 { + pub autoneg: ethtool_link_ext_substate_autoneg::Type, + pub link_training: ethtool_link_ext_substate_link_training::Type, + pub link_logical_mismatch: ethtool_link_ext_substate_link_logical_mismatch::Type, + pub bad_signal_integrity: ethtool_link_ext_substate_bad_signal_integrity::Type, + pub cable_issue: ethtool_link_ext_substate_cable_issue::Type, + pub module: ethtool_link_ext_substate_module::Type, + pub __link_ext_substate: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcf_proto_ops { - pub head: list_head, - pub kind: [::aya_bpf::cty::c_char; 16usize], - pub classify: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *const tcf_proto, - arg3: *mut tcf_result, - ) -> ::aya_bpf::cty::c_int, - >, - pub init: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub destroy: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: bool_, arg3: *mut netlink_ext_ack), - >, - pub get: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: u32_) -> *mut ::aya_bpf::cty::c_void, - >, - pub put: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub change: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut sk_buff, - arg3: *mut tcf_proto, - arg4: ::aya_bpf::cty::c_ulong, - arg5: u32_, - arg6: *mut *mut nlattr, - arg7: *mut *mut ::aya_bpf::cty::c_void, - arg8: u32_, - arg9: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub delete: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tcf_proto, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut bool_, - arg4: bool_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub delete_empty: ::core::option::Option bool_>, - pub walk: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut tcf_walker, arg3: bool_), - >, - pub reoffload: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tcf_proto, - arg2: bool_, - arg3: flow_setup_cb_t, - arg4: *mut ::aya_bpf::cty::c_void, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub hw_add: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub hw_del: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut tcf_proto, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub bind_class: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: u32_, - arg3: ::aya_bpf::cty::c_ulong, - arg4: *mut ::aya_bpf::cty::c_void, - arg5: ::aya_bpf::cty::c_ulong, - ), - >, - pub tmplt_create: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut tcf_chain, - arg3: *mut *mut nlattr, - arg4: *mut netlink_ext_ack, - ) -> *mut ::aya_bpf::cty::c_void, - >, - pub tmplt_destroy: - ::core::option::Option, - pub get_exts: ::core::option::Option< - unsafe extern "C" fn(arg1: *const tcf_proto, arg2: u32_) -> *mut tcf_exts, - >, - pub dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut tcf_proto, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: *mut sk_buff, - arg5: *mut tcmsg, - arg6: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub terse_dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut tcf_proto, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: *mut sk_buff, - arg5: *mut tcmsg, - arg6: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub tmplt_dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut net, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub owner: *mut module, - pub flags: ::aya_bpf::cty::c_int, +pub struct ethtool_link_ext_stats { + pub link_down_events: u64_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct tcf_chain { - pub filter_chain_lock: mutex, - pub filter_chain: *mut tcf_proto, - pub list: list_head, - pub block: *mut tcf_block, - pub index: u32_, - pub refcnt: ::aya_bpf::cty::c_uint, - pub action_refcnt: ::aya_bpf::cty::c_uint, - pub explicitly_created: bool_, - pub flushing: bool_, - pub tmplt_ops: *const tcf_proto_ops, - pub tmplt_priv: *mut ::aya_bpf::cty::c_void, - pub rcu: callback_head, +#[derive(Debug)] +pub struct ethtool_link_ksettings { + pub base: ethtool_link_settings, + pub link_modes: ethtool_link_ksettings__bindgen_ty_1, + pub lanes: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_filter { - pub refcnt: refcount_t, - pub rcu: callback_head, - pub prog: *mut bpf_prog, +pub struct ethtool_link_ksettings__bindgen_ty_1 { + pub supported: [::aya_ebpf::cty::c_ulong; 2usize], + pub advertising: [::aya_ebpf::cty::c_ulong; 2usize], + pub lp_advertising: [::aya_ebpf::cty::c_ulong; 2usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_active_lock { - pub ptr: *mut ::aya_bpf::cty::c_void, - pub id: u32_, +pub struct kernel_ethtool_coalesce { + pub use_cqe_mode_tx: u8_, + pub use_cqe_mode_rx: u8_, + pub tx_aggr_max_bytes: u32_, + pub tx_aggr_max_frames: u32_, + pub tx_aggr_time_usecs: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_stack_state { - pub spilled_ptr: bpf_reg_state, - pub slot_type: [u8_; 8usize], +pub struct ethtool_eth_mac_stats { + pub src: ethtool_mac_stats_src::Type, + pub __bindgen_anon_1: ethtool_eth_mac_stats__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_reference_state { - pub id: ::aya_bpf::cty::c_int, - pub insn_idx: ::aya_bpf::cty::c_int, - pub callback_ref: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub union ethtool_eth_mac_stats__bindgen_ty_1 { + pub __bindgen_anon_1: ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_1, + pub stats: ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_idx_pair { - pub prev_idx: u32_, - pub idx: u32_, +pub struct ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_1 { + pub FramesTransmittedOK: u64_, + pub SingleCollisionFrames: u64_, + pub MultipleCollisionFrames: u64_, + pub FramesReceivedOK: u64_, + pub FrameCheckSequenceErrors: u64_, + pub AlignmentErrors: u64_, + pub OctetsTransmittedOK: u64_, + pub FramesWithDeferredXmissions: u64_, + pub LateCollisions: u64_, + pub FramesAbortedDueToXSColls: u64_, + pub FramesLostDueToIntMACXmitError: u64_, + pub CarrierSenseErrors: u64_, + pub OctetsReceivedOK: u64_, + pub FramesLostDueToIntMACRcvError: u64_, + pub MulticastFramesXmittedOK: u64_, + pub BroadcastFramesXmittedOK: u64_, + pub FramesWithExcessiveDeferral: u64_, + pub MulticastFramesReceivedOK: u64_, + pub BroadcastFramesReceivedOK: u64_, + pub InRangeLengthErrors: u64_, + pub OutOfRangeLengthField: u64_, + pub FrameTooLongErrors: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_verifier_state { - pub frame: [*mut bpf_func_state; 8usize], - pub parent: *mut bpf_verifier_state, - pub branches: u32_, - pub insn_idx: u32_, - pub curframe: u32_, - pub active_lock: bpf_active_lock, - pub speculative: bool_, - pub active_rcu_lock: bool_, - pub first_insn_idx: u32_, - pub last_insn_idx: u32_, - pub jmp_history: *mut bpf_idx_pair, - pub jmp_history_cnt: u32_, +pub struct ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_2 { + pub FramesTransmittedOK: u64_, + pub SingleCollisionFrames: u64_, + pub MultipleCollisionFrames: u64_, + pub FramesReceivedOK: u64_, + pub FrameCheckSequenceErrors: u64_, + pub AlignmentErrors: u64_, + pub OctetsTransmittedOK: u64_, + pub FramesWithDeferredXmissions: u64_, + pub LateCollisions: u64_, + pub FramesAbortedDueToXSColls: u64_, + pub FramesLostDueToIntMACXmitError: u64_, + pub CarrierSenseErrors: u64_, + pub OctetsReceivedOK: u64_, + pub FramesLostDueToIntMACRcvError: u64_, + pub MulticastFramesXmittedOK: u64_, + pub BroadcastFramesXmittedOK: u64_, + pub FramesWithExcessiveDeferral: u64_, + pub MulticastFramesReceivedOK: u64_, + pub BroadcastFramesReceivedOK: u64_, + pub InRangeLengthErrors: u64_, + pub OutOfRangeLengthField: u64_, + pub FrameTooLongErrors: u64_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_verifier_state_list { - pub state: bpf_verifier_state, - pub next: *mut bpf_verifier_state_list, - pub miss_cnt: ::aya_bpf::cty::c_int, - pub hit_cnt: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub struct ethtool_eth_phy_stats { + pub src: ethtool_mac_stats_src::Type, + pub __bindgen_anon_1: ethtool_eth_phy_stats__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ethtool_eth_phy_stats__bindgen_ty_1 { + pub __bindgen_anon_1: ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_1, + pub stats: ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_loop_inline_state { - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub callback_subprogno: u32_, +pub struct ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_1 { + pub SymbolErrorDuringCarrier: u64_, } -impl bpf_loop_inline_state { - #[inline] - pub fn initialized(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_initialized(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn fit_for_inline(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_fit_for_inline(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - initialized: ::aya_bpf::cty::c_uint, - fit_for_inline: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let initialized: u32 = unsafe { ::core::mem::transmute(initialized) }; - initialized as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let fit_for_inline: u32 = unsafe { ::core::mem::transmute(fit_for_inline) }; - fit_for_inline as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_2 { + pub SymbolErrorDuringCarrier: u64_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_insn_aux_data { - pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1, - pub __bindgen_anon_2: bpf_insn_aux_data__bindgen_ty_2, - pub kptr_struct_meta: *mut btf_struct_meta, - pub map_key_state: u64_, - pub ctx_field_size: ::aya_bpf::cty::c_int, - pub seen: u32_, - pub sanitize_stack_spill: bool_, - pub zext_dst: bool_, - pub storage_get_func_atomic: bool_, - pub is_iter_next: bool_, - pub alu_state: u8_, - pub orig_idx: ::aya_bpf::cty::c_uint, - pub jmp_point: bool_, - pub prune_point: bool_, - pub force_checkpoint: bool_, +pub struct ethtool_eth_ctrl_stats { + pub src: ethtool_mac_stats_src::Type, + pub __bindgen_anon_1: ethtool_eth_ctrl_stats__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_insn_aux_data__bindgen_ty_1 { - pub ptr_type: bpf_reg_type::Type, - pub map_ptr_state: ::aya_bpf::cty::c_ulong, - pub call_imm: s32, - pub alu_limit: u32_, - pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_1, - pub btf_var: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2, - pub loop_inline_state: bpf_loop_inline_state, +pub union ethtool_eth_ctrl_stats__bindgen_ty_1 { + pub __bindgen_anon_1: ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_1, + pub stats: ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_1 { - pub map_index: u32_, - pub map_off: u32_, +pub struct ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_1 { + pub MACControlFramesTransmitted: u64_, + pub MACControlFramesReceived: u64_, + pub UnsupportedOpcodesReceived: u64_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_2 { + pub MACControlFramesTransmitted: u64_, + pub MACControlFramesReceived: u64_, + pub UnsupportedOpcodesReceived: u64_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2 { - pub reg_type: bpf_reg_type::Type, - pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, +pub struct ethtool_pause_stats { + pub src: ethtool_mac_stats_src::Type, + pub __bindgen_anon_1: ethtool_pause_stats__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, - pub mem_size: u32_, +pub union ethtool_pause_stats__bindgen_ty_1 { + pub __bindgen_anon_1: ethtool_pause_stats__bindgen_ty_1__bindgen_ty_1, + pub stats: ethtool_pause_stats__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 { - pub btf: *mut btf, - pub btf_id: u32_, +pub struct ethtool_pause_stats__bindgen_ty_1__bindgen_ty_1 { + pub tx_pause_frames: u64_, + pub rx_pause_frames: u64_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union bpf_insn_aux_data__bindgen_ty_2 { - pub obj_new_size: u64_, - pub insert_off: u64_, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_pause_stats__bindgen_ty_1__bindgen_ty_2 { + pub tx_pause_frames: u64_, + pub rx_pause_frames: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dst_metrics { - pub metrics: [u32_; 17usize], - pub refcnt: refcount_t, +pub struct ethtool_fec_stat { + pub total: u64_, + pub lanes: [u64_; 8usize], } #[repr(C)] -#[derive(Debug)] -pub struct sock_reuseport { - pub rcu: callback_head, - pub max_socks: u16_, - pub num_socks: u16_, - pub num_closed_socks: u16_, - pub incoming_cpu: u16_, - pub synq_overflow_ts: ::aya_bpf::cty::c_uint, - pub reuseport_id: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub prog: *mut bpf_prog, - pub socks: __IncompleteArrayField<*mut sock>, -} -impl sock_reuseport { - #[inline] - pub fn bind_inany(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_bind_inany(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn has_conns(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_has_conns(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - bind_inany: ::aya_bpf::cty::c_uint, - has_conns: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let bind_inany: u32 = unsafe { ::core::mem::transmute(bind_inany) }; - bind_inany as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let has_conns: u32 = unsafe { ::core::mem::transmute(has_conns) }; - has_conns as u64 - }); - __bindgen_bitfield_unit - } +#[derive(Debug, Copy, Clone)] +pub struct ethtool_fec_stats { + pub corrected_blocks: ethtool_fec_stat, + pub uncorrectable_blocks: ethtool_fec_stat, + pub corrected_bits: ethtool_fec_stat, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_psock_progs { - pub msg_parser: *mut bpf_prog, - pub stream_parser: *mut bpf_prog, - pub stream_verdict: *mut bpf_prog, - pub skb_verdict: *mut bpf_prog, +pub struct ethtool_rmon_hist_range { + pub low: u16_, + pub high: u16_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct strp_stats { - pub msgs: ::aya_bpf::cty::c_ulonglong, - pub bytes: ::aya_bpf::cty::c_ulonglong, - pub mem_fail: ::aya_bpf::cty::c_uint, - pub need_more_hdr: ::aya_bpf::cty::c_uint, - pub msg_too_big: ::aya_bpf::cty::c_uint, - pub msg_timeouts: ::aya_bpf::cty::c_uint, - pub bad_hdr_len: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub struct ethtool_rmon_stats { + pub src: ethtool_mac_stats_src::Type, + pub __bindgen_anon_1: ethtool_rmon_stats__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ethtool_rmon_stats__bindgen_ty_1 { + pub __bindgen_anon_1: ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_1, + pub stats: ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct strp_callbacks { - pub parse_msg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut strparser, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub rcv_msg: - ::core::option::Option, - pub read_sock_done: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut strparser, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub abort_parser: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut strparser, arg2: ::aya_bpf::cty::c_int), - >, - pub lock: ::core::option::Option, - pub unlock: ::core::option::Option, +pub struct ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_1 { + pub undersize_pkts: u64_, + pub oversize_pkts: u64_, + pub fragments: u64_, + pub jabbers: u64_, + pub hist: [u64_; 10usize], + pub hist_tx: [u64_; 10usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct strparser { - pub sk: *mut sock, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub skb_nextp: *mut *mut sk_buff, - pub skb_head: *mut sk_buff, - pub need_bytes: ::aya_bpf::cty::c_uint, - pub msg_timer_work: delayed_work, - pub work: work_struct, - pub stats: strp_stats, - pub cb: strp_callbacks, +pub struct ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_2 { + pub undersize_pkts: u64_, + pub oversize_pkts: u64_, + pub fragments: u64_, + pub jabbers: u64_, + pub hist: [u64_; 10usize], + pub hist_tx: [u64_; 10usize], } -impl strparser { - #[inline] - pub fn stopped(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_stopped(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn paused(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_paused(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn aborted(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } - } - #[inline] - pub fn set_aborted(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn interrupted(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } - } - #[inline] - pub fn set_interrupted(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn unrecov_intr(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } - } - #[inline] - pub fn set_unrecov_intr(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - stopped: u32_, - paused: u32_, - aborted: u32_, - interrupted: u32_, - unrecov_intr: u32_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let stopped: u32 = unsafe { ::core::mem::transmute(stopped) }; - stopped as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let paused: u32 = unsafe { ::core::mem::transmute(paused) }; - paused as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let aborted: u32 = unsafe { ::core::mem::transmute(aborted) }; - aborted as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let interrupted: u32 = unsafe { ::core::mem::transmute(interrupted) }; - interrupted as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let unrecov_intr: u32 = unsafe { ::core::mem::transmute(unrecov_intr) }; - unrecov_intr as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ethtool_module_eeprom { + pub offset: u32_, + pub length: u32_, + pub page: u8_, + pub bank: u8_, + pub i2c_address: u8_, + pub data: *mut u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_psock_work_state { - pub len: u32_, - pub off: u32_, +pub struct ethtool_module_power_mode_params { + pub policy: ethtool_module_power_mode_policy::Type, + pub mode: ethtool_module_power_mode::Type, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct sk_psock { - pub sk: *mut sock, - pub sk_redir: *mut sock, - pub apply_bytes: u32_, - pub cork_bytes: u32_, - pub eval: u32_, - pub redir_ingress: bool_, - pub cork: *mut sk_msg, - pub progs: sk_psock_progs, - pub strp: strparser, - pub ingress_skb: sk_buff_head, - pub ingress_msg: list_head, - pub ingress_lock: spinlock_t, - pub state: ::aya_bpf::cty::c_ulong, - pub link: list_head, - pub link_lock: spinlock_t, - pub refcnt: refcount_t, - pub saved_unhash: ::core::option::Option, - pub saved_destroy: ::core::option::Option, - pub saved_close: - ::core::option::Option, - pub saved_write_space: ::core::option::Option, - pub saved_data_ready: ::core::option::Option, - pub psock_update_sk_prot: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sock, - arg2: *mut sk_psock, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub sk_proto: *mut proto, - pub work_mutex: mutex, - pub work_state: sk_psock_work_state, - pub work: delayed_work, - pub rwork: rcu_work, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_mm_state { + pub verify_time: u32_, + pub max_verify_time: u32_, + pub verify_status: ethtool_mm_verify_status::Type, + pub tx_enabled: bool_, + pub tx_active: bool_, + pub pmac_enabled: bool_, + pub verify_enabled: bool_, + pub tx_min_frag_size: u32_, + pub rx_min_frag_size: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fib_nh_exception { - pub fnhe_next: *mut fib_nh_exception, - pub fnhe_genid: ::aya_bpf::cty::c_int, - pub fnhe_daddr: __be32, - pub fnhe_pmtu: u32_, - pub fnhe_mtu_locked: bool_, - pub fnhe_gw: __be32, - pub fnhe_expires: ::aya_bpf::cty::c_ulong, - pub fnhe_rth_input: *mut rtable, - pub fnhe_rth_output: *mut rtable, - pub fnhe_stamp: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, +pub struct ethtool_mm_cfg { + pub verify_time: u32_, + pub verify_enabled: bool_, + pub tx_enabled: bool_, + pub pmac_enabled: bool_, + pub tx_min_frag_size: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct rtable { - pub dst: dst_entry, - pub rt_genid: ::aya_bpf::cty::c_int, - pub rt_flags: ::aya_bpf::cty::c_uint, - pub rt_type: __u16, - pub rt_is_input: __u8, - pub rt_uses_gateway: __u8, - pub rt_iif: ::aya_bpf::cty::c_int, - pub rt_gw_family: u8_, - pub __bindgen_anon_1: rtable__bindgen_ty_1, - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_mm_stats { + pub MACMergeFrameAssErrorCount: u64_, + pub MACMergeFrameSmdErrorCount: u64_, + pub MACMergeFrameAssOkCount: u64_, + pub MACMergeFragCountRx: u64_, + pub MACMergeFragCountTx: u64_, + pub MACMergeHoldCount: u64_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union rtable__bindgen_ty_1 { - pub rt_gw4: __be32, - pub rt_gw6: in6_addr, +#[derive(Debug, Copy, Clone)] +pub struct ethtool_rxfh_param { + pub hfunc: u8_, + pub indir_size: u32_, + pub indir: *mut u32_, + pub key_size: u32_, + pub key: *mut u8_, + pub rss_context: u32_, + pub rss_delete: u8_, + pub input_xfrm: u8_, } -impl rtable { - #[inline] - pub fn rt_mtu_locked(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_rt_mtu_locked(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn rt_pmtu(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 31u8) as u32) } - } - #[inline] - pub fn set_rt_pmtu(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 31u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - rt_mtu_locked: u32_, - rt_pmtu: u32_, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let rt_mtu_locked: u32 = unsafe { ::core::mem::transmute(rt_mtu_locked) }; - rt_mtu_locked as u64 - }); - __bindgen_bitfield_unit.set(1usize, 31u8, { - let rt_pmtu: u32 = unsafe { ::core::mem::transmute(rt_pmtu) }; - rt_pmtu as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct reciprocal_value { + pub m: u32_, + pub sh1: u8_, + pub sh2: u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fnhe_hash_bucket { - pub chain: *mut fib_nh_exception, +pub struct kmem_cache_order_objects { + pub x: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct fib_nh { - pub nh_common: fib_nh_common, - pub nh_hash: hlist_node, - pub nh_parent: *mut fib_info, - pub nh_tclassid: __u32, - pub nh_saddr: __be32, - pub nh_saddr_genid: ::aya_bpf::cty::c_int, +#[derive(Debug, Copy, Clone)] +pub struct kmem_cache { + pub cpu_slab: *mut kmem_cache_cpu, + pub flags: slab_flags_t, + pub min_partial: ::aya_ebpf::cty::c_ulong, + pub size: ::aya_ebpf::cty::c_uint, + pub object_size: ::aya_ebpf::cty::c_uint, + pub reciprocal_size: reciprocal_value, + pub offset: ::aya_ebpf::cty::c_uint, + pub cpu_partial: ::aya_ebpf::cty::c_uint, + pub cpu_partial_slabs: ::aya_ebpf::cty::c_uint, + pub oo: kmem_cache_order_objects, + pub min: kmem_cache_order_objects, + pub allocflags: gfp_t, + pub refcount: ::aya_ebpf::cty::c_int, + pub ctor: ::core::option::Option, + pub inuse: ::aya_ebpf::cty::c_uint, + pub align: ::aya_ebpf::cty::c_uint, + pub red_left_pad: ::aya_ebpf::cty::c_uint, + pub name: *const ::aya_ebpf::cty::c_char, + pub list: list_head, + pub kobj: kobject, + pub random: ::aya_ebpf::cty::c_ulong, + pub remote_node_defrag_ratio: ::aya_ebpf::cty::c_uint, + pub random_seq: *mut ::aya_ebpf::cty::c_uint, + pub useroffset: ::aya_ebpf::cty::c_uint, + pub usersize: ::aya_ebpf::cty::c_uint, + pub node: [*mut kmem_cache_node; 32usize], } #[repr(C)] -pub struct fib_info { - pub fib_hash: hlist_node, - pub fib_lhash: hlist_node, - pub nh_list: list_head, - pub fib_net: *mut net, - pub fib_treeref: refcount_t, - pub fib_clntref: refcount_t, - pub fib_flags: ::aya_bpf::cty::c_uint, - pub fib_dead: ::aya_bpf::cty::c_uchar, - pub fib_protocol: ::aya_bpf::cty::c_uchar, - pub fib_scope: ::aya_bpf::cty::c_uchar, - pub fib_type: ::aya_bpf::cty::c_uchar, - pub fib_prefsrc: __be32, - pub fib_tb_id: u32_, - pub fib_priority: u32_, - pub fib_metrics: *mut dst_metrics, - pub fib_nhs: ::aya_bpf::cty::c_int, - pub fib_nh_is_v6: bool_, - pub nh_updated: bool_, - pub nh: *mut nexthop, - pub rcu: callback_head, - pub fib_nh: __IncompleteArrayField, +#[derive(Copy, Clone)] +pub struct fs_struct { + pub users: ::aya_ebpf::cty::c_int, + pub lock: spinlock_t, + pub seq: seqcount_spinlock_t, + pub umask: ::aya_ebpf::cty::c_int, + pub in_exec: ::aya_ebpf::cty::c_int, + pub root: path, + pub pwd: path, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nexthop { - pub rb_node: rb_node, - pub fi_list: list_head, - pub f6i_list: list_head, - pub fdb_list: list_head, - pub grp_list: list_head, - pub net: *mut net, - pub id: u32_, - pub protocol: u8_, - pub nh_flags: u8_, - pub is_group: bool_, - pub refcnt: refcount_t, - pub rcu: callback_head, - pub __bindgen_anon_1: nexthop__bindgen_ty_1, +pub struct posix_acl_entry { + pub e_tag: ::aya_ebpf::cty::c_short, + pub e_perm: ::aya_ebpf::cty::c_ushort, + pub __bindgen_anon_1: posix_acl_entry__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union nexthop__bindgen_ty_1 { - pub nh_info: *mut nh_info, - pub nh_grp: *mut nh_group, +pub union posix_acl_entry__bindgen_ty_1 { + pub e_uid: kuid_t, + pub e_gid: kgid_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct inet_ehash_bucket { - pub chain: hlist_nulls_head, +pub struct posix_acl { + pub a_refcount: refcount_t, + pub a_rcu: callback_head, + pub a_count: ::aya_ebpf::cty::c_uint, + pub a_entries: __IncompleteArrayField, } #[repr(C)] #[derive(Copy, Clone)] -pub struct inet_bind_hashbucket { - pub lock: spinlock_t, - pub chain: hlist_head, +pub struct file_lock_context { + pub flc_lock: spinlock_t, + pub flc_flock: list_head, + pub flc_posix: list_head, + pub flc_lease: list_head, } +pub type fsnotify_connp_t = *mut fsnotify_mark_connector; #[repr(C)] #[derive(Copy, Clone)] -pub struct inet_listen_hashbucket { +pub struct fsnotify_mark_connector { pub lock: spinlock_t, - pub nulls_head: hlist_nulls_head, + pub type_: ::aya_ebpf::cty::c_ushort, + pub flags: ::aya_ebpf::cty::c_ushort, + pub __bindgen_anon_1: fsnotify_mark_connector__bindgen_ty_1, + pub list: hlist_head, } #[repr(C)] -#[derive(Debug)] -pub struct bpf_storage_buffer { - pub rcu: callback_head, - pub data: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Copy, Clone)] +pub union fsnotify_mark_connector__bindgen_ty_1 { + pub obj: *mut fsnotify_connp_t, + pub destroy_next: *mut fsnotify_mark_connector, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ack_sample { - pub pkts_acked: u32_, - pub rtt_us: s32, - pub in_flight: u32_, +pub struct nlm_lockowner { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rate_sample { - pub prior_mstamp: u64_, - pub prior_delivered: u32_, - pub prior_delivered_ce: u32_, - pub delivered: s32, - pub delivered_ce: s32, - pub interval_us: ::aya_bpf::cty::c_long, - pub snd_interval_us: u32_, - pub rcv_interval_us: u32_, - pub rtt_us: ::aya_bpf::cty::c_long, - pub losses: ::aya_bpf::cty::c_int, - pub acked_sacked: u32_, - pub prior_in_flight: u32_, - pub last_end_seq: u32_, - pub is_app_limited: bool_, - pub is_retrans: bool_, - pub is_ack_delayed: bool_, +pub struct nfs_lock_info { + pub state: u32_, + pub owner: *mut nlm_lockowner, + pub list: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sk_msg_sg { - pub start: u32_, - pub curr: u32_, - pub end: u32_, - pub size: u32_, - pub copybreak: u32_, - pub copy: [::aya_bpf::cty::c_ulong; 1usize], - pub data: [scatterlist; 19usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sk_msg { - pub sg: sk_msg_sg, - pub data: *mut ::aya_bpf::cty::c_void, - pub data_end: *mut ::aya_bpf::cty::c_void, - pub apply_bytes: u32_, - pub cork_bytes: u32_, - pub flags: u32_, - pub skb: *mut sk_buff, - pub sk_redir: *mut sock, - pub sk: *mut sock, - pub list: list_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rt6_exception_bucket { - pub chain: hlist_head, - pub depth: ::aya_bpf::cty::c_int, +pub struct nfs4_lock_info { + pub owner: *mut nfs4_lock_state, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nh_info { - pub dev_hash: hlist_node, - pub nh_parent: *mut nexthop, - pub family: u8_, - pub reject_nh: bool_, - pub fdb_nh: bool_, - pub __bindgen_anon_1: nh_info__bindgen_ty_1, +pub struct file_lock { + pub fl_blocker: *mut file_lock, + pub fl_list: list_head, + pub fl_link: hlist_node, + pub fl_blocked_requests: list_head, + pub fl_blocked_member: list_head, + pub fl_owner: fl_owner_t, + pub fl_flags: ::aya_ebpf::cty::c_uint, + pub fl_type: ::aya_ebpf::cty::c_uchar, + pub fl_pid: ::aya_ebpf::cty::c_uint, + pub fl_link_cpu: ::aya_ebpf::cty::c_int, + pub fl_wait: wait_queue_head_t, + pub fl_file: *mut file, + pub fl_start: loff_t, + pub fl_end: loff_t, + pub fl_fasync: *mut fasync_struct, + pub fl_break_time: ::aya_ebpf::cty::c_ulong, + pub fl_downgrade_time: ::aya_ebpf::cty::c_ulong, + pub fl_ops: *const file_lock_operations, + pub fl_lmops: *const lock_manager_operations, + pub fl_u: file_lock__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union nh_info__bindgen_ty_1 { - pub fib_nhc: fib_nh_common, - pub fib_nh: fib_nh, - pub fib6_nh: fib6_nh, +pub union file_lock__bindgen_ty_1 { + pub nfs_fl: nfs_lock_info, + pub nfs4_fl: nfs4_lock_info, + pub afs: file_lock__bindgen_ty_1__bindgen_ty_1, + pub ceph: file_lock__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nh_res_bucket { - pub nh_entry: *mut nh_grp_entry, - pub used_time: atomic_long_t, - pub migrated_time: ::aya_bpf::cty::c_ulong, - pub occupied: bool_, - pub nh_flags: u8_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nh_grp_entry { - pub nh: *mut nexthop, - pub weight: u8_, - pub __bindgen_anon_1: nh_grp_entry__bindgen_ty_1, - pub nh_list: list_head, - pub nh_parent: *mut nexthop, +pub struct file_lock__bindgen_ty_1__bindgen_ty_1 { + pub link: list_head, + pub state: ::aya_ebpf::cty::c_int, + pub debug_id: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub union nh_grp_entry__bindgen_ty_1 { - pub hthr: nh_grp_entry__bindgen_ty_1__bindgen_ty_1, - pub res: nh_grp_entry__bindgen_ty_1__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct file_lock__bindgen_ty_1__bindgen_ty_2 { + pub inode: *mut inode, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nh_grp_entry__bindgen_ty_1__bindgen_ty_1 { - pub upper_bound: atomic_t, +pub struct file_lock_operations { + pub fl_copy_lock: + ::core::option::Option, + pub fl_release_private: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nh_grp_entry__bindgen_ty_1__bindgen_ty_2 { - pub uw_nh_entry: list_head, - pub count_buckets: u16_, - pub wants_buckets: u16_, +pub struct lock_manager_operations { + pub lm_mod_owner: *mut ::aya_ebpf::cty::c_void, + pub lm_get_owner: ::core::option::Option fl_owner_t>, + pub lm_put_owner: ::core::option::Option, + pub lm_notify: ::core::option::Option, + pub lm_grant: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file_lock, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lm_break: ::core::option::Option bool_>, + pub lm_change: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file_lock, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut list_head, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lm_setup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file_lock, arg2: *mut *mut ::aya_ebpf::cty::c_void), + >, + pub lm_breaker_owns_lease: + ::core::option::Option bool_>, + pub lm_lock_expirable: + ::core::option::Option bool_>, + pub lm_expire_lock: ::core::option::Option, } +pub type nlink_t = u32_; #[repr(C)] -#[derive(Debug)] -pub struct nh_res_table { - pub net: *mut net, - pub nhg_id: u32_, - pub upkeep_dw: delayed_work, - pub uw_nh_entries: list_head, - pub unbalanced_since: ::aya_bpf::cty::c_ulong, - pub idle_timer: u32_, - pub unbalanced_timer: u32_, - pub num_nh_buckets: u16_, - pub nh_buckets: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct proc_ops { + pub proc_flags: ::aya_ebpf::cty::c_uint, + pub proc_open: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_ebpf::cty::c_int, + >, + pub proc_read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: usize, + arg4: *mut loff_t, + ) -> isize, + >, + pub proc_read_iter: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> isize, + >, + pub proc_write: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *const ::aya_ebpf::cty::c_char, + arg3: usize, + arg4: *mut loff_t, + ) -> isize, + >, + pub proc_lseek: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: loff_t, arg3: ::aya_ebpf::cty::c_int) -> loff_t, + >, + pub proc_release: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_ebpf::cty::c_int, + >, + pub proc_poll: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: *mut poll_table_struct) -> __poll_t, + >, + pub proc_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_long, + >, + pub proc_compat_ioctl: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_long, + >, + pub proc_mmap: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut file, arg2: *mut vm_area_struct) -> ::aya_ebpf::cty::c_int, + >, + pub proc_get_unmapped_area: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_ulong, + arg5: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_ulong, + >, } +pub type proc_write_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] -pub struct nh_group { - pub spare: *mut nh_group, - pub num_nh: u16_, - pub is_multipath: bool_, - pub hash_threshold: bool_, - pub resilient: bool_, - pub fdb_nh: bool_, - pub has_v4: bool_, - pub res_table: *mut nh_res_table, - pub nh_entries: __IncompleteArrayField, +pub struct proc_dir_entry { + pub in_use: atomic_t, + pub refcnt: refcount_t, + pub pde_openers: list_head, + pub pde_unload_lock: spinlock_t, + pub pde_unload_completion: *mut completion, + pub proc_iops: *const inode_operations, + pub __bindgen_anon_1: proc_dir_entry__bindgen_ty_1, + pub proc_dops: *const dentry_operations, + pub __bindgen_anon_2: proc_dir_entry__bindgen_ty_2, + pub write: proc_write_t, + pub data: *mut ::aya_ebpf::cty::c_void, + pub state_size: ::aya_ebpf::cty::c_uint, + pub low_ino: ::aya_ebpf::cty::c_uint, + pub nlink: nlink_t, + pub uid: kuid_t, + pub gid: kgid_t, + pub size: loff_t, + pub parent: *mut proc_dir_entry, + pub subdir: rb_root, + pub subdir_node: rb_node, + pub name: *mut ::aya_ebpf::cty::c_char, + pub mode: umode_t, + pub flags: u8_, + pub namelen: u8_, + pub inline_name: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } -pub type sci_t = u64_; -pub type ssci_t = u32_; #[repr(C)] #[derive(Copy, Clone)] -pub union salt { - pub __bindgen_anon_1: salt__bindgen_ty_1, - pub bytes: [u8_; 12usize], -} -#[repr(C, packed)] -#[derive(Debug, Copy, Clone)] -pub struct salt__bindgen_ty_1 { - pub ssci: u32_, - pub pn: u64_, +pub union proc_dir_entry__bindgen_ty_1 { + pub proc_ops: *const proc_ops, + pub proc_dir_ops: *const file_operations, } -pub type salt_t = salt; #[repr(C)] #[derive(Copy, Clone)] -pub union pn { - pub __bindgen_anon_1: pn__bindgen_ty_1, - pub full64: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pn__bindgen_ty_1 { - pub lower: u32_, - pub upper: u32_, +pub union proc_dir_entry__bindgen_ty_2 { + pub seq_ops: *const seq_operations, + pub single_show: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut seq_file, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, } -pub type pn_t = pn; #[repr(C)] #[derive(Copy, Clone)] -pub struct macsec_key { - pub id: [u8_; 16usize], - pub tfm: *mut crypto_aead, - pub salt: salt_t, -} -#[repr(C)] -#[derive(Debug)] -pub struct crypto_aead { - pub authsize: ::aya_bpf::cty::c_uint, - pub reqsize: ::aya_bpf::cty::c_uint, - pub base: crypto_tfm, +pub struct klist { + pub k_lock: spinlock_t, + pub k_list: list_head, + pub get: ::core::option::Option, + pub put: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct macsec_rx_sc_stats { - pub InOctetsValidated: __u64, - pub InOctetsDecrypted: __u64, - pub InPktsUnchecked: __u64, - pub InPktsDelayed: __u64, - pub InPktsOK: __u64, - pub InPktsInvalid: __u64, - pub InPktsLate: __u64, - pub InPktsNotValid: __u64, - pub InPktsNotUsingSA: __u64, - pub InPktsUnusedSA: __u64, +pub struct klist_node { + pub n_klist: *mut ::aya_ebpf::cty::c_void, + pub n_node: list_head, + pub n_ref: kref, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_rx_sa_stats { - pub InPktsOK: __u32, - pub InPktsInvalid: __u32, - pub InPktsNotValid: __u32, - pub InPktsNotUsingSA: __u32, - pub InPktsUnusedSA: __u32, +#[derive(Copy, Clone)] +pub struct driver_private { + pub kobj: kobject, + pub klist_devices: klist, + pub knode_bus: klist_node, + pub mkobj: *mut module_kobject, + pub driver: *mut device_driver, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_tx_sa_stats { - pub OutPktsProtected: __u32, - pub OutPktsEncrypted: __u32, +#[derive(Copy, Clone)] +pub struct device_private { + pub klist_children: klist, + pub knode_parent: klist_node, + pub knode_driver: klist_node, + pub knode_bus: klist_node, + pub knode_class: klist_node, + pub deferred_probe: list_head, + pub async_driver: *mut device_driver, + pub deferred_probe_reason: *mut ::aya_ebpf::cty::c_char, + pub device: *mut device, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 7usize], } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_tx_sc_stats { - pub OutPktsProtected: __u64, - pub OutPktsEncrypted: __u64, - pub OutOctetsProtected: __u64, - pub OutOctetsEncrypted: __u64, +impl device_private { + #[inline] + pub fn dead(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_dead(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(dead: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let dead: u8 = unsafe { ::core::mem::transmute(dead) }; + dead as u64 + }); + __bindgen_bitfield_unit + } } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_dev_stats { - pub OutPktsUntagged: __u64, - pub InPktsUntagged: __u64, - pub OutPktsTooLong: __u64, - pub InPktsNoTag: __u64, - pub InPktsBadTag: __u64, - pub InPktsUnknownSCI: __u64, - pub InPktsNoSCI: __u64, - pub InPktsOverrun: __u64, +pub mod led_brightness { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const LED_OFF: Type = 0; + pub const LED_ON: Type = 1; + pub const LED_HALF: Type = 127; + pub const LED_FULL: Type = 255; } #[repr(C)] #[derive(Copy, Clone)] -pub struct macsec_rx_sa { - pub key: macsec_key, - pub ssci: ssci_t, - pub lock: spinlock_t, - pub __bindgen_anon_1: macsec_rx_sa__bindgen_ty_1, - pub refcnt: refcount_t, - pub active: bool_, - pub stats: *mut macsec_rx_sa_stats, - pub sc: *mut macsec_rx_sc, - pub rcu: callback_head, +pub struct iphdr { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub tos: __u8, + pub tot_len: __be16, + pub id: __be16, + pub frag_off: __be16, + pub ttl: __u8, + pub protocol: __u8, + pub check: __sum16, + pub __bindgen_anon_1: iphdr__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union macsec_rx_sa__bindgen_ty_1 { - pub next_pn_halves: pn_t, - pub next_pn: u64_, +pub union iphdr__bindgen_ty_1 { + pub __bindgen_anon_1: iphdr__bindgen_ty_1__bindgen_ty_1, + pub addrs: iphdr__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct macsec_rx_sc { - pub next: *mut macsec_rx_sc, - pub sci: sci_t, - pub active: bool_, - pub sa: [*mut macsec_rx_sa; 4usize], - pub stats: *mut pcpu_rx_sc_stats, - pub refcnt: refcount_t, - pub callback_head: callback_head, +pub struct iphdr__bindgen_ty_1__bindgen_ty_1 { + pub saddr: __be32, + pub daddr: __be32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pcpu_rx_sc_stats { - pub stats: macsec_rx_sc_stats, - pub syncp: u64_stats_sync, +pub struct iphdr__bindgen_ty_1__bindgen_ty_2 { + pub saddr: __be32, + pub daddr: __be32, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pcpu_tx_sc_stats { - pub stats: macsec_tx_sc_stats, - pub syncp: u64_stats_sync, +impl iphdr { + #[inline] + pub fn ihl(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } + } + #[inline] + pub fn set_ihl(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 4u8, val as u64) + } + } + #[inline] + pub fn version(&self) -> __u8 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } + } + #[inline] + pub fn set_version(&mut self, val: __u8) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 4u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(ihl: __u8, version: __u8) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 4u8, { + let ihl: u8 = unsafe { ::core::mem::transmute(ihl) }; + ihl as u64 + }); + __bindgen_bitfield_unit.set(4usize, 4u8, { + let version: u8 = unsafe { ::core::mem::transmute(version) }; + version as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Copy, Clone)] -pub struct macsec_tx_sa { - pub key: macsec_key, - pub ssci: ssci_t, - pub lock: spinlock_t, - pub __bindgen_anon_1: macsec_tx_sa__bindgen_ty_1, - pub refcnt: refcount_t, - pub active: bool_, - pub stats: *mut macsec_tx_sa_stats, - pub rcu: callback_head, +pub struct rtable { + pub dst: dst_entry, + pub rt_genid: ::aya_ebpf::cty::c_int, + pub rt_flags: ::aya_ebpf::cty::c_uint, + pub rt_type: __u16, + pub rt_is_input: __u8, + pub rt_uses_gateway: __u8, + pub rt_iif: ::aya_ebpf::cty::c_int, + pub rt_gw_family: u8_, + pub __bindgen_anon_1: rtable__bindgen_ty_1, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, } #[repr(C)] #[derive(Copy, Clone)] -pub union macsec_tx_sa__bindgen_ty_1 { - pub next_pn_halves: pn_t, - pub next_pn: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_tx_sc { - pub active: bool_, - pub encoding_sa: u8_, - pub encrypt: bool_, - pub send_sci: bool_, - pub end_station: bool_, - pub scb: bool_, - pub sa: [*mut macsec_tx_sa; 4usize], - pub stats: *mut pcpu_tx_sc_stats, - pub md_dst: *mut metadata_dst, -} -pub mod metadata_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const METADATA_IP_TUNNEL: Type = 0; - pub const METADATA_HW_PORT_MUX: Type = 1; - pub const METADATA_MACSEC: Type = 2; - pub const METADATA_XFRM: Type = 3; +pub union rtable__bindgen_ty_1 { + pub rt_gw4: __be32, + pub rt_gw6: in6_addr, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct hw_port_info { - pub lower_dev: *mut net_device, - pub port_id: u32_, +impl rtable { + #[inline] + pub fn rt_mtu_locked(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_rt_mtu_locked(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn rt_pmtu(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 31u8) as u32) } + } + #[inline] + pub fn set_rt_pmtu(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 31u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + rt_mtu_locked: u32_, + rt_pmtu: u32_, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let rt_mtu_locked: u32 = unsafe { ::core::mem::transmute(rt_mtu_locked) }; + rt_mtu_locked as u64 + }); + __bindgen_bitfield_unit.set(1usize, 31u8, { + let rt_pmtu: u32 = unsafe { ::core::mem::transmute(rt_pmtu) }; + rt_pmtu as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct macsec_info { - pub sci: sci_t, +pub struct in_addr { + pub s_addr: __be32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_md_info { - pub if_id: u32_, - pub link: ::aya_bpf::cty::c_int, - pub dst_orig: *mut dst_entry, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct metadata_dst { - pub dst: dst_entry, - pub type_: metadata_type::Type, - pub u: metadata_dst__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union metadata_dst__bindgen_ty_1 { - pub tun_info: ip_tunnel_info, - pub port_info: hw_port_info, - pub macsec_info: macsec_info, - pub xfrm_info: xfrm_md_info, +pub struct udp_table { + pub hash: *mut udp_hslot, + pub hash2: *mut udp_hslot, + pub mask: ::aya_ebpf::cty::c_uint, + pub log: ::aya_ebpf::cty::c_uint, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct macsec_secy { - pub netdev: *mut net_device, - pub n_rx_sc: ::aya_bpf::cty::c_uint, - pub sci: sci_t, - pub key_len: u16_, - pub icv_len: u16_, - pub validate_frames: macsec_validation_type::Type, - pub xpn: bool_, - pub operational: bool_, - pub protect_frames: bool_, - pub replay_protect: bool_, - pub replay_window: u32_, - pub tx_sc: macsec_tx_sc, - pub rx_sc: *mut macsec_rx_sc, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct macsec_context { - pub __bindgen_anon_1: macsec_context__bindgen_ty_1, - pub offload: macsec_offload::Type, - pub secy: *mut macsec_secy, - pub rx_sc: *mut macsec_rx_sc, - pub sa: macsec_context__bindgen_ty_2, - pub stats: macsec_context__bindgen_ty_3, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union macsec_context__bindgen_ty_1 { - pub netdev: *mut net_device, - pub phydev: *mut phy_device, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct macsec_context__bindgen_ty_2 { - pub assoc_num: ::aya_bpf::cty::c_uchar, - pub key: [u8_; 128usize], - pub __bindgen_anon_1: macsec_context__bindgen_ty_2__bindgen_ty_1, +pub mod bpf_arg_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ARG_DONTCARE: Type = 0; + pub const ARG_CONST_MAP_PTR: Type = 1; + pub const ARG_PTR_TO_MAP_KEY: Type = 2; + pub const ARG_PTR_TO_MAP_VALUE: Type = 3; + pub const ARG_PTR_TO_MEM: Type = 4; + pub const ARG_CONST_SIZE: Type = 5; + pub const ARG_CONST_SIZE_OR_ZERO: Type = 6; + pub const ARG_PTR_TO_CTX: Type = 7; + pub const ARG_ANYTHING: Type = 8; + pub const ARG_PTR_TO_SPIN_LOCK: Type = 9; + pub const ARG_PTR_TO_SOCK_COMMON: Type = 10; + pub const ARG_PTR_TO_INT: Type = 11; + pub const ARG_PTR_TO_LONG: Type = 12; + pub const ARG_PTR_TO_SOCKET: Type = 13; + pub const ARG_PTR_TO_BTF_ID: Type = 14; + pub const ARG_PTR_TO_RINGBUF_MEM: Type = 15; + pub const ARG_CONST_ALLOC_SIZE_OR_ZERO: Type = 16; + pub const ARG_PTR_TO_BTF_ID_SOCK_COMMON: Type = 17; + pub const ARG_PTR_TO_PERCPU_BTF_ID: Type = 18; + pub const ARG_PTR_TO_FUNC: Type = 19; + pub const ARG_PTR_TO_STACK: Type = 20; + pub const ARG_PTR_TO_CONST_STR: Type = 21; + pub const ARG_PTR_TO_TIMER: Type = 22; + pub const ARG_PTR_TO_KPTR: Type = 23; + pub const ARG_PTR_TO_DYNPTR: Type = 24; + pub const __BPF_ARG_TYPE_MAX: Type = 25; + pub const ARG_PTR_TO_MAP_VALUE_OR_NULL: Type = 259; + pub const ARG_PTR_TO_MEM_OR_NULL: Type = 260; + pub const ARG_PTR_TO_CTX_OR_NULL: Type = 263; + pub const ARG_PTR_TO_SOCKET_OR_NULL: Type = 269; + pub const ARG_PTR_TO_STACK_OR_NULL: Type = 276; + pub const ARG_PTR_TO_BTF_ID_OR_NULL: Type = 270; + pub const ARG_PTR_TO_UNINIT_MEM: Type = 32772; + pub const ARG_PTR_TO_FIXED_SIZE_MEM: Type = 262148; + pub const __BPF_ARG_TYPE_LIMIT: Type = 33554431; } -#[repr(C)] -#[derive(Copy, Clone)] -pub union macsec_context__bindgen_ty_2__bindgen_ty_1 { - pub rx_sa: *mut macsec_rx_sa, - pub tx_sa: *mut macsec_tx_sa, +pub mod bpf_return_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RET_INTEGER: Type = 0; + pub const RET_VOID: Type = 1; + pub const RET_PTR_TO_MAP_VALUE: Type = 2; + pub const RET_PTR_TO_SOCKET: Type = 3; + pub const RET_PTR_TO_TCP_SOCK: Type = 4; + pub const RET_PTR_TO_SOCK_COMMON: Type = 5; + pub const RET_PTR_TO_MEM: Type = 6; + pub const RET_PTR_TO_MEM_OR_BTF_ID: Type = 7; + pub const RET_PTR_TO_BTF_ID: Type = 8; + pub const __BPF_RET_TYPE_MAX: Type = 9; + pub const RET_PTR_TO_MAP_VALUE_OR_NULL: Type = 258; + pub const RET_PTR_TO_SOCKET_OR_NULL: Type = 259; + pub const RET_PTR_TO_TCP_SOCK_OR_NULL: Type = 260; + pub const RET_PTR_TO_SOCK_COMMON_OR_NULL: Type = 261; + pub const RET_PTR_TO_RINGBUF_MEM_OR_NULL: Type = 1286; + pub const RET_PTR_TO_DYNPTR_MEM_OR_NULL: Type = 262; + pub const RET_PTR_TO_BTF_ID_OR_NULL: Type = 264; + pub const RET_PTR_TO_BTF_ID_TRUSTED: Type = 1048584; + pub const __BPF_RET_TYPE_LIMIT: Type = 33554431; } #[repr(C)] #[derive(Copy, Clone)] -pub union macsec_context__bindgen_ty_3 { - pub tx_sc_stats: *mut macsec_tx_sc_stats, - pub tx_sa_stats: *mut macsec_tx_sa_stats, - pub rx_sc_stats: *mut macsec_rx_sc_stats, - pub rx_sa_stats: *mut macsec_rx_sa_stats, - pub dev_stats: *mut macsec_dev_stats, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xfrm_type { - pub owner: *mut module, - pub proto: u8_, - pub flags: u8_, - pub init_state: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut xfrm_state, - arg2: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub destructor: ::core::option::Option, - pub input: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut xfrm_state, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub output: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut xfrm_state, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub reject: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut xfrm_state, - arg2: *mut sk_buff, - arg3: *const flowi, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct udp_hslot { + pub head: hlist_head, + pub count: ::aya_ebpf::cty::c_int, + pub lock: spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xfrm_type_offload { - pub owner: *mut module, - pub proto: u8_, - pub encap: - ::core::option::Option, - pub input_tail: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut xfrm_state, arg2: *mut sk_buff) -> ::aya_bpf::cty::c_int, - >, - pub xmit: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut xfrm_state, - arg2: *mut sk_buff, - arg3: netdev_features_t, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct mptcp_mib { + pub mibs: [::aya_ebpf::cty::c_ulong; 59usize], } +pub type smp_call_func_t = + ::core::option::Option; +pub type eventfs_callback = ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_char, + arg2: *mut umode_t, + arg3: *mut *mut ::aya_ebpf::cty::c_void, + arg4: *mut *const file_operations, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rhash_lock_head {} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_umem { - pub addrs: *mut ::aya_bpf::cty::c_void, - pub size: u64_, - pub headroom: u32_, - pub chunk_size: u32_, - pub chunks: u32_, - pub npgs: u32_, - pub user: *mut user_struct, - pub users: refcount_t, - pub flags: u8_, - pub zc: bool_, - pub pgs: *mut *mut page, - pub id: ::aya_bpf::cty::c_int, - pub xsk_dma_list: list_head, - pub work: work_struct, +pub struct eventfs_entry { + pub name: *const ::aya_ebpf::cty::c_char, + pub callback: eventfs_callback, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct in_ifaddr { - pub hash: hlist_node, - pub ifa_next: *mut in_ifaddr, - pub ifa_dev: *mut in_device, - pub callback_head: callback_head, - pub ifa_local: __be32, - pub ifa_address: __be32, - pub ifa_mask: __be32, - pub ifa_rt_priority: __u32, - pub ifa_broadcast: __be32, - pub ifa_scope: ::aya_bpf::cty::c_uchar, - pub ifa_prefixlen: ::aya_bpf::cty::c_uchar, - pub ifa_proto: ::aya_bpf::cty::c_uchar, - pub ifa_flags: __u32, - pub ifa_label: [::aya_bpf::cty::c_char; 16usize], - pub ifa_valid_lft: __u32, - pub ifa_preferred_lft: __u32, - pub ifa_cstamp: ::aya_bpf::cty::c_ulong, - pub ifa_tstamp: ::aya_bpf::cty::c_ulong, +pub struct ftrace_event_field { + pub link: list_head, + pub name: *const ::aya_ebpf::cty::c_char, + pub type_: *const ::aya_ebpf::cty::c_char, + pub filter_type: ::aya_ebpf::cty::c_int, + pub offset: ::aya_ebpf::cty::c_int, + pub size: ::aya_ebpf::cty::c_int, + pub is_signed: ::aya_ebpf::cty::c_int, + pub len: ::aya_ebpf::cty::c_int, } +pub type __u128 = u128; +pub type u128_ = __u128; +pub type freelist_full_t = u128_; #[repr(C)] +#[repr(align(16))] #[derive(Copy, Clone)] -pub struct bpf_local_storage_map_bucket { - pub list: hlist_head, - pub lock: raw_spinlock_t, -} -#[repr(C)] -#[derive(Debug)] -pub struct bpf_local_storage_data { - pub smap: *mut bpf_local_storage_map, - pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tls_crypto_info { - pub version: __u16, - pub cipher_type: __u16, +pub union freelist_aba_t { + pub __bindgen_anon_1: freelist_aba_t__bindgen_ty_1, + pub full: freelist_full_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tls12_crypto_info_aes_gcm_128 { - pub info: tls_crypto_info, - pub iv: [::aya_bpf::cty::c_uchar; 8usize], - pub key: [::aya_bpf::cty::c_uchar; 16usize], - pub salt: [::aya_bpf::cty::c_uchar; 4usize], - pub rec_seq: [::aya_bpf::cty::c_uchar; 8usize], +pub struct freelist_aba_t__bindgen_ty_1 { + pub freelist: *mut ::aya_ebpf::cty::c_void, + pub counter: ::aya_ebpf::cty::c_ulong, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tls12_crypto_info_aes_gcm_256 { - pub info: tls_crypto_info, - pub iv: [::aya_bpf::cty::c_uchar; 8usize], - pub key: [::aya_bpf::cty::c_uchar; 32usize], - pub salt: [::aya_bpf::cty::c_uchar; 4usize], - pub rec_seq: [::aya_bpf::cty::c_uchar; 8usize], +#[repr(align(16))] +#[derive(Copy, Clone)] +pub struct slab { + pub __page_flags: ::aya_ebpf::cty::c_ulong, + pub slab_cache: *mut kmem_cache, + pub __bindgen_anon_1: slab__bindgen_ty_1, + pub __unused: ::aya_ebpf::cty::c_uint, + pub __page_refcount: atomic_t, + pub memcg_data: ::aya_ebpf::cty::c_ulong, } #[repr(C)] -#[derive(Debug)] -pub struct tls12_crypto_info_chacha20_poly1305 { - pub info: tls_crypto_info, - pub iv: [::aya_bpf::cty::c_uchar; 12usize], - pub key: [::aya_bpf::cty::c_uchar; 32usize], - pub salt: __IncompleteArrayField<::aya_bpf::cty::c_uchar>, - pub rec_seq: [::aya_bpf::cty::c_uchar; 8usize], +#[repr(align(16))] +#[derive(Copy, Clone)] +pub union slab__bindgen_ty_1 { + pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1, + pub callback_head: callback_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tls12_crypto_info_sm4_gcm { - pub info: tls_crypto_info, - pub iv: [::aya_bpf::cty::c_uchar; 8usize], - pub key: [::aya_bpf::cty::c_uchar; 16usize], - pub salt: [::aya_bpf::cty::c_uchar; 4usize], - pub rec_seq: [::aya_bpf::cty::c_uchar; 8usize], +#[repr(align(16))] +#[derive(Copy, Clone)] +pub struct slab__bindgen_ty_1__bindgen_ty_1 { + pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tls12_crypto_info_sm4_ccm { - pub info: tls_crypto_info, - pub iv: [::aya_bpf::cty::c_uchar; 8usize], - pub key: [::aya_bpf::cty::c_uchar; 16usize], - pub salt: [::aya_bpf::cty::c_uchar; 4usize], - pub rec_seq: [::aya_bpf::cty::c_uchar; 8usize], +#[derive(Copy, Clone)] +pub union slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub slab_list: list_head, + pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tls_prot_info { - pub version: u16_, - pub cipher_type: u16_, - pub prepend_size: u16_, - pub tag_size: u16_, - pub overhead_size: u16_, - pub iv_size: u16_, - pub salt_size: u16_, - pub rec_seq_size: u16_, - pub aad_size: u16_, - pub tail_size: u16_, +pub struct slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub next: *mut slab, + pub slabs: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cipher_context { - pub iv: *mut ::aya_bpf::cty::c_char, - pub rec_seq: *mut ::aya_bpf::cty::c_char, +#[repr(align(16))] +#[derive(Copy, Clone)] +pub union slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { + pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, + pub freelist_counter: freelist_aba_t, } #[repr(C)] -pub struct tls_crypto_context { - pub info: __BindgenUnionField, - pub __bindgen_anon_1: __BindgenUnionField, - pub bindgen_union_field: [u16; 28usize], +#[derive(Copy, Clone)] +pub struct slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { + pub freelist: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: + slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] -pub struct tls_crypto_context__bindgen_ty_1 { - pub aes_gcm_128: __BindgenUnionField, - pub aes_gcm_256: __BindgenUnionField, - pub chacha20_poly1305: __BindgenUnionField, - pub sm4_gcm: __BindgenUnionField, - pub sm4_ccm: __BindgenUnionField, - pub bindgen_union_field: [u16; 28usize], +#[derive(Copy, Clone)] +pub union slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 { + pub counters: ::aya_ebpf::cty::c_ulong, + pub __bindgen_anon_1: + slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] -pub struct tls_context { - pub prot_info: tls_prot_info, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub push_pending_record: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, - >, - pub sk_write_space: ::core::option::Option, - pub priv_ctx_tx: *mut ::aya_bpf::cty::c_void, - pub priv_ctx_rx: *mut ::aya_bpf::cty::c_void, - pub netdev: *mut net_device, - pub tx: cipher_context, - pub rx: cipher_context, - pub partially_sent_record: *mut scatterlist, - pub partially_sent_offset: u16_, - pub in_tcp_sendpages: bool_, - pub pending_open_record_frags: bool_, - pub tx_lock: mutex, - pub flags: ::aya_bpf::cty::c_ulong, - pub sk_proto: *mut proto, - pub sk: *mut sock, - pub sk_destruct: ::core::option::Option, - pub crypto_send: tls_crypto_context, - pub crypto_recv: tls_crypto_context, - pub list: list_head, - pub refcount: refcount_t, - pub rcu: callback_head, +#[repr(align(4))] +#[derive(Debug, Copy, Clone)] +pub struct slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 +{ + pub _bitfield_align_1: [u16; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, } -impl tls_context { - #[inline] - pub fn tx_conf(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 3u8) as u8) } - } - #[inline] - pub fn set_tx_conf(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 3u8, val as u64) - } - } +impl slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { #[inline] - pub fn rx_conf(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 3u8) as u8) } + pub fn inuse(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 16u8) as u32) } } #[inline] - pub fn set_rx_conf(&mut self, val: u8_) { + pub fn set_inuse(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 3u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 16u8, val as u64) } } #[inline] - pub fn zerocopy_sendfile(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + pub fn objects(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 15u8) as u32) } } #[inline] - pub fn set_zerocopy_sendfile(&mut self, val: u8_) { + pub fn set_objects(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(16usize, 15u8, val as u64) } } #[inline] - pub fn rx_no_pad(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } + pub fn frozen(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(31usize, 1u8) as u32) } } #[inline] - pub fn set_rx_no_pad(&mut self, val: u8_) { + pub fn set_frozen(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(31usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - tx_conf: u8_, - rx_conf: u8_, - zerocopy_sendfile: u8_, - rx_no_pad: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 3u8, { - let tx_conf: u8 = unsafe { ::core::mem::transmute(tx_conf) }; - tx_conf as u64 - }); - __bindgen_bitfield_unit.set(3usize, 3u8, { - let rx_conf: u8 = unsafe { ::core::mem::transmute(rx_conf) }; - rx_conf as u64 + inuse: ::aya_ebpf::cty::c_uint, + objects: ::aya_ebpf::cty::c_uint, + frozen: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 16u8, { + let inuse: u32 = unsafe { ::core::mem::transmute(inuse) }; + inuse as u64 }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let zerocopy_sendfile: u8 = unsafe { ::core::mem::transmute(zerocopy_sendfile) }; - zerocopy_sendfile as u64 + __bindgen_bitfield_unit.set(16usize, 15u8, { + let objects: u32 = unsafe { ::core::mem::transmute(objects) }; + objects as u64 }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let rx_no_pad: u8 = unsafe { ::core::mem::transmute(rx_no_pad) }; - rx_no_pad as u64 + __bindgen_bitfield_unit.set(31usize, 1u8, { + let frozen: u32 = unsafe { ::core::mem::transmute(frozen) }; + frozen as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_ct_gre { - pub stream_timeout: ::aya_bpf::cty::c_uint, - pub timeout: ::aya_bpf::cty::c_uint, +#[repr(align(16))] +#[derive(Copy, Clone)] +pub struct kmem_cache_cpu { + pub __bindgen_anon_1: kmem_cache_cpu__bindgen_ty_1, + pub slab: *mut slab, + pub partial: *mut slab, + pub lock: local_lock_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_hook_state { - pub hook: u8_, - pub pf: u8_, - pub in_: *mut net_device, - pub out: *mut net_device, - pub sk: *mut sock, - pub net: *mut net, - pub okfn: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut sock, - arg3: *mut sk_buff, - ) -> ::aya_bpf::cty::c_int, - >, +#[repr(align(16))] +#[derive(Copy, Clone)] +pub union kmem_cache_cpu__bindgen_ty_1 { + pub __bindgen_anon_1: kmem_cache_cpu__bindgen_ty_1__bindgen_ty_1, + pub freelist_tid: freelist_aba_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_zone { - pub id: u16_, - pub flags: u8_, - pub dir: u8_, +pub struct kmem_cache_cpu__bindgen_ty_1__bindgen_ty_1 { + pub freelist: *mut *mut ::aya_ebpf::cty::c_void, + pub tid: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nf_conntrack_man { - pub u3: nf_inet_addr, - pub u: nf_conntrack_man_proto, - pub l3num: u_int16_t, +pub struct kmem_cache_node { + pub list_lock: spinlock_t, + pub nr_partial: ::aya_ebpf::cty::c_ulong, + pub partial: list_head, + pub nr_slabs: atomic_long_t, + pub total_objects: atomic_long_t, + pub full: list_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nf_conntrack_tuple { - pub src: nf_conntrack_man, - pub dst: nf_conntrack_tuple__bindgen_ty_1, +pub struct watch_list { + pub rcu: callback_head, + pub watchers: hlist_head, + pub release_watch: ::core::option::Option, + pub lock: spinlock_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1 { - pub u3: nf_inet_addr, - pub u: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1, - pub protonum: u_int8_t, - pub __nfct_hash_offsetend: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_2, - pub dir: u_int8_t, +pub struct key_user { + pub node: rb_node, + pub cons_lock: mutex, + pub lock: spinlock_t, + pub usage: refcount_t, + pub nkeys: atomic_t, + pub nikeys: atomic_t, + pub uid: kuid_t, + pub qnkeys: ::aya_ebpf::cty::c_int, + pub qnbytes: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub union nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1 { - pub all: __be16, - pub tcp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub udp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, - pub icmp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_3, - pub dccp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_4, - pub sctp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_5, - pub gre: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_6, +pub struct key_preparsed_payload { + pub orig_description: *const ::aya_ebpf::cty::c_char, + pub description: *mut ::aya_ebpf::cty::c_char, + pub payload: key_payload, + pub data: *const ::aya_ebpf::cty::c_void, + pub datalen: usize, + pub quotalen: usize, + pub expiry: time64_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub port: __be16, +pub struct key_match_data { + pub cmp: ::core::option::Option< + unsafe extern "C" fn(arg1: *const key, arg2: *const key_match_data) -> bool_, + >, + pub raw_data: *const ::aya_ebpf::cty::c_void, + pub preparsed: *mut ::aya_ebpf::cty::c_void, + pub lookup_type: ::aya_ebpf::cty::c_uint, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { - pub port: __be16, +pub mod kernel_pkey_operation { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const kernel_pkey_encrypt: Type = 0; + pub const kernel_pkey_decrypt: Type = 1; + pub const kernel_pkey_sign: Type = 2; + pub const kernel_pkey_verify: Type = 3; } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_3 { - pub type_: u_int8_t, - pub code: u_int8_t, +#[derive(Copy, Clone)] +pub struct kernel_pkey_params { + pub key: *mut key, + pub encoding: *const ::aya_ebpf::cty::c_char, + pub hash_algo: *const ::aya_ebpf::cty::c_char, + pub info: *mut ::aya_ebpf::cty::c_char, + pub in_len: __u32, + pub __bindgen_anon_1: kernel_pkey_params__bindgen_ty_1, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 7usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_4 { - pub port: __be16, +#[derive(Copy, Clone)] +pub union kernel_pkey_params__bindgen_ty_1 { + pub out_len: __u32, + pub in2_len: __u32, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_5 { - pub port: __be16, +impl kernel_pkey_params { + #[inline] + pub fn op(&self) -> kernel_pkey_operation::Type { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } + } + #[inline] + pub fn set_op(&mut self, val: kernel_pkey_operation::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 8u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(op: kernel_pkey_operation::Type) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 8u8, { + let op: u32 = unsafe { ::core::mem::transmute(op) }; + op as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_6 { - pub key: __be16, +pub struct kernel_pkey_query { + pub supported_ops: __u32, + pub key_size: __u32, + pub max_data_size: __u16, + pub max_sig_size: __u16, + pub max_enc_size: __u16, + pub max_dec_size: __u16, +} +pub mod watch_notification_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const WATCH_TYPE_META: Type = 0; + pub const WATCH_TYPE_KEY_NOTIFY: Type = 1; + pub const WATCH_TYPE__NR: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_2 {} +pub struct watch_type_filter { + pub type_: watch_notification_type::Type, + pub subtype_filter: [__u32; 1usize], + pub info_filter: __u32, + pub info_mask: __u32, +} #[repr(C)] -#[derive(Copy, Clone)] -pub struct nf_conntrack_tuple_hash { - pub hnnode: hlist_nulls_node, - pub tuple: nf_conntrack_tuple, +pub struct watch_filter { + pub __bindgen_anon_1: watch_filter__bindgen_ty_1, + pub nr_filters: u32_, + pub filters: __IncompleteArrayField, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_ct_udp { - pub stream_ts: ::aya_bpf::cty::c_ulong, +#[derive(Copy, Clone)] +pub union watch_filter__bindgen_ty_1 { + pub rcu: callback_head, + pub type_filter: [::aya_ebpf::cty::c_ulong; 1usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union nf_conntrack_proto { - pub dccp: nf_ct_dccp, - pub sctp: ip_ct_sctp, - pub tcp: ip_ct_tcp, - pub udp: nf_ct_udp, - pub gre: nf_ct_gre, - pub tmpl_padto: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nf_conn { - pub ct_general: nf_conntrack, +pub struct watch_queue { + pub rcu: callback_head, + pub filter: *mut watch_filter, + pub pipe: *mut pipe_inode_info, + pub watches: hlist_head, + pub notes: *mut *mut page, + pub notes_bitmap: *mut ::aya_ebpf::cty::c_ulong, + pub usage: kref, pub lock: spinlock_t, - pub timeout: u32_, - pub zone: nf_conntrack_zone, - pub tuplehash: [nf_conntrack_tuple_hash; 2usize], - pub status: ::aya_bpf::cty::c_ulong, - pub ct_net: possible_net_t, - pub nat_bysource: hlist_node, - pub __nfct_init_offset: nf_conn__bindgen_ty_1, - pub master: *mut nf_conn, - pub mark: u_int32_t, - pub secmark: u_int32_t, - pub ext: *mut nf_ct_ext, - pub proto: nf_conntrack_proto, + pub nr_notes: ::aya_ebpf::cty::c_uint, + pub nr_pages: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conn__bindgen_ty_1 {} -pub type __le32 = __u32; -#[repr(C)] #[derive(Copy, Clone)] -pub struct task_delay_info { - pub lock: raw_spinlock_t, - pub blkio_start: u64_, - pub blkio_delay: u64_, - pub swapin_start: u64_, - pub swapin_delay: u64_, - pub blkio_count: u32_, - pub swapin_count: u32_, - pub freepages_start: u64_, - pub freepages_delay: u64_, - pub thrashing_start: u64_, - pub thrashing_delay: u64_, - pub compact_start: u64_, - pub compact_delay: u64_, - pub wpcopy_start: u64_, - pub wpcopy_delay: u64_, - pub irq_delay: u64_, - pub freepages_count: u32_, - pub thrashing_count: u32_, - pub compact_count: u32_, - pub wpcopy_count: u32_, - pub irq_count: u32_, +pub struct watch { + pub __bindgen_anon_1: watch__bindgen_ty_1, + pub queue: *mut watch_queue, + pub queue_node: hlist_node, + pub watch_list: *mut watch_list, + pub list_node: hlist_node, + pub cred: *const cred, + pub private: *mut ::aya_ebpf::cty::c_void, + pub id: u64_, + pub usage: kref, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct new_utsname { - pub sysname: [::aya_bpf::cty::c_char; 65usize], - pub nodename: [::aya_bpf::cty::c_char; 65usize], - pub release: [::aya_bpf::cty::c_char; 65usize], - pub version: [::aya_bpf::cty::c_char; 65usize], - pub machine: [::aya_bpf::cty::c_char; 65usize], - pub domainname: [::aya_bpf::cty::c_char; 65usize], +#[derive(Copy, Clone)] +pub union watch__bindgen_ty_1 { + pub rcu: callback_head, + pub info_id: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uts_namespace { - pub name: new_utsname, - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub ns: ns_common, +#[derive(Copy, Clone)] +pub struct blk_queue_stats { + pub callbacks: list_head, + pub lock: spinlock_t, + pub accounting: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nsset { - pub flags: ::aya_bpf::cty::c_uint, - pub nsproxy: *mut nsproxy, - pub fs: *mut fs_struct, - pub cred: *const cred, +pub struct iommu_mm_data { + pub pasid: u32_, + pub sva_domains: list_head, + pub sva_handles: list_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_link_info { - pub type_: __u32, - pub id: __u32, - pub prog_id: __u32, - pub __bindgen_anon_1: bpf_link_info__bindgen_ty_1, +pub struct dev_iommu { + pub lock: mutex, + pub fault_param: *mut iommu_fault_param, + pub iopf_param: *mut iopf_device_param, + pub fwspec: *mut iommu_fwspec, + pub iommu_dev: *mut iommu_device, + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub max_pasids: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 3usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union bpf_link_info__bindgen_ty_1 { - pub raw_tracepoint: bpf_link_info__bindgen_ty_1__bindgen_ty_1, - pub tracing: bpf_link_info__bindgen_ty_1__bindgen_ty_2, - pub cgroup: bpf_link_info__bindgen_ty_1__bindgen_ty_3, - pub iter: bpf_link_info__bindgen_ty_1__bindgen_ty_4, - pub netns: bpf_link_info__bindgen_ty_1__bindgen_ty_5, - pub xdp: bpf_link_info__bindgen_ty_1__bindgen_ty_6, - pub struct_ops: bpf_link_info__bindgen_ty_1__bindgen_ty_7, - pub netfilter: bpf_link_info__bindgen_ty_1__bindgen_ty_8, +impl dev_iommu { + #[inline] + pub fn attach_deferred(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_attach_deferred(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn pci_32bit_workaround(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_pci_32bit_workaround(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn require_direct(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_require_direct(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn shadow_on_flush(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_shadow_on_flush(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + attach_deferred: u32_, + pci_32bit_workaround: u32_, + require_direct: u32_, + shadow_on_flush: u32_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let attach_deferred: u32 = unsafe { ::core::mem::transmute(attach_deferred) }; + attach_deferred as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let pci_32bit_workaround: u32 = unsafe { ::core::mem::transmute(pci_32bit_workaround) }; + pci_32bit_workaround as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let require_direct: u32 = unsafe { ::core::mem::transmute(require_direct) }; + require_direct as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let shadow_on_flush: u32 = unsafe { ::core::mem::transmute(shadow_on_flush) }; + shadow_on_flush as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_1 { - pub tp_name: __u64, - pub tp_name_len: __u32, +pub struct of_phandle_args { + pub np: *mut device_node, + pub args_count: ::aya_ebpf::cty::c_int, + pub args: [u32; 16usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_2 { - pub attach_type: __u32, - pub target_obj_id: __u32, - pub target_btf_id: __u32, +pub struct iommu_device { + pub list: list_head, + pub ops: *const iommu_ops, + pub fwnode: *mut fwnode_handle, + pub dev: *mut device, + pub singleton_group: *mut iommu_group, + pub max_pasids: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_3 { - pub cgroup_id: __u64, - pub attach_type: __u32, +pub struct iommu_fault_unrecoverable { + pub reason: __u32, + pub flags: __u32, + pub pasid: __u32, + pub perm: __u32, + pub addr: __u64, + pub fetch_addr: __u64, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4 { - pub target_name: __u64, - pub target_name_len: __u32, - pub __bindgen_anon_1: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1, - pub __bindgen_anon_2: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct iommu_fault_page_request { + pub flags: __u32, + pub pasid: __u32, + pub grpid: __u32, + pub perm: __u32, + pub addr: __u64, + pub private_data: [__u64; 2usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1 { - pub map: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1__bindgen_ty_1 { - pub map_id: __u32, +pub struct iommu_fault { + pub type_: __u32, + pub padding: __u32, + pub __bindgen_anon_1: iommu_fault__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2 { - pub cgroup: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_1, - pub task: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_2, +pub union iommu_fault__bindgen_ty_1 { + pub event: iommu_fault_unrecoverable, + pub prm: iommu_fault_page_request, + pub padding2: [__u8; 56usize], +} +pub mod iommu_page_response_code { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IOMMU_PAGE_RESP_SUCCESS: Type = 0; + pub const IOMMU_PAGE_RESP_INVALID: Type = 1; + pub const IOMMU_PAGE_RESP_FAILURE: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_1 { - pub cgroup_id: __u64, - pub order: __u32, +pub struct iommu_page_response { + pub argsz: __u32, + pub version: __u32, + pub flags: __u32, + pub pasid: __u32, + pub grpid: __u32, + pub code: __u32, } +pub type iommu_fault_handler_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_domain, + arg2: *mut device, + arg3: ::aya_ebpf::cty::c_ulong, + arg4: ::aya_ebpf::cty::c_int, + arg5: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_2 { - pub tid: __u32, - pub pid: __u32, +pub struct iommu_domain_geometry { + pub aperture_start: dma_addr_t, + pub aperture_end: dma_addr_t, + pub force_aperture: bool_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_5 { - pub netns_ino: __u32, - pub attach_type: __u32, +#[derive(Copy, Clone)] +pub struct iommu_domain { + pub type_: ::aya_ebpf::cty::c_uint, + pub ops: *const iommu_domain_ops, + pub dirty_ops: *const iommu_dirty_ops, + pub owner: *const iommu_ops, + pub pgsize_bitmap: ::aya_ebpf::cty::c_ulong, + pub geometry: iommu_domain_geometry, + pub iova_cookie: *mut iommu_dma_cookie, + pub iopf_handler: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_fault, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> iommu_page_response_code::Type, + >, + pub fault_data: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: iommu_domain__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_6 { - pub ifindex: __u32, +#[derive(Copy, Clone)] +pub union iommu_domain__bindgen_ty_1 { + pub __bindgen_anon_1: iommu_domain__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: iommu_domain__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_7 { - pub map_id: __u32, +pub struct iommu_domain__bindgen_ty_1__bindgen_ty_1 { + pub handler: iommu_fault_handler_t, + pub handler_token: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_8 { - pub pf: __u32, - pub hooknum: __u32, - pub priority: __s32, - pub flags: __u32, +pub struct iommu_domain__bindgen_ty_1__bindgen_ty_2 { + pub mm: *mut mm_struct, + pub users: ::aya_ebpf::cty::c_int, + pub next: list_head, } -pub type nlink_t = u32_; +pub type iommu_dev_fault_handler_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_fault, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; +pub type ioasid_t = ::aya_ebpf::cty::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct proc_ops { - pub proc_flags: ::aya_bpf::cty::c_uint, - pub proc_open: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_bpf::cty::c_int, +pub struct iommu_domain_ops { + pub attach_dev: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: *mut device) -> ::aya_ebpf::cty::c_int, >, - pub proc_read: ::core::option::Option< + pub set_dev_pasid: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut ::aya_bpf::cty::c_char, + arg1: *mut iommu_domain, + arg2: *mut device, + arg3: ioasid_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub map_pages: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_domain, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: phys_addr_t, + arg4: usize, + arg5: usize, + arg6: ::aya_ebpf::cty::c_int, + arg7: gfp_t, + arg8: *mut usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub unmap_pages: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_domain, + arg2: ::aya_ebpf::cty::c_ulong, arg3: usize, - arg4: *mut loff_t, - ) -> isize, + arg4: usize, + arg5: *mut iommu_iotlb_gather, + ) -> usize, >, - pub proc_read_iter: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kiocb, arg2: *mut iov_iter) -> isize, + pub flush_iotlb_all: ::core::option::Option, + pub iotlb_sync_map: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_domain, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, >, - pub proc_write: ::core::option::Option< + pub iotlb_sync: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: *mut iommu_iotlb_gather), + >, + pub cache_invalidate_user: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file, - arg2: *const ::aya_bpf::cty::c_char, + arg1: *mut iommu_domain, + arg2: *mut iommu_user_data_array, + ) -> ::aya_ebpf::cty::c_int, + >, + pub iova_to_phys: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: dma_addr_t) -> phys_addr_t, + >, + pub enforce_cache_coherency: + ::core::option::Option bool_>, + pub enable_nesting: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut iommu_domain) -> ::aya_ebpf::cty::c_int, + >, + pub set_pgtable_quirks: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_domain, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub free: ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iommu_dirty_ops { + pub set_dirty_tracking: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut iommu_domain, arg2: bool_) -> ::aya_ebpf::cty::c_int, + >, + pub read_and_clear_dirty: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iommu_domain, + arg2: ::aya_ebpf::cty::c_ulong, arg3: usize, - arg4: *mut loff_t, - ) -> isize, + arg4: ::aya_ebpf::cty::c_ulong, + arg5: *mut iommu_dirty_bitmap, + ) -> ::aya_ebpf::cty::c_int, >, - pub proc_lseek: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: loff_t, arg3: ::aya_bpf::cty::c_int) -> loff_t, +} +pub mod iommu_cap { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IOMMU_CAP_CACHE_COHERENCY: Type = 0; + pub const IOMMU_CAP_NOEXEC: Type = 1; + pub const IOMMU_CAP_PRE_BOOT_PROTECTION: Type = 2; + pub const IOMMU_CAP_ENFORCE_CACHE_COHERENCY: Type = 3; + pub const IOMMU_CAP_DEFERRED_FLUSH: Type = 4; + pub const IOMMU_CAP_DIRTY_TRACKING: Type = 5; +} +pub mod iommu_dev_features { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IOMMU_DEV_FEAT_SVA: Type = 0; + pub const IOMMU_DEV_FEAT_IOPF: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iommu_ops { + pub capable: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut device, arg2: iommu_cap::Type) -> bool_, >, - pub proc_release: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut file) -> ::aya_bpf::cty::c_int, + pub hw_info: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: *mut u32_, + arg3: *mut u32_, + ) -> *mut ::aya_ebpf::cty::c_void, >, - pub proc_poll: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut poll_table_struct) -> __poll_t, + pub domain_alloc: ::core::option::Option< + unsafe extern "C" fn(arg1: ::aya_ebpf::cty::c_uint) -> *mut iommu_domain, >, - pub proc_ioctl: ::core::option::Option< + pub domain_alloc_user: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_long, + arg1: *mut device, + arg2: u32_, + arg3: *mut iommu_domain, + arg4: *const iommu_user_data, + ) -> *mut iommu_domain, >, - pub proc_compat_ioctl: ::core::option::Option< + pub domain_alloc_paging: + ::core::option::Option *mut iommu_domain>, + pub probe_device: + ::core::option::Option *mut iommu_device>, + pub release_device: ::core::option::Option, + pub probe_finalize: ::core::option::Option, + pub device_group: + ::core::option::Option *mut iommu_group>, + pub get_resv_regions: + ::core::option::Option, + pub of_xlate: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_long, + arg1: *mut device, + arg2: *mut of_phandle_args, + ) -> ::aya_ebpf::cty::c_int, >, - pub proc_mmap: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file, arg2: *mut vm_area_struct) -> ::aya_bpf::cty::c_int, + pub is_attach_deferred: + ::core::option::Option bool_>, + pub dev_enable_feat: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: iommu_dev_features::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub proc_get_unmapped_area: ::core::option::Option< + pub dev_disable_feat: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, - arg4: ::aya_bpf::cty::c_ulong, - arg5: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_ulong, + arg1: *mut device, + arg2: iommu_dev_features::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub page_response: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut device, + arg2: *mut iommu_fault_event, + arg3: *mut iommu_page_response, + ) -> ::aya_ebpf::cty::c_int, >, + pub def_domain_type: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub remove_dev_pasid: + ::core::option::Option, + pub default_domain_ops: *const iommu_domain_ops, + pub pgsize_bitmap: ::aya_ebpf::cty::c_ulong, + pub owner: *mut module, + pub identity_domain: *mut iommu_domain, + pub blocked_domain: *mut iommu_domain, + pub default_domain: *mut iommu_domain, } -pub type proc_write_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct timens_offsets { - pub monotonic: timespec64, - pub boottime: timespec64, +pub struct iommu_iotlb_gather { + pub start: ::aya_ebpf::cty::c_ulong, + pub end: ::aya_ebpf::cty::c_ulong, + pub pgsize: usize, + pub freelist: list_head, + pub queued: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct time_namespace { - pub user_ns: *mut user_namespace, - pub ucounts: *mut ucounts, - pub ns: ns_common, - pub offsets: timens_offsets, - pub vvar_page: *mut page, - pub frozen_offsets: bool_, +pub struct iommu_dirty_bitmap { + pub bitmap: *mut iova_bitmap, + pub gather: *mut iommu_iotlb_gather, } #[repr(C)] -pub struct proc_dir_entry { - pub in_use: atomic_t, - pub refcnt: refcount_t, - pub pde_openers: list_head, - pub pde_unload_lock: spinlock_t, - pub pde_unload_completion: *mut completion, - pub proc_iops: *const inode_operations, - pub __bindgen_anon_1: proc_dir_entry__bindgen_ty_1, - pub proc_dops: *const dentry_operations, - pub __bindgen_anon_2: proc_dir_entry__bindgen_ty_2, - pub write: proc_write_t, - pub data: *mut ::aya_bpf::cty::c_void, - pub state_size: ::aya_bpf::cty::c_uint, - pub low_ino: ::aya_bpf::cty::c_uint, - pub nlink: nlink_t, - pub uid: kuid_t, - pub gid: kgid_t, - pub size: loff_t, - pub parent: *mut proc_dir_entry, - pub subdir: rb_root, - pub subdir_node: rb_node, - pub name: *mut ::aya_bpf::cty::c_char, - pub mode: umode_t, - pub flags: u8_, - pub namelen: u8_, - pub inline_name: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Debug, Copy, Clone)] +pub struct iommu_user_data { + pub type_: ::aya_ebpf::cty::c_uint, + pub uptr: *mut ::aya_ebpf::cty::c_void, + pub len: usize, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iommu_user_data_array { + pub type_: ::aya_ebpf::cty::c_uint, + pub uptr: *mut ::aya_ebpf::cty::c_void, + pub entry_len: usize, + pub entry_num: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub union proc_dir_entry__bindgen_ty_1 { - pub proc_ops: *const proc_ops, - pub proc_dir_ops: *const file_operations, +pub struct iommu_fault_event { + pub fault: iommu_fault, + pub list: list_head, } #[repr(C)] #[derive(Copy, Clone)] -pub union proc_dir_entry__bindgen_ty_2 { - pub seq_ops: *const seq_operations, - pub single_show: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct iommu_fault_param { + pub handler: iommu_dev_fault_handler_t, + pub data: *mut ::aya_ebpf::cty::c_void, + pub faults: list_head, + pub lock: mutex, } -pub mod watch_notification_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const WATCH_TYPE_META: Type = 0; - pub const WATCH_TYPE_KEY_NOTIFY: Type = 1; - pub const WATCH_TYPE__NR: Type = 2; +#[repr(C)] +#[derive(Debug)] +pub struct iommu_fwspec { + pub ops: *const iommu_ops, + pub iommu_fwnode: *mut fwnode_handle, + pub flags: u32_, + pub num_ids: ::aya_ebpf::cty::c_uint, + pub ids: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bio_crypt_ctx { - pub bc_key: *const blk_crypto_key, - pub bc_dun: [u64_; 4usize], +pub struct blk_integrity_iter { + pub prot_buf: *mut ::aya_ebpf::cty::c_void, + pub data_buf: *mut ::aya_ebpf::cty::c_void, + pub seed: sector_t, + pub data_size: ::aya_ebpf::cty::c_uint, + pub interval: ::aya_ebpf::cty::c_ushort, + pub tuple_size: ::aya_ebpf::cty::c_uchar, + pub disk_name: *const ::aya_ebpf::cty::c_char, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct elevator_queue { - pub type_: *mut elevator_type, - pub elevator_data: *mut ::aya_bpf::cty::c_void, - pub kobj: kobject, - pub sysfs_lock: mutex, - pub flags: ::aya_bpf::cty::c_ulong, - pub hash: [hlist_head; 64usize], +#[derive(Debug, Copy, Clone)] +pub struct ipv4_devconf { + pub sysctl: *mut ::aya_ebpf::cty::c_void, + pub data: [::aya_ebpf::cty::c_int; 33usize], + pub state: [::aya_ebpf::cty::c_ulong; 1usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct blk_mq_ctx { - pub __bindgen_anon_1: blk_mq_ctx__bindgen_ty_1, - pub cpu: ::aya_bpf::cty::c_uint, - pub index_hw: [::aya_bpf::cty::c_ushort; 3usize], - pub hctxs: [*mut blk_mq_hw_ctx; 3usize], - pub queue: *mut request_queue, - pub ctxs: *mut blk_mq_ctxs, - pub kobj: kobject, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blk_mq_ctx__bindgen_ty_1 { - pub lock: spinlock_t, - pub rq_lists: [list_head; 3usize], - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +pub struct in_device { + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub refcnt: refcount_t, + pub dead: ::aya_ebpf::cty::c_int, + pub ifa_list: *mut in_ifaddr, + pub mc_list: *mut ip_mc_list, + pub mc_hash: *mut *mut ip_mc_list, + pub mc_count: ::aya_ebpf::cty::c_int, + pub mc_tomb_lock: spinlock_t, + pub mc_tomb: *mut ip_mc_list, + pub mr_v1_seen: ::aya_ebpf::cty::c_ulong, + pub mr_v2_seen: ::aya_ebpf::cty::c_ulong, + pub mr_maxdelay: ::aya_ebpf::cty::c_ulong, + pub mr_qi: ::aya_ebpf::cty::c_ulong, + pub mr_qri: ::aya_ebpf::cty::c_ulong, + pub mr_qrv: ::aya_ebpf::cty::c_uchar, + pub mr_gq_running: ::aya_ebpf::cty::c_uchar, + pub mr_ifc_count: u32_, + pub mr_gq_timer: timer_list, + pub mr_ifc_timer: timer_list, + pub arp_parms: *mut neigh_parms, + pub cnf: ipv4_devconf, + pub callback_head: callback_head, } -impl blk_mq_ctx__bindgen_ty_1 { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct in_ifaddr { + pub hash: hlist_node, + pub ifa_next: *mut in_ifaddr, + pub ifa_dev: *mut in_device, + pub callback_head: callback_head, + pub ifa_local: __be32, + pub ifa_address: __be32, + pub ifa_mask: __be32, + pub ifa_rt_priority: __u32, + pub ifa_broadcast: __be32, + pub ifa_scope: ::aya_ebpf::cty::c_uchar, + pub ifa_prefixlen: ::aya_ebpf::cty::c_uchar, + pub ifa_proto: ::aya_ebpf::cty::c_uchar, + pub ifa_flags: __u32, + pub ifa_label: [::aya_ebpf::cty::c_char; 16usize], + pub ifa_valid_lft: __u32, + pub ifa_preferred_lft: __u32, + pub ifa_cstamp: ::aya_ebpf::cty::c_ulong, + pub ifa_tstamp: ::aya_ebpf::cty::c_ulong, } -impl blk_mq_ctx { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rt6key { + pub addr: in6_addr, + pub plen: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_trace { - pub trace_state: ::aya_bpf::cty::c_int, - pub rchan: *mut rchan, - pub sequence: *mut ::aya_bpf::cty::c_ulong, - pub msg_data: *mut ::aya_bpf::cty::c_uchar, - pub act_mask: u16_, - pub start_lba: u64_, - pub end_lba: u64_, - pub pid: u32_, - pub dev: u32_, - pub dir: *mut dentry, - pub running_list: list_head, - pub dropped: atomic_t, +#[derive(Copy, Clone)] +pub struct fib_nh_common { + pub nhc_dev: *mut net_device, + pub nhc_dev_tracker: netdevice_tracker, + pub nhc_oif: ::aya_ebpf::cty::c_int, + pub nhc_scope: ::aya_ebpf::cty::c_uchar, + pub nhc_family: u8_, + pub nhc_gw_family: u8_, + pub nhc_flags: ::aya_ebpf::cty::c_uchar, + pub nhc_lwtstate: *mut lwtunnel_state, + pub nhc_gw: fib_nh_common__bindgen_ty_1, + pub nhc_weight: ::aya_ebpf::cty::c_int, + pub nhc_upper_bound: atomic_t, + pub nhc_pcpu_rth_output: *mut *mut rtable, + pub nhc_rth_input: *mut rtable, + pub nhc_exceptions: *mut fnhe_hash_bucket, } #[repr(C)] #[derive(Copy, Clone)] -pub struct blk_flush_queue { +pub union fib_nh_common__bindgen_ty_1 { + pub ipv4: __be32, + pub ipv6: in6_addr, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct fib6_nh { + pub nh_common: fib_nh_common, + pub last_probe: ::aya_ebpf::cty::c_ulong, + pub rt6i_pcpu: *mut *mut rt6_info, + pub rt6i_exception_bucket: *mut rt6_exception_bucket, +} +#[repr(C)] +pub struct fib6_info { + pub fib6_table: *mut fib6_table, + pub fib6_next: *mut fib6_info, + pub fib6_node: *mut fib6_node, + pub __bindgen_anon_1: fib6_info__bindgen_ty_1, + pub fib6_nsiblings: ::aya_ebpf::cty::c_uint, + pub fib6_ref: refcount_t, + pub expires: ::aya_ebpf::cty::c_ulong, + pub fib6_metrics: *mut dst_metrics, + pub fib6_dst: rt6key, + pub fib6_flags: u32_, + pub fib6_src: rt6key, + pub fib6_prefsrc: rt6key, + pub fib6_metric: u32_, + pub fib6_protocol: u8_, + pub fib6_type: u8_, + pub offload: u8_, + pub trap: u8_, + pub offload_failed: u8_, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub rq_status: blk_status_t, - pub flush_pending_since: ::aya_bpf::cty::c_ulong, - pub flush_queue: [list_head; 2usize], - pub flush_data_in_flight: list_head, - pub flush_rq: *mut request, - pub mq_flush_lock: spinlock_t, + pub rcu: callback_head, + pub nh: *mut nexthop, + pub fib6_nh: __IncompleteArrayField, } -impl blk_flush_queue { +#[repr(C)] +#[derive(Copy, Clone)] +pub union fib6_info__bindgen_ty_1 { + pub fib6_siblings: list_head, + pub nh_list: list_head, +} +impl fib6_info { #[inline] - pub fn flush_pending_idx(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn should_flush(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_flush_pending_idx(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_should_flush(&mut self, val: u8_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn flush_running_idx(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + pub fn dst_nocount(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } } #[inline] - pub fn set_flush_running_idx(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_dst_nocount(&mut self, val: u8_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] + pub fn dst_nopolicy(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_dst_nopolicy(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn fib6_destroying(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_fib6_destroying(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn unused(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } + } + #[inline] + pub fn set_unused(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 4u8, val as u64) + } + } + #[inline] pub fn new_bitfield_1( - flush_pending_idx: ::aya_bpf::cty::c_uint, - flush_running_idx: ::aya_bpf::cty::c_uint, + should_flush: u8_, + dst_nocount: u8_, + dst_nopolicy: u8_, + fib6_destroying: u8_, + unused: u8_, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let flush_pending_idx: u32 = unsafe { ::core::mem::transmute(flush_pending_idx) }; - flush_pending_idx as u64 + let should_flush: u8 = unsafe { ::core::mem::transmute(should_flush) }; + should_flush as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let flush_running_idx: u32 = unsafe { ::core::mem::transmute(flush_running_idx) }; - flush_running_idx as u64 + let dst_nocount: u8 = unsafe { ::core::mem::transmute(dst_nocount) }; + dst_nocount as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let dst_nopolicy: u8 = unsafe { ::core::mem::transmute(dst_nopolicy) }; + dst_nopolicy as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let fib6_destroying: u8 = unsafe { ::core::mem::transmute(fib6_destroying) }; + fib6_destroying as u64 + }); + __bindgen_bitfield_unit.set(4usize, 4u8, { + let unused: u8 = unsafe { ::core::mem::transmute(unused) }; + unused as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Copy, Clone)] -pub struct rchan_buf { - pub start: *mut ::aya_bpf::cty::c_void, - pub data: *mut ::aya_bpf::cty::c_void, - pub offset: usize, - pub subbufs_produced: usize, - pub subbufs_consumed: usize, - pub chan: *mut rchan, - pub read_wait: wait_queue_head_t, - pub wakeup_work: irq_work, - pub dentry: *mut dentry, - pub kref: kref, - pub page_array: *mut *mut page, - pub page_count: ::aya_bpf::cty::c_uint, - pub finalized: ::aya_bpf::cty::c_uint, - pub padding: *mut usize, - pub prev_padding: usize, - pub bytes_consumed: usize, - pub early_bytes: usize, - pub cpu: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, - pub __bindgen_padding_0: u32, -} -impl rchan_buf { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub struct rt6_info { + pub dst: dst_entry, + pub from: *mut fib6_info, + pub sernum: ::aya_ebpf::cty::c_int, + pub rt6i_dst: rt6key, + pub rt6i_src: rt6key, + pub rt6i_gateway: in6_addr, + pub rt6i_idev: *mut inet6_dev, + pub rt6i_flags: u32_, + pub rt6i_nfheader_len: ::aya_ebpf::cty::c_ushort, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rchan { - pub version: u32_, - pub subbuf_size: usize, - pub n_subbufs: usize, - pub alloc_size: usize, - pub cb: *const rchan_callbacks, - pub kref: kref, - pub private_data: *mut ::aya_bpf::cty::c_void, - pub last_toobig: usize, - pub buf: *mut *mut rchan_buf, - pub is_global: ::aya_bpf::cty::c_int, - pub list: list_head, - pub parent: *mut dentry, - pub has_base_filename: ::aya_bpf::cty::c_int, - pub base_filename: [::aya_bpf::cty::c_char; 255usize], +pub struct rt6_statistics { + pub fib_nodes: __u32, + pub fib_route_nodes: __u32, + pub fib_rt_entries: __u32, + pub fib_rt_cache: __u32, + pub fib_discarded_routes: __u32, + pub fib_rt_alloc: atomic_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rchan_callbacks { - pub subbuf_start: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rchan_buf, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub create_buf_file: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_char, - arg2: *mut dentry, - arg3: umode_t, - arg4: *mut rchan_buf, - arg5: *mut ::aya_bpf::cty::c_int, - ) -> *mut dentry, - >, - pub remove_buf_file: - ::core::option::Option ::aya_bpf::cty::c_int>, -} -pub mod blk_crypto_mode_num { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BLK_ENCRYPTION_MODE_INVALID: Type = 0; - pub const BLK_ENCRYPTION_MODE_AES_256_XTS: Type = 1; - pub const BLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV: Type = 2; - pub const BLK_ENCRYPTION_MODE_ADIANTUM: Type = 3; - pub const BLK_ENCRYPTION_MODE_SM4_XTS: Type = 4; - pub const BLK_ENCRYPTION_MODE_MAX: Type = 5; +pub struct fib6_node { + pub parent: *mut fib6_node, + pub left: *mut fib6_node, + pub right: *mut fib6_node, + pub subtree: *mut fib6_node, + pub leaf: *mut fib6_info, + pub fn_bit: __u16, + pub fn_flags: __u16, + pub fn_sernum: ::aya_ebpf::cty::c_int, + pub rr_ptr: *mut fib6_info, + pub rcu: callback_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_crypto_config { - pub crypto_mode: blk_crypto_mode_num::Type, - pub data_unit_size: ::aya_bpf::cty::c_uint, - pub dun_bytes: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub struct fib6_table { + pub tb6_hlist: hlist_node, + pub tb6_id: u32_, + pub tb6_lock: spinlock_t, + pub tb6_root: fib6_node, + pub tb6_peers: inet_peer_base, + pub flags: ::aya_ebpf::cty::c_uint, + pub fib_seq: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_crypto_key { - pub crypto_cfg: blk_crypto_config, - pub data_unit_size_bits: ::aya_bpf::cty::c_uint, - pub size: ::aya_bpf::cty::c_uint, - pub raw: [u8_; 64usize], +#[derive(Copy, Clone)] +pub union xfrm_address_t { + pub a4: __be32, + pub a6: [__be32; 4usize], + pub in6: in6_addr, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_mq_ctxs { - pub kobj: kobject, - pub queue_ctx: *mut blk_mq_ctx, +#[derive(Copy, Clone)] +pub struct xfrm_id { + pub daddr: xfrm_address_t, + pub spi: __be32, + pub proto: __u8, } -pub type blk_insert_t = ::aya_bpf::cty::c_uint; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_mq_alloc_data { - pub q: *mut request_queue, - pub flags: blk_mq_req_flags_t, - pub shallow_depth: ::aya_bpf::cty::c_uint, - pub cmd_flags: blk_opf_t, - pub rq_flags: req_flags_t, - pub nr_tags: ::aya_bpf::cty::c_uint, - pub cached_rq: *mut *mut request, - pub ctx: *mut blk_mq_ctx, - pub hctx: *mut blk_mq_hw_ctx, +#[derive(Debug)] +pub struct xfrm_sec_ctx { + pub ctx_doi: __u8, + pub ctx_alg: __u8, + pub ctx_len: __u16, + pub ctx_sid: __u32, + pub ctx_str: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } -pub mod elv_merge { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ELEVATOR_NO_MERGE: Type = 0; - pub const ELEVATOR_FRONT_MERGE: Type = 1; - pub const ELEVATOR_BACK_MERGE: Type = 2; - pub const ELEVATOR_DISCARD_MERGE: Type = 3; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_selector { + pub daddr: xfrm_address_t, + pub saddr: xfrm_address_t, + pub dport: __be16, + pub dport_mask: __be16, + pub sport: __be16, + pub sport_mask: __be16, + pub family: __u16, + pub prefixlen_d: __u8, + pub prefixlen_s: __u8, + pub proto: __u8, + pub ifindex: ::aya_ebpf::cty::c_int, + pub user: __kernel_uid32_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct elevator_mq_ops { - pub init_sched: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut request_queue, - arg2: *mut elevator_type, - ) -> ::aya_bpf::cty::c_int, - >, - pub exit_sched: ::core::option::Option, - pub init_hctx: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_mq_hw_ctx, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub exit_hctx: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut blk_mq_hw_ctx, arg2: ::aya_bpf::cty::c_uint), - >, - pub depth_updated: ::core::option::Option, - pub allow_merge: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request, arg3: *mut bio) -> bool_, - >, - pub bio_merge: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut request_queue, - arg2: *mut bio, - arg3: ::aya_bpf::cty::c_uint, - ) -> bool_, - >, - pub request_merge: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut request_queue, - arg2: *mut *mut request, - arg3: *mut bio, - ) -> ::aya_bpf::cty::c_int, - >, - pub request_merged: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request, arg3: elv_merge::Type), - >, - pub requests_merged: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request, arg3: *mut request), - >, - pub limit_depth: - ::core::option::Option, - pub prepare_request: ::core::option::Option, - pub finish_request: ::core::option::Option, - pub insert_requests: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut blk_mq_hw_ctx, arg2: *mut list_head, arg3: blk_insert_t), - >, - pub dispatch_request: - ::core::option::Option *mut request>, - pub has_work: ::core::option::Option bool_>, - pub completed_request: - ::core::option::Option, - pub requeue_request: ::core::option::Option, - pub former_request: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request) -> *mut request, - >, - pub next_request: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut request_queue, arg2: *mut request) -> *mut request, - >, - pub init_icq: ::core::option::Option, - pub exit_icq: ::core::option::Option, +pub struct xfrm_lifetime_cfg { + pub soft_byte_limit: __u64, + pub hard_byte_limit: __u64, + pub soft_packet_limit: __u64, + pub hard_packet_limit: __u64, + pub soft_add_expires_seconds: __u64, + pub hard_add_expires_seconds: __u64, + pub soft_use_expires_seconds: __u64, + pub hard_use_expires_seconds: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct elevator_type { - pub icq_cache: *mut kmem_cache, - pub ops: elevator_mq_ops, - pub icq_size: usize, - pub icq_align: usize, - pub elevator_attrs: *mut elv_fs_entry, - pub elevator_name: *const ::aya_bpf::cty::c_char, - pub elevator_alias: *const ::aya_bpf::cty::c_char, - pub elevator_features: ::aya_bpf::cty::c_uint, - pub elevator_owner: *mut module, - pub queue_debugfs_attrs: *const blk_mq_debugfs_attr, - pub hctx_debugfs_attrs: *const blk_mq_debugfs_attr, - pub icq_cache_name: [::aya_bpf::cty::c_char; 22usize], - pub list: list_head, +pub struct xfrm_lifetime_cur { + pub bytes: __u64, + pub packets: __u64, + pub add_time: __u64, + pub use_time: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct elv_fs_entry { - pub attr: attribute, - pub show: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut elevator_queue, arg2: *mut ::aya_bpf::cty::c_char) -> isize, - >, - pub store: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut elevator_queue, - arg2: *const ::aya_bpf::cty::c_char, - arg3: usize, - ) -> isize, - >, +pub struct xfrm_replay_state { + pub oseq: __u32, + pub seq: __u32, + pub bitmap: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct io_uring_task { - pub cached_refs: ::aya_bpf::cty::c_int, - pub last: *const io_ring_ctx, - pub io_wq: *mut io_wq, - pub registered_rings: [*mut file; 16usize], - pub xa: xarray, - pub wait: wait_queue_head, - pub in_cancel: atomic_t, - pub inflight_tracked: atomic_t, - pub inflight: percpu_counter, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, - pub __bindgen_anon_1: io_uring_task__bindgen_ty_1, +#[derive(Debug)] +pub struct xfrm_replay_state_esn { + pub bmp_len: ::aya_ebpf::cty::c_uint, + pub oseq: __u32, + pub seq: __u32, + pub oseq_hi: __u32, + pub seq_hi: __u32, + pub replay_window: __u32, + pub bmp: __IncompleteArrayField<__u32>, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_task__bindgen_ty_1 { - pub task_list: llist_head, - pub task_work: callback_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, -} -impl io_uring_task { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[derive(Debug)] +pub struct xfrm_algo { + pub alg_name: [::aya_ebpf::cty::c_char; 64usize], + pub alg_key_len: ::aya_ebpf::cty::c_uint, + pub alg_key: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } -pub type __kernel_rwf_t = ::aya_bpf::cty::c_int; #[repr(C)] -#[derive(Copy, Clone)] -pub struct io_uring_cmd { - pub file: *mut file, - pub sqe: *const io_uring_sqe, - pub __bindgen_anon_1: io_uring_cmd__bindgen_ty_1, - pub cmd_op: u32_, - pub flags: u32_, - pub pdu: [u8_; 32usize], +#[derive(Debug)] +pub struct xfrm_algo_auth { + pub alg_name: [::aya_ebpf::cty::c_char; 64usize], + pub alg_key_len: ::aya_ebpf::cty::c_uint, + pub alg_trunc_len: ::aya_ebpf::cty::c_uint, + pub alg_key: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] -#[derive(Copy, Clone)] -pub union io_uring_cmd__bindgen_ty_1 { - pub task_work_cb: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut io_uring_cmd, arg2: ::aya_bpf::cty::c_uint), - >, - pub cookie: *mut ::aya_bpf::cty::c_void, +#[derive(Debug)] +pub struct xfrm_algo_aead { + pub alg_name: [::aya_ebpf::cty::c_char; 64usize], + pub alg_key_len: ::aya_ebpf::cty::c_uint, + pub alg_icv_len: ::aya_ebpf::cty::c_uint, + pub alg_key: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } #[repr(C)] -pub struct io_uring_sqe { - pub opcode: __u8, - pub flags: __u8, - pub ioprio: __u16, - pub fd: __s32, - pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_1, - pub __bindgen_anon_2: io_uring_sqe__bindgen_ty_2, - pub len: __u32, - pub __bindgen_anon_3: io_uring_sqe__bindgen_ty_3, - pub user_data: __u64, - pub __bindgen_anon_4: io_uring_sqe__bindgen_ty_4, - pub personality: __u16, - pub __bindgen_anon_5: io_uring_sqe__bindgen_ty_5, - pub __bindgen_anon_6: io_uring_sqe__bindgen_ty_6, +#[derive(Debug, Copy, Clone)] +pub struct xfrm_stats { + pub replay_window: __u32, + pub replay: __u32, + pub integrity_failed: __u32, } #[repr(C)] #[derive(Copy, Clone)] -pub union io_uring_sqe__bindgen_ty_1 { - pub off: __u64, - pub addr2: __u64, - pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_1__bindgen_ty_1, +pub struct xfrm_encap_tmpl { + pub encap_type: __u16, + pub encap_sport: __be16, + pub encap_dport: __be16, + pub encap_oa: xfrm_address_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_uring_sqe__bindgen_ty_1__bindgen_ty_1 { - pub cmd_op: __u32, - pub __pad1: __u32, +pub struct xfrm_mark { + pub v: __u32, + pub m: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_address_filter { + pub saddr: xfrm_address_t, + pub daddr: xfrm_address_t, + pub family: __u16, + pub splen: __u8, + pub dplen: __u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_state_walk { + pub all: list_head, + pub state: u8_, + pub dying: u8_, + pub proto: u8_, + pub seq: u32_, + pub filter: *mut xfrm_address_filter, +} +pub mod xfrm_replay_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const XFRM_REPLAY_MODE_LEGACY: Type = 0; + pub const XFRM_REPLAY_MODE_BMP: Type = 1; + pub const XFRM_REPLAY_MODE_ESN: Type = 2; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_dev_offload { + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub real_dev: *mut net_device, + pub offload_handle: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 7usize], +} +impl xfrm_dev_offload { + #[inline] + pub fn dir(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u8) } + } + #[inline] + pub fn set_dir(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 2u8, val as u64) + } + } + #[inline] + pub fn type_(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 2u8) as u8) } + } + #[inline] + pub fn set_type(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 2u8, val as u64) + } + } + #[inline] + pub fn flags(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 2u8) as u8) } + } + #[inline] + pub fn set_flags(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 2u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(dir: u8_, type_: u8_, flags: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 2u8, { + let dir: u8 = unsafe { ::core::mem::transmute(dir) }; + dir as u64 + }); + __bindgen_bitfield_unit.set(2usize, 2u8, { + let type_: u8 = unsafe { ::core::mem::transmute(type_) }; + type_ as u64 + }); + __bindgen_bitfield_unit.set(4usize, 2u8, { + let flags: u8 = unsafe { ::core::mem::transmute(flags) }; + flags as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_mode { + pub encap: u8_, + pub family: u8_, + pub flags: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_state { + pub xs_net: possible_net_t, + pub __bindgen_anon_1: xfrm_state__bindgen_ty_1, + pub bysrc: hlist_node, + pub byspi: hlist_node, + pub byseq: hlist_node, + pub refcnt: refcount_t, + pub lock: spinlock_t, + pub id: xfrm_id, + pub sel: xfrm_selector, + pub mark: xfrm_mark, + pub if_id: u32_, + pub tfcpad: u32_, + pub genid: u32_, + pub km: xfrm_state_walk, + pub props: xfrm_state__bindgen_ty_2, + pub lft: xfrm_lifetime_cfg, + pub aalg: *mut xfrm_algo_auth, + pub ealg: *mut xfrm_algo, + pub calg: *mut xfrm_algo, + pub aead: *mut xfrm_algo_aead, + pub geniv: *const ::aya_ebpf::cty::c_char, + pub new_mapping_sport: __be16, + pub new_mapping: u32_, + pub mapping_maxage: u32_, + pub encap: *mut xfrm_encap_tmpl, + pub encap_sk: *mut sock, + pub coaddr: *mut xfrm_address_t, + pub tunnel: *mut xfrm_state, + pub tunnel_users: atomic_t, + pub replay: xfrm_replay_state, + pub replay_esn: *mut xfrm_replay_state_esn, + pub preplay: xfrm_replay_state, + pub preplay_esn: *mut xfrm_replay_state_esn, + pub repl_mode: xfrm_replay_mode::Type, + pub xflags: u32_, + pub replay_maxage: u32_, + pub replay_maxdiff: u32_, + pub rtimer: timer_list, + pub stats: xfrm_stats, + pub curlft: xfrm_lifetime_cur, + pub mtimer: hrtimer, + pub xso: xfrm_dev_offload, + pub saved_tmo: ::aya_ebpf::cty::c_long, + pub lastused: time64_t, + pub xfrag: page_frag, + pub type_: *const xfrm_type, + pub inner_mode: xfrm_mode, + pub inner_mode_iaf: xfrm_mode, + pub outer_mode: xfrm_mode, + pub type_offload: *const xfrm_type_offload, + pub security: *mut xfrm_sec_ctx, + pub data: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union xfrm_state__bindgen_ty_1 { + pub gclist: hlist_node, + pub bydst: hlist_node, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_state__bindgen_ty_2 { + pub reqid: u32_, + pub mode: u8_, + pub replay_window: u8_, + pub aalgo: u8_, + pub ealgo: u8_, + pub calgo: u8_, + pub flags: u8_, + pub family: u16_, + pub saddr: xfrm_address_t, + pub header_len: ::aya_ebpf::cty::c_int, + pub trailer_len: ::aya_ebpf::cty::c_int, + pub extra_flags: u32_, + pub smark: xfrm_mark, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_policy_walk_entry { + pub all: list_head, + pub dead: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_policy_queue { + pub hold_queue: sk_buff_head, + pub hold_timer: timer_list, + pub timeout: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_tmpl { + pub id: xfrm_id, + pub saddr: xfrm_address_t, + pub encap_family: ::aya_ebpf::cty::c_ushort, + pub reqid: u32_, + pub mode: u8_, + pub share: u8_, + pub optional: u8_, + pub allalgs: u8_, + pub aalgos: u32_, + pub ealgos: u32_, + pub calgos: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct xfrm_policy { + pub xp_net: possible_net_t, + pub bydst: hlist_node, + pub byidx: hlist_node, + pub lock: rwlock_t, + pub refcnt: refcount_t, + pub pos: u32_, + pub timer: timer_list, + pub genid: atomic_t, + pub priority: u32_, + pub index: u32_, + pub if_id: u32_, + pub mark: xfrm_mark, + pub selector: xfrm_selector, + pub lft: xfrm_lifetime_cfg, + pub curlft: xfrm_lifetime_cur, + pub walk: xfrm_policy_walk_entry, + pub polq: xfrm_policy_queue, + pub bydst_reinsert: bool_, + pub type_: u8_, + pub action: u8_, + pub flags: u8_, + pub xfrm_nr: u8_, + pub family: u16_, + pub security: *mut xfrm_sec_ctx, + pub xfrm_vec: [xfrm_tmpl; 6usize], + pub bydst_inexact_list: hlist_node, + pub rcu: callback_head, + pub xdo: xfrm_dev_offload, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct dst_metrics { + pub metrics: [u32_; 17usize], + pub refcnt: refcount_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fib_nh_exception { + pub fnhe_next: *mut fib_nh_exception, + pub fnhe_genid: ::aya_ebpf::cty::c_int, + pub fnhe_daddr: __be32, + pub fnhe_pmtu: u32_, + pub fnhe_mtu_locked: bool_, + pub fnhe_gw: __be32, + pub fnhe_expires: ::aya_ebpf::cty::c_ulong, + pub fnhe_rth_input: *mut rtable, + pub fnhe_rth_output: *mut rtable, + pub fnhe_stamp: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fnhe_hash_bucket { + pub chain: *mut fib_nh_exception, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rt6_exception_bucket { + pub chain: hlist_head, + pub depth: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_type { + pub owner: *mut module, + pub proto: u8_, + pub flags: u8_, + pub init_state: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut xfrm_state, + arg2: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub destructor: ::core::option::Option, + pub input: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut xfrm_state, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, + >, + pub output: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut xfrm_state, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, + >, + pub reject: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut xfrm_state, + arg2: *mut sk_buff, + arg3: *const flowi, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_type_offload { + pub owner: *mut module, + pub proto: u8_, + pub encap: + ::core::option::Option, + pub input_tail: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut xfrm_state, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, + >, + pub xmit: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut xfrm_state, + arg2: *mut sk_buff, + arg3: netdev_features_t, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct semaphore { + pub lock: raw_spinlock_t, + pub count: ::aya_ebpf::cty::c_uint, + pub wait_list: list_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct userfaultfd_ctx { + pub fault_pending_wqh: wait_queue_head_t, + pub fault_wqh: wait_queue_head_t, + pub fd_wqh: wait_queue_head_t, + pub event_wqh: wait_queue_head_t, + pub refile_seq: seqcount_spinlock_t, + pub refcount: refcount_t, + pub flags: ::aya_ebpf::cty::c_uint, + pub features: ::aya_ebpf::cty::c_uint, + pub released: bool_, + pub mmap_changing: atomic_t, + pub mm: *mut mm_struct, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct io_uring_task { + pub cached_refs: ::aya_ebpf::cty::c_int, + pub last: *const io_ring_ctx, + pub io_wq: *mut io_wq, + pub registered_rings: [*mut file; 16usize], + pub xa: xarray, + pub wait: wait_queue_head, + pub in_cancel: atomic_t, + pub inflight_tracked: atomic_t, + pub inflight: percpu_counter, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub __bindgen_anon_1: io_uring_task__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct io_uring_task__bindgen_ty_1 { + pub task_list: llist_head, + pub task_work: callback_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, +} +impl io_uring_task { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +pub type __kernel_rwf_t = ::aya_ebpf::cty::c_int; +#[repr(C)] +pub struct io_uring_sqe { + pub opcode: __u8, + pub flags: __u8, + pub ioprio: __u16, + pub fd: __s32, + pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_1, + pub __bindgen_anon_2: io_uring_sqe__bindgen_ty_2, + pub len: __u32, + pub __bindgen_anon_3: io_uring_sqe__bindgen_ty_3, + pub user_data: __u64, + pub __bindgen_anon_4: io_uring_sqe__bindgen_ty_4, + pub personality: __u16, + pub __bindgen_anon_5: io_uring_sqe__bindgen_ty_5, + pub __bindgen_anon_6: io_uring_sqe__bindgen_ty_6, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union io_uring_sqe__bindgen_ty_1 { + pub off: __u64, + pub addr2: __u64, + pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct io_uring_sqe__bindgen_ty_1__bindgen_ty_1 { + pub cmd_op: __u32, + pub __pad1: __u32, } #[repr(C)] #[derive(Copy, Clone)] pub union io_uring_sqe__bindgen_ty_2 { pub addr: __u64, pub splice_off_in: __u64, + pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct io_uring_sqe__bindgen_ty_2__bindgen_ty_1 { + pub level: __u32, + pub optname: __u32, } #[repr(C)] #[derive(Copy, Clone)] @@ -28955,6 +29164,9 @@ pub union io_uring_sqe__bindgen_ty_3 { pub xattr_flags: __u32, pub msg_ring_flags: __u32, pub uring_cmd_flags: __u32, + pub waitid_flags: __u32, + pub futex_flags: __u32, + pub install_fd_flags: __u32, } #[repr(C)] #[derive(Copy, Clone)] @@ -28967,6 +29179,7 @@ pub union io_uring_sqe__bindgen_ty_4 { pub union io_uring_sqe__bindgen_ty_5 { pub splice_fd_in: __s32, pub file_index: __u32, + pub optlen: __u32, pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_5__bindgen_ty_1, } #[repr(C)] @@ -28978,6 +29191,7 @@ pub struct io_uring_sqe__bindgen_ty_5__bindgen_ty_1 { #[repr(C)] pub struct io_uring_sqe__bindgen_ty_6 { pub __bindgen_anon_1: __BindgenUnionField, + pub optval: __BindgenUnionField<__u64>, pub cmd: __BindgenUnionField<[__u8; 0usize]>, pub bindgen_union_field: [u64; 2usize], } @@ -28995,13 +29209,6 @@ pub struct io_uring_cqe { pub flags: __u32, pub big_cqe: __IncompleteArrayField<__u64>, } -pub mod task_work_notify_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const TWA_NONE: Type = 0; - pub const TWA_RESUME: Type = 1; - pub const TWA_SIGNAL: Type = 2; - pub const TWA_SIGNAL_NO_IPI: Type = 3; -} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_wq_work_node { @@ -29017,20 +29224,20 @@ pub struct io_wq_work_list { #[derive(Debug, Copy, Clone)] pub struct io_wq_work { pub list: io_wq_work_node, - pub flags: ::aya_bpf::cty::c_uint, - pub cancel_seq: ::aya_bpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_uint, + pub cancel_seq: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_fixed_file { - pub file_ptr: ::aya_bpf::cty::c_ulong, + pub file_ptr: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_file_table { pub files: *mut io_fixed_file, - pub bitmap: *mut ::aya_bpf::cty::c_ulong, - pub alloc_hint: ::aya_bpf::cty::c_uint, + pub bitmap: *mut ::aya_ebpf::cty::c_ulong, + pub alloc_hint: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] @@ -29044,7 +29251,7 @@ pub struct io_hash_bucket { #[derive(Debug, Copy, Clone)] pub struct io_hash_table { pub hbs: *mut io_hash_bucket, - pub hash_bits: ::aya_bpf::cty::c_uint, + pub hash_bits: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -29053,31 +29260,30 @@ pub struct io_submit_link { pub last: *mut io_kiocb, } #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Copy, Clone)] pub struct io_submit_state { pub free_list: io_wq_work_node, pub compl_reqs: io_wq_work_list, pub link: io_submit_link, pub plug_started: bool_, pub need_plug: bool_, - pub submit_nr: ::aya_bpf::cty::c_ushort, - pub cqes_count: ::aya_bpf::cty::c_uint, + pub submit_nr: ::aya_ebpf::cty::c_ushort, + pub cqes_count: ::aya_ebpf::cty::c_uint, pub plug: blk_plug, - pub cqes: [io_uring_cqe; 16usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_alloc_cache { pub list: io_wq_work_node, - pub nr_cached: ::aya_bpf::cty::c_uint, - pub max_cached: ::aya_bpf::cty::c_uint, + pub nr_cached: ::aya_ebpf::cty::c_uint, + pub max_cached: ::aya_ebpf::cty::c_uint, pub elem_size: usize, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_restriction { - pub register_op: [::aya_bpf::cty::c_ulong; 1usize], - pub sqe_op: [::aya_bpf::cty::c_ulong; 1usize], + pub register_op: [::aya_ebpf::cty::c_ulong; 1usize], + pub sqe_op: [::aya_ebpf::cty::c_ulong; 1usize], pub sqe_flags_allowed: u8_, pub sqe_flags_required: u8_, pub registered: bool_, @@ -29086,22 +29292,29 @@ pub struct io_restriction { pub struct io_ring_ctx { pub __bindgen_anon_1: io_ring_ctx__bindgen_ty_1, pub __bindgen_anon_2: io_ring_ctx__bindgen_ty_2, + pub __bindgen_anon_3: io_ring_ctx__bindgen_ty_3, + pub __bindgen_anon_4: io_ring_ctx__bindgen_ty_4, + pub __bindgen_anon_5: io_ring_ctx__bindgen_ty_5, + pub completion_cqes: [io_uring_cqe; 16usize], + pub completion_lock: spinlock_t, pub locked_free_list: io_wq_work_list, - pub locked_free_nr: ::aya_bpf::cty::c_uint, + pub locked_free_nr: ::aya_ebpf::cty::c_uint, + pub io_buffers_comp: list_head, + pub cq_overflow_list: list_head, + pub cancel_table: io_hash_table, + pub waitid_list: hlist_head, + pub futex_list: hlist_head, + pub futex_cache: io_alloc_cache, pub sq_creds: *const cred, pub sq_data: *mut io_sq_data, pub sqo_sq_wait: wait_queue_head, pub sqd_list: list_head, - pub check_cq: ::aya_bpf::cty::c_ulong, - pub file_alloc_start: ::aya_bpf::cty::c_uint, - pub file_alloc_end: ::aya_bpf::cty::c_uint, + pub file_alloc_start: ::aya_ebpf::cty::c_uint, + pub file_alloc_end: ::aya_ebpf::cty::c_uint, pub personalities: xarray, pub pers_next: u32_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, - pub __bindgen_anon_3: io_ring_ctx__bindgen_ty_3, - pub __bindgen_anon_4: io_ring_ctx__bindgen_ty_4, - pub __bindgen_anon_5: io_ring_ctx__bindgen_ty_5, + pub io_buffers_cache: list_head, + pub io_buf_list: hlist_head, pub poll_wq: wait_queue_head, pub restrictions: io_restriction, pub dummy_ubuf: *mut io_mapped_ubuf, @@ -29110,9 +29323,7 @@ pub struct io_ring_ctx { pub rsrc_ref_list: list_head, pub rsrc_node_cache: io_alloc_cache, pub rsrc_quiesce_wq: wait_queue_head, - pub rsrc_quiesce: ::aya_bpf::cty::c_uint, - pub io_buffers_pages: list_head, - pub ring_sock: *mut socket, + pub rsrc_quiesce: ::aya_ebpf::cty::c_uint, pub hash_map: *mut io_wq_hash, pub user: *mut user_struct, pub mm_account: *mut mm_struct, @@ -29125,147 +29336,164 @@ pub struct io_ring_ctx { pub iowq_limits_set: bool_, pub poll_wq_task_work: callback_head, pub defer_list: list_head, - pub sq_thread_idle: ::aya_bpf::cty::c_uint, - pub evfd_last_cq_tail: ::aya_bpf::cty::c_uint, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, + pub sq_thread_idle: ::aya_ebpf::cty::c_uint, + pub evfd_last_cq_tail: ::aya_ebpf::cty::c_uint, + pub n_ring_pages: ::aya_ebpf::cty::c_ushort, + pub n_sqe_pages: ::aya_ebpf::cty::c_ushort, + pub ring_pages: *mut *mut page, + pub sqe_pages: *mut *mut page, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_ring_ctx__bindgen_ty_1 { - pub flags: ::aya_bpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, - pub notify_method: task_work_notify_mode::Type, - pub rings: *mut io_rings, pub submitter_task: *mut task_struct, + pub rings: *mut io_rings, pub refs: percpu_ref, + pub notify_method: task_work_notify_mode::Type, pub _bitfield_align_2: [u8; 0], pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, + pub __bindgen_padding_0: u32, } impl io_ring_ctx__bindgen_ty_1 { #[inline] - pub fn drain_next(&self) -> ::aya_bpf::cty::c_uint { + pub fn drain_next(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_drain_next(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_drain_next(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn restricted(&self) -> ::aya_bpf::cty::c_uint { + pub fn restricted(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_restricted(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_restricted(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn off_timeout_used(&self) -> ::aya_bpf::cty::c_uint { + pub fn off_timeout_used(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_off_timeout_used(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_off_timeout_used(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn drain_active(&self) -> ::aya_bpf::cty::c_uint { + pub fn drain_active(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_drain_active(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_drain_active(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn has_evfd(&self) -> ::aya_bpf::cty::c_uint { + pub fn has_evfd(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_has_evfd(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_has_evfd(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] - pub fn task_complete(&self) -> ::aya_bpf::cty::c_uint { + pub fn task_complete(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } } #[inline] - pub fn set_task_complete(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_task_complete(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] - pub fn syscall_iopoll(&self) -> ::aya_bpf::cty::c_uint { + pub fn lockless_cq(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } } #[inline] - pub fn set_syscall_iopoll(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_lockless_cq(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] - pub fn poll_activated(&self) -> ::aya_bpf::cty::c_uint { + pub fn syscall_iopoll(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } } #[inline] - pub fn set_poll_activated(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_syscall_iopoll(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(7usize, 1u8, val as u64) } } #[inline] - pub fn drain_disabled(&self) -> ::aya_bpf::cty::c_uint { + pub fn poll_activated(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) } } #[inline] - pub fn set_drain_disabled(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_poll_activated(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(8usize, 1u8, val as u64) } } #[inline] - pub fn compat(&self) -> ::aya_bpf::cty::c_uint { + pub fn drain_disabled(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u32) } } #[inline] - pub fn set_compat(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_drain_disabled(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(9usize, 1u8, val as u64) } } #[inline] + pub fn compat(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u32) } + } + #[inline] + pub fn set_compat(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(10usize, 1u8, val as u64) + } + } + #[inline] pub fn new_bitfield_1( - drain_next: ::aya_bpf::cty::c_uint, - restricted: ::aya_bpf::cty::c_uint, - off_timeout_used: ::aya_bpf::cty::c_uint, - drain_active: ::aya_bpf::cty::c_uint, - has_evfd: ::aya_bpf::cty::c_uint, - task_complete: ::aya_bpf::cty::c_uint, - syscall_iopoll: ::aya_bpf::cty::c_uint, - poll_activated: ::aya_bpf::cty::c_uint, - drain_disabled: ::aya_bpf::cty::c_uint, - compat: ::aya_bpf::cty::c_uint, + drain_next: ::aya_ebpf::cty::c_uint, + restricted: ::aya_ebpf::cty::c_uint, + off_timeout_used: ::aya_ebpf::cty::c_uint, + drain_active: ::aya_ebpf::cty::c_uint, + has_evfd: ::aya_ebpf::cty::c_uint, + task_complete: ::aya_ebpf::cty::c_uint, + lockless_cq: ::aya_ebpf::cty::c_uint, + syscall_iopoll: ::aya_ebpf::cty::c_uint, + poll_activated: ::aya_ebpf::cty::c_uint, + drain_disabled: ::aya_ebpf::cty::c_uint, + compat: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 2usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { @@ -29293,18 +29521,22 @@ impl io_ring_ctx__bindgen_ty_1 { task_complete as u64 }); __bindgen_bitfield_unit.set(6usize, 1u8, { + let lockless_cq: u32 = unsafe { ::core::mem::transmute(lockless_cq) }; + lockless_cq as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { let syscall_iopoll: u32 = unsafe { ::core::mem::transmute(syscall_iopoll) }; syscall_iopoll as u64 }); - __bindgen_bitfield_unit.set(7usize, 1u8, { + __bindgen_bitfield_unit.set(8usize, 1u8, { let poll_activated: u32 = unsafe { ::core::mem::transmute(poll_activated) }; poll_activated as u64 }); - __bindgen_bitfield_unit.set(8usize, 1u8, { + __bindgen_bitfield_unit.set(9usize, 1u8, { let drain_disabled: u32 = unsafe { ::core::mem::transmute(drain_disabled) }; drain_disabled as u64 }); - __bindgen_bitfield_unit.set(9usize, 1u8, { + __bindgen_bitfield_unit.set(10usize, 1u8, { let compat: u32 = unsafe { ::core::mem::transmute(compat) }; compat as u64 }); @@ -29317,59 +29549,74 @@ impl io_ring_ctx__bindgen_ty_1 { } } #[repr(C)] +#[derive(Copy, Clone)] pub struct io_ring_ctx__bindgen_ty_2 { pub uring_lock: mutex, pub sq_array: *mut u32_, pub sq_sqes: *mut io_uring_sqe, - pub cached_sq_head: ::aya_bpf::cty::c_uint, - pub sq_entries: ::aya_bpf::cty::c_uint, + pub cached_sq_head: ::aya_ebpf::cty::c_uint, + pub sq_entries: ::aya_ebpf::cty::c_uint, pub rsrc_node: *mut io_rsrc_node, pub cancel_seq: atomic_t, pub file_table: io_file_table, - pub nr_user_files: ::aya_bpf::cty::c_uint, - pub nr_user_bufs: ::aya_bpf::cty::c_uint, + pub nr_user_files: ::aya_ebpf::cty::c_uint, + pub nr_user_bufs: ::aya_ebpf::cty::c_uint, pub user_bufs: *mut *mut io_mapped_ubuf, pub submit_state: io_submit_state, pub io_bl: *mut io_buffer_list, pub io_bl_xa: xarray, - pub io_buffers_cache: list_head, pub cancel_table_locked: io_hash_table, - pub cq_overflow_list: list_head, pub apoll_cache: io_alloc_cache, pub netmsg_cache: io_alloc_cache, + pub iopoll_list: io_wq_work_list, + pub poll_multi_queue: bool_, + pub cancelable_uring_cmd: hlist_head, } #[repr(C)] -#[derive(Copy, Clone)] +#[derive(Debug, Copy, Clone)] pub struct io_ring_ctx__bindgen_ty_3 { pub cqe_cached: *mut io_uring_cqe, pub cqe_sentinel: *mut io_uring_cqe, - pub cached_cq_tail: ::aya_bpf::cty::c_uint, - pub cq_entries: ::aya_bpf::cty::c_uint, + pub cached_cq_tail: ::aya_ebpf::cty::c_uint, + pub cq_entries: ::aya_ebpf::cty::c_uint, pub io_ev_fd: *mut io_ev_fd, - pub cq_wait: wait_queue_head, - pub cq_extra: ::aya_bpf::cty::c_uint, + pub cq_extra: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub __bindgen_padding_0: u32, +} +impl io_ring_ctx__bindgen_ty_3 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Copy, Clone)] pub struct io_ring_ctx__bindgen_ty_4 { - pub completion_lock: spinlock_t, - pub poll_multi_queue: bool_, - pub cq_wait_nr: atomic_t, - pub iopoll_list: io_wq_work_list, - pub cancel_table: io_hash_table, pub work_llist: llist_head, - pub io_buffers_comp: list_head, + pub check_cq: ::aya_ebpf::cty::c_ulong, + pub cq_wait_nr: atomic_t, + pub cq_timeouts: atomic_t, + pub cq_wait: wait_queue_head, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, +} +impl io_ring_ctx__bindgen_ty_4 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Copy, Clone)] pub struct io_ring_ctx__bindgen_ty_5 { pub timeout_lock: spinlock_t, - pub cq_timeouts: atomic_t, pub timeout_list: list_head, pub ltimeout_list: list_head, - pub cq_last_tm_flush: ::aya_bpf::cty::c_uint, + pub cq_last_tm_flush: ::aya_ebpf::cty::c_uint, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, pub __bindgen_padding_0: u32, @@ -29381,29 +29628,44 @@ impl io_ring_ctx__bindgen_ty_5 { __bindgen_bitfield_unit } } -impl io_ring_ctx { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub type free_work_fn = + ::core::option::Option *mut io_wq_work>; +pub type io_wq_work_fn = ::core::option::Option; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct io_wq_acct { + pub nr_workers: ::aya_ebpf::cty::c_uint, + pub max_workers: ::aya_ebpf::cty::c_uint, + pub index: ::aya_ebpf::cty::c_int, + pub nr_running: atomic_t, + pub lock: raw_spinlock_t, + pub work_list: io_wq_work_list, + pub flags: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct io_wq { + pub state: ::aya_ebpf::cty::c_ulong, + pub free_work: free_work_fn, + pub do_work: io_wq_work_fn, + pub hash: *mut io_wq_hash, + pub worker_refs: atomic_t, + pub worker_done: completion, + pub cpuhp_node: hlist_node, + pub task: *mut task_struct, + pub acct: [io_wq_acct; 2usize], + pub lock: raw_spinlock_t, + pub free_list: hlist_nulls_head, + pub all_list: list_head, + pub wait: wait_queue_entry, + pub hash_tail: [*mut io_wq_work; 64usize], + pub cpu_mask: cpumask_var_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct io_uring { pub head: u32_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_0: u32, pub tail: u32_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_1: u32, } #[repr(C)] #[derive(Debug)] @@ -29419,13 +29681,13 @@ pub struct io_rings { pub cq_flags: u32_, pub cq_overflow: u32_, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, pub cqes: __IncompleteArrayField, } impl io_rings { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); __bindgen_bitfield_unit } } @@ -29446,7 +29708,7 @@ pub struct io_cqe { #[derive(Copy, Clone)] pub union io_cqe__bindgen_ty_1 { pub flags: __u32, - pub fd: ::aya_bpf::cty::c_int, + pub fd: ::aya_ebpf::cty::c_int, } pub type io_req_tw_func_t = ::core::option::Option; @@ -29463,7 +29725,7 @@ pub struct io_kiocb { pub opcode: u8_, pub iopoll_completed: u8_, pub buf_index: u16_, - pub flags: ::aya_bpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, pub cqe: io_cqe, pub ctx: *mut io_ring_ctx, pub task: *mut task_struct, @@ -29473,13 +29735,14 @@ pub struct io_kiocb { pub refs: atomic_t, pub poll_refs: atomic_t, pub io_task_work: io_task_work, - pub nr_tw: ::aya_bpf::cty::c_uint, - pub __bindgen_anon_4: io_kiocb__bindgen_ty_4, + pub nr_tw: ::aya_ebpf::cty::c_uint, + pub hash_node: hlist_node, pub apoll: *mut async_poll, - pub async_data: *mut ::aya_bpf::cty::c_void, + pub async_data: *mut ::aya_ebpf::cty::c_void, pub link: *mut io_kiocb, pub creds: *const cred, pub work: io_wq_work, + pub big_cqe: io_kiocb__bindgen_ty_4, } #[repr(C)] #[derive(Copy, Clone)] @@ -29501,14 +29764,8 @@ pub union io_kiocb__bindgen_ty_3 { pub apoll_events: __poll_t, } #[repr(C)] -#[derive(Copy, Clone)] -pub union io_kiocb__bindgen_ty_4 { - pub hash_node: hlist_node, - pub __bindgen_anon_1: io_kiocb__bindgen_ty_4__bindgen_ty_1, -} -#[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_kiocb__bindgen_ty_4__bindgen_ty_1 { +pub struct io_kiocb__bindgen_ty_4 { pub extra1: u64_, pub extra2: u64_, } @@ -29524,11 +29781,11 @@ pub struct io_ev_fd { } impl io_ev_fd { #[inline] - pub fn eventfd_async(&self) -> ::aya_bpf::cty::c_uint { + pub fn eventfd_async(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_eventfd_async(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_eventfd_async(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) @@ -29536,7 +29793,7 @@ impl io_ev_fd { } #[inline] pub fn new_bitfield_1( - eventfd_async: ::aya_bpf::cty::c_uint, + eventfd_async: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { @@ -29547,1887 +29804,646 @@ impl io_ev_fd { } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_cache_entry { - pub node: io_wq_work_node, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_rsrc_put { - pub tag: u64_, - pub __bindgen_anon_1: io_rsrc_put__bindgen_ty_1, -} -#[repr(C)] #[derive(Copy, Clone)] -pub union io_rsrc_put__bindgen_ty_1 { - pub rsrc: *mut ::aya_bpf::cty::c_void, - pub file: *mut file, - pub buf: *mut io_mapped_ubuf, +pub struct io_wq_hash { + pub refs: refcount_t, + pub map: ::aya_ebpf::cty::c_ulong, + pub wait: wait_queue_head, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct io_rsrc_node { - pub __bindgen_anon_1: io_rsrc_node__bindgen_ty_1, - pub refs: ::aya_bpf::cty::c_int, - pub empty: bool_, - pub type_: u16_, - pub node: list_head, - pub item: io_rsrc_put, +#[derive(Debug, Copy, Clone)] +pub struct io_tw_state { + pub locked: bool_, } -#[repr(C)] -#[derive(Copy, Clone)] -pub union io_rsrc_node__bindgen_ty_1 { - pub cache: io_cache_entry, - pub ctx: *mut io_ring_ctx, +pub mod dpll_pin_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DPLL_PIN_TYPE_MUX: Type = 1; + pub const DPLL_PIN_TYPE_EXT: Type = 2; + pub const DPLL_PIN_TYPE_SYNCE_ETH_PORT: Type = 3; + pub const DPLL_PIN_TYPE_INT_OSCILLATOR: Type = 4; + pub const DPLL_PIN_TYPE_GNSS: Type = 5; + pub const __DPLL_PIN_TYPE_MAX: Type = 6; + pub const DPLL_PIN_TYPE_MAX: Type = 5; } #[repr(C)] -#[derive(Debug)] -pub struct io_mapped_ubuf { - pub ubuf: u64_, - pub ubuf_end: u64_, - pub nr_bvecs: ::aya_bpf::cty::c_uint, - pub acct_pages: ::aya_bpf::cty::c_ulong, - pub bvec: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct dpll_pin_phase_adjust_range { + pub min: s32, + pub max: s32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_rsrc_data { - pub ctx: *mut io_ring_ctx, - pub tags: *mut *mut u64_, - pub nr: ::aya_bpf::cty::c_uint, - pub rsrc_type: u16_, - pub quiesce: bool_, +pub struct dpll_pin_properties { + pub board_label: *const ::aya_ebpf::cty::c_char, + pub panel_label: *const ::aya_ebpf::cty::c_char, + pub package_label: *const ::aya_ebpf::cty::c_char, + pub type_: dpll_pin_type::Type, + pub capabilities: ::aya_ebpf::cty::c_ulong, + pub freq_supported_num: u32_, + pub freq_supported: *mut dpll_pin_frequency, + pub phase_range: dpll_pin_phase_adjust_range, } #[repr(C)] #[derive(Copy, Clone)] -pub struct io_wq_hash { - pub refs: refcount_t, - pub map: ::aya_bpf::cty::c_ulong, - pub wait: wait_queue_head, +pub struct dpll_pin { + pub id: u32_, + pub pin_idx: u32_, + pub clock_id: u64_, + pub module: *mut module, + pub dpll_refs: xarray, + pub parent_refs: xarray, + pub prop: dpll_pin_properties, + pub refcount: refcount_t, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_tw_state { - pub locked: bool_, +pub struct dpll_pin_frequency { + pub min: u64_, + pub max: u64_, +} +pub mod devlink_port_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_PORT_TYPE_NOTSET: Type = 0; + pub const DEVLINK_PORT_TYPE_AUTO: Type = 1; + pub const DEVLINK_PORT_TYPE_ETH: Type = 2; + pub const DEVLINK_PORT_TYPE_IB: Type = 3; +} +pub mod devlink_port_flavour { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_PORT_FLAVOUR_PHYSICAL: Type = 0; + pub const DEVLINK_PORT_FLAVOUR_CPU: Type = 1; + pub const DEVLINK_PORT_FLAVOUR_DSA: Type = 2; + pub const DEVLINK_PORT_FLAVOUR_PCI_PF: Type = 3; + pub const DEVLINK_PORT_FLAVOUR_PCI_VF: Type = 4; + pub const DEVLINK_PORT_FLAVOUR_VIRTUAL: Type = 5; + pub const DEVLINK_PORT_FLAVOUR_UNUSED: Type = 6; + pub const DEVLINK_PORT_FLAVOUR_PCI_SF: Type = 7; } -pub type u_char = ::aya_bpf::cty::c_uchar; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ww_acquire_ctx { - pub task: *mut task_struct, - pub stamp: ::aya_bpf::cty::c_ulong, - pub acquired: ::aya_bpf::cty::c_uint, - pub wounded: ::aya_bpf::cty::c_ushort, - pub is_wait_die: ::aya_bpf::cty::c_ushort, +pub struct devlink_port_phys_attrs { + pub port_number: u32_, + pub split_subport_number: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct klist { - pub k_lock: spinlock_t, - pub k_list: list_head, - pub get: ::core::option::Option, - pub put: ::core::option::Option, +#[derive(Debug, Copy, Clone)] +pub struct devlink_port_pci_pf_attrs { + pub controller: u32_, + pub pf: u16_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: u8, +} +impl devlink_port_pci_pf_attrs { + #[inline] + pub fn external(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_external(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(external: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let external: u8 = unsafe { ::core::mem::transmute(external) }; + external as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct klist_node { - pub n_klist: *mut ::aya_bpf::cty::c_void, - pub n_node: list_head, - pub n_ref: kref, +pub struct devlink_port_pci_vf_attrs { + pub controller: u32_, + pub pf: u16_, + pub vf: u16_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 3usize], +} +impl devlink_port_pci_vf_attrs { + #[inline] + pub fn external(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_external(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(external: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let external: u8 = unsafe { ::core::mem::transmute(external) }; + external as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct driver_private { - pub kobj: kobject, - pub klist_devices: klist, - pub knode_bus: klist_node, - pub mkobj: *mut module_kobject, - pub driver: *mut device_driver, +#[derive(Debug, Copy, Clone)] +pub struct devlink_port_pci_sf_attrs { + pub controller: u32_, + pub sf: u32_, + pub pf: u16_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: u8, +} +impl devlink_port_pci_sf_attrs { + #[inline] + pub fn external(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_external(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(external: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let external: u8 = unsafe { ::core::mem::transmute(external) }; + external as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Copy, Clone)] -pub struct device_private { - pub klist_children: klist, - pub knode_parent: klist_node, - pub knode_driver: klist_node, - pub knode_bus: klist_node, - pub knode_class: klist_node, - pub deferred_probe: list_head, - pub async_driver: *mut device_driver, - pub deferred_probe_reason: *mut ::aya_bpf::cty::c_char, - pub device: *mut device, +pub struct devlink_port_attrs { pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 7usize], + pub lanes: u32_, + pub flavour: devlink_port_flavour::Type, + pub switch_id: netdev_phys_item_id, + pub __bindgen_anon_1: devlink_port_attrs__bindgen_ty_1, } -impl device_private { +#[repr(C)] +#[derive(Copy, Clone)] +pub union devlink_port_attrs__bindgen_ty_1 { + pub phys: devlink_port_phys_attrs, + pub pci_pf: devlink_port_pci_pf_attrs, + pub pci_vf: devlink_port_pci_vf_attrs, + pub pci_sf: devlink_port_pci_sf_attrs, +} +impl devlink_port_attrs { #[inline] - pub fn dead(&self) -> u8_ { + pub fn split(&self) -> u8_ { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_dead(&mut self, val: u8_) { + pub fn set_split(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(dead: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + pub fn splittable(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_splittable(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(split: u8_, splittable: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let dead: u8 = unsafe { ::core::mem::transmute(dead) }; - dead as u64 + let split: u8 = unsafe { ::core::mem::transmute(split) }; + split as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let splittable: u8 = unsafe { ::core::mem::transmute(splittable) }; + splittable as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dev_pin_info { - pub p: *mut pinctrl, - pub default_state: *mut pinctrl_state, - pub init_state: *mut pinctrl_state, - pub sleep_state: *mut pinctrl_state, - pub idle_state: *mut pinctrl_state, +#[derive(Copy, Clone)] +pub struct devlink_port { + pub list: list_head, + pub region_list: list_head, + pub devlink: *mut devlink, + pub ops: *const devlink_port_ops, + pub index: ::aya_ebpf::cty::c_uint, + pub type_lock: spinlock_t, + pub type_: devlink_port_type::Type, + pub desired_type: devlink_port_type::Type, + pub __bindgen_anon_1: devlink_port__bindgen_ty_1, + pub attrs: devlink_port_attrs, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub type_warn_dw: delayed_work, + pub reporter_list: list_head, + pub devlink_rate: *mut devlink_rate, + pub linecard: *mut devlink_linecard, + pub rel_index: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sg_table { - pub sgl: *mut scatterlist, - pub nents: ::aya_bpf::cty::c_uint, - pub orig_nents: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union devlink_port__bindgen_ty_1 { + pub type_eth: devlink_port__bindgen_ty_1__bindgen_ty_1, + pub type_ib: devlink_port__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct scsi_sense_hdr { - pub response_code: u8_, - pub sense_key: u8_, - pub asc: u8_, - pub ascq: u8_, - pub byte4: u8_, - pub byte5: u8_, - pub byte6: u8_, - pub additional_length: u8_, +pub struct devlink_port__bindgen_ty_1__bindgen_ty_1 { + pub netdev: *mut net_device, + pub ifindex: ::aya_ebpf::cty::c_int, + pub ifname: [::aya_ebpf::cty::c_char; 16usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_drvinfo { - pub cmd: __u32, - pub driver: [::aya_bpf::cty::c_char; 32usize], - pub version: [::aya_bpf::cty::c_char; 32usize], - pub fw_version: [::aya_bpf::cty::c_char; 32usize], - pub bus_info: [::aya_bpf::cty::c_char; 32usize], - pub erom_version: [::aya_bpf::cty::c_char; 32usize], - pub reserved2: [::aya_bpf::cty::c_char; 12usize], - pub n_priv_flags: __u32, - pub n_stats: __u32, - pub testinfo_len: __u32, - pub eedump_len: __u32, - pub regdump_len: __u32, +pub struct devlink_port__bindgen_ty_1__bindgen_ty_2 { + pub ibdev: *mut ib_device, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_wolinfo { - pub cmd: __u32, - pub supported: __u32, - pub wolopts: __u32, - pub sopass: [__u8; 6usize], +impl devlink_port { + #[inline] + pub fn attrs_set(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_attrs_set(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn switch_port(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_switch_port(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn registered(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_registered(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn initialized(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_initialized(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + attrs_set: u8_, + switch_port: u8_, + registered: u8_, + initialized: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let attrs_set: u8 = unsafe { ::core::mem::transmute(attrs_set) }; + attrs_set as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let switch_port: u8 = unsafe { ::core::mem::transmute(switch_port) }; + switch_port as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let registered: u8 = unsafe { ::core::mem::transmute(registered) }; + registered as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let initialized: u8 = unsafe { ::core::mem::transmute(initialized) }; + initialized as u64 + }); + __bindgen_bitfield_unit + } } -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_tunable { - pub cmd: __u32, - pub id: __u32, - pub type_id: __u32, - pub len: __u32, - pub data: __IncompleteArrayField<*mut ::aya_bpf::cty::c_void>, +pub mod devlink_sb_pool_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_SB_POOL_TYPE_INGRESS: Type = 0; + pub const DEVLINK_SB_POOL_TYPE_EGRESS: Type = 1; } -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_regs { - pub cmd: __u32, - pub version: __u32, - pub len: __u32, - pub data: __IncompleteArrayField<__u8>, +pub mod devlink_sb_threshold_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_SB_THRESHOLD_TYPE_STATIC: Type = 0; + pub const DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC: Type = 1; } -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_eeprom { - pub cmd: __u32, - pub magic: __u32, - pub offset: __u32, - pub len: __u32, - pub data: __IncompleteArrayField<__u8>, +pub mod devlink_eswitch_encap_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_ESWITCH_ENCAP_MODE_NONE: Type = 0; + pub const DEVLINK_ESWITCH_ENCAP_MODE_BASIC: Type = 1; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_eee { - pub cmd: __u32, - pub supported: __u32, - pub advertised: __u32, - pub lp_advertised: __u32, - pub eee_active: __u32, - pub eee_enabled: __u32, - pub tx_lpi_enabled: __u32, - pub tx_lpi_timer: __u32, - pub reserved: [__u32; 2usize], +pub mod devlink_rate_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_RATE_TYPE_LEAF: Type = 0; + pub const DEVLINK_RATE_TYPE_NODE: Type = 1; +} +pub mod devlink_selftest_status { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_SELFTEST_STATUS_SKIP: Type = 0; + pub const DEVLINK_SELFTEST_STATUS_PASS: Type = 1; + pub const DEVLINK_SELFTEST_STATUS_FAIL: Type = 2; +} +pub mod devlink_trap_action { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_TRAP_ACTION_DROP: Type = 0; + pub const DEVLINK_TRAP_ACTION_TRAP: Type = 1; + pub const DEVLINK_TRAP_ACTION_MIRROR: Type = 2; +} +pub mod devlink_trap_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_TRAP_TYPE_DROP: Type = 0; + pub const DEVLINK_TRAP_TYPE_EXCEPTION: Type = 1; + pub const DEVLINK_TRAP_TYPE_CONTROL: Type = 2; +} +pub mod devlink_reload_action { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_RELOAD_ACTION_UNSPEC: Type = 0; + pub const DEVLINK_RELOAD_ACTION_DRIVER_REINIT: Type = 1; + pub const DEVLINK_RELOAD_ACTION_FW_ACTIVATE: Type = 2; + pub const __DEVLINK_RELOAD_ACTION_MAX: Type = 3; + pub const DEVLINK_RELOAD_ACTION_MAX: Type = 2; +} +pub mod devlink_reload_limit { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_RELOAD_LIMIT_UNSPEC: Type = 0; + pub const DEVLINK_RELOAD_LIMIT_NO_RESET: Type = 1; + pub const __DEVLINK_RELOAD_LIMIT_MAX: Type = 2; + pub const DEVLINK_RELOAD_LIMIT_MAX: Type = 1; +} +pub mod devlink_dpipe_field_mapping_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE: Type = 0; + pub const DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX: Type = 1; +} +pub mod devlink_port_fn_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_PORT_FN_STATE_INACTIVE: Type = 0; + pub const DEVLINK_PORT_FN_STATE_ACTIVE: Type = 1; +} +pub mod devlink_port_fn_opstate { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_PORT_FN_OPSTATE_DETACHED: Type = 0; + pub const DEVLINK_PORT_FN_OPSTATE_ATTACHED: Type = 1; } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_modinfo { - pub cmd: __u32, - pub type_: __u32, - pub eeprom_len: __u32, - pub reserved: [__u32; 8usize], +#[derive(Copy, Clone)] +pub struct devlink_rate { + pub list: list_head, + pub type_: devlink_rate_type::Type, + pub devlink: *mut devlink, + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub tx_share: u64_, + pub tx_max: u64_, + pub parent: *mut devlink_rate, + pub __bindgen_anon_1: devlink_rate__bindgen_ty_1, + pub tx_priority: u32_, + pub tx_weight: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_coalesce { - pub cmd: __u32, - pub rx_coalesce_usecs: __u32, - pub rx_max_coalesced_frames: __u32, - pub rx_coalesce_usecs_irq: __u32, - pub rx_max_coalesced_frames_irq: __u32, - pub tx_coalesce_usecs: __u32, - pub tx_max_coalesced_frames: __u32, - pub tx_coalesce_usecs_irq: __u32, - pub tx_max_coalesced_frames_irq: __u32, - pub stats_block_coalesce_usecs: __u32, - pub use_adaptive_rx_coalesce: __u32, - pub use_adaptive_tx_coalesce: __u32, - pub pkt_rate_low: __u32, - pub rx_coalesce_usecs_low: __u32, - pub rx_max_coalesced_frames_low: __u32, - pub tx_coalesce_usecs_low: __u32, - pub tx_max_coalesced_frames_low: __u32, - pub pkt_rate_high: __u32, - pub rx_coalesce_usecs_high: __u32, - pub rx_max_coalesced_frames_high: __u32, - pub tx_coalesce_usecs_high: __u32, - pub tx_max_coalesced_frames_high: __u32, - pub rate_sample_interval: __u32, +#[derive(Copy, Clone)] +pub union devlink_rate__bindgen_ty_1 { + pub devlink_port: *mut devlink_port, + pub __bindgen_anon_1: devlink_rate__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_ringparam { - pub cmd: __u32, - pub rx_max_pending: __u32, - pub rx_mini_max_pending: __u32, - pub rx_jumbo_max_pending: __u32, - pub tx_max_pending: __u32, - pub rx_pending: __u32, - pub rx_mini_pending: __u32, - pub rx_jumbo_pending: __u32, - pub tx_pending: __u32, +pub struct devlink_rate__bindgen_ty_1__bindgen_ty_1 { + pub name: *mut ::aya_ebpf::cty::c_char, + pub refcnt: refcount_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_channels { - pub cmd: __u32, - pub max_rx: __u32, - pub max_tx: __u32, - pub max_other: __u32, - pub max_combined: __u32, - pub rx_count: __u32, - pub tx_count: __u32, - pub other_count: __u32, - pub combined_count: __u32, +pub struct devlink_dev_stats { + pub reload_stats: [u32_; 6usize], + pub remote_reload_stats: [u32_; 6usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_pauseparam { - pub cmd: __u32, - pub autoneg: __u32, - pub rx_pause: __u32, - pub tx_pause: __u32, -} -pub mod ethtool_link_ext_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_STATE_AUTONEG: Type = 0; - pub const ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE: Type = 1; - pub const ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH: Type = 2; - pub const ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY: Type = 3; - pub const ETHTOOL_LINK_EXT_STATE_NO_CABLE: Type = 4; - pub const ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE: Type = 5; - pub const ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE: Type = 6; - pub const ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE: Type = 7; - pub const ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED: Type = 8; - pub const ETHTOOL_LINK_EXT_STATE_OVERHEAT: Type = 9; - pub const ETHTOOL_LINK_EXT_STATE_MODULE: Type = 10; -} -pub mod ethtool_link_ext_substate_autoneg { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED: Type = 1; - pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED: Type = 2; - pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED: Type = 3; - pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE: Type = 4; - pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE: Type = 5; - pub const ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD: Type = 6; -} -pub mod ethtool_link_ext_substate_link_training { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED: Type = 1; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT: Type = 2; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY: Type = 3; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT: Type = 4; -} -pub mod ethtool_link_ext_substate_link_logical_mismatch { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK: Type = 1; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK: Type = 2; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS: Type = 3; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED: Type = 4; - pub const ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED: Type = 5; -} -pub mod ethtool_link_ext_substate_bad_signal_integrity { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS: Type = 1; - pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE: Type = 2; - pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST: Type = 3; - pub const ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS: Type = 4; -} -pub mod ethtool_link_ext_substate_cable_issue { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE: Type = 1; - pub const ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE: Type = 2; -} -pub mod ethtool_link_ext_substate_module { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY: Type = 1; -} -pub mod ethtool_mac_stats_src { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_MAC_STATS_SRC_AGGREGATE: Type = 0; - pub const ETHTOOL_MAC_STATS_SRC_EMAC: Type = 1; - pub const ETHTOOL_MAC_STATS_SRC_PMAC: Type = 2; -} -pub mod ethtool_module_power_mode_policy { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH: Type = 1; - pub const ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO: Type = 2; -} -pub mod ethtool_module_power_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_MODULE_POWER_MODE_LOW: Type = 1; - pub const ETHTOOL_MODULE_POWER_MODE_HIGH: Type = 2; -} -pub mod ethtool_mm_verify_status { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_MM_VERIFY_STATUS_UNKNOWN: Type = 0; - pub const ETHTOOL_MM_VERIFY_STATUS_INITIAL: Type = 1; - pub const ETHTOOL_MM_VERIFY_STATUS_VERIFYING: Type = 2; - pub const ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED: Type = 3; - pub const ETHTOOL_MM_VERIFY_STATUS_FAILED: Type = 4; - pub const ETHTOOL_MM_VERIFY_STATUS_DISABLED: Type = 5; -} -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_test { - pub cmd: __u32, - pub flags: __u32, - pub reserved: __u32, - pub len: __u32, - pub data: __IncompleteArrayField<__u64>, -} -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_stats { - pub cmd: __u32, - pub n_stats: __u32, - pub data: __IncompleteArrayField<__u64>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_tcpip4_spec { - pub ip4src: __be32, - pub ip4dst: __be32, - pub psrc: __be16, - pub pdst: __be16, - pub tos: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_ah_espip4_spec { - pub ip4src: __be32, - pub ip4dst: __be32, - pub spi: __be32, - pub tos: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_usrip4_spec { - pub ip4src: __be32, - pub ip4dst: __be32, - pub l4_4_bytes: __be32, - pub tos: __u8, - pub ip_ver: __u8, - pub proto: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_tcpip6_spec { - pub ip6src: [__be32; 4usize], - pub ip6dst: [__be32; 4usize], - pub psrc: __be16, - pub pdst: __be16, - pub tclass: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_ah_espip6_spec { - pub ip6src: [__be32; 4usize], - pub ip6dst: [__be32; 4usize], - pub spi: __be32, - pub tclass: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_usrip6_spec { - pub ip6src: [__be32; 4usize], - pub ip6dst: [__be32; 4usize], - pub l4_4_bytes: __be32, - pub tclass: __u8, - pub l4_proto: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_flow_union { - pub tcp_ip4_spec: ethtool_tcpip4_spec, - pub udp_ip4_spec: ethtool_tcpip4_spec, - pub sctp_ip4_spec: ethtool_tcpip4_spec, - pub ah_ip4_spec: ethtool_ah_espip4_spec, - pub esp_ip4_spec: ethtool_ah_espip4_spec, - pub usr_ip4_spec: ethtool_usrip4_spec, - pub tcp_ip6_spec: ethtool_tcpip6_spec, - pub udp_ip6_spec: ethtool_tcpip6_spec, - pub sctp_ip6_spec: ethtool_tcpip6_spec, - pub ah_ip6_spec: ethtool_ah_espip6_spec, - pub esp_ip6_spec: ethtool_ah_espip6_spec, - pub usr_ip6_spec: ethtool_usrip6_spec, - pub ether_spec: ethhdr, - pub hdata: [__u8; 52usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_flow_ext { - pub padding: [__u8; 2usize], - pub h_dest: [::aya_bpf::cty::c_uchar; 6usize], - pub vlan_etype: __be16, - pub vlan_tci: __be16, - pub data: [__be32; 2usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_rx_flow_spec { - pub flow_type: __u32, - pub h_u: ethtool_flow_union, - pub h_ext: ethtool_flow_ext, - pub m_u: ethtool_flow_union, - pub m_ext: ethtool_flow_ext, - pub ring_cookie: __u64, - pub location: __u32, -} -#[repr(C)] -pub struct ethtool_rxnfc { - pub cmd: __u32, - pub flow_type: __u32, - pub data: __u64, - pub fs: ethtool_rx_flow_spec, - pub __bindgen_anon_1: ethtool_rxnfc__bindgen_ty_1, - pub rule_locs: __IncompleteArrayField<__u32>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_rxnfc__bindgen_ty_1 { - pub rule_cnt: __u32, - pub rss_context: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_flash { - pub cmd: __u32, - pub region: __u32, - pub data: [::aya_bpf::cty::c_char; 128usize], -} -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_dump { - pub cmd: __u32, - pub version: __u32, - pub flag: __u32, - pub len: __u32, - pub data: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_ts_info { - pub cmd: __u32, - pub so_timestamping: __u32, - pub phc_index: __s32, - pub tx_types: __u32, - pub tx_reserved: [__u32; 3usize], - pub rx_filters: __u32, - pub rx_reserved: [__u32; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_fecparam { - pub cmd: __u32, - pub active_fec: __u32, - pub fec: __u32, - pub reserved: __u32, -} -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_link_settings { - pub cmd: __u32, - pub speed: __u32, - pub duplex: __u8, - pub port: __u8, - pub phy_address: __u8, - pub autoneg: __u8, - pub mdio_support: __u8, - pub eth_tp_mdix: __u8, - pub eth_tp_mdix_ctrl: __u8, - pub link_mode_masks_nwords: __s8, - pub transceiver: __u8, - pub master_slave_cfg: __u8, - pub master_slave_state: __u8, - pub rate_matching: __u8, - pub reserved: [__u32; 7usize], - pub link_mode_masks: __IncompleteArrayField<__u32>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kernel_ethtool_ringparam { - pub rx_buf_len: u32_, - pub tcp_data_split: u8_, - pub tx_push: u8_, - pub rx_push: u8_, - pub cqe_size: u32_, - pub tx_push_buf_len: u32_, - pub tx_push_buf_max_len: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_link_ext_state_info { - pub link_ext_state: ethtool_link_ext_state::Type, - pub __bindgen_anon_1: ethtool_link_ext_state_info__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_link_ext_state_info__bindgen_ty_1 { - pub autoneg: ethtool_link_ext_substate_autoneg::Type, - pub link_training: ethtool_link_ext_substate_link_training::Type, - pub link_logical_mismatch: ethtool_link_ext_substate_link_logical_mismatch::Type, - pub bad_signal_integrity: ethtool_link_ext_substate_bad_signal_integrity::Type, - pub cable_issue: ethtool_link_ext_substate_cable_issue::Type, - pub module: ethtool_link_ext_substate_module::Type, - pub __link_ext_substate: u32_, +pub struct devlink { + pub index: u32_, + pub ports: xarray, + pub rate_list: list_head, + pub sb_list: list_head, + pub dpipe_table_list: list_head, + pub resource_list: list_head, + pub params: xarray, + pub region_list: list_head, + pub reporter_list: list_head, + pub dpipe_headers: *mut devlink_dpipe_headers, + pub trap_list: list_head, + pub trap_group_list: list_head, + pub trap_policer_list: list_head, + pub linecard_list: list_head, + pub ops: *const devlink_ops, + pub snapshot_ids: xarray, + pub stats: devlink_dev_stats, + pub dev: *mut device, + pub _net: possible_net_t, + pub lock: mutex, + pub lock_key: lock_class_key, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub refcount: refcount_t, + pub rwork: rcu_work, + pub rel: *mut devlink_rel, + pub nested_rels: xarray, + pub priv_: __IncompleteArrayField<::aya_ebpf::cty::c_char>, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_link_ext_stats { - pub link_down_events: u64_, +impl devlink { + #[inline] + pub fn reload_failed(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_reload_failed(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(reload_failed: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let reload_failed: u8 = unsafe { ::core::mem::transmute(reload_failed) }; + reload_failed as u64 + }); + __bindgen_bitfield_unit + } } -#[repr(C)] -#[derive(Debug)] -pub struct ethtool_link_ksettings { - pub base: ethtool_link_settings, - pub link_modes: ethtool_link_ksettings__bindgen_ty_1, - pub lanes: u32_, +pub mod rdma_driver_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RDMA_DRIVER_UNKNOWN: Type = 0; + pub const RDMA_DRIVER_MLX5: Type = 1; + pub const RDMA_DRIVER_MLX4: Type = 2; + pub const RDMA_DRIVER_CXGB3: Type = 3; + pub const RDMA_DRIVER_CXGB4: Type = 4; + pub const RDMA_DRIVER_MTHCA: Type = 5; + pub const RDMA_DRIVER_BNXT_RE: Type = 6; + pub const RDMA_DRIVER_OCRDMA: Type = 7; + pub const RDMA_DRIVER_NES: Type = 8; + pub const RDMA_DRIVER_I40IW: Type = 9; + pub const RDMA_DRIVER_IRDMA: Type = 9; + pub const RDMA_DRIVER_VMW_PVRDMA: Type = 10; + pub const RDMA_DRIVER_QEDR: Type = 11; + pub const RDMA_DRIVER_HNS: Type = 12; + pub const RDMA_DRIVER_USNIC: Type = 13; + pub const RDMA_DRIVER_RXE: Type = 14; + pub const RDMA_DRIVER_HFI1: Type = 15; + pub const RDMA_DRIVER_QIB: Type = 16; + pub const RDMA_DRIVER_EFA: Type = 17; + pub const RDMA_DRIVER_SIW: Type = 18; + pub const RDMA_DRIVER_ERDMA: Type = 19; + pub const RDMA_DRIVER_MANA: Type = 20; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_link_ksettings__bindgen_ty_1 { - pub supported: [::aya_bpf::cty::c_ulong; 2usize], - pub advertising: [::aya_bpf::cty::c_ulong; 2usize], - pub lp_advertising: [::aya_bpf::cty::c_ulong; 2usize], +pub mod ib_cq_notify_flags { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_CQ_SOLICITED: Type = 1; + pub const IB_CQ_NEXT_COMP: Type = 2; + pub const IB_CQ_SOLICITED_MASK: Type = 3; + pub const IB_CQ_REPORT_MISSED_EVENTS: Type = 4; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kernel_ethtool_coalesce { - pub use_cqe_mode_tx: u8_, - pub use_cqe_mode_rx: u8_, - pub tx_aggr_max_bytes: u32_, - pub tx_aggr_max_frames: u32_, - pub tx_aggr_time_usecs: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_eth_mac_stats { - pub src: ethtool_mac_stats_src::Type, - pub __bindgen_anon_1: ethtool_eth_mac_stats__bindgen_ty_1, +pub struct ib_mad { + _unused: [u8; 0], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_eth_mac_stats__bindgen_ty_1 { - pub __bindgen_anon_1: ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_1, - pub stats: ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_2, +pub mod rdma_link_layer { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_LINK_LAYER_UNSPECIFIED: Type = 0; + pub const IB_LINK_LAYER_INFINIBAND: Type = 1; + pub const IB_LINK_LAYER_ETHERNET: Type = 2; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_1 { - pub FramesTransmittedOK: u64_, - pub SingleCollisionFrames: u64_, - pub MultipleCollisionFrames: u64_, - pub FramesReceivedOK: u64_, - pub FrameCheckSequenceErrors: u64_, - pub AlignmentErrors: u64_, - pub OctetsTransmittedOK: u64_, - pub FramesWithDeferredXmissions: u64_, - pub LateCollisions: u64_, - pub FramesAbortedDueToXSColls: u64_, - pub FramesLostDueToIntMACXmitError: u64_, - pub CarrierSenseErrors: u64_, - pub OctetsReceivedOK: u64_, - pub FramesLostDueToIntMACRcvError: u64_, - pub MulticastFramesXmittedOK: u64_, - pub BroadcastFramesXmittedOK: u64_, - pub FramesWithExcessiveDeferral: u64_, - pub MulticastFramesReceivedOK: u64_, - pub BroadcastFramesReceivedOK: u64_, - pub InRangeLengthErrors: u64_, - pub OutOfRangeLengthField: u64_, - pub FrameTooLongErrors: u64_, +pub mod rdma_netdev_t { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RDMA_NETDEV_OPA_VNIC: Type = 0; + pub const RDMA_NETDEV_IPOIB: Type = 1; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_eth_mac_stats__bindgen_ty_1__bindgen_ty_2 { - pub FramesTransmittedOK: u64_, - pub SingleCollisionFrames: u64_, - pub MultipleCollisionFrames: u64_, - pub FramesReceivedOK: u64_, - pub FrameCheckSequenceErrors: u64_, - pub AlignmentErrors: u64_, - pub OctetsTransmittedOK: u64_, - pub FramesWithDeferredXmissions: u64_, - pub LateCollisions: u64_, - pub FramesAbortedDueToXSColls: u64_, - pub FramesLostDueToIntMACXmitError: u64_, - pub CarrierSenseErrors: u64_, - pub OctetsReceivedOK: u64_, - pub FramesLostDueToIntMACRcvError: u64_, - pub MulticastFramesXmittedOK: u64_, - pub BroadcastFramesXmittedOK: u64_, - pub FramesWithExcessiveDeferral: u64_, - pub MulticastFramesReceivedOK: u64_, - pub BroadcastFramesReceivedOK: u64_, - pub InRangeLengthErrors: u64_, - pub OutOfRangeLengthField: u64_, - pub FrameTooLongErrors: u64_, +pub mod ib_srq_attr_mask { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_SRQ_MAX_WR: Type = 1; + pub const IB_SRQ_LIMIT: Type = 2; } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_eth_phy_stats { - pub src: ethtool_mac_stats_src::Type, - pub __bindgen_anon_1: ethtool_eth_phy_stats__bindgen_ty_1, +pub mod ib_mr_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_MR_TYPE_MEM_REG: Type = 0; + pub const IB_MR_TYPE_SG_GAPS: Type = 1; + pub const IB_MR_TYPE_DM: Type = 2; + pub const IB_MR_TYPE_USER: Type = 3; + pub const IB_MR_TYPE_DMA: Type = 4; + pub const IB_MR_TYPE_INTEGRITY: Type = 5; } -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_eth_phy_stats__bindgen_ty_1 { - pub __bindgen_anon_1: ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_1, - pub stats: ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_2, +pub mod ib_uverbs_advise_mr_advice { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH: Type = 0; + pub const IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE: Type = 1; + pub const IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_1 { - pub SymbolErrorDuringCarrier: u64_, +pub struct uverbs_attr_bundle { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_eth_phy_stats__bindgen_ty_1__bindgen_ty_2 { - pub SymbolErrorDuringCarrier: u64_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_eth_ctrl_stats { - pub src: ethtool_mac_stats_src::Type, - pub __bindgen_anon_1: ethtool_eth_ctrl_stats__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_eth_ctrl_stats__bindgen_ty_1 { - pub __bindgen_anon_1: ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_1, - pub stats: ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_2, +pub struct rdma_cm_id { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_1 { - pub MACControlFramesTransmitted: u64_, - pub MACControlFramesReceived: u64_, - pub UnsupportedOpcodesReceived: u64_, +pub struct iw_cm_id { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_eth_ctrl_stats__bindgen_ty_1__bindgen_ty_2 { - pub MACControlFramesTransmitted: u64_, - pub MACControlFramesReceived: u64_, - pub UnsupportedOpcodesReceived: u64_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_pause_stats { - pub src: ethtool_mac_stats_src::Type, - pub __bindgen_anon_1: ethtool_pause_stats__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_pause_stats__bindgen_ty_1 { - pub __bindgen_anon_1: ethtool_pause_stats__bindgen_ty_1__bindgen_ty_1, - pub stats: ethtool_pause_stats__bindgen_ty_1__bindgen_ty_2, +pub struct iw_cm_conn_param { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ethtool_pause_stats__bindgen_ty_1__bindgen_ty_1 { - pub tx_pause_frames: u64_, - pub rx_pause_frames: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_pause_stats__bindgen_ty_1__bindgen_ty_2 { - pub tx_pause_frames: u64_, - pub rx_pause_frames: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_fec_stat { - pub total: u64_, - pub lanes: [u64_; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_fec_stats { - pub corrected_blocks: ethtool_fec_stat, - pub uncorrectable_blocks: ethtool_fec_stat, - pub corrected_bits: ethtool_fec_stat, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_rmon_hist_range { - pub low: u16_, - pub high: u16_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ethtool_rmon_stats { - pub src: ethtool_mac_stats_src::Type, - pub __bindgen_anon_1: ethtool_rmon_stats__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ethtool_rmon_stats__bindgen_ty_1 { - pub __bindgen_anon_1: ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_1, - pub stats: ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_1 { - pub undersize_pkts: u64_, - pub oversize_pkts: u64_, - pub fragments: u64_, - pub jabbers: u64_, - pub hist: [u64_; 10usize], - pub hist_tx: [u64_; 10usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_rmon_stats__bindgen_ty_1__bindgen_ty_2 { - pub undersize_pkts: u64_, - pub oversize_pkts: u64_, - pub fragments: u64_, - pub jabbers: u64_, - pub hist: [u64_; 10usize], - pub hist_tx: [u64_; 10usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_module_eeprom { - pub offset: u32_, - pub length: u32_, - pub page: u8_, - pub bank: u8_, - pub i2c_address: u8_, - pub data: *mut u8_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_module_power_mode_params { - pub policy: ethtool_module_power_mode_policy::Type, - pub mode: ethtool_module_power_mode::Type, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_mm_state { - pub verify_time: u32_, - pub max_verify_time: u32_, - pub verify_status: ethtool_mm_verify_status::Type, - pub tx_enabled: bool_, - pub tx_active: bool_, - pub pmac_enabled: bool_, - pub verify_enabled: bool_, - pub tx_min_frag_size: u32_, - pub rx_min_frag_size: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_mm_cfg { - pub verify_time: u32_, - pub verify_enabled: bool_, - pub tx_enabled: bool_, - pub pmac_enabled: bool_, - pub tx_min_frag_size: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ethtool_mm_stats { - pub MACMergeFrameAssErrorCount: u64_, - pub MACMergeFrameSmdErrorCount: u64_, - pub MACMergeFrameAssOkCount: u64_, - pub MACMergeFragCountRx: u64_, - pub MACMergeFragCountTx: u64_, - pub MACMergeHoldCount: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_notifier_info { - pub dev: *mut net_device, - pub extack: *mut netlink_ext_ack, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mptcp_mib { - pub mibs: [::aya_bpf::cty::c_ulong; 52usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct param_attribute { - pub mattr: module_attribute, - pub param: *const kernel_param, -} -#[repr(C)] -#[derive(Debug)] -pub struct module_param_attrs { - pub num: ::aya_bpf::cty::c_uint, - pub grp: attribute_group, - pub attrs: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct workqueue_attrs { - pub nice: ::aya_bpf::cty::c_int, - pub cpumask: cpumask_var_t, - pub no_numa: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct local_lock_t {} -pub mod ib_poll_context { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_POLL_SOFTIRQ: Type = 0; - pub const IB_POLL_WORKQUEUE: Type = 1; - pub const IB_POLL_UNBOUND_WORKQUEUE: Type = 2; - pub const IB_POLL_LAST_POOL_TYPE: Type = 2; - pub const IB_POLL_DIRECT: Type = 3; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct reciprocal_value { - pub m: u32_, - pub sh1: u8_, - pub sh2: u8_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ftrace_event_field { - pub link: list_head, - pub name: *const ::aya_bpf::cty::c_char, - pub type_: *const ::aya_bpf::cty::c_char, - pub filter_type: ::aya_bpf::cty::c_int, - pub offset: ::aya_bpf::cty::c_int, - pub size: ::aya_bpf::cty::c_int, - pub is_signed: ::aya_bpf::cty::c_int, - pub len: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pagevec { - pub nr: ::aya_bpf::cty::c_uchar, - pub percpu_pvec_drained: bool_, - pub pages: [*mut page; 15usize], -} -pub mod led_brightness { - pub type Type = ::aya_bpf::cty::c_uint; - pub const LED_OFF: Type = 0; - pub const LED_ON: Type = 1; - pub const LED_HALF: Type = 127; - pub const LED_FULL: Type = 255; -} -pub mod hash_algo { - pub type Type = ::aya_bpf::cty::c_uint; - pub const HASH_ALGO_MD4: Type = 0; - pub const HASH_ALGO_MD5: Type = 1; - pub const HASH_ALGO_SHA1: Type = 2; - pub const HASH_ALGO_RIPE_MD_160: Type = 3; - pub const HASH_ALGO_SHA256: Type = 4; - pub const HASH_ALGO_SHA384: Type = 5; - pub const HASH_ALGO_SHA512: Type = 6; - pub const HASH_ALGO_SHA224: Type = 7; - pub const HASH_ALGO_RIPE_MD_128: Type = 8; - pub const HASH_ALGO_RIPE_MD_256: Type = 9; - pub const HASH_ALGO_RIPE_MD_320: Type = 10; - pub const HASH_ALGO_WP_256: Type = 11; - pub const HASH_ALGO_WP_384: Type = 12; - pub const HASH_ALGO_WP_512: Type = 13; - pub const HASH_ALGO_TGR_128: Type = 14; - pub const HASH_ALGO_TGR_160: Type = 15; - pub const HASH_ALGO_TGR_192: Type = 16; - pub const HASH_ALGO_SM3_256: Type = 17; - pub const HASH_ALGO_STREEBOG_256: Type = 18; - pub const HASH_ALGO_STREEBOG_512: Type = 19; - pub const HASH_ALGO__LAST: Type = 20; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pm_domain_data { - pub list_node: list_head, - pub dev: *mut device, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rt_mutex_base { - pub wait_lock: raw_spinlock_t, - pub waiters: rb_root_cached, - pub owner: *mut task_struct, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rt_mutex { - pub rtmutex: rt_mutex_base, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct semaphore { - pub lock: raw_spinlock_t, - pub count: ::aya_bpf::cty::c_uint, - pub wait_list: list_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_tlb_mem { - pub start: phys_addr_t, - pub end: phys_addr_t, - pub vaddr: *mut ::aya_bpf::cty::c_void, - pub nslabs: ::aya_bpf::cty::c_ulong, - pub used: ::aya_bpf::cty::c_ulong, - pub debugfs: *mut dentry, - pub late_alloc: bool_, - pub force_bounce: bool_, - pub for_alloc: bool_, - pub nareas: ::aya_bpf::cty::c_uint, - pub area_nslabs: ::aya_bpf::cty::c_uint, - pub areas: *mut io_tlb_area, - pub slots: *mut io_tlb_slot, - pub total_used: atomic_long_t, - pub used_hiwater: atomic_long_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kmem_cache_order_objects { - pub x: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kmem_cache { - pub cpu_slab: *mut kmem_cache_cpu, - pub flags: slab_flags_t, - pub min_partial: ::aya_bpf::cty::c_ulong, - pub size: ::aya_bpf::cty::c_uint, - pub object_size: ::aya_bpf::cty::c_uint, - pub reciprocal_size: reciprocal_value, - pub offset: ::aya_bpf::cty::c_uint, - pub cpu_partial: ::aya_bpf::cty::c_uint, - pub cpu_partial_slabs: ::aya_bpf::cty::c_uint, - pub oo: kmem_cache_order_objects, - pub min: kmem_cache_order_objects, - pub allocflags: gfp_t, - pub refcount: ::aya_bpf::cty::c_int, - pub ctor: ::core::option::Option, - pub inuse: ::aya_bpf::cty::c_uint, - pub align: ::aya_bpf::cty::c_uint, - pub red_left_pad: ::aya_bpf::cty::c_uint, - pub name: *const ::aya_bpf::cty::c_char, - pub list: list_head, - pub kobj: kobject, - pub random: ::aya_bpf::cty::c_ulong, - pub remote_node_defrag_ratio: ::aya_bpf::cty::c_uint, - pub random_seq: *mut ::aya_bpf::cty::c_uint, - pub useroffset: ::aya_bpf::cty::c_uint, - pub usersize: ::aya_bpf::cty::c_uint, - pub node: [*mut kmem_cache_node; 32usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct slab { - pub __page_flags: ::aya_bpf::cty::c_ulong, - pub slab_cache: *mut kmem_cache, - pub __bindgen_anon_1: slab__bindgen_ty_1, - pub __unused: ::aya_bpf::cty::c_uint, - pub __page_refcount: atomic_t, - pub memcg_data: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union slab__bindgen_ty_1 { - pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1, - pub callback_head: callback_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct slab__bindgen_ty_1__bindgen_ty_1 { - pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub freelist: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_2: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub slab_list: list_head, - pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub next: *mut slab, - pub slabs: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { - pub counters: ::aya_bpf::cty::c_ulong, - pub __bindgen_anon_1: slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, -} -#[repr(C)] -#[repr(align(4))] -#[derive(Debug, Copy, Clone)] -pub struct slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - pub _bitfield_align_1: [u16; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, -} -impl slab__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { - #[inline] - pub fn inuse(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 16u8) as u32) } - } - #[inline] - pub fn set_inuse(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 16u8, val as u64) - } - } - #[inline] - pub fn objects(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 15u8) as u32) } - } - #[inline] - pub fn set_objects(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(16usize, 15u8, val as u64) - } - } - #[inline] - pub fn frozen(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(31usize, 1u8) as u32) } - } - #[inline] - pub fn set_frozen(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(31usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - inuse: ::aya_bpf::cty::c_uint, - objects: ::aya_bpf::cty::c_uint, - frozen: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 16u8, { - let inuse: u32 = unsafe { ::core::mem::transmute(inuse) }; - inuse as u64 - }); - __bindgen_bitfield_unit.set(16usize, 15u8, { - let objects: u32 = unsafe { ::core::mem::transmute(objects) }; - objects as u64 - }); - __bindgen_bitfield_unit.set(31usize, 1u8, { - let frozen: u32 = unsafe { ::core::mem::transmute(frozen) }; - frozen as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kmem_cache_cpu { - pub freelist: *mut *mut ::aya_bpf::cty::c_void, - pub tid: ::aya_bpf::cty::c_ulong, - pub slab: *mut slab, - pub partial: *mut slab, - pub lock: local_lock_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct kmem_cache_node { - pub list_lock: spinlock_t, - pub nr_partial: ::aya_bpf::cty::c_ulong, - pub partial: list_head, - pub nr_slabs: atomic_long_t, - pub total_objects: atomic_long_t, - pub full: list_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct file_lock_context { - pub flc_lock: spinlock_t, - pub flc_flock: list_head, - pub flc_posix: list_head, - pub flc_lease: list_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nlm_lockowner { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_lock_info { - pub state: u32_, - pub owner: *mut nlm_lockowner, - pub list: list_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_lock_info { - pub owner: *mut nfs4_lock_state, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct file_lock { - pub fl_blocker: *mut file_lock, - pub fl_list: list_head, - pub fl_link: hlist_node, - pub fl_blocked_requests: list_head, - pub fl_blocked_member: list_head, - pub fl_owner: fl_owner_t, - pub fl_flags: ::aya_bpf::cty::c_uint, - pub fl_type: ::aya_bpf::cty::c_uchar, - pub fl_pid: ::aya_bpf::cty::c_uint, - pub fl_link_cpu: ::aya_bpf::cty::c_int, - pub fl_wait: wait_queue_head_t, - pub fl_file: *mut file, - pub fl_start: loff_t, - pub fl_end: loff_t, - pub fl_fasync: *mut fasync_struct, - pub fl_break_time: ::aya_bpf::cty::c_ulong, - pub fl_downgrade_time: ::aya_bpf::cty::c_ulong, - pub fl_ops: *const file_lock_operations, - pub fl_lmops: *const lock_manager_operations, - pub fl_u: file_lock__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union file_lock__bindgen_ty_1 { - pub nfs_fl: nfs_lock_info, - pub nfs4_fl: nfs4_lock_info, - pub afs: file_lock__bindgen_ty_1__bindgen_ty_1, - pub ceph: file_lock__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_lock__bindgen_ty_1__bindgen_ty_1 { - pub link: list_head, - pub state: ::aya_bpf::cty::c_int, - pub debug_id: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_lock__bindgen_ty_1__bindgen_ty_2 { - pub inode: *mut inode, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_lock_operations { - pub fl_copy_lock: - ::core::option::Option, - pub fl_release_private: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct lock_manager_operations { - pub lm_mod_owner: *mut ::aya_bpf::cty::c_void, - pub lm_get_owner: ::core::option::Option fl_owner_t>, - pub lm_put_owner: ::core::option::Option, - pub lm_notify: ::core::option::Option, - pub lm_grant: ::core::option::Option< +pub struct ib_device_ops { + pub owner: *mut module, + pub driver_id: rdma_driver_id::Type, + pub uverbs_abi_ver: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub device_group: *const attribute_group, + pub port_groups: *mut *const attribute_group, + pub post_send: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file_lock, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut ib_qp, + arg2: *const ib_send_wr, + arg3: *mut *const ib_send_wr, + ) -> ::aya_ebpf::cty::c_int, >, - pub lm_break: ::core::option::Option bool_>, - pub lm_change: ::core::option::Option< + pub post_recv: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut file_lock, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut list_head, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut ib_qp, + arg2: *const ib_recv_wr, + arg3: *mut *const ib_recv_wr, + ) -> ::aya_ebpf::cty::c_int, >, - pub lm_setup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut file_lock, arg2: *mut *mut ::aya_bpf::cty::c_void), - >, - pub lm_breaker_owns_lease: - ::core::option::Option bool_>, - pub lm_lock_expirable: - ::core::option::Option bool_>, - pub lm_expire_lock: ::core::option::Option, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_sq_data { - pub refs: refcount_t, - pub park_pending: atomic_t, - pub lock: mutex, - pub ctx_list: list_head, - pub thread: *mut task_struct, - pub wait: wait_queue_head, - pub sq_thread_idle: ::aya_bpf::cty::c_uint, - pub sq_cpu: ::aya_bpf::cty::c_int, - pub task_pid: pid_t, - pub task_tgid: pid_t, - pub state: ::aya_bpf::cty::c_ulong, - pub exited: completion, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct badblocks { - pub dev: *mut device, - pub count: ::aya_bpf::cty::c_int, - pub unacked_exist: ::aya_bpf::cty::c_int, - pub shift: ::aya_bpf::cty::c_int, - pub page: *mut u64_, - pub changed: ::aya_bpf::cty::c_int, - pub lock: seqlock_t, - pub sector: sector_t, - pub size: sector_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_param { - pub value: __s32, - pub fixed: __u8, - pub disabled: __u8, - pub flags: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_point { - pub pointer: *mut ::aya_bpf::cty::c_void, - pub length: __u16, - pub flags: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_freq { - pub m: __s32, - pub e: __s16, - pub i: __u8, - pub flags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_quality { - pub qual: __u8, - pub level: __u8, - pub noise: __u8, - pub updated: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_discarded { - pub nwid: __u32, - pub code: __u32, - pub fragment: __u32, - pub retries: __u32, - pub misc: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_missed { - pub beacon: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_statistics { - pub status: __u16, - pub qual: iw_quality, - pub discard: iw_discarded, - pub miss: iw_missed, -} -#[repr(C)] -pub struct iwreq_data { - pub name: __BindgenUnionField<[::aya_bpf::cty::c_char; 16usize]>, - pub essid: __BindgenUnionField, - pub nwid: __BindgenUnionField, - pub freq: __BindgenUnionField, - pub sens: __BindgenUnionField, - pub bitrate: __BindgenUnionField, - pub txpower: __BindgenUnionField, - pub rts: __BindgenUnionField, - pub frag: __BindgenUnionField, - pub mode: __BindgenUnionField<__u32>, - pub retry: __BindgenUnionField, - pub encoding: __BindgenUnionField, - pub power: __BindgenUnionField, - pub qual: __BindgenUnionField, - pub ap_addr: __BindgenUnionField, - pub addr: __BindgenUnionField, - pub param: __BindgenUnionField, - pub data: __BindgenUnionField, - pub bindgen_union_field: [u64; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_priv_args { - pub cmd: __u32, - pub set_args: __u16, - pub get_args: __u16, - pub name: [::aya_bpf::cty::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct libipw_device { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_public_data { - pub spy_data: *mut iw_spy_data, - pub libipw: *mut libipw_device, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_request_info { - pub cmd: __u16, - pub flags: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_spy_data { - pub spy_number: ::aya_bpf::cty::c_int, - pub spy_address: [u_char; 48usize], - pub spy_stat: [iw_quality; 8usize], - pub spy_thr_low: iw_quality, - pub spy_thr_high: iw_quality, - pub spy_thr_under: [u_char; 8usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct posix_acl_entry { - pub e_tag: ::aya_bpf::cty::c_short, - pub e_perm: ::aya_bpf::cty::c_ushort, - pub __bindgen_anon_1: posix_acl_entry__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union posix_acl_entry__bindgen_ty_1 { - pub e_uid: kuid_t, - pub e_gid: kgid_t, -} -#[repr(C)] -pub struct posix_acl { - pub a_refcount: refcount_t, - pub a_rcu: callback_head, - pub a_count: ::aya_bpf::cty::c_uint, - pub a_entries: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct hd_geometry { - pub heads: ::aya_bpf::cty::c_uchar, - pub sectors: ::aya_bpf::cty::c_uchar, - pub cylinders: ::aya_bpf::cty::c_ushort, - pub start: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -pub struct xsk_buff_pool { - pub dev: *mut device, - pub netdev: *mut net_device, - pub xsk_tx_list: list_head, - pub xsk_tx_list_lock: spinlock_t, - pub users: refcount_t, - pub umem: *mut xdp_umem, - pub work: work_struct, - pub free_list: list_head, - pub heads_cnt: u32_, - pub queue_id: u16_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub fq: *mut xsk_queue, - pub cq: *mut xsk_queue, - pub dma_pages: *mut dma_addr_t, - pub heads: *mut xdp_buff_xsk, - pub tx_descs: *mut xdp_desc, - pub chunk_mask: u64_, - pub addrs_cnt: u64_, - pub free_list_cnt: u32_, - pub dma_pages_cnt: u32_, - pub free_heads_cnt: u32_, - pub headroom: u32_, - pub chunk_size: u32_, - pub chunk_shift: u32_, - pub frame_len: u32_, - pub cached_need_wakeup: u8_, - pub uses_need_wakeup: bool_, - pub dma_need_sync: bool_, - pub unaligned: bool_, - pub addrs: *mut ::aya_bpf::cty::c_void, - pub cq_lock: spinlock_t, - pub free_heads: __IncompleteArrayField<*mut xdp_buff_xsk>, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, -} -impl xsk_buff_pool { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_desc { - pub addr: __u64, - pub len: __u32, - pub options: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_buff_xsk { - pub xdp: xdp_buff, - pub cb: [u8_; 24usize], - pub dma: dma_addr_t, - pub frame_dma: dma_addr_t, - pub pool: *mut xsk_buff_pool, - pub orig_addr: u64_, - pub free_list_node: list_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_prepared_key { - pub tfm: *mut crypto_skcipher, - pub blk_key: *mut blk_crypto_key, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_info { - pub ci_enc_key: fscrypt_prepared_key, - pub ci_owns_key: bool_, - pub ci_inlinecrypt: bool_, - pub ci_mode: *mut fscrypt_mode, - pub ci_inode: *mut inode, - pub ci_master_key: *mut fscrypt_master_key, - pub ci_master_key_link: list_head, - pub ci_direct_key: *mut fscrypt_direct_key, - pub ci_dirhash_key: siphash_key_t, - pub ci_dirhash_key_initialized: bool_, - pub ci_policy: fscrypt_policy, - pub ci_nonce: [u8_; 16usize], - pub ci_hashed_ino: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_key_specifier { - pub type_: __u32, - pub __reserved: __u32, - pub u: fscrypt_key_specifier__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fscrypt_key_specifier__bindgen_ty_1 { - pub __reserved: [__u8; 32usize], - pub descriptor: [__u8; 8usize], - pub identifier: [__u8; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_mode { - pub friendly_name: *const ::aya_bpf::cty::c_char, - pub cipher_str: *const ::aya_bpf::cty::c_char, - pub keysize: ::aya_bpf::cty::c_int, - pub security_strength: ::aya_bpf::cty::c_int, - pub ivsize: ::aya_bpf::cty::c_int, - pub logged_cryptoapi_impl: ::aya_bpf::cty::c_int, - pub logged_blk_crypto_native: ::aya_bpf::cty::c_int, - pub logged_blk_crypto_fallback: ::aya_bpf::cty::c_int, - pub blk_crypto_mode: blk_crypto_mode_num::Type, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_hkdf { - pub hmac_tfm: *mut crypto_shash, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_master_key_secret { - pub hkdf: fscrypt_hkdf, - pub size: u32_, - pub raw: [u8_; 64usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_master_key { - pub mk_node: hlist_node, - pub mk_sem: rw_semaphore, - pub mk_active_refs: refcount_t, - pub mk_struct_refs: refcount_t, - pub mk_rcu_head: callback_head, - pub mk_secret: fscrypt_master_key_secret, - pub mk_spec: fscrypt_key_specifier, - pub mk_users: *mut key, - pub mk_decrypted_inodes: list_head, - pub mk_decrypted_inodes_lock: spinlock_t, - pub mk_direct_keys: [fscrypt_prepared_key; 11usize], - pub mk_iv_ino_lblk_64_keys: [fscrypt_prepared_key; 11usize], - pub mk_iv_ino_lblk_32_keys: [fscrypt_prepared_key; 11usize], - pub mk_ino_hash_key: siphash_key_t, - pub mk_ino_hash_key_initialized: bool_, -} -pub type irq_poll_fn = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut irq_poll, arg2: ::aya_bpf::cty::c_int) -> ::aya_bpf::cty::c_int, ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct irq_poll { - pub list: list_head, - pub state: ::aya_bpf::cty::c_ulong, - pub weight: ::aya_bpf::cty::c_int, - pub poll: irq_poll_fn, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rdma_cgroup { - pub css: cgroup_subsys_state, - pub rpools: list_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rdmacg_device { - pub dev_node: list_head, - pub rpools: list_head, - pub name: *mut ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dim_sample { - pub time: ktime_t, - pub pkt_ctr: u32_, - pub byte_ctr: u32_, - pub event_ctr: u16_, - pub comp_ctr: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dim_stats { - pub ppms: ::aya_bpf::cty::c_int, - pub bpms: ::aya_bpf::cty::c_int, - pub epms: ::aya_bpf::cty::c_int, - pub cpms: ::aya_bpf::cty::c_int, - pub cpe_ratio: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dim { - pub state: u8_, - pub prev_stats: dim_stats, - pub start_sample: dim_sample, - pub measuring_sample: dim_sample, - pub work: work_struct, - pub priv_: *mut ::aya_bpf::cty::c_void, - pub profile_ix: u8_, - pub mode: u8_, - pub tune_state: u8_, - pub steps_right: u8_, - pub steps_left: u8_, - pub tired: u8_, -} -pub mod rdma_nl_counter_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RDMA_COUNTER_MODE_NONE: Type = 0; - pub const RDMA_COUNTER_MODE_AUTO: Type = 1; - pub const RDMA_COUNTER_MODE_MANUAL: Type = 2; - pub const RDMA_COUNTER_MODE_MAX: Type = 3; -} -pub mod rdma_nl_counter_mask { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RDMA_COUNTER_MASK_QP_TYPE: Type = 1; - pub const RDMA_COUNTER_MASK_PID: Type = 2; -} -pub mod rdma_restrack_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RDMA_RESTRACK_PD: Type = 0; - pub const RDMA_RESTRACK_CQ: Type = 1; - pub const RDMA_RESTRACK_QP: Type = 2; - pub const RDMA_RESTRACK_CM_ID: Type = 3; - pub const RDMA_RESTRACK_MR: Type = 4; - pub const RDMA_RESTRACK_CTX: Type = 5; - pub const RDMA_RESTRACK_COUNTER: Type = 6; - pub const RDMA_RESTRACK_SRQ: Type = 7; - pub const RDMA_RESTRACK_MAX: Type = 8; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rdma_restrack_entry { - pub valid: bool_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub kref: kref, - pub comp: completion, - pub task: *mut task_struct, - pub kern_name: *const ::aya_bpf::cty::c_char, - pub type_: rdma_restrack_type::Type, - pub user: bool_, - pub id: u32_, -} -impl rdma_restrack_entry { - #[inline] - pub fn no_track(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_no_track(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(no_track: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let no_track: u8 = unsafe { ::core::mem::transmute(no_track) }; - no_track as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rdma_link_ops { - pub list: list_head, - pub type_: *const ::aya_bpf::cty::c_char, - pub newlink: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_char, - arg2: *mut net_device, - ) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct auto_mode_param { - pub qp_type: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rdma_counter_mode { - pub mode: rdma_nl_counter_mode::Type, - pub mask: rdma_nl_counter_mask::Type, - pub param: auto_mode_param, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rdma_port_counter { - pub mode: rdma_counter_mode, - pub hstats: *mut rdma_hw_stats, - pub num_counters: ::aya_bpf::cty::c_uint, - pub lock: mutex, -} -#[repr(C)] -pub struct rdma_hw_stats { - pub lock: mutex, - pub timestamp: ::aya_bpf::cty::c_ulong, - pub lifespan: ::aya_bpf::cty::c_ulong, - pub descs: *const rdma_stat_desc, - pub is_disabled: *mut ::aya_bpf::cty::c_ulong, - pub num_counters: ::aya_bpf::cty::c_int, - pub value: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rdma_counter { - pub res: rdma_restrack_entry, - pub device: *mut ib_device, - pub id: u32, - pub kref: kref, - pub mode: rdma_counter_mode, - pub lock: mutex, - pub stats: *mut rdma_hw_stats, - pub port: u32_, -} -pub mod rdma_driver_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RDMA_DRIVER_UNKNOWN: Type = 0; - pub const RDMA_DRIVER_MLX5: Type = 1; - pub const RDMA_DRIVER_MLX4: Type = 2; - pub const RDMA_DRIVER_CXGB3: Type = 3; - pub const RDMA_DRIVER_CXGB4: Type = 4; - pub const RDMA_DRIVER_MTHCA: Type = 5; - pub const RDMA_DRIVER_BNXT_RE: Type = 6; - pub const RDMA_DRIVER_OCRDMA: Type = 7; - pub const RDMA_DRIVER_NES: Type = 8; - pub const RDMA_DRIVER_I40IW: Type = 9; - pub const RDMA_DRIVER_IRDMA: Type = 9; - pub const RDMA_DRIVER_VMW_PVRDMA: Type = 10; - pub const RDMA_DRIVER_QEDR: Type = 11; - pub const RDMA_DRIVER_HNS: Type = 12; - pub const RDMA_DRIVER_USNIC: Type = 13; - pub const RDMA_DRIVER_RXE: Type = 14; - pub const RDMA_DRIVER_HFI1: Type = 15; - pub const RDMA_DRIVER_QIB: Type = 16; - pub const RDMA_DRIVER_EFA: Type = 17; - pub const RDMA_DRIVER_SIW: Type = 18; - pub const RDMA_DRIVER_ERDMA: Type = 19; - pub const RDMA_DRIVER_MANA: Type = 20; -} -pub mod ib_cq_notify_flags { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_CQ_SOLICITED: Type = 1; - pub const IB_CQ_NEXT_COMP: Type = 2; - pub const IB_CQ_SOLICITED_MASK: Type = 3; - pub const IB_CQ_REPORT_MISSED_EVENTS: Type = 4; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_mad { - _unused: [u8; 0], -} -pub mod rdma_link_layer { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_LINK_LAYER_UNSPECIFIED: Type = 0; - pub const IB_LINK_LAYER_INFINIBAND: Type = 1; - pub const IB_LINK_LAYER_ETHERNET: Type = 2; -} -pub mod rdma_netdev_t { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RDMA_NETDEV_OPA_VNIC: Type = 0; - pub const RDMA_NETDEV_IPOIB: Type = 1; -} -pub mod ib_srq_attr_mask { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_SRQ_MAX_WR: Type = 1; - pub const IB_SRQ_LIMIT: Type = 2; -} -pub mod ib_mr_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_MR_TYPE_MEM_REG: Type = 0; - pub const IB_MR_TYPE_SG_GAPS: Type = 1; - pub const IB_MR_TYPE_DM: Type = 2; - pub const IB_MR_TYPE_USER: Type = 3; - pub const IB_MR_TYPE_DMA: Type = 4; - pub const IB_MR_TYPE_INTEGRITY: Type = 5; -} -pub mod ib_uverbs_advise_mr_advice { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH: Type = 0; - pub const IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE: Type = 1; - pub const IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT: Type = 2; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uverbs_attr_bundle { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rdma_cm_id { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_cm_id { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iw_cm_conn_param { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_device_ops { - pub owner: *mut module, - pub driver_id: rdma_driver_id::Type, - pub uverbs_abi_ver: u32_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub device_group: *const attribute_group, - pub port_groups: *mut *const attribute_group, - pub post_send: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ib_qp, - arg2: *const ib_send_wr, - arg3: *mut *const ib_send_wr, - ) -> ::aya_bpf::cty::c_int, - >, - pub post_recv: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ib_qp, - arg2: *const ib_recv_wr, - arg3: *mut *const ib_recv_wr, - ) -> ::aya_bpf::cty::c_int, - >, - pub drain_rq: ::core::option::Option, - pub drain_sq: ::core::option::Option, - pub poll_cq: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ib_cq, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ib_wc, - ) -> ::aya_bpf::cty::c_int, + pub drain_rq: ::core::option::Option, + pub drain_sq: ::core::option::Option, + pub poll_cq: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ib_cq, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ib_wc, + ) -> ::aya_ebpf::cty::c_int, >, pub peek_cq: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_cq, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub req_notify_cq: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_cq, arg2: ib_cq_notify_flags::Type, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub post_srq_recv: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_srq, arg2: *const ib_recv_wr, arg3: *mut *const ib_recv_wr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub process_mad: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u32_, arg4: *const ib_wc, arg5: *const ib_grh, @@ -31435,49 +30451,49 @@ pub struct ib_device_ops { arg7: *mut ib_mad, arg8: *mut usize, arg9: *mut u16_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub query_device: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: *mut ib_device_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_device: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: *mut ib_device_modify, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_dev_fw_str: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_device, arg2: *mut ::aya_bpf::cty::c_char), + unsafe extern "C" fn(arg1: *mut ib_device, arg2: *mut ::aya_ebpf::cty::c_char), >, pub get_vector_affinity: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_device, arg2: ::aya_bpf::cty::c_int) -> *const cpumask, + unsafe extern "C" fn(arg1: *mut ib_device, arg2: ::aya_ebpf::cty::c_int) -> *const cpumask, >, pub query_port: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: u32_, arg3: *mut ib_port_attr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_port: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: u32_, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: *mut ib_port_modify, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_port_immutable: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: u32_, arg3: *mut ib_port_immutable, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_link_layer: ::core::option::Option< unsafe extern "C" fn(arg1: *mut ib_device, arg2: u32_) -> rdma_link_layer::Type, @@ -31490,8 +30506,8 @@ pub struct ib_device_ops { arg1: *mut ib_device, arg2: u32_, arg3: rdma_netdev_t::Type, - arg4: *const ::aya_bpf::cty::c_char, - arg5: ::aya_bpf::cty::c_uchar, + arg4: *const ::aya_ebpf::cty::c_char, + arg5: ::aya_ebpf::cty::c_uchar, arg6: ::core::option::Option, ) -> *mut net_device, >, @@ -31501,27 +30517,27 @@ pub struct ib_device_ops { arg2: u32_, arg3: rdma_netdev_t::Type, arg4: *mut rdma_netdev_alloc_params, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub query_gid: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: u32_, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: *mut ib_gid, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub add_gid: ::core::option::Option< unsafe extern "C" fn( arg1: *const ib_gid_attr, - arg2: *mut *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub del_gid: ::core::option::Option< unsafe extern "C" fn( arg1: *const ib_gid_attr, - arg2: *mut *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg2: *mut *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, pub query_pkey: ::core::option::Option< unsafe extern "C" fn( @@ -31529,55 +30545,55 @@ pub struct ib_device_ops { arg2: u32_, arg3: u16_, arg4: *mut u16_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub alloc_ucontext: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_ucontext, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_ucontext, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub dealloc_ucontext: ::core::option::Option, pub mmap: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_ucontext, arg2: *mut vm_area_struct, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub mmap_free: ::core::option::Option, pub disassociate_ucontext: ::core::option::Option, pub alloc_pd: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_pd, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_pd, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub dealloc_pd: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_pd, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_pd, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub create_ah: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_ah, arg2: *mut rdma_ah_init_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub create_user_ah: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_ah, arg2: *mut rdma_ah_init_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_ah: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_ah, arg2: *mut rdma_ah_attr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_ah, arg2: *mut rdma_ah_attr) -> ::aya_ebpf::cty::c_int, >, pub query_ah: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_ah, arg2: *mut rdma_ah_attr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_ah, arg2: *mut rdma_ah_attr) -> ::aya_ebpf::cty::c_int, >, pub destroy_ah: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_ah, arg2: u32_) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_ah, arg2: u32_) -> ::aya_ebpf::cty::c_int, >, pub create_srq: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_srq, arg2: *mut ib_srq_init_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_srq: ::core::option::Option< unsafe extern "C" fn( @@ -31585,62 +30601,62 @@ pub struct ib_device_ops { arg2: *mut ib_srq_attr, arg3: ib_srq_attr_mask::Type, arg4: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub query_srq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_srq, arg2: *mut ib_srq_attr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_srq, arg2: *mut ib_srq_attr) -> ::aya_ebpf::cty::c_int, >, pub destroy_srq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_srq, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_srq, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub create_qp: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_qp, arg2: *mut ib_qp_init_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_qp: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_qp, arg2: *mut ib_qp_attr, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub query_qp: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_qp, arg2: *mut ib_qp_attr, - arg3: ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, arg4: *mut ib_qp_init_attr, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub destroy_qp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_qp, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_qp, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub create_cq: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_cq, arg2: *const ib_cq_init_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_cq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_cq, arg2: u16_, arg3: u16_) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_cq, arg2: u16_, arg3: u16_) -> ::aya_ebpf::cty::c_int, >, pub destroy_cq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_cq, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_cq, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub resize_cq: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_cq, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_dma_mr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_pd, arg2: ::aya_bpf::cty::c_int) -> *mut ib_mr, + unsafe extern "C" fn(arg1: *mut ib_pd, arg2: ::aya_ebpf::cty::c_int) -> *mut ib_mr, >, pub reg_user_mr: ::core::option::Option< unsafe extern "C" fn( @@ -31648,7 +30664,7 @@ pub struct ib_device_ops { arg2: u64_, arg3: u64_, arg4: u64_, - arg5: ::aya_bpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_int, arg6: *mut ib_udata, ) -> *mut ib_mr, >, @@ -31658,25 +30674,25 @@ pub struct ib_device_ops { arg2: u64_, arg3: u64_, arg4: u64_, - arg5: ::aya_bpf::cty::c_int, - arg6: ::aya_bpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_int, + arg6: ::aya_ebpf::cty::c_int, arg7: *mut ib_udata, ) -> *mut ib_mr, >, pub rereg_user_mr: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_mr, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u64_, arg4: u64_, arg5: u64_, - arg6: ::aya_bpf::cty::c_int, + arg6: ::aya_ebpf::cty::c_int, arg7: *mut ib_pd, arg8: *mut ib_udata, ) -> *mut ib_mr, >, pub dereg_mr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_mr, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_mr, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub alloc_mr: ::core::option::Option< unsafe extern "C" fn(arg1: *mut ib_pd, arg2: ib_mr_type::Type, arg3: u32_) -> *mut ib_mr, @@ -31692,47 +30708,47 @@ pub struct ib_device_ops { arg4: *mut ib_sge, arg5: u32_, arg6: *mut uverbs_attr_bundle, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_mr_sg: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_mr, arg2: *mut scatterlist, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, pub check_mr_status: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_mr, arg2: u32_, arg3: *mut ib_mr_status, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub alloc_mw: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_mw, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_mw, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub dealloc_mw: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub attach_mcast: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_qp, arg2: *mut ib_gid, arg3: u16_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub detach_mcast: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_qp, arg2: *mut ib_gid, arg3: u16_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub alloc_xrcd: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_xrcd, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_xrcd, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub dealloc_xrcd: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_xrcd, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_xrcd, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub create_flow: ::core::option::Option< unsafe extern "C" fn( @@ -31742,51 +30758,51 @@ pub struct ib_device_ops { ) -> *mut ib_flow, >, pub destroy_flow: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub destroy_flow_action: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_flow_action) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_flow_action) -> ::aya_ebpf::cty::c_int, >, pub set_vf_link_state: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u32_, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_vf_config: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u32_, arg4: *mut ifla_vf_info, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_vf_stats: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u32_, arg4: *mut ifla_vf_stats, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub get_vf_guid: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u32_, arg4: *mut ifla_vf_guid, arg5: *mut ifla_vf_guid, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub set_vf_guid: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, - arg2: ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, arg3: u32_, arg4: u64_, - arg5: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub create_wq: ::core::option::Option< unsafe extern "C" fn( @@ -31796,7 +30812,7 @@ pub struct ib_device_ops { ) -> *mut ib_wq, >, pub destroy_wq: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_wq, arg2: *mut ib_udata) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_wq, arg2: *mut ib_udata) -> ::aya_ebpf::cty::c_int, >, pub modify_wq: ::core::option::Option< unsafe extern "C" fn( @@ -31804,17 +30820,17 @@ pub struct ib_device_ops { arg2: *mut ib_wq_attr, arg3: u32_, arg4: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub create_rwq_ind_table: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_rwq_ind_table, arg2: *mut ib_rwq_ind_table_init_attr, arg3: *mut ib_udata, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub destroy_rwq_ind_table: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_rwq_ind_table) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_rwq_ind_table) -> ::aya_ebpf::cty::c_int, >, pub alloc_dm: ::core::option::Option< unsafe extern "C" fn( @@ -31828,7 +30844,7 @@ pub struct ib_device_ops { unsafe extern "C" fn( arg1: *mut ib_dm, arg2: *mut uverbs_attr_bundle, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub reg_dm_mr: ::core::option::Option< unsafe extern "C" fn( @@ -31842,28 +30858,28 @@ pub struct ib_device_ops { unsafe extern "C" fn( arg1: *mut ib_counters, arg2: *mut uverbs_attr_bundle, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub destroy_counters: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_counters) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut ib_counters) -> ::aya_ebpf::cty::c_int, >, pub read_counters: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_counters, arg2: *mut ib_counters_read_attr, arg3: *mut uverbs_attr_bundle, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub map_mr_sg_pi: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_mr, arg2: *mut scatterlist, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut ::aya_bpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_uint, arg5: *mut scatterlist, - arg6: ::aya_bpf::cty::c_int, - arg7: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg6: ::aya_ebpf::cty::c_int, + arg7: *mut ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, >, pub alloc_hw_device_stats: ::core::option::Option *mut rdma_hw_stats>, @@ -31875,97 +30891,105 @@ pub struct ib_device_ops { arg1: *mut ib_device, arg2: *mut rdma_hw_stats, arg3: u32_, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub modify_hw_stat: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: u32_, - arg3: ::aya_bpf::cty::c_uint, + arg3: ::aya_ebpf::cty::c_uint, arg4: bool_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub fill_res_mr_entry: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_mr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_mr) -> ::aya_ebpf::cty::c_int, >, pub fill_res_mr_entry_raw: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_mr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_mr) -> ::aya_ebpf::cty::c_int, >, pub fill_res_cq_entry: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_cq) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_cq) -> ::aya_ebpf::cty::c_int, >, pub fill_res_cq_entry_raw: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_cq) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_cq) -> ::aya_ebpf::cty::c_int, >, pub fill_res_qp_entry: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_qp) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_qp) -> ::aya_ebpf::cty::c_int, >, pub fill_res_qp_entry_raw: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_qp) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_qp) -> ::aya_ebpf::cty::c_int, >, pub fill_res_cm_id_entry: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut rdma_cm_id) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut rdma_cm_id) -> ::aya_ebpf::cty::c_int, + >, + pub fill_res_srq_entry: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_srq) -> ::aya_ebpf::cty::c_int, + >, + pub fill_res_srq_entry_raw: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_srq) -> ::aya_ebpf::cty::c_int, + >, + pub enable_driver: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_device) -> ::aya_ebpf::cty::c_int, >, - pub enable_driver: - ::core::option::Option ::aya_bpf::cty::c_int>, pub dealloc_driver: ::core::option::Option, pub iw_add_ref: ::core::option::Option, pub iw_rem_ref: ::core::option::Option, pub iw_get_qp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_device, arg2: ::aya_bpf::cty::c_int) -> *mut ib_qp, + unsafe extern "C" fn(arg1: *mut ib_device, arg2: ::aya_ebpf::cty::c_int) -> *mut ib_qp, >, pub iw_connect: ::core::option::Option< unsafe extern "C" fn( arg1: *mut iw_cm_id, arg2: *mut iw_cm_conn_param, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub iw_accept: ::core::option::Option< unsafe extern "C" fn( arg1: *mut iw_cm_id, arg2: *mut iw_cm_conn_param, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub iw_reject: ::core::option::Option< unsafe extern "C" fn( arg1: *mut iw_cm_id, - arg2: *const ::aya_bpf::cty::c_void, + arg2: *const ::aya_ebpf::cty::c_void, arg3: u8_, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub iw_create_listen: ::core::option::Option< unsafe extern "C" fn( arg1: *mut iw_cm_id, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, pub iw_destroy_listen: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub counter_bind_qp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rdma_counter, arg2: *mut ib_qp) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut rdma_counter, arg2: *mut ib_qp) -> ::aya_ebpf::cty::c_int, >, pub counter_unbind_qp: - ::core::option::Option ::aya_bpf::cty::c_int>, + ::core::option::Option ::aya_ebpf::cty::c_int>, pub counter_dealloc: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rdma_counter) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut rdma_counter) -> ::aya_ebpf::cty::c_int, >, pub counter_alloc_stats: ::core::option::Option *mut rdma_hw_stats>, pub counter_update_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rdma_counter) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut rdma_counter) -> ::aya_ebpf::cty::c_int, >, pub fill_stat_mr_entry: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_mr) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut ib_mr) -> ::aya_ebpf::cty::c_int, >, pub query_ucontext: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_ucontext, arg2: *mut uverbs_attr_bundle, - ) -> ::aya_bpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_numa_node: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_device) -> ::aya_ebpf::cty::c_int, >, - pub get_numa_node: - ::core::option::Option ::aya_bpf::cty::c_int>, pub size_ib_ah: usize, pub size_ib_counters: usize, pub size_ib_cq: usize, @@ -31979,11 +31003,11 @@ pub struct ib_device_ops { } impl ib_device_ops { #[inline] - pub fn uverbs_no_driver_id_binding(&self) -> ::aya_bpf::cty::c_uint { + pub fn uverbs_no_driver_id_binding(&self) -> ::aya_ebpf::cty::c_uint { unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_uverbs_no_driver_id_binding(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_uverbs_no_driver_id_binding(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) @@ -31991,7 +31015,7 @@ impl ib_device_ops { } #[inline] pub fn new_bitfield_1( - uverbs_no_driver_id_binding: ::aya_bpf::cty::c_uint, + uverbs_no_driver_id_binding: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { @@ -32012,7 +31036,7 @@ pub struct ib_core_device { pub owner: *mut ib_device, } pub mod ib_atomic_cap { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const IB_ATOMIC_NONE: Type = 0; pub const IB_ATOMIC_HCA: Type = 1; pub const IB_ATOMIC_GLOB: Type = 2; @@ -32063,42 +31087,42 @@ pub struct ib_device_attr { pub vendor_id: u32_, pub vendor_part_id: u32_, pub hw_ver: u32_, - pub max_qp: ::aya_bpf::cty::c_int, - pub max_qp_wr: ::aya_bpf::cty::c_int, + pub max_qp: ::aya_ebpf::cty::c_int, + pub max_qp_wr: ::aya_ebpf::cty::c_int, pub device_cap_flags: u64_, pub kernel_cap_flags: u64_, - pub max_send_sge: ::aya_bpf::cty::c_int, - pub max_recv_sge: ::aya_bpf::cty::c_int, - pub max_sge_rd: ::aya_bpf::cty::c_int, - pub max_cq: ::aya_bpf::cty::c_int, - pub max_cqe: ::aya_bpf::cty::c_int, - pub max_mr: ::aya_bpf::cty::c_int, - pub max_pd: ::aya_bpf::cty::c_int, - pub max_qp_rd_atom: ::aya_bpf::cty::c_int, - pub max_ee_rd_atom: ::aya_bpf::cty::c_int, - pub max_res_rd_atom: ::aya_bpf::cty::c_int, - pub max_qp_init_rd_atom: ::aya_bpf::cty::c_int, - pub max_ee_init_rd_atom: ::aya_bpf::cty::c_int, + pub max_send_sge: ::aya_ebpf::cty::c_int, + pub max_recv_sge: ::aya_ebpf::cty::c_int, + pub max_sge_rd: ::aya_ebpf::cty::c_int, + pub max_cq: ::aya_ebpf::cty::c_int, + pub max_cqe: ::aya_ebpf::cty::c_int, + pub max_mr: ::aya_ebpf::cty::c_int, + pub max_pd: ::aya_ebpf::cty::c_int, + pub max_qp_rd_atom: ::aya_ebpf::cty::c_int, + pub max_ee_rd_atom: ::aya_ebpf::cty::c_int, + pub max_res_rd_atom: ::aya_ebpf::cty::c_int, + pub max_qp_init_rd_atom: ::aya_ebpf::cty::c_int, + pub max_ee_init_rd_atom: ::aya_ebpf::cty::c_int, pub atomic_cap: ib_atomic_cap::Type, pub masked_atomic_cap: ib_atomic_cap::Type, - pub max_ee: ::aya_bpf::cty::c_int, - pub max_rdd: ::aya_bpf::cty::c_int, - pub max_mw: ::aya_bpf::cty::c_int, - pub max_raw_ipv6_qp: ::aya_bpf::cty::c_int, - pub max_raw_ethy_qp: ::aya_bpf::cty::c_int, - pub max_mcast_grp: ::aya_bpf::cty::c_int, - pub max_mcast_qp_attach: ::aya_bpf::cty::c_int, - pub max_total_mcast_qp_attach: ::aya_bpf::cty::c_int, - pub max_ah: ::aya_bpf::cty::c_int, - pub max_srq: ::aya_bpf::cty::c_int, - pub max_srq_wr: ::aya_bpf::cty::c_int, - pub max_srq_sge: ::aya_bpf::cty::c_int, - pub max_fast_reg_page_list_len: ::aya_bpf::cty::c_uint, - pub max_pi_fast_reg_page_list_len: ::aya_bpf::cty::c_uint, + pub max_ee: ::aya_ebpf::cty::c_int, + pub max_rdd: ::aya_ebpf::cty::c_int, + pub max_mw: ::aya_ebpf::cty::c_int, + pub max_raw_ipv6_qp: ::aya_ebpf::cty::c_int, + pub max_raw_ethy_qp: ::aya_ebpf::cty::c_int, + pub max_mcast_grp: ::aya_ebpf::cty::c_int, + pub max_mcast_qp_attach: ::aya_ebpf::cty::c_int, + pub max_total_mcast_qp_attach: ::aya_ebpf::cty::c_int, + pub max_ah: ::aya_ebpf::cty::c_int, + pub max_srq: ::aya_ebpf::cty::c_int, + pub max_srq_wr: ::aya_ebpf::cty::c_int, + pub max_srq_sge: ::aya_ebpf::cty::c_int, + pub max_fast_reg_page_list_len: ::aya_ebpf::cty::c_uint, + pub max_pi_fast_reg_page_list_len: ::aya_ebpf::cty::c_uint, pub max_pkeys: u16_, pub local_ca_ack_delay: u8_, - pub sig_prot_cap: ::aya_bpf::cty::c_int, - pub sig_guard_cap: ::aya_bpf::cty::c_int, + pub sig_prot_cap: ::aya_ebpf::cty::c_int, + pub sig_guard_cap: ::aya_ebpf::cty::c_int, pub odp_caps: ib_odp_caps, pub timestamp_mask: u64, pub hca_core_clock: u64, @@ -32117,6 +31141,13 @@ pub struct hw_stats_device_data { } #[repr(C)] #[derive(Debug, Copy, Clone)] +pub struct rdmacg_device { + pub dev_node: list_head, + pub rpools: list_head, + pub name: *mut ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct rdma_restrack_root { _unused: [u8; 0], } @@ -32130,7 +31161,7 @@ pub struct uapi_definition { pub struct ib_device { pub dma_device: *mut device, pub ops: ib_device_ops, - pub name: [::aya_bpf::cty::c_char; 64usize], + pub name: [::aya_ebpf::cty::c_char; 64usize], pub callback_head: callback_head, pub event_handler_list: list_head, pub event_handler_rwsem: rw_semaphore, @@ -32140,11 +31171,11 @@ pub struct ib_device { pub unregistration_lock: mutex, pub cache_lock: rwlock_t, pub port_data: *mut ib_port_data, - pub num_comp_vectors: ::aya_bpf::cty::c_int, + pub num_comp_vectors: ::aya_ebpf::cty::c_int, pub __bindgen_anon_1: ib_device__bindgen_ty_1, pub groups: [*const attribute_group; 4usize], pub uverbs_cmd_mask: u64_, - pub node_desc: [::aya_bpf::cty::c_char; 64usize], + pub node_desc: [::aya_ebpf::cty::c_char; 64usize], pub node_guid: __be64, pub local_dma_lkey: u32_, pub _bitfield_align_1: [u8; 0], @@ -32165,7 +31196,7 @@ pub struct ib_device { pub link_ops: *const rdma_link_ops, pub compat_devs_mutex: mutex, pub compat_devs: xarray, - pub iw_ifname: [::aya_bpf::cty::c_char; 16usize], + pub iw_ifname: [::aya_ebpf::cty::c_char; 16usize], pub iw_driver_flags: u32_, pub lag_flags: u32_, } @@ -32231,934 +31262,1718 @@ impl ib_device { __bindgen_bitfield_unit } } -pub mod ib_signature_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_SIG_TYPE_NONE: Type = 0; - pub const IB_SIG_TYPE_T10_DIF: Type = 1; -} -pub mod ib_t10_dif_bg_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_T10DIF_CRC: Type = 0; - pub const IB_T10DIF_CSUM: Type = 1; -} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_t10_dif_domain { - pub bg_type: ib_t10_dif_bg_type::Type, - pub pi_interval: u16_, - pub bg: u16_, - pub app_tag: u16_, - pub ref_tag: u32_, - pub ref_remap: bool_, - pub app_escape: bool_, - pub ref_escape: bool_, - pub apptag_check_mask: u16_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_sig_domain { - pub sig_type: ib_signature_type::Type, - pub sig: ib_sig_domain__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ib_sig_domain__bindgen_ty_1 { - pub dif: ib_t10_dif_domain, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_sig_attrs { - pub check_mask: u8_, - pub mem: ib_sig_domain, - pub wire: ib_sig_domain, - pub meta_length: ::aya_bpf::cty::c_int, -} -pub mod ib_sig_err_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_SIG_BAD_GUARD: Type = 0; - pub const IB_SIG_BAD_REFTAG: Type = 1; - pub const IB_SIG_BAD_APPTAG: Type = 2; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_sig_err { - pub err_type: ib_sig_err_type::Type, - pub expected: u32_, - pub actual: u32_, - pub sig_err_offset: u64_, - pub key: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ib_gid { - pub raw: [u8_; 16usize], - pub global: ib_gid__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_gid__bindgen_ty_1 { - pub subnet_prefix: __be64, - pub interface_id: __be64, -} -pub mod ib_gid_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_GID_TYPE_IB: Type = 0; - pub const IB_GID_TYPE_ROCE: Type = 1; - pub const IB_GID_TYPE_ROCE_UDP_ENCAP: Type = 2; - pub const IB_GID_TYPE_SIZE: Type = 3; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_gid_attr { - pub ndev: *mut net_device, - pub device: *mut ib_device, - pub gid: ib_gid, - pub gid_type: ib_gid_type::Type, - pub index: u16_, - pub port_num: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_cq_init_attr { - pub cqe: ::aya_bpf::cty::c_uint, - pub comp_vector: u32_, - pub flags: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_dm_mr_attr { - pub length: u64_, - pub offset: u64_, - pub access_flags: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_dm_alloc_attr { - pub length: u64_, - pub alignment: u32_, - pub flags: u32_, -} -pub mod ib_mtu { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_MTU_256: Type = 1; - pub const IB_MTU_512: Type = 2; - pub const IB_MTU_1024: Type = 3; - pub const IB_MTU_2048: Type = 4; - pub const IB_MTU_4096: Type = 5; -} -pub mod ib_port_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_PORT_NOP: Type = 0; - pub const IB_PORT_DOWN: Type = 1; - pub const IB_PORT_INIT: Type = 2; - pub const IB_PORT_ARMED: Type = 3; - pub const IB_PORT_ACTIVE: Type = 4; - pub const IB_PORT_ACTIVE_DEFER: Type = 5; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rdma_stat_desc { - pub name: *const ::aya_bpf::cty::c_char, - pub flags: ::aya_bpf::cty::c_uint, - pub priv_: *const ::aya_bpf::cty::c_void, +pub struct devlink_port_ops { + pub port_split: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *mut devlink_port, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_unsplit: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *mut devlink_port, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_type_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: devlink_port_type::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *mut devlink_port, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_hw_addr_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *mut u8_, + arg3: *mut ::aya_ebpf::cty::c_int, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_hw_addr_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *const u8_, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_roce_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *mut bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_roce_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_migratable_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *mut bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_migratable_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_state_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *mut devlink_port_fn_state::Type, + arg3: *mut devlink_port_fn_opstate::Type, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_state_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: devlink_port_fn_state::Type, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_ipsec_crypto_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *mut bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_ipsec_crypto_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_ipsec_packet_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: *mut bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fn_ipsec_packet_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: bool_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_port_attr { - pub subnet_prefix: u64_, - pub state: ib_port_state::Type, - pub max_mtu: ib_mtu::Type, - pub active_mtu: ib_mtu::Type, - pub phys_mtu: u32_, - pub gid_tbl_len: ::aya_bpf::cty::c_int, +pub struct devlink_port_new_attrs { + pub flavour: devlink_port_flavour::Type, + pub port_index: ::aya_ebpf::cty::c_uint, + pub controller: u32_, + pub sfnum: u32_, + pub pfnum: u16_, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub port_cap_flags: u32_, - pub max_msg_sz: u32_, - pub bad_pkey_cntr: u32_, - pub qkey_viol_cntr: u32_, - pub pkey_tbl_len: u16_, - pub sm_lid: u32_, - pub lid: u32_, - pub lmc: u8_, - pub max_vl_num: u8_, - pub sm_sl: u8_, - pub subnet_timeout: u8_, - pub init_type_reply: u8_, - pub active_width: u8_, - pub active_speed: u16_, - pub phys_state: u8_, - pub port_cap_flags2: u16_, + pub __bindgen_padding_0: u8, } -impl ib_port_attr { +impl devlink_port_new_attrs { #[inline] - pub fn ip_gids(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn port_index_valid(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_ip_gids(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_port_index_valid(&mut self, val: u8_) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u8 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(ip_gids: ::aya_bpf::cty::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let ip_gids: u32 = unsafe { ::core::mem::transmute(ip_gids) }; - ip_gids as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_device_modify { - pub sys_image_guid: u64_, - pub node_desc: [::aya_bpf::cty::c_char; 64usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_port_modify { - pub set_port_cap_mask: u32_, - pub clr_port_cap_mask: u32_, - pub init_type: u8_, -} -pub mod ib_event_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_EVENT_CQ_ERR: Type = 0; - pub const IB_EVENT_QP_FATAL: Type = 1; - pub const IB_EVENT_QP_REQ_ERR: Type = 2; - pub const IB_EVENT_QP_ACCESS_ERR: Type = 3; - pub const IB_EVENT_COMM_EST: Type = 4; - pub const IB_EVENT_SQ_DRAINED: Type = 5; - pub const IB_EVENT_PATH_MIG: Type = 6; - pub const IB_EVENT_PATH_MIG_ERR: Type = 7; - pub const IB_EVENT_DEVICE_FATAL: Type = 8; - pub const IB_EVENT_PORT_ACTIVE: Type = 9; - pub const IB_EVENT_PORT_ERR: Type = 10; - pub const IB_EVENT_LID_CHANGE: Type = 11; - pub const IB_EVENT_PKEY_CHANGE: Type = 12; - pub const IB_EVENT_SM_CHANGE: Type = 13; - pub const IB_EVENT_SRQ_ERR: Type = 14; - pub const IB_EVENT_SRQ_LIMIT_REACHED: Type = 15; - pub const IB_EVENT_QP_LAST_WQE_REACHED: Type = 16; - pub const IB_EVENT_CLIENT_REREGISTER: Type = 17; - pub const IB_EVENT_GID_CHANGE: Type = 18; - pub const IB_EVENT_WQ_FATAL: Type = 19; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_ucq_object { - _unused: [u8; 0], -} -pub type ib_comp_handler = ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_cq, arg2: *mut ::aya_bpf::cty::c_void), ->; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_cq { - pub device: *mut ib_device, - pub uobject: *mut ib_ucq_object, - pub comp_handler: ib_comp_handler, - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub cq_context: *mut ::aya_bpf::cty::c_void, - pub cqe: ::aya_bpf::cty::c_int, - pub cqe_used: ::aya_bpf::cty::c_uint, - pub usecnt: atomic_t, - pub poll_ctx: ib_poll_context::Type, - pub wc: *mut ib_wc, - pub pool_entry: list_head, - pub __bindgen_anon_1: ib_cq__bindgen_ty_1, - pub comp_wq: *mut workqueue_struct, - pub dim: *mut dim, - pub timestamp: ktime_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub comp_vector: ::aya_bpf::cty::c_uint, - pub res: rdma_restrack_entry, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ib_cq__bindgen_ty_1 { - pub iop: irq_poll, - pub work: work_struct, -} -impl ib_cq { - #[inline] - pub fn interrupt(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn controller_valid(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } } #[inline] - pub fn set_interrupt(&mut self, val: u8_) { + pub fn set_controller_valid(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn shared(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + pub fn sfnum_valid(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } } #[inline] - pub fn set_shared(&mut self, val: u8_) { + pub fn set_sfnum_valid(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) + self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(interrupt: u8_, shared: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + pub fn new_bitfield_1( + port_index_valid: u8_, + controller_valid: u8_, + sfnum_valid: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let interrupt: u8 = unsafe { ::core::mem::transmute(interrupt) }; - interrupt as u64 + let port_index_valid: u8 = unsafe { ::core::mem::transmute(port_index_valid) }; + port_index_valid as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let shared: u8 = unsafe { ::core::mem::transmute(shared) }; - shared as u64 + let controller_valid: u8 = unsafe { ::core::mem::transmute(controller_valid) }; + controller_valid as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let sfnum_valid: u8 = unsafe { ::core::mem::transmute(sfnum_valid) }; + sfnum_valid as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_uqp_object { - _unused: [u8; 0], -} -pub mod ib_qp_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_QPT_SMI: Type = 0; - pub const IB_QPT_GSI: Type = 1; - pub const IB_QPT_RC: Type = 2; - pub const IB_QPT_UC: Type = 3; - pub const IB_QPT_UD: Type = 4; - pub const IB_QPT_RAW_IPV6: Type = 5; - pub const IB_QPT_RAW_ETHERTYPE: Type = 6; - pub const IB_QPT_RAW_PACKET: Type = 8; - pub const IB_QPT_XRC_INI: Type = 9; - pub const IB_QPT_XRC_TGT: Type = 10; - pub const IB_QPT_MAX: Type = 11; - pub const IB_QPT_DRIVER: Type = 255; - pub const IB_QPT_RESERVED1: Type = 4096; - pub const IB_QPT_RESERVED2: Type = 4097; - pub const IB_QPT_RESERVED3: Type = 4098; - pub const IB_QPT_RESERVED4: Type = 4099; - pub const IB_QPT_RESERVED5: Type = 4100; - pub const IB_QPT_RESERVED6: Type = 4101; - pub const IB_QPT_RESERVED7: Type = 4102; - pub const IB_QPT_RESERVED8: Type = 4103; - pub const IB_QPT_RESERVED9: Type = 4104; - pub const IB_QPT_RESERVED10: Type = 4105; +pub struct devlink_sb_pool_info { + pub pool_type: devlink_sb_pool_type::Type, + pub size: u32_, + pub threshold_type: devlink_sb_threshold_type::Type, + pub cell_size: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_qp { - pub device: *mut ib_device, - pub pd: *mut ib_pd, - pub send_cq: *mut ib_cq, - pub recv_cq: *mut ib_cq, - pub mr_lock: spinlock_t, - pub mrs_used: ::aya_bpf::cty::c_int, - pub rdma_mrs: list_head, - pub sig_mrs: list_head, - pub srq: *mut ib_srq, - pub xrcd: *mut ib_xrcd, - pub xrcd_list: list_head, - pub usecnt: atomic_t, - pub open_list: list_head, - pub real_qp: *mut ib_qp, - pub uobject: *mut ib_uqp_object, - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub qp_context: *mut ::aya_bpf::cty::c_void, - pub av_sgid_attr: *const ib_gid_attr, - pub alt_path_sgid_attr: *const ib_gid_attr, - pub qp_num: u32_, - pub max_write_sge: u32_, - pub max_read_sge: u32_, - pub qp_type: ib_qp_type::Type, - pub rwq_ind_tbl: *mut ib_rwq_ind_table, - pub qp_sec: *mut ib_qp_security, - pub port: u32_, - pub integrity_en: bool_, - pub res: rdma_restrack_entry, - pub counter: *mut rdma_counter, +#[derive(Debug, Copy, Clone)] +pub struct devlink_dpipe_field { + pub name: *const ::aya_ebpf::cty::c_char, + pub id: ::aya_ebpf::cty::c_uint, + pub bitwidth: ::aya_ebpf::cty::c_uint, + pub mapping_type: devlink_dpipe_field_mapping_type::Type, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_usrq_object { - _unused: [u8; 0], -} -pub mod ib_srq_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_SRQT_BASIC: Type = 0; - pub const IB_SRQT_XRC: Type = 1; - pub const IB_SRQT_TM: Type = 2; +pub struct devlink_dpipe_header { + pub name: *const ::aya_ebpf::cty::c_char, + pub id: ::aya_ebpf::cty::c_uint, + pub fields: *mut devlink_dpipe_field, + pub fields_count: ::aya_ebpf::cty::c_uint, + pub global: bool_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_srq { - pub device: *mut ib_device, - pub pd: *mut ib_pd, - pub uobject: *mut ib_usrq_object, - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub srq_context: *mut ::aya_bpf::cty::c_void, - pub srq_type: ib_srq_type::Type, - pub usecnt: atomic_t, - pub ext: ib_srq__bindgen_ty_1, - pub res: rdma_restrack_entry, +#[derive(Debug, Copy, Clone)] +pub struct devlink_dpipe_headers { + pub headers: *mut *mut devlink_dpipe_header, + pub headers_count: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_srq__bindgen_ty_1 { - pub cq: *mut ib_cq, - pub __bindgen_anon_1: ib_srq__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct devlink_flash_update_params { + pub fw: *const firmware, + pub component: *const ::aya_ebpf::cty::c_char, + pub overwrite_mask: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ib_srq__bindgen_ty_1__bindgen_ty_1 { - pub xrc: ib_srq__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct devlink_trap_policer { + pub id: u32_, + pub init_rate: u64_, + pub init_burst: u64_, + pub max_rate: u64_, + pub min_rate: u64_, + pub max_burst: u64_, + pub min_burst: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_srq__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub xrcd: *mut ib_xrcd, - pub srq_num: u32_, +pub struct devlink_trap_group { + pub name: *const ::aya_ebpf::cty::c_char, + pub id: u16_, + pub generic: bool_, + pub init_policer_id: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_uwq_object { - _unused: [u8; 0], -} -pub mod ib_wq_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_WQS_RESET: Type = 0; - pub const IB_WQS_RDY: Type = 1; - pub const IB_WQS_ERR: Type = 2; -} -pub mod ib_wq_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_WQT_RQ: Type = 0; +pub struct devlink_trap { + pub type_: devlink_trap_type::Type, + pub init_action: devlink_trap_action::Type, + pub generic: bool_, + pub id: u16_, + pub name: *const ::aya_ebpf::cty::c_char, + pub init_group_id: u16_, + pub metadata_cap: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_wq { - pub device: *mut ib_device, - pub uobject: *mut ib_uwq_object, - pub wq_context: *mut ::aya_bpf::cty::c_void, - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), +pub struct devlink_ops { + pub supported_flash_update_params: u32_, + pub reload_actions: ::aya_ebpf::cty::c_ulong, + pub reload_limits: ::aya_ebpf::cty::c_ulong, + pub reload_down: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: bool_, + arg3: devlink_reload_action::Type, + arg4: devlink_reload_limit::Type, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub reload_up: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: devlink_reload_action::Type, + arg3: devlink_reload_limit::Type, + arg4: *mut u32_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_pool_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: *mut devlink_sb_pool_info, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_pool_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: u32_, + arg5: devlink_sb_threshold_type::Type, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_port_pool_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_port_pool_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: u32_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_tc_pool_bind_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: devlink_sb_pool_type::Type, + arg5: *mut u16_, + arg6: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_tc_pool_bind_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: devlink_sb_pool_type::Type, + arg5: u16_, + arg6: u32_, + arg7: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_occ_snapshot: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_occ_max_clear: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_occ_port_pool_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: *mut u32_, + arg5: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sb_occ_tc_port_bind_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_port, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: devlink_sb_pool_type::Type, + arg5: *mut u32_, + arg6: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub eswitch_mode_get: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut devlink, arg2: *mut u16_) -> ::aya_ebpf::cty::c_int, + >, + pub eswitch_mode_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: u16_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub eswitch_inline_mode_get: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut devlink, arg2: *mut u8_) -> ::aya_ebpf::cty::c_int, + >, + pub eswitch_inline_mode_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: u8_, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub eswitch_encap_mode_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *mut devlink_eswitch_encap_mode::Type, + ) -> ::aya_ebpf::cty::c_int, + >, + pub eswitch_encap_mode_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: devlink_eswitch_encap_mode::Type, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub info_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *mut devlink_info_req, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub flash_update: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *mut devlink_flash_update_params, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_init: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_fini: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap, + arg3: *mut ::aya_ebpf::cty::c_void, + ), + >, + pub trap_action_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap, + arg3: devlink_trap_action::Type, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_group_init: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap_group, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_group_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap_group, + arg3: *const devlink_trap_policer, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_group_action_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap_group, + arg3: devlink_trap_action::Type, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_drop_counter_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap, + arg3: *mut u64_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_policer_init: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap_policer, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_policer_fini: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut devlink, arg2: *const devlink_trap_policer), + >, + pub trap_policer_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap_policer, + arg3: u64_, + arg4: u64_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub trap_policer_counter_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_trap_policer, + arg3: *mut u64_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_new: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: *const devlink_port_new_attrs, + arg3: *mut netlink_ext_ack, + arg4: *mut *mut devlink_port, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_leaf_tx_share_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u64_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_leaf_tx_max_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u64_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_leaf_tx_priority_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u32_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_leaf_tx_weight_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u32_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_tx_share_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u64_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_tx_max_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u64_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_tx_priority_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u32_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_tx_weight_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: u32_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_new: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut *mut ::aya_ebpf::cty::c_void, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_leaf_parent_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut devlink_rate, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: *mut ::aya_ebpf::cty::c_void, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rate_node_parent_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_rate, + arg2: *mut devlink_rate, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: *mut ::aya_ebpf::cty::c_void, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub selftest_check: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: ::aya_ebpf::cty::c_uint, + arg3: *mut netlink_ext_ack, + ) -> bool_, + >, + pub selftest_run: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink, + arg2: ::aya_ebpf::cty::c_uint, + arg3: *mut netlink_ext_ack, + ) -> devlink_selftest_status::Type, >, - pub pd: *mut ib_pd, - pub cq: *mut ib_cq, - pub wq_num: u32_, - pub state: ib_wq_state::Type, - pub wq_type: ib_wq_type::Type, - pub usecnt: atomic_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_event { - pub device: *mut ib_device, - pub element: ib_event__bindgen_ty_1, - pub event: ib_event_type::Type, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ib_event__bindgen_ty_1 { - pub cq: *mut ib_cq, - pub qp: *mut ib_qp, - pub srq: *mut ib_srq, - pub wq: *mut ib_wq, - pub port_num: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_global_route { - pub sgid_attr: *const ib_gid_attr, - pub dgid: ib_gid, - pub flow_label: u32_, - pub sgid_index: u8_, - pub hop_limit: u8_, - pub traffic_class: u8_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_grh { - pub version_tclass_flow: __be32, - pub paylen: __be16, - pub next_hdr: u8_, - pub hop_limit: u8_, - pub sgid: ib_gid, - pub dgid: ib_gid, } +pub type irq_poll_fn = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut irq_poll, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_mr_status { - pub fail_status: u32_, - pub sig_err: ib_sig_err, +pub struct irq_poll { + pub list: list_head, + pub state: ::aya_ebpf::cty::c_ulong, + pub weight: ::aya_ebpf::cty::c_int, + pub poll: irq_poll_fn, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rdma_ah_init_attr { - pub ah_attr: *mut rdma_ah_attr, - pub flags: u32_, - pub xmit_slave: *mut net_device, -} -pub mod rdma_ah_attr_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const RDMA_AH_ATTR_TYPE_UNDEFINED: Type = 0; - pub const RDMA_AH_ATTR_TYPE_IB: Type = 1; - pub const RDMA_AH_ATTR_TYPE_ROCE: Type = 2; - pub const RDMA_AH_ATTR_TYPE_OPA: Type = 3; +pub struct rdma_cgroup { + pub css: cgroup_subsys_state, + pub rpools: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_ah_attr { - pub dlid: u16_, - pub src_path_bits: u8_, +pub struct dim_sample { + pub time: ktime_t, + pub pkt_ctr: u32_, + pub byte_ctr: u32_, + pub event_ctr: u16_, + pub comp_ctr: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct roce_ah_attr { - pub dmac: [u8_; 6usize], +pub struct dim_stats { + pub ppms: ::aya_ebpf::cty::c_int, + pub bpms: ::aya_ebpf::cty::c_int, + pub epms: ::aya_ebpf::cty::c_int, + pub cpms: ::aya_ebpf::cty::c_int, + pub cpe_ratio: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct opa_ah_attr { - pub dlid: u32_, - pub src_path_bits: u8_, - pub make_grd: bool_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rdma_ah_attr { - pub grh: ib_global_route, - pub sl: u8_, - pub static_rate: u8_, - pub port_num: u32_, - pub ah_flags: u8_, - pub type_: rdma_ah_attr_type::Type, - pub __bindgen_anon_1: rdma_ah_attr__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union rdma_ah_attr__bindgen_ty_1 { - pub ib: ib_ah_attr, - pub roce: roce_ah_attr, - pub opa: opa_ah_attr, +pub struct dim { + pub state: u8_, + pub prev_stats: dim_stats, + pub start_sample: dim_sample, + pub measuring_sample: dim_sample, + pub work: work_struct, + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub profile_ix: u8_, + pub mode: u8_, + pub tune_state: u8_, + pub steps_right: u8_, + pub steps_left: u8_, + pub tired: u8_, } -pub mod ib_wc_status { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_WC_SUCCESS: Type = 0; - pub const IB_WC_LOC_LEN_ERR: Type = 1; - pub const IB_WC_LOC_QP_OP_ERR: Type = 2; - pub const IB_WC_LOC_EEC_OP_ERR: Type = 3; - pub const IB_WC_LOC_PROT_ERR: Type = 4; - pub const IB_WC_WR_FLUSH_ERR: Type = 5; - pub const IB_WC_MW_BIND_ERR: Type = 6; - pub const IB_WC_BAD_RESP_ERR: Type = 7; - pub const IB_WC_LOC_ACCESS_ERR: Type = 8; - pub const IB_WC_REM_INV_REQ_ERR: Type = 9; - pub const IB_WC_REM_ACCESS_ERR: Type = 10; - pub const IB_WC_REM_OP_ERR: Type = 11; - pub const IB_WC_RETRY_EXC_ERR: Type = 12; - pub const IB_WC_RNR_RETRY_EXC_ERR: Type = 13; - pub const IB_WC_LOC_RDD_VIOL_ERR: Type = 14; - pub const IB_WC_REM_INV_RD_REQ_ERR: Type = 15; - pub const IB_WC_REM_ABORT_ERR: Type = 16; - pub const IB_WC_INV_EECN_ERR: Type = 17; - pub const IB_WC_INV_EEC_STATE_ERR: Type = 18; - pub const IB_WC_FATAL_ERR: Type = 19; - pub const IB_WC_RESP_TIMEOUT_ERR: Type = 20; - pub const IB_WC_GENERAL_ERR: Type = 21; +pub mod rdma_nl_counter_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RDMA_COUNTER_MODE_NONE: Type = 0; + pub const RDMA_COUNTER_MODE_AUTO: Type = 1; + pub const RDMA_COUNTER_MODE_MANUAL: Type = 2; + pub const RDMA_COUNTER_MODE_MAX: Type = 3; } -pub mod ib_wc_opcode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_WC_SEND: Type = 0; - pub const IB_WC_RDMA_WRITE: Type = 1; - pub const IB_WC_RDMA_READ: Type = 2; - pub const IB_WC_COMP_SWAP: Type = 3; - pub const IB_WC_FETCH_ADD: Type = 4; - pub const IB_WC_BIND_MW: Type = 5; - pub const IB_WC_LOCAL_INV: Type = 6; - pub const IB_WC_LSO: Type = 7; - pub const IB_WC_ATOMIC_WRITE: Type = 9; - pub const IB_WC_REG_MR: Type = 10; - pub const IB_WC_MASKED_COMP_SWAP: Type = 11; - pub const IB_WC_MASKED_FETCH_ADD: Type = 12; - pub const IB_WC_FLUSH: Type = 8; - pub const IB_WC_RECV: Type = 128; - pub const IB_WC_RECV_RDMA_WITH_IMM: Type = 129; +pub mod rdma_nl_counter_mask { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RDMA_COUNTER_MASK_QP_TYPE: Type = 1; + pub const RDMA_COUNTER_MASK_PID: Type = 2; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_cqe { - pub done: ::core::option::Option, +pub mod rdma_restrack_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RDMA_RESTRACK_PD: Type = 0; + pub const RDMA_RESTRACK_CQ: Type = 1; + pub const RDMA_RESTRACK_QP: Type = 2; + pub const RDMA_RESTRACK_CM_ID: Type = 3; + pub const RDMA_RESTRACK_MR: Type = 4; + pub const RDMA_RESTRACK_CTX: Type = 5; + pub const RDMA_RESTRACK_COUNTER: Type = 6; + pub const RDMA_RESTRACK_SRQ: Type = 7; + pub const RDMA_RESTRACK_MAX: Type = 8; } #[repr(C)] #[derive(Copy, Clone)] -pub struct ib_wc { - pub __bindgen_anon_1: ib_wc__bindgen_ty_1, - pub status: ib_wc_status::Type, - pub opcode: ib_wc_opcode::Type, - pub vendor_err: u32_, - pub byte_len: u32_, - pub qp: *mut ib_qp, - pub ex: ib_wc__bindgen_ty_2, - pub src_qp: u32_, - pub slid: u32_, - pub wc_flags: ::aya_bpf::cty::c_int, - pub pkey_index: u16_, - pub sl: u8_, - pub dlid_path_bits: u8_, - pub port_num: u32_, - pub smac: [u8_; 6usize], - pub vlan_id: u16_, - pub network_hdr_type: u8_, +pub struct rdma_restrack_entry { + pub valid: bool_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub kref: kref, + pub comp: completion, + pub task: *mut task_struct, + pub kern_name: *const ::aya_ebpf::cty::c_char, + pub type_: rdma_restrack_type::Type, + pub user: bool_, + pub id: u32_, } -#[repr(C)] -#[derive(Copy, Clone)] -pub union ib_wc__bindgen_ty_1 { - pub wr_id: u64_, - pub wr_cqe: *mut ib_cqe, +impl rdma_restrack_entry { + #[inline] + pub fn no_track(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_no_track(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(no_track: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let no_track: u8 = unsafe { ::core::mem::transmute(no_track) }; + no_track as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Copy, Clone)] -pub union ib_wc__bindgen_ty_2 { - pub imm_data: __be32, - pub invalidate_rkey: u32_, +#[derive(Debug, Copy, Clone)] +pub struct rdma_link_ops { + pub list: list_head, + pub type_: *const ::aya_ebpf::cty::c_char, + pub newlink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_char, + arg2: *mut net_device, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_srq_attr { - pub max_wr: u32_, - pub max_sge: u32_, - pub srq_limit: u32_, +pub struct auto_mode_param { + pub qp_type: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_xrcd { - pub device: *mut ib_device, - pub usecnt: atomic_t, - pub inode: *mut inode, - pub tgt_qps_rwsem: rw_semaphore, - pub tgt_qps: xarray, +#[derive(Debug, Copy, Clone)] +pub struct rdma_counter_mode { + pub mode: rdma_nl_counter_mode::Type, + pub mask: rdma_nl_counter_mask::Type, + pub param: auto_mode_param, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ib_srq_init_attr { - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub srq_context: *mut ::aya_bpf::cty::c_void, - pub attr: ib_srq_attr, - pub srq_type: ib_srq_type::Type, - pub ext: ib_srq_init_attr__bindgen_ty_1, +pub struct rdma_port_counter { + pub mode: rdma_counter_mode, + pub hstats: *mut rdma_hw_stats, + pub num_counters: ::aya_ebpf::cty::c_uint, + pub lock: mutex, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_srq_init_attr__bindgen_ty_1 { - pub cq: *mut ib_cq, - pub __bindgen_anon_1: ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1, +pub struct rdma_hw_stats { + pub lock: mutex, + pub timestamp: ::aya_ebpf::cty::c_ulong, + pub lifespan: ::aya_ebpf::cty::c_ulong, + pub descs: *const rdma_stat_desc, + pub is_disabled: *mut ::aya_ebpf::cty::c_ulong, + pub num_counters: ::aya_ebpf::cty::c_int, + pub value: __IncompleteArrayField, } #[repr(C)] #[derive(Copy, Clone)] -pub union ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1 { - pub xrc: ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, - pub tag_matching: ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, +pub struct rdma_counter { + pub res: rdma_restrack_entry, + pub device: *mut ib_device, + pub id: u32, + pub kref: kref, + pub mode: rdma_counter_mode, + pub lock: mutex, + pub stats: *mut rdma_hw_stats, + pub port: u32_, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { - pub xrcd: *mut ib_xrcd, +pub mod ib_signature_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_SIG_TYPE_NONE: Type = 0; + pub const IB_SIG_TYPE_T10_DIF: Type = 1; } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { - pub max_num_tags: u32_, +pub mod ib_t10_dif_bg_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_T10DIF_CRC: Type = 0; + pub const IB_T10DIF_CSUM: Type = 1; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_qp_cap { - pub max_send_wr: u32_, - pub max_recv_wr: u32_, - pub max_send_sge: u32_, - pub max_recv_sge: u32_, - pub max_inline_data: u32_, - pub max_rdma_ctxs: u32_, -} -pub mod ib_sig_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_SIGNAL_ALL_WR: Type = 0; - pub const IB_SIGNAL_REQ_WR: Type = 1; +pub struct ib_t10_dif_domain { + pub bg_type: ib_t10_dif_bg_type::Type, + pub pi_interval: u16_, + pub bg: u16_, + pub app_tag: u16_, + pub ref_tag: u32_, + pub ref_remap: bool_, + pub app_escape: bool_, + pub ref_escape: bool_, + pub apptag_check_mask: u16_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_qp_init_attr { - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub qp_context: *mut ::aya_bpf::cty::c_void, - pub send_cq: *mut ib_cq, - pub recv_cq: *mut ib_cq, - pub srq: *mut ib_srq, - pub xrcd: *mut ib_xrcd, - pub cap: ib_qp_cap, - pub sq_sig_type: ib_sig_type::Type, - pub qp_type: ib_qp_type::Type, - pub create_flags: u32_, - pub port_num: u32_, - pub rwq_ind_tbl: *mut ib_rwq_ind_table, - pub source_qpn: u32_, +#[derive(Copy, Clone)] +pub struct ib_sig_domain { + pub sig_type: ib_signature_type::Type, + pub sig: ib_sig_domain__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_rwq_ind_table { - pub device: *mut ib_device, - pub uobject: *mut ib_uobject, - pub usecnt: atomic_t, - pub ind_tbl_num: u32_, - pub log_ind_tbl_size: u32_, - pub ind_tbl: *mut *mut ib_wq, -} -pub mod ib_qp_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_QPS_RESET: Type = 0; - pub const IB_QPS_INIT: Type = 1; - pub const IB_QPS_RTR: Type = 2; - pub const IB_QPS_RTS: Type = 3; - pub const IB_QPS_SQD: Type = 4; - pub const IB_QPS_SQE: Type = 5; - pub const IB_QPS_ERR: Type = 6; -} -pub mod ib_mig_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_MIG_MIGRATED: Type = 0; - pub const IB_MIG_REARM: Type = 1; - pub const IB_MIG_ARMED: Type = 2; -} -pub mod ib_mw_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_MW_TYPE_1: Type = 1; - pub const IB_MW_TYPE_2: Type = 2; +#[derive(Copy, Clone)] +pub union ib_sig_domain__bindgen_ty_1 { + pub dif: ib_t10_dif_domain, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ib_qp_attr { - pub qp_state: ib_qp_state::Type, - pub cur_qp_state: ib_qp_state::Type, - pub path_mtu: ib_mtu::Type, - pub path_mig_state: ib_mig_state::Type, - pub qkey: u32_, - pub rq_psn: u32_, - pub sq_psn: u32_, - pub dest_qp_num: u32_, - pub qp_access_flags: ::aya_bpf::cty::c_int, - pub cap: ib_qp_cap, - pub ah_attr: rdma_ah_attr, - pub alt_ah_attr: rdma_ah_attr, - pub pkey_index: u16_, - pub alt_pkey_index: u16_, - pub en_sqd_async_notify: u8_, - pub sq_draining: u8_, - pub max_rd_atomic: u8_, - pub max_dest_rd_atomic: u8_, - pub min_rnr_timer: u8_, - pub port_num: u32_, - pub timeout: u8_, - pub retry_cnt: u8_, - pub rnr_retry: u8_, - pub alt_port_num: u32_, - pub alt_timeout: u8_, - pub rate_limit: u32_, - pub xmit_slave: *mut net_device, +pub struct ib_sig_attrs { + pub check_mask: u8_, + pub mem: ib_sig_domain, + pub wire: ib_sig_domain, + pub meta_length: ::aya_ebpf::cty::c_int, } -pub mod ib_wr_opcode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IB_WR_RDMA_WRITE: Type = 0; - pub const IB_WR_RDMA_WRITE_WITH_IMM: Type = 1; - pub const IB_WR_SEND: Type = 2; - pub const IB_WR_SEND_WITH_IMM: Type = 3; - pub const IB_WR_RDMA_READ: Type = 4; - pub const IB_WR_ATOMIC_CMP_AND_SWP: Type = 5; - pub const IB_WR_ATOMIC_FETCH_AND_ADD: Type = 6; - pub const IB_WR_BIND_MW: Type = 8; - pub const IB_WR_LSO: Type = 10; - pub const IB_WR_SEND_WITH_INV: Type = 9; - pub const IB_WR_RDMA_READ_WITH_INV: Type = 11; - pub const IB_WR_LOCAL_INV: Type = 7; - pub const IB_WR_MASKED_ATOMIC_CMP_AND_SWP: Type = 12; - pub const IB_WR_MASKED_ATOMIC_FETCH_AND_ADD: Type = 13; - pub const IB_WR_FLUSH: Type = 14; - pub const IB_WR_ATOMIC_WRITE: Type = 15; - pub const IB_WR_REG_MR: Type = 32; - pub const IB_WR_REG_MR_INTEGRITY: Type = 33; - pub const IB_WR_RESERVED1: Type = 240; - pub const IB_WR_RESERVED2: Type = 241; - pub const IB_WR_RESERVED3: Type = 242; - pub const IB_WR_RESERVED4: Type = 243; - pub const IB_WR_RESERVED5: Type = 244; - pub const IB_WR_RESERVED6: Type = 245; - pub const IB_WR_RESERVED7: Type = 246; - pub const IB_WR_RESERVED8: Type = 247; - pub const IB_WR_RESERVED9: Type = 248; - pub const IB_WR_RESERVED10: Type = 249; +pub mod ib_sig_err_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_SIG_BAD_GUARD: Type = 0; + pub const IB_SIG_BAD_REFTAG: Type = 1; + pub const IB_SIG_BAD_APPTAG: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_sge { - pub addr: u64_, - pub length: u32_, - pub lkey: u32_, +pub struct ib_sig_err { + pub err_type: ib_sig_err_type::Type, + pub expected: u32_, + pub actual: u32_, + pub sig_err_offset: u64_, + pub key: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ib_send_wr { - pub next: *mut ib_send_wr, - pub __bindgen_anon_1: ib_send_wr__bindgen_ty_1, - pub sg_list: *mut ib_sge, - pub num_sge: ::aya_bpf::cty::c_int, - pub opcode: ib_wr_opcode::Type, - pub send_flags: ::aya_bpf::cty::c_int, - pub ex: ib_send_wr__bindgen_ty_2, +pub union ib_gid { + pub raw: [u8_; 16usize], + pub global: ib_gid__bindgen_ty_1, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ib_send_wr__bindgen_ty_1 { - pub wr_id: u64_, - pub wr_cqe: *mut ib_cqe, +#[derive(Debug, Copy, Clone)] +pub struct ib_gid__bindgen_ty_1 { + pub subnet_prefix: __be64, + pub interface_id: __be64, +} +pub mod ib_gid_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_GID_TYPE_IB: Type = 0; + pub const IB_GID_TYPE_ROCE: Type = 1; + pub const IB_GID_TYPE_ROCE_UDP_ENCAP: Type = 2; + pub const IB_GID_TYPE_SIZE: Type = 3; } #[repr(C)] #[derive(Copy, Clone)] -pub union ib_send_wr__bindgen_ty_2 { - pub imm_data: __be32, - pub invalidate_rkey: u32_, +pub struct ib_gid_attr { + pub ndev: *mut net_device, + pub device: *mut ib_device, + pub gid: ib_gid, + pub gid_type: ib_gid_type::Type, + pub index: u16_, + pub port_num: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_ah { - pub device: *mut ib_device, - pub pd: *mut ib_pd, - pub uobject: *mut ib_uobject, - pub sgid_attr: *const ib_gid_attr, - pub type_: rdma_ah_attr_type::Type, +pub struct ib_cq_init_attr { + pub cqe: ::aya_ebpf::cty::c_uint, + pub comp_vector: u32_, + pub flags: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_mr { - pub device: *mut ib_device, - pub pd: *mut ib_pd, - pub lkey: u32_, - pub rkey: u32_, - pub iova: u64_, +#[derive(Debug, Copy, Clone)] +pub struct ib_dm_mr_attr { pub length: u64_, - pub page_size: ::aya_bpf::cty::c_uint, - pub type_: ib_mr_type::Type, - pub need_inval: bool_, - pub __bindgen_anon_1: ib_mr__bindgen_ty_1, - pub dm: *mut ib_dm, - pub sig_attrs: *mut ib_sig_attrs, - pub res: rdma_restrack_entry, + pub offset: u64_, + pub access_flags: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ib_mr__bindgen_ty_1 { - pub uobject: *mut ib_uobject, - pub qp_entry: list_head, +#[derive(Debug, Copy, Clone)] +pub struct ib_dm_alloc_attr { + pub length: u64_, + pub alignment: u32_, + pub flags: u32_, +} +pub mod ib_mtu { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_MTU_256: Type = 1; + pub const IB_MTU_512: Type = 2; + pub const IB_MTU_1024: Type = 3; + pub const IB_MTU_2048: Type = 4; + pub const IB_MTU_4096: Type = 5; +} +pub mod ib_port_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_PORT_NOP: Type = 0; + pub const IB_PORT_DOWN: Type = 1; + pub const IB_PORT_INIT: Type = 2; + pub const IB_PORT_ARMED: Type = 3; + pub const IB_PORT_ACTIVE: Type = 4; + pub const IB_PORT_ACTIVE_DEFER: Type = 5; } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ib_recv_wr { - pub next: *mut ib_recv_wr, - pub __bindgen_anon_1: ib_recv_wr__bindgen_ty_1, - pub sg_list: *mut ib_sge, - pub num_sge: ::aya_bpf::cty::c_int, +#[derive(Debug, Copy, Clone)] +pub struct rdma_stat_desc { + pub name: *const ::aya_ebpf::cty::c_char, + pub flags: ::aya_ebpf::cty::c_uint, + pub priv_: *const ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ib_recv_wr__bindgen_ty_1 { - pub wr_id: u64_, - pub wr_cqe: *mut ib_cqe, +#[derive(Debug, Copy, Clone)] +pub struct ib_port_attr { + pub subnet_prefix: u64_, + pub state: ib_port_state::Type, + pub max_mtu: ib_mtu::Type, + pub active_mtu: ib_mtu::Type, + pub phys_mtu: u32_, + pub gid_tbl_len: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub port_cap_flags: u32_, + pub max_msg_sz: u32_, + pub bad_pkey_cntr: u32_, + pub qkey_viol_cntr: u32_, + pub pkey_tbl_len: u16_, + pub sm_lid: u32_, + pub lid: u32_, + pub lmc: u8_, + pub max_vl_num: u8_, + pub sm_sl: u8_, + pub subnet_timeout: u8_, + pub init_type_reply: u8_, + pub active_width: u8_, + pub active_speed: u16_, + pub phys_state: u8_, + pub port_cap_flags2: u16_, +} +impl ib_port_attr { + #[inline] + pub fn ip_gids(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_ip_gids(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(ip_gids: ::aya_ebpf::cty::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let ip_gids: u32 = unsafe { ::core::mem::transmute(ip_gids) }; + ip_gids as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_rdmacg_object { - pub cg: *mut rdma_cgroup, +pub struct ib_device_modify { + pub sys_image_guid: u64_, + pub node_desc: [::aya_ebpf::cty::c_char; 64usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_uverbs_file { +pub struct ib_port_modify { + pub set_port_cap_mask: u32_, + pub clr_port_cap_mask: u32_, + pub init_type: u8_, +} +pub mod ib_event_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_EVENT_CQ_ERR: Type = 0; + pub const IB_EVENT_QP_FATAL: Type = 1; + pub const IB_EVENT_QP_REQ_ERR: Type = 2; + pub const IB_EVENT_QP_ACCESS_ERR: Type = 3; + pub const IB_EVENT_COMM_EST: Type = 4; + pub const IB_EVENT_SQ_DRAINED: Type = 5; + pub const IB_EVENT_PATH_MIG: Type = 6; + pub const IB_EVENT_PATH_MIG_ERR: Type = 7; + pub const IB_EVENT_DEVICE_FATAL: Type = 8; + pub const IB_EVENT_PORT_ACTIVE: Type = 9; + pub const IB_EVENT_PORT_ERR: Type = 10; + pub const IB_EVENT_LID_CHANGE: Type = 11; + pub const IB_EVENT_PKEY_CHANGE: Type = 12; + pub const IB_EVENT_SM_CHANGE: Type = 13; + pub const IB_EVENT_SRQ_ERR: Type = 14; + pub const IB_EVENT_SRQ_LIMIT_REACHED: Type = 15; + pub const IB_EVENT_QP_LAST_WQE_REACHED: Type = 16; + pub const IB_EVENT_CLIENT_REREGISTER: Type = 17; + pub const IB_EVENT_GID_CHANGE: Type = 18; + pub const IB_EVENT_WQ_FATAL: Type = 19; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_ucq_object { _unused: [u8; 0], } +pub type ib_comp_handler = ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_cq, arg2: *mut ::aya_ebpf::cty::c_void), +>; +pub mod ib_poll_context { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_POLL_SOFTIRQ: Type = 0; + pub const IB_POLL_WORKQUEUE: Type = 1; + pub const IB_POLL_UNBOUND_WORKQUEUE: Type = 2; + pub const IB_POLL_LAST_POOL_TYPE: Type = 2; + pub const IB_POLL_DIRECT: Type = 3; +} #[repr(C)] #[derive(Copy, Clone)] -pub struct ib_ucontext { +pub struct ib_cq { pub device: *mut ib_device, - pub ufile: *mut ib_uverbs_file, - pub cg_obj: ib_rdmacg_object, + pub uobject: *mut ib_ucq_object, + pub comp_handler: ib_comp_handler, + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub cq_context: *mut ::aya_ebpf::cty::c_void, + pub cqe: ::aya_ebpf::cty::c_int, + pub cqe_used: ::aya_ebpf::cty::c_uint, + pub usecnt: atomic_t, + pub poll_ctx: ib_poll_context::Type, + pub wc: *mut ib_wc, + pub pool_entry: list_head, + pub __bindgen_anon_1: ib_cq__bindgen_ty_1, + pub comp_wq: *mut workqueue_struct, + pub dim: *mut dim, + pub timestamp: ktime_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub comp_vector: ::aya_ebpf::cty::c_uint, pub res: rdma_restrack_entry, - pub mmap_xa: xarray, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_cq__bindgen_ty_1 { + pub iop: irq_poll, + pub work: work_struct, +} +impl ib_cq { + #[inline] + pub fn interrupt(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_interrupt(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn shared(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_shared(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(interrupt: u8_, shared: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let interrupt: u8 = unsafe { ::core::mem::transmute(interrupt) }; + interrupt as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let shared: u8 = unsafe { ::core::mem::transmute(shared) }; + shared as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct uverbs_api_object { +pub struct ib_uqp_object { _unused: [u8; 0], } +pub mod ib_qp_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_QPT_SMI: Type = 0; + pub const IB_QPT_GSI: Type = 1; + pub const IB_QPT_RC: Type = 2; + pub const IB_QPT_UC: Type = 3; + pub const IB_QPT_UD: Type = 4; + pub const IB_QPT_RAW_IPV6: Type = 5; + pub const IB_QPT_RAW_ETHERTYPE: Type = 6; + pub const IB_QPT_RAW_PACKET: Type = 8; + pub const IB_QPT_XRC_INI: Type = 9; + pub const IB_QPT_XRC_TGT: Type = 10; + pub const IB_QPT_MAX: Type = 11; + pub const IB_QPT_DRIVER: Type = 255; + pub const IB_QPT_RESERVED1: Type = 4096; + pub const IB_QPT_RESERVED2: Type = 4097; + pub const IB_QPT_RESERVED3: Type = 4098; + pub const IB_QPT_RESERVED4: Type = 4099; + pub const IB_QPT_RESERVED5: Type = 4100; + pub const IB_QPT_RESERVED6: Type = 4101; + pub const IB_QPT_RESERVED7: Type = 4102; + pub const IB_QPT_RESERVED8: Type = 4103; + pub const IB_QPT_RESERVED9: Type = 4104; + pub const IB_QPT_RESERVED10: Type = 4105; +} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_uobject { - pub user_handle: u64_, - pub ufile: *mut ib_uverbs_file, - pub context: *mut ib_ucontext, - pub object: *mut ::aya_bpf::cty::c_void, - pub list: list_head, - pub cg_obj: ib_rdmacg_object, - pub id: ::aya_bpf::cty::c_int, - pub ref_: kref, +#[derive(Copy, Clone)] +pub struct ib_qp { + pub device: *mut ib_device, + pub pd: *mut ib_pd, + pub send_cq: *mut ib_cq, + pub recv_cq: *mut ib_cq, + pub mr_lock: spinlock_t, + pub mrs_used: ::aya_ebpf::cty::c_int, + pub rdma_mrs: list_head, + pub sig_mrs: list_head, + pub srq: *mut ib_srq, + pub xrcd: *mut ib_xrcd, + pub xrcd_list: list_head, pub usecnt: atomic_t, - pub rcu: callback_head, - pub uapi_object: *const uverbs_api_object, + pub open_list: list_head, + pub real_qp: *mut ib_qp, + pub uobject: *mut ib_uqp_object, + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub qp_context: *mut ::aya_ebpf::cty::c_void, + pub av_sgid_attr: *const ib_gid_attr, + pub alt_path_sgid_attr: *const ib_gid_attr, + pub qp_num: u32_, + pub max_write_sge: u32_, + pub max_read_sge: u32_, + pub qp_type: ib_qp_type::Type, + pub rwq_ind_tbl: *mut ib_rwq_ind_table, + pub qp_sec: *mut ib_qp_security, + pub port: u32_, + pub integrity_en: bool_, + pub res: rdma_restrack_entry, + pub counter: *mut rdma_counter, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ib_udata { - pub inbuf: *const ::aya_bpf::cty::c_void, - pub outbuf: *mut ::aya_bpf::cty::c_void, - pub inlen: usize, - pub outlen: usize, +pub struct ib_usrq_object { + _unused: [u8; 0], +} +pub mod ib_srq_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_SRQT_BASIC: Type = 0; + pub const IB_SRQT_XRC: Type = 1; + pub const IB_SRQT_TM: Type = 2; } #[repr(C)] #[derive(Copy, Clone)] -pub struct ib_pd { - pub local_dma_lkey: u32_, - pub flags: u32_, +pub struct ib_srq { pub device: *mut ib_device, - pub uobject: *mut ib_uobject, + pub pd: *mut ib_pd, + pub uobject: *mut ib_usrq_object, + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub srq_context: *mut ::aya_ebpf::cty::c_void, + pub srq_type: ib_srq_type::Type, pub usecnt: atomic_t, - pub unsafe_global_rkey: u32_, - pub __internal_mr: *mut ib_mr, + pub ext: ib_srq__bindgen_ty_1, pub res: rdma_restrack_entry, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ib_wq_init_attr { - pub wq_context: *mut ::aya_bpf::cty::c_void, - pub wq_type: ib_wq_type::Type, - pub max_wr: u32_, - pub max_sge: u32_, +#[derive(Copy, Clone)] +pub struct ib_srq__bindgen_ty_1 { pub cq: *mut ib_cq, - pub event_handler: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_bpf::cty::c_void), - >, - pub create_flags: u32_, + pub __bindgen_anon_1: ib_srq__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_srq__bindgen_ty_1__bindgen_ty_1 { + pub xrc: ib_srq__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_srq__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub xrcd: *mut ib_xrcd, + pub srq_num: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_uwq_object { + _unused: [u8; 0], +} +pub mod ib_wq_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_WQS_RESET: Type = 0; + pub const IB_WQS_RDY: Type = 1; + pub const IB_WQS_ERR: Type = 2; +} +pub mod ib_wq_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_WQT_RQ: Type = 0; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_wq { + pub device: *mut ib_device, + pub uobject: *mut ib_uwq_object, + pub wq_context: *mut ::aya_ebpf::cty::c_void, + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub pd: *mut ib_pd, + pub cq: *mut ib_cq, + pub wq_num: u32_, + pub state: ib_wq_state::Type, + pub wq_type: ib_wq_type::Type, + pub usecnt: atomic_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_event { + pub device: *mut ib_device, + pub element: ib_event__bindgen_ty_1, + pub event: ib_event_type::Type, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_event__bindgen_ty_1 { + pub cq: *mut ib_cq, + pub qp: *mut ib_qp, + pub srq: *mut ib_srq, + pub wq: *mut ib_wq, + pub port_num: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_global_route { + pub sgid_attr: *const ib_gid_attr, + pub dgid: ib_gid, + pub flow_label: u32_, + pub sgid_index: u8_, + pub hop_limit: u8_, + pub traffic_class: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_grh { + pub version_tclass_flow: __be32, + pub paylen: __be16, + pub next_hdr: u8_, + pub hop_limit: u8_, + pub sgid: ib_gid, + pub dgid: ib_gid, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_mr_status { + pub fail_status: u32_, + pub sig_err: ib_sig_err, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rdma_ah_init_attr { + pub ah_attr: *mut rdma_ah_attr, + pub flags: u32_, + pub xmit_slave: *mut net_device, +} +pub mod rdma_ah_attr_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RDMA_AH_ATTR_TYPE_UNDEFINED: Type = 0; + pub const RDMA_AH_ATTR_TYPE_IB: Type = 1; + pub const RDMA_AH_ATTR_TYPE_ROCE: Type = 2; + pub const RDMA_AH_ATTR_TYPE_OPA: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_ah_attr { + pub dlid: u16_, + pub src_path_bits: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct roce_ah_attr { + pub dmac: [u8_; 6usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct opa_ah_attr { + pub dlid: u32_, + pub src_path_bits: u8_, + pub make_grd: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rdma_ah_attr { + pub grh: ib_global_route, + pub sl: u8_, + pub static_rate: u8_, + pub port_num: u32_, + pub ah_flags: u8_, + pub type_: rdma_ah_attr_type::Type, + pub __bindgen_anon_1: rdma_ah_attr__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union rdma_ah_attr__bindgen_ty_1 { + pub ib: ib_ah_attr, + pub roce: roce_ah_attr, + pub opa: opa_ah_attr, +} +pub mod ib_wc_status { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_WC_SUCCESS: Type = 0; + pub const IB_WC_LOC_LEN_ERR: Type = 1; + pub const IB_WC_LOC_QP_OP_ERR: Type = 2; + pub const IB_WC_LOC_EEC_OP_ERR: Type = 3; + pub const IB_WC_LOC_PROT_ERR: Type = 4; + pub const IB_WC_WR_FLUSH_ERR: Type = 5; + pub const IB_WC_MW_BIND_ERR: Type = 6; + pub const IB_WC_BAD_RESP_ERR: Type = 7; + pub const IB_WC_LOC_ACCESS_ERR: Type = 8; + pub const IB_WC_REM_INV_REQ_ERR: Type = 9; + pub const IB_WC_REM_ACCESS_ERR: Type = 10; + pub const IB_WC_REM_OP_ERR: Type = 11; + pub const IB_WC_RETRY_EXC_ERR: Type = 12; + pub const IB_WC_RNR_RETRY_EXC_ERR: Type = 13; + pub const IB_WC_LOC_RDD_VIOL_ERR: Type = 14; + pub const IB_WC_REM_INV_RD_REQ_ERR: Type = 15; + pub const IB_WC_REM_ABORT_ERR: Type = 16; + pub const IB_WC_INV_EECN_ERR: Type = 17; + pub const IB_WC_INV_EEC_STATE_ERR: Type = 18; + pub const IB_WC_FATAL_ERR: Type = 19; + pub const IB_WC_RESP_TIMEOUT_ERR: Type = 20; + pub const IB_WC_GENERAL_ERR: Type = 21; +} +pub mod ib_wc_opcode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_WC_SEND: Type = 0; + pub const IB_WC_RDMA_WRITE: Type = 1; + pub const IB_WC_RDMA_READ: Type = 2; + pub const IB_WC_COMP_SWAP: Type = 3; + pub const IB_WC_FETCH_ADD: Type = 4; + pub const IB_WC_BIND_MW: Type = 5; + pub const IB_WC_LOCAL_INV: Type = 6; + pub const IB_WC_LSO: Type = 7; + pub const IB_WC_ATOMIC_WRITE: Type = 9; + pub const IB_WC_REG_MR: Type = 10; + pub const IB_WC_MASKED_COMP_SWAP: Type = 11; + pub const IB_WC_MASKED_FETCH_ADD: Type = 12; + pub const IB_WC_FLUSH: Type = 8; + pub const IB_WC_RECV: Type = 128; + pub const IB_WC_RECV_RDMA_WITH_IMM: Type = 129; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_cqe { + pub done: ::core::option::Option, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_wc { + pub __bindgen_anon_1: ib_wc__bindgen_ty_1, + pub status: ib_wc_status::Type, + pub opcode: ib_wc_opcode::Type, + pub vendor_err: u32_, + pub byte_len: u32_, + pub qp: *mut ib_qp, + pub ex: ib_wc__bindgen_ty_2, + pub src_qp: u32_, + pub slid: u32_, + pub wc_flags: ::aya_ebpf::cty::c_int, + pub pkey_index: u16_, + pub sl: u8_, + pub dlid_path_bits: u8_, + pub port_num: u32_, + pub smac: [u8_; 6usize], + pub vlan_id: u16_, + pub network_hdr_type: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_wc__bindgen_ty_1 { + pub wr_id: u64_, + pub wr_cqe: *mut ib_cqe, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_wc__bindgen_ty_2 { + pub imm_data: __be32, + pub invalidate_rkey: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_srq_attr { + pub max_wr: u32_, + pub max_sge: u32_, + pub srq_limit: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_xrcd { + pub device: *mut ib_device, + pub usecnt: atomic_t, + pub inode: *mut inode, + pub tgt_qps_rwsem: rw_semaphore, + pub tgt_qps: xarray, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_srq_init_attr { + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub srq_context: *mut ::aya_ebpf::cty::c_void, + pub attr: ib_srq_attr, + pub srq_type: ib_srq_type::Type, + pub ext: ib_srq_init_attr__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_srq_init_attr__bindgen_ty_1 { + pub cq: *mut ib_cq, + pub __bindgen_anon_1: ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1 { + pub xrc: ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub tag_matching: ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub xrcd: *mut ib_xrcd, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_srq_init_attr__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { + pub max_num_tags: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_qp_cap { + pub max_send_wr: u32_, + pub max_recv_wr: u32_, + pub max_send_sge: u32_, + pub max_recv_sge: u32_, + pub max_inline_data: u32_, + pub max_rdma_ctxs: u32_, +} +pub mod ib_sig_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_SIGNAL_ALL_WR: Type = 0; + pub const IB_SIGNAL_REQ_WR: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_qp_init_attr { + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub qp_context: *mut ::aya_ebpf::cty::c_void, + pub send_cq: *mut ib_cq, + pub recv_cq: *mut ib_cq, + pub srq: *mut ib_srq, + pub xrcd: *mut ib_xrcd, + pub cap: ib_qp_cap, + pub sq_sig_type: ib_sig_type::Type, + pub qp_type: ib_qp_type::Type, + pub create_flags: u32_, + pub port_num: u32_, + pub rwq_ind_tbl: *mut ib_rwq_ind_table, + pub source_qpn: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_rwq_ind_table { + pub device: *mut ib_device, + pub uobject: *mut ib_uobject, + pub usecnt: atomic_t, + pub ind_tbl_num: u32_, + pub log_ind_tbl_size: u32_, + pub ind_tbl: *mut *mut ib_wq, +} +pub mod ib_qp_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_QPS_RESET: Type = 0; + pub const IB_QPS_INIT: Type = 1; + pub const IB_QPS_RTR: Type = 2; + pub const IB_QPS_RTS: Type = 3; + pub const IB_QPS_SQD: Type = 4; + pub const IB_QPS_SQE: Type = 5; + pub const IB_QPS_ERR: Type = 6; +} +pub mod ib_mig_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_MIG_MIGRATED: Type = 0; + pub const IB_MIG_REARM: Type = 1; + pub const IB_MIG_ARMED: Type = 2; +} +pub mod ib_mw_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_MW_TYPE_1: Type = 1; + pub const IB_MW_TYPE_2: Type = 2; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_qp_attr { + pub qp_state: ib_qp_state::Type, + pub cur_qp_state: ib_qp_state::Type, + pub path_mtu: ib_mtu::Type, + pub path_mig_state: ib_mig_state::Type, + pub qkey: u32_, + pub rq_psn: u32_, + pub sq_psn: u32_, + pub dest_qp_num: u32_, + pub qp_access_flags: ::aya_ebpf::cty::c_int, + pub cap: ib_qp_cap, + pub ah_attr: rdma_ah_attr, + pub alt_ah_attr: rdma_ah_attr, + pub pkey_index: u16_, + pub alt_pkey_index: u16_, + pub en_sqd_async_notify: u8_, + pub sq_draining: u8_, + pub max_rd_atomic: u8_, + pub max_dest_rd_atomic: u8_, + pub min_rnr_timer: u8_, + pub port_num: u32_, + pub timeout: u8_, + pub retry_cnt: u8_, + pub rnr_retry: u8_, + pub alt_port_num: u32_, + pub alt_timeout: u8_, + pub rate_limit: u32_, + pub xmit_slave: *mut net_device, +} +pub mod ib_wr_opcode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IB_WR_RDMA_WRITE: Type = 0; + pub const IB_WR_RDMA_WRITE_WITH_IMM: Type = 1; + pub const IB_WR_SEND: Type = 2; + pub const IB_WR_SEND_WITH_IMM: Type = 3; + pub const IB_WR_RDMA_READ: Type = 4; + pub const IB_WR_ATOMIC_CMP_AND_SWP: Type = 5; + pub const IB_WR_ATOMIC_FETCH_AND_ADD: Type = 6; + pub const IB_WR_BIND_MW: Type = 8; + pub const IB_WR_LSO: Type = 10; + pub const IB_WR_SEND_WITH_INV: Type = 9; + pub const IB_WR_RDMA_READ_WITH_INV: Type = 11; + pub const IB_WR_LOCAL_INV: Type = 7; + pub const IB_WR_MASKED_ATOMIC_CMP_AND_SWP: Type = 12; + pub const IB_WR_MASKED_ATOMIC_FETCH_AND_ADD: Type = 13; + pub const IB_WR_FLUSH: Type = 14; + pub const IB_WR_ATOMIC_WRITE: Type = 15; + pub const IB_WR_REG_MR: Type = 32; + pub const IB_WR_REG_MR_INTEGRITY: Type = 33; + pub const IB_WR_RESERVED1: Type = 240; + pub const IB_WR_RESERVED2: Type = 241; + pub const IB_WR_RESERVED3: Type = 242; + pub const IB_WR_RESERVED4: Type = 243; + pub const IB_WR_RESERVED5: Type = 244; + pub const IB_WR_RESERVED6: Type = 245; + pub const IB_WR_RESERVED7: Type = 246; + pub const IB_WR_RESERVED8: Type = 247; + pub const IB_WR_RESERVED9: Type = 248; + pub const IB_WR_RESERVED10: Type = 249; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_sge { + pub addr: u64_, + pub length: u32_, + pub lkey: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_send_wr { + pub next: *mut ib_send_wr, + pub __bindgen_anon_1: ib_send_wr__bindgen_ty_1, + pub sg_list: *mut ib_sge, + pub num_sge: ::aya_ebpf::cty::c_int, + pub opcode: ib_wr_opcode::Type, + pub send_flags: ::aya_ebpf::cty::c_int, + pub ex: ib_send_wr__bindgen_ty_2, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_send_wr__bindgen_ty_1 { + pub wr_id: u64_, + pub wr_cqe: *mut ib_cqe, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_send_wr__bindgen_ty_2 { + pub imm_data: __be32, + pub invalidate_rkey: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_ah { + pub device: *mut ib_device, + pub pd: *mut ib_pd, + pub uobject: *mut ib_uobject, + pub sgid_attr: *const ib_gid_attr, + pub type_: rdma_ah_attr_type::Type, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_mr { + pub device: *mut ib_device, + pub pd: *mut ib_pd, + pub lkey: u32_, + pub rkey: u32_, + pub iova: u64_, + pub length: u64_, + pub page_size: ::aya_ebpf::cty::c_uint, + pub type_: ib_mr_type::Type, + pub need_inval: bool_, + pub __bindgen_anon_1: ib_mr__bindgen_ty_1, + pub dm: *mut ib_dm, + pub sig_attrs: *mut ib_sig_attrs, + pub res: rdma_restrack_entry, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_mr__bindgen_ty_1 { + pub uobject: *mut ib_uobject, + pub qp_entry: list_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_recv_wr { + pub next: *mut ib_recv_wr, + pub __bindgen_anon_1: ib_recv_wr__bindgen_ty_1, + pub sg_list: *mut ib_sge, + pub num_sge: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ib_recv_wr__bindgen_ty_1 { + pub wr_id: u64_, + pub wr_cqe: *mut ib_cqe, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_rdmacg_object { + pub cg: *mut rdma_cgroup, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_uverbs_file { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_ucontext { + pub device: *mut ib_device, + pub ufile: *mut ib_uverbs_file, + pub cg_obj: ib_rdmacg_object, + pub res: rdma_restrack_entry, + pub mmap_xa: xarray, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct uverbs_api_object { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_uobject { + pub user_handle: u64_, + pub ufile: *mut ib_uverbs_file, + pub context: *mut ib_ucontext, + pub object: *mut ::aya_ebpf::cty::c_void, + pub list: list_head, + pub cg_obj: ib_rdmacg_object, + pub id: ::aya_ebpf::cty::c_int, + pub ref_: kref, + pub usecnt: atomic_t, + pub rcu: callback_head, + pub uapi_object: *const uverbs_api_object, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_udata { + pub inbuf: *const ::aya_ebpf::cty::c_void, + pub outbuf: *mut ::aya_ebpf::cty::c_void, + pub inlen: usize, + pub outlen: usize, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ib_pd { + pub local_dma_lkey: u32_, + pub flags: u32_, + pub device: *mut ib_device, + pub uobject: *mut ib_uobject, + pub usecnt: atomic_t, + pub unsafe_global_rkey: u32_, + pub __internal_mr: *mut ib_mr, + pub res: rdma_restrack_entry, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ib_wq_init_attr { + pub wq_context: *mut ::aya_ebpf::cty::c_void, + pub wq_type: ib_wq_type::Type, + pub max_wr: u32_, + pub max_sge: u32_, + pub cq: *mut ib_cq, + pub event_handler: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ib_event, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub create_flags: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -33175,7 +32990,7 @@ pub struct ib_rwq_ind_table_init_attr { pub ind_tbl: *mut *mut ib_wq, } pub mod port_pkey_state { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const IB_PORT_PKEY_NOT_VALID: Type = 0; pub const IB_PORT_PKEY_VALID: Type = 1; pub const IB_PORT_PKEY_LISTED: Type = 2; @@ -33198,11 +33013,11 @@ pub struct ib_qp_security { pub mutex: mutex, pub ports_pkeys: *mut ib_ports_pkeys, pub shared_qp_list: list_head, - pub security: *mut ::aya_bpf::cty::c_void, + pub security: *mut ::aya_ebpf::cty::c_void, pub destroying: bool_, pub error_list_count: atomic_t, pub error_complete: completion, - pub error_comps_pending: ::aya_bpf::cty::c_int, + pub error_comps_pending: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -33229,14 +33044,14 @@ pub struct ib_mw { pub type_: ib_mw_type::Type, } pub mod ib_flow_attr_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const IB_FLOW_ATTR_NORMAL: Type = 0; pub const IB_FLOW_ATTR_ALL_DEFAULT: Type = 1; pub const IB_FLOW_ATTR_MC_DEFAULT: Type = 2; pub const IB_FLOW_ATTR_SNIFFER: Type = 3; } pub mod ib_flow_spec_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const IB_FLOW_SPEC_ETH: Type = 32; pub const IB_FLOW_SPEC_IB: Type = 34; pub const IB_FLOW_SPEC_IPV4: Type = 48; @@ -33418,7 +33233,7 @@ pub struct ib_flow_spec_action_handle { pub act: *mut ib_flow_action, } pub mod ib_flow_action_type { - pub type Type = ::aya_bpf::cty::c_uint; + pub type Type = ::aya_ebpf::cty::c_uint; pub const IB_FLOW_ACTION_UNSPECIFIED: Type = 0; pub const IB_FLOW_ACTION_ESP: Type = 1; } @@ -33507,8 +33322,8 @@ pub struct ib_port_cache { #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ib_port_immutable { - pub pkey_tbl_len: ::aya_bpf::cty::c_int, - pub gid_tbl_len: ::aya_bpf::cty::c_int, + pub pkey_tbl_len: ::aya_ebpf::cty::c_int, + pub gid_tbl_len: ::aya_ebpf::cty::c_int, pub core_cap_flags: u32_, pub max_mad_size: u32_, } @@ -33536,16 +33351,16 @@ pub struct ib_port_data { #[derive(Debug, Copy, Clone)] pub struct rdma_netdev_alloc_params { pub sizeof_priv: usize, - pub txqs: ::aya_bpf::cty::c_uint, - pub rxqs: ::aya_bpf::cty::c_uint, - pub param: *mut ::aya_bpf::cty::c_void, + pub txqs: ::aya_ebpf::cty::c_uint, + pub rxqs: ::aya_ebpf::cty::c_uint, + pub param: *mut ::aya_ebpf::cty::c_void, pub initialize_rdma_netdev: ::core::option::Option< unsafe extern "C" fn( arg1: *mut ib_device, arg2: u32_, arg3: *mut net_device, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] @@ -33560,8811 +33375,6254 @@ pub struct ib_counters_read_attr { pub struct rdma_user_mmap_entry { pub ref_: kref, pub ucontext: *mut ib_ucontext, - pub start_pgoff: ::aya_bpf::cty::c_ulong, + pub start_pgoff: ::aya_ebpf::cty::c_ulong, pub npages: usize, pub driver_removed: bool_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct firmware { - pub size: usize, - pub data: *const u8_, - pub priv_: *mut ::aya_bpf::cty::c_void, +#[derive(Copy, Clone)] +pub struct workqueue_struct { + pub pwqs: list_head, + pub list: list_head, + pub mutex: mutex, + pub work_color: ::aya_ebpf::cty::c_int, + pub flush_color: ::aya_ebpf::cty::c_int, + pub nr_pwqs_to_flush: atomic_t, + pub first_flusher: *mut wq_flusher, + pub flusher_queue: list_head, + pub flusher_overflow: list_head, + pub maydays: list_head, + pub rescuer: *mut worker, + pub nr_drainers: ::aya_ebpf::cty::c_int, + pub saved_max_active: ::aya_ebpf::cty::c_int, + pub unbound_attrs: *mut workqueue_attrs, + pub dfl_pwq: *mut pool_workqueue, + pub wq_dev: *mut wq_device, + pub name: [::aya_ebpf::cty::c_char; 24usize], + pub rcu: callback_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, + pub flags: ::aya_ebpf::cty::c_uint, + pub cpu_pwq: *mut *mut pool_workqueue, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, } -pub mod device_link_state { - pub type Type = ::aya_bpf::cty::c_int; - pub const DL_STATE_NONE: Type = -1; - pub const DL_STATE_DORMANT: Type = 0; - pub const DL_STATE_AVAILABLE: Type = 1; - pub const DL_STATE_CONSUMER_PROBE: Type = 2; - pub const DL_STATE_ACTIVE: Type = 3; - pub const DL_STATE_SUPPLIER_UNBIND: Type = 4; +pub mod wq_affn_scope { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const WQ_AFFN_DFL: Type = 0; + pub const WQ_AFFN_CPU: Type = 1; + pub const WQ_AFFN_SMT: Type = 2; + pub const WQ_AFFN_CACHE: Type = 3; + pub const WQ_AFFN_NUMA: Type = 4; + pub const WQ_AFFN_SYSTEM: Type = 5; + pub const WQ_AFFN_NR_TYPES: Type = 6; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct workqueue_attrs { + pub nice: ::aya_ebpf::cty::c_int, + pub cpumask: cpumask_var_t, + pub __pod_cpumask: cpumask_var_t, + pub affn_strict: bool_, + pub affn_scope: wq_affn_scope::Type, + pub ordered: bool_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct device_link { - pub supplier: *mut device, - pub s_node: list_head, - pub consumer: *mut device, - pub c_node: list_head, - pub link_dev: device, - pub status: device_link_state::Type, - pub flags: u32_, - pub rpm_active: refcount_t, - pub kref: kref, - pub rm_work: work_struct, - pub supplier_preactivated: bool_, +pub struct worker { + pub __bindgen_anon_1: worker__bindgen_ty_1, + pub current_work: *mut work_struct, + pub current_func: work_func_t, + pub current_pwq: *mut pool_workqueue, + pub current_at: u64_, + pub current_color: ::aya_ebpf::cty::c_uint, + pub sleeping: ::aya_ebpf::cty::c_int, + pub last_func: work_func_t, + pub scheduled: list_head, + pub task: *mut task_struct, + pub pool: *mut worker_pool, + pub node: list_head, + pub last_active: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_uint, + pub id: ::aya_ebpf::cty::c_int, + pub desc: [::aya_ebpf::cty::c_char; 24usize], + pub rescue_wq: *mut workqueue_struct, } #[repr(C)] #[derive(Copy, Clone)] -pub struct mdio_device { - pub dev: device, - pub bus: *mut mii_bus, - pub modalias: [::aya_bpf::cty::c_char; 32usize], - pub bus_match: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut device, arg2: *mut device_driver) -> ::aya_bpf::cty::c_int, - >, - pub device_free: ::core::option::Option, - pub device_remove: ::core::option::Option, - pub addr: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, - pub reset_gpio: *mut gpio_desc, - pub reset_ctrl: *mut reset_control, - pub reset_assert_delay: ::aya_bpf::cty::c_uint, - pub reset_deassert_delay: ::aya_bpf::cty::c_uint, +pub union worker__bindgen_ty_1 { + pub entry: list_head, + pub hentry: hlist_node, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phy_c45_device_ids { - pub devices_in_package: u32_, - pub mmds_present: u32_, - pub device_ids: [u32_; 32usize], +pub struct pool_workqueue { + pub pool: *mut worker_pool, + pub wq: *mut workqueue_struct, + pub work_color: ::aya_ebpf::cty::c_int, + pub flush_color: ::aya_ebpf::cty::c_int, + pub refcnt: ::aya_ebpf::cty::c_int, + pub nr_in_flight: [::aya_ebpf::cty::c_int; 16usize], + pub nr_active: ::aya_ebpf::cty::c_int, + pub max_active: ::aya_ebpf::cty::c_int, + pub inactive_works: list_head, + pub pwqs_node: list_head, + pub mayday_node: list_head, + pub stats: [u64_; 8usize], + pub release_work: kthread_work, + pub rcu: callback_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 240usize]>, } -pub mod phy_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PHY_DOWN: Type = 0; - pub const PHY_READY: Type = 1; - pub const PHY_HALTED: Type = 2; - pub const PHY_UP: Type = 3; - pub const PHY_RUNNING: Type = 4; - pub const PHY_NOLINK: Type = 5; - pub const PHY_CABLETEST: Type = 6; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct worker_pool { + pub lock: raw_spinlock_t, + pub cpu: ::aya_ebpf::cty::c_int, + pub node: ::aya_ebpf::cty::c_int, + pub id: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_uint, + pub watchdog_ts: ::aya_ebpf::cty::c_ulong, + pub cpu_stall: bool_, + pub nr_running: ::aya_ebpf::cty::c_int, + pub worklist: list_head, + pub nr_workers: ::aya_ebpf::cty::c_int, + pub nr_idle: ::aya_ebpf::cty::c_int, + pub idle_list: list_head, + pub idle_timer: timer_list, + pub idle_cull_work: work_struct, + pub mayday_timer: timer_list, + pub busy_hash: [hlist_head; 64usize], + pub manager: *mut worker, + pub workers: list_head, + pub dying_workers: list_head, + pub detach_completion: *mut completion, + pub worker_ida: ida, + pub attrs: *mut workqueue_attrs, + pub hash_node: hlist_node, + pub refcnt: ::aya_ebpf::cty::c_int, + pub rcu: callback_head, } -pub mod phy_interface_t { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PHY_INTERFACE_MODE_NA: Type = 0; - pub const PHY_INTERFACE_MODE_INTERNAL: Type = 1; - pub const PHY_INTERFACE_MODE_MII: Type = 2; - pub const PHY_INTERFACE_MODE_GMII: Type = 3; - pub const PHY_INTERFACE_MODE_SGMII: Type = 4; - pub const PHY_INTERFACE_MODE_TBI: Type = 5; - pub const PHY_INTERFACE_MODE_REVMII: Type = 6; - pub const PHY_INTERFACE_MODE_RMII: Type = 7; - pub const PHY_INTERFACE_MODE_REVRMII: Type = 8; - pub const PHY_INTERFACE_MODE_RGMII: Type = 9; - pub const PHY_INTERFACE_MODE_RGMII_ID: Type = 10; - pub const PHY_INTERFACE_MODE_RGMII_RXID: Type = 11; - pub const PHY_INTERFACE_MODE_RGMII_TXID: Type = 12; - pub const PHY_INTERFACE_MODE_RTBI: Type = 13; - pub const PHY_INTERFACE_MODE_SMII: Type = 14; - pub const PHY_INTERFACE_MODE_XGMII: Type = 15; - pub const PHY_INTERFACE_MODE_XLGMII: Type = 16; - pub const PHY_INTERFACE_MODE_MOCA: Type = 17; - pub const PHY_INTERFACE_MODE_QSGMII: Type = 18; - pub const PHY_INTERFACE_MODE_TRGMII: Type = 19; - pub const PHY_INTERFACE_MODE_100BASEX: Type = 20; - pub const PHY_INTERFACE_MODE_1000BASEX: Type = 21; - pub const PHY_INTERFACE_MODE_2500BASEX: Type = 22; - pub const PHY_INTERFACE_MODE_5GBASER: Type = 23; - pub const PHY_INTERFACE_MODE_RXAUI: Type = 24; - pub const PHY_INTERFACE_MODE_XAUI: Type = 25; - pub const PHY_INTERFACE_MODE_10GBASER: Type = 26; - pub const PHY_INTERFACE_MODE_25GBASER: Type = 27; - pub const PHY_INTERFACE_MODE_USXGMII: Type = 28; - pub const PHY_INTERFACE_MODE_10GKR: Type = 29; - pub const PHY_INTERFACE_MODE_QUSGMII: Type = 30; - pub const PHY_INTERFACE_MODE_1000BASEKX: Type = 31; - pub const PHY_INTERFACE_MODE_MAX: Type = 32; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct wq_flusher { + pub list: list_head, + pub flush_color: ::aya_ebpf::cty::c_int, + pub done: completion, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct phy_led_trigger { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct wq_device { + pub wq: *mut workqueue_struct, + pub dev: device, +} +pub mod hash_algo { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const HASH_ALGO_MD4: Type = 0; + pub const HASH_ALGO_MD5: Type = 1; + pub const HASH_ALGO_SHA1: Type = 2; + pub const HASH_ALGO_RIPE_MD_160: Type = 3; + pub const HASH_ALGO_SHA256: Type = 4; + pub const HASH_ALGO_SHA384: Type = 5; + pub const HASH_ALGO_SHA512: Type = 6; + pub const HASH_ALGO_SHA224: Type = 7; + pub const HASH_ALGO_RIPE_MD_128: Type = 8; + pub const HASH_ALGO_RIPE_MD_256: Type = 9; + pub const HASH_ALGO_RIPE_MD_320: Type = 10; + pub const HASH_ALGO_WP_256: Type = 11; + pub const HASH_ALGO_WP_384: Type = 12; + pub const HASH_ALGO_WP_512: Type = 13; + pub const HASH_ALGO_TGR_128: Type = 14; + pub const HASH_ALGO_TGR_160: Type = 15; + pub const HASH_ALGO_TGR_192: Type = 16; + pub const HASH_ALGO_SM3_256: Type = 17; + pub const HASH_ALGO_STREEBOG_256: Type = 18; + pub const HASH_ALGO_STREEBOG_512: Type = 19; + pub const HASH_ALGO_SHA3_256: Type = 20; + pub const HASH_ALGO_SHA3_384: Type = 21; + pub const HASH_ALGO_SHA3_512: Type = 22; + pub const HASH_ALGO__LAST: Type = 23; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phylink { - _unused: [u8; 0], +pub struct iopf_device_param { + pub dev: *mut device, + pub queue: *mut iopf_queue, + pub queue_list: list_head, + pub partial: list_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct phy_device { - pub mdio: mdio_device, - pub drv: *mut phy_driver, - pub devlink: *mut device_link, - pub phy_id: u32_, - pub c45_ids: phy_c45_device_ids, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 3usize]>, - pub rate_matching: ::aya_bpf::cty::c_int, - pub state: phy_state::Type, - pub dev_flags: u32_, - pub interface: phy_interface_t::Type, - pub speed: ::aya_bpf::cty::c_int, - pub duplex: ::aya_bpf::cty::c_int, - pub port: ::aya_bpf::cty::c_int, - pub pause: ::aya_bpf::cty::c_int, - pub asym_pause: ::aya_bpf::cty::c_int, - pub master_slave_get: u8_, - pub master_slave_set: u8_, - pub master_slave_state: u8_, - pub supported: [::aya_bpf::cty::c_ulong; 2usize], - pub advertising: [::aya_bpf::cty::c_ulong; 2usize], - pub lp_advertising: [::aya_bpf::cty::c_ulong; 2usize], - pub adv_old: [::aya_bpf::cty::c_ulong; 2usize], - pub supported_eee: [::aya_bpf::cty::c_ulong; 2usize], - pub advertising_eee: [::aya_bpf::cty::c_ulong; 2usize], - pub eee_enabled: bool_, - pub host_interfaces: [::aya_bpf::cty::c_ulong; 1usize], - pub eee_broken_modes: u32_, - pub phy_led_triggers: *mut phy_led_trigger, - pub phy_num_led_triggers: ::aya_bpf::cty::c_uint, - pub last_triggered: *mut phy_led_trigger, - pub led_link_trigger: *mut phy_led_trigger, - pub leds: list_head, - pub irq: ::aya_bpf::cty::c_int, - pub priv_: *mut ::aya_bpf::cty::c_void, - pub shared: *mut phy_package_shared, - pub skb: *mut sk_buff, - pub ehdr: *mut ::aya_bpf::cty::c_void, - pub nest: *mut nlattr, - pub state_queue: delayed_work, +pub struct iopf_queue { + pub wq: *mut workqueue_struct, + pub devices: list_head, pub lock: mutex, - pub sfp_bus_attached: bool_, - pub sfp_bus: *mut sfp_bus, - pub phylink: *mut phylink, - pub attached_dev: *mut net_device, - pub mii_ts: *mut mii_timestamper, - pub psec: *mut pse_control, - pub mdix: u8_, - pub mdix_ctrl: u8_, - pub pma_extable: ::aya_bpf::cty::c_int, - pub link_down_events: ::aya_bpf::cty::c_uint, - pub phy_link_change: - ::core::option::Option, - pub adjust_link: ::core::option::Option, - pub macsec_ops: *const macsec_ops, } -impl phy_device { - #[inline] - pub fn is_c45(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_c45(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn is_internal(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_internal(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn is_pseudo_fixed_link(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_pseudo_fixed_link(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn is_gigabit_capable(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_gigabit_capable(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn has_fixups(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } - } - #[inline] - pub fn set_has_fixups(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn suspended(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } - } - #[inline] - pub fn set_suspended(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) - } - } - #[inline] - pub fn suspended_by_mdio_bus(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } - } - #[inline] - pub fn set_suspended_by_mdio_bus(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) - } - } - #[inline] - pub fn sysfs_links(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } - } - #[inline] - pub fn set_sysfs_links(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) - } - } - #[inline] - pub fn loopback_enabled(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) } - } - #[inline] - pub fn set_loopback_enabled(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 1u8, val as u64) - } - } - #[inline] - pub fn downshifted_rate(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u32) } - } - #[inline] - pub fn set_downshifted_rate(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(9usize, 1u8, val as u64) - } - } - #[inline] - pub fn is_on_sfp_module(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u32) } - } - #[inline] - pub fn set_is_on_sfp_module(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(10usize, 1u8, val as u64) - } - } - #[inline] - pub fn mac_managed_pm(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) } - } - #[inline] - pub fn set_mac_managed_pm(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 1u8, val as u64) - } - } - #[inline] - pub fn autoneg(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u32) } - } - #[inline] - pub fn set_autoneg(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(12usize, 1u8, val as u64) - } - } - #[inline] - pub fn link(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u32) } - } - #[inline] - pub fn set_link(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(13usize, 1u8, val as u64) - } - } - #[inline] - pub fn autoneg_complete(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) } - } - #[inline] - pub fn set_autoneg_complete(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(14usize, 1u8, val as u64) - } - } - #[inline] - pub fn interrupts(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) } - } - #[inline] - pub fn set_interrupts(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(15usize, 1u8, val as u64) - } - } - #[inline] - pub fn irq_suspended(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 1u8) as u32) } - } - #[inline] - pub fn set_irq_suspended(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(16usize, 1u8, val as u64) - } - } - #[inline] - pub fn irq_rerun(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u32) } - } - #[inline] - pub fn set_irq_rerun(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(17usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - is_c45: ::aya_bpf::cty::c_uint, - is_internal: ::aya_bpf::cty::c_uint, - is_pseudo_fixed_link: ::aya_bpf::cty::c_uint, - is_gigabit_capable: ::aya_bpf::cty::c_uint, - has_fixups: ::aya_bpf::cty::c_uint, - suspended: ::aya_bpf::cty::c_uint, - suspended_by_mdio_bus: ::aya_bpf::cty::c_uint, - sysfs_links: ::aya_bpf::cty::c_uint, - loopback_enabled: ::aya_bpf::cty::c_uint, - downshifted_rate: ::aya_bpf::cty::c_uint, - is_on_sfp_module: ::aya_bpf::cty::c_uint, - mac_managed_pm: ::aya_bpf::cty::c_uint, - autoneg: ::aya_bpf::cty::c_uint, - link: ::aya_bpf::cty::c_uint, - autoneg_complete: ::aya_bpf::cty::c_uint, - interrupts: ::aya_bpf::cty::c_uint, - irq_suspended: ::aya_bpf::cty::c_uint, - irq_rerun: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 3usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 3usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let is_c45: u32 = unsafe { ::core::mem::transmute(is_c45) }; - is_c45 as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let is_internal: u32 = unsafe { ::core::mem::transmute(is_internal) }; - is_internal as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let is_pseudo_fixed_link: u32 = unsafe { ::core::mem::transmute(is_pseudo_fixed_link) }; - is_pseudo_fixed_link as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let is_gigabit_capable: u32 = unsafe { ::core::mem::transmute(is_gigabit_capable) }; - is_gigabit_capable as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let has_fixups: u32 = unsafe { ::core::mem::transmute(has_fixups) }; - has_fixups as u64 - }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let suspended: u32 = unsafe { ::core::mem::transmute(suspended) }; - suspended as u64 - }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let suspended_by_mdio_bus: u32 = - unsafe { ::core::mem::transmute(suspended_by_mdio_bus) }; - suspended_by_mdio_bus as u64 - }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let sysfs_links: u32 = unsafe { ::core::mem::transmute(sysfs_links) }; - sysfs_links as u64 - }); - __bindgen_bitfield_unit.set(8usize, 1u8, { - let loopback_enabled: u32 = unsafe { ::core::mem::transmute(loopback_enabled) }; - loopback_enabled as u64 - }); - __bindgen_bitfield_unit.set(9usize, 1u8, { - let downshifted_rate: u32 = unsafe { ::core::mem::transmute(downshifted_rate) }; - downshifted_rate as u64 - }); - __bindgen_bitfield_unit.set(10usize, 1u8, { - let is_on_sfp_module: u32 = unsafe { ::core::mem::transmute(is_on_sfp_module) }; - is_on_sfp_module as u64 - }); - __bindgen_bitfield_unit.set(11usize, 1u8, { - let mac_managed_pm: u32 = unsafe { ::core::mem::transmute(mac_managed_pm) }; - mac_managed_pm as u64 - }); - __bindgen_bitfield_unit.set(12usize, 1u8, { - let autoneg: u32 = unsafe { ::core::mem::transmute(autoneg) }; - autoneg as u64 - }); - __bindgen_bitfield_unit.set(13usize, 1u8, { - let link: u32 = unsafe { ::core::mem::transmute(link) }; - link as u64 - }); - __bindgen_bitfield_unit.set(14usize, 1u8, { - let autoneg_complete: u32 = unsafe { ::core::mem::transmute(autoneg_complete) }; - autoneg_complete as u64 - }); - __bindgen_bitfield_unit.set(15usize, 1u8, { - let interrupts: u32 = unsafe { ::core::mem::transmute(interrupts) }; - interrupts as u64 - }); - __bindgen_bitfield_unit.set(16usize, 1u8, { - let irq_suspended: u32 = unsafe { ::core::mem::transmute(irq_suspended) }; - irq_suspended as u64 - }); - __bindgen_bitfield_unit.set(17usize, 1u8, { - let irq_rerun: u32 = unsafe { ::core::mem::transmute(irq_rerun) }; - irq_rerun as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Copy, Clone)] +pub struct __kernel_sockaddr_storage { + pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct phy_plca_cfg { - pub version: ::aya_bpf::cty::c_int, - pub enabled: ::aya_bpf::cty::c_int, - pub node_id: ::aya_bpf::cty::c_int, - pub node_cnt: ::aya_bpf::cty::c_int, - pub to_tmr: ::aya_bpf::cty::c_int, - pub burst_cnt: ::aya_bpf::cty::c_int, - pub burst_tmr: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub union __kernel_sockaddr_storage__bindgen_ty_1 { + pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1, + pub __align: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phy_plca_status { - pub pst: bool_, +pub struct __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1 { + pub ss_family: __kernel_sa_family_t, + pub __data: [::aya_ebpf::cty::c_char; 126usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phy_tdr_config { - pub first: u32_, - pub last: u32_, - pub step: u32_, - pub pair: s8, +pub struct flow_dissector { + pub used_keys: ::aya_ebpf::cty::c_ulonglong, + pub offset: [::aya_ebpf::cty::c_ushort; 33usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct mdio_bus_stats { - pub transfers: u64_stats_t, - pub errors: u64_stats_t, - pub writes: u64_stats_t, - pub reads: u64_stats_t, - pub syncp: u64_stats_sync, +pub struct nf_conntrack { + pub use_: refcount_t, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct mii_bus { - pub owner: *mut module, - pub name: *const ::aya_bpf::cty::c_char, - pub id: [::aya_bpf::cty::c_char; 61usize], - pub priv_: *mut ::aya_bpf::cty::c_void, - pub read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_bus, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_bus, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub read_c45: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_bus, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub write_c45: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_bus, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - arg5: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub reset: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub stats: [mdio_bus_stats; 32usize], - pub mdio_lock: mutex, - pub parent: *mut device, - pub state: mii_bus__bindgen_ty_1::Type, - pub dev: device, - pub mdio_map: [*mut mdio_device; 32usize], - pub phy_mask: u32_, - pub phy_ignore_ta_mask: u32_, - pub irq: [::aya_bpf::cty::c_int; 32usize], - pub reset_delay_us: ::aya_bpf::cty::c_int, - pub reset_post_delay_us: ::aya_bpf::cty::c_int, - pub reset_gpiod: *mut gpio_desc, - pub shared_lock: mutex, - pub shared: [*mut phy_package_shared; 32usize], +#[derive(Debug, Copy, Clone)] +pub struct netdev_notifier_info { + pub dev: *mut net_device, + pub extack: *mut netlink_ext_ack, } -pub mod mii_bus__bindgen_ty_1 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const MDIOBUS_ALLOCATED: Type = 1; - pub const MDIOBUS_REGISTERED: Type = 2; - pub const MDIOBUS_UNREGISTERED: Type = 3; - pub const MDIOBUS_RELEASED: Type = 4; +pub mod bpf_func_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_FUNC_unspec: Type = 0; + pub const BPF_FUNC_map_lookup_elem: Type = 1; + pub const BPF_FUNC_map_update_elem: Type = 2; + pub const BPF_FUNC_map_delete_elem: Type = 3; + pub const BPF_FUNC_probe_read: Type = 4; + pub const BPF_FUNC_ktime_get_ns: Type = 5; + pub const BPF_FUNC_trace_printk: Type = 6; + pub const BPF_FUNC_get_prandom_u32: Type = 7; + pub const BPF_FUNC_get_smp_processor_id: Type = 8; + pub const BPF_FUNC_skb_store_bytes: Type = 9; + pub const BPF_FUNC_l3_csum_replace: Type = 10; + pub const BPF_FUNC_l4_csum_replace: Type = 11; + pub const BPF_FUNC_tail_call: Type = 12; + pub const BPF_FUNC_clone_redirect: Type = 13; + pub const BPF_FUNC_get_current_pid_tgid: Type = 14; + pub const BPF_FUNC_get_current_uid_gid: Type = 15; + pub const BPF_FUNC_get_current_comm: Type = 16; + pub const BPF_FUNC_get_cgroup_classid: Type = 17; + pub const BPF_FUNC_skb_vlan_push: Type = 18; + pub const BPF_FUNC_skb_vlan_pop: Type = 19; + pub const BPF_FUNC_skb_get_tunnel_key: Type = 20; + pub const BPF_FUNC_skb_set_tunnel_key: Type = 21; + pub const BPF_FUNC_perf_event_read: Type = 22; + pub const BPF_FUNC_redirect: Type = 23; + pub const BPF_FUNC_get_route_realm: Type = 24; + pub const BPF_FUNC_perf_event_output: Type = 25; + pub const BPF_FUNC_skb_load_bytes: Type = 26; + pub const BPF_FUNC_get_stackid: Type = 27; + pub const BPF_FUNC_csum_diff: Type = 28; + pub const BPF_FUNC_skb_get_tunnel_opt: Type = 29; + pub const BPF_FUNC_skb_set_tunnel_opt: Type = 30; + pub const BPF_FUNC_skb_change_proto: Type = 31; + pub const BPF_FUNC_skb_change_type: Type = 32; + pub const BPF_FUNC_skb_under_cgroup: Type = 33; + pub const BPF_FUNC_get_hash_recalc: Type = 34; + pub const BPF_FUNC_get_current_task: Type = 35; + pub const BPF_FUNC_probe_write_user: Type = 36; + pub const BPF_FUNC_current_task_under_cgroup: Type = 37; + pub const BPF_FUNC_skb_change_tail: Type = 38; + pub const BPF_FUNC_skb_pull_data: Type = 39; + pub const BPF_FUNC_csum_update: Type = 40; + pub const BPF_FUNC_set_hash_invalid: Type = 41; + pub const BPF_FUNC_get_numa_node_id: Type = 42; + pub const BPF_FUNC_skb_change_head: Type = 43; + pub const BPF_FUNC_xdp_adjust_head: Type = 44; + pub const BPF_FUNC_probe_read_str: Type = 45; + pub const BPF_FUNC_get_socket_cookie: Type = 46; + pub const BPF_FUNC_get_socket_uid: Type = 47; + pub const BPF_FUNC_set_hash: Type = 48; + pub const BPF_FUNC_setsockopt: Type = 49; + pub const BPF_FUNC_skb_adjust_room: Type = 50; + pub const BPF_FUNC_redirect_map: Type = 51; + pub const BPF_FUNC_sk_redirect_map: Type = 52; + pub const BPF_FUNC_sock_map_update: Type = 53; + pub const BPF_FUNC_xdp_adjust_meta: Type = 54; + pub const BPF_FUNC_perf_event_read_value: Type = 55; + pub const BPF_FUNC_perf_prog_read_value: Type = 56; + pub const BPF_FUNC_getsockopt: Type = 57; + pub const BPF_FUNC_override_return: Type = 58; + pub const BPF_FUNC_sock_ops_cb_flags_set: Type = 59; + pub const BPF_FUNC_msg_redirect_map: Type = 60; + pub const BPF_FUNC_msg_apply_bytes: Type = 61; + pub const BPF_FUNC_msg_cork_bytes: Type = 62; + pub const BPF_FUNC_msg_pull_data: Type = 63; + pub const BPF_FUNC_bind: Type = 64; + pub const BPF_FUNC_xdp_adjust_tail: Type = 65; + pub const BPF_FUNC_skb_get_xfrm_state: Type = 66; + pub const BPF_FUNC_get_stack: Type = 67; + pub const BPF_FUNC_skb_load_bytes_relative: Type = 68; + pub const BPF_FUNC_fib_lookup: Type = 69; + pub const BPF_FUNC_sock_hash_update: Type = 70; + pub const BPF_FUNC_msg_redirect_hash: Type = 71; + pub const BPF_FUNC_sk_redirect_hash: Type = 72; + pub const BPF_FUNC_lwt_push_encap: Type = 73; + pub const BPF_FUNC_lwt_seg6_store_bytes: Type = 74; + pub const BPF_FUNC_lwt_seg6_adjust_srh: Type = 75; + pub const BPF_FUNC_lwt_seg6_action: Type = 76; + pub const BPF_FUNC_rc_repeat: Type = 77; + pub const BPF_FUNC_rc_keydown: Type = 78; + pub const BPF_FUNC_skb_cgroup_id: Type = 79; + pub const BPF_FUNC_get_current_cgroup_id: Type = 80; + pub const BPF_FUNC_get_local_storage: Type = 81; + pub const BPF_FUNC_sk_select_reuseport: Type = 82; + pub const BPF_FUNC_skb_ancestor_cgroup_id: Type = 83; + pub const BPF_FUNC_sk_lookup_tcp: Type = 84; + pub const BPF_FUNC_sk_lookup_udp: Type = 85; + pub const BPF_FUNC_sk_release: Type = 86; + pub const BPF_FUNC_map_push_elem: Type = 87; + pub const BPF_FUNC_map_pop_elem: Type = 88; + pub const BPF_FUNC_map_peek_elem: Type = 89; + pub const BPF_FUNC_msg_push_data: Type = 90; + pub const BPF_FUNC_msg_pop_data: Type = 91; + pub const BPF_FUNC_rc_pointer_rel: Type = 92; + pub const BPF_FUNC_spin_lock: Type = 93; + pub const BPF_FUNC_spin_unlock: Type = 94; + pub const BPF_FUNC_sk_fullsock: Type = 95; + pub const BPF_FUNC_tcp_sock: Type = 96; + pub const BPF_FUNC_skb_ecn_set_ce: Type = 97; + pub const BPF_FUNC_get_listener_sock: Type = 98; + pub const BPF_FUNC_skc_lookup_tcp: Type = 99; + pub const BPF_FUNC_tcp_check_syncookie: Type = 100; + pub const BPF_FUNC_sysctl_get_name: Type = 101; + pub const BPF_FUNC_sysctl_get_current_value: Type = 102; + pub const BPF_FUNC_sysctl_get_new_value: Type = 103; + pub const BPF_FUNC_sysctl_set_new_value: Type = 104; + pub const BPF_FUNC_strtol: Type = 105; + pub const BPF_FUNC_strtoul: Type = 106; + pub const BPF_FUNC_sk_storage_get: Type = 107; + pub const BPF_FUNC_sk_storage_delete: Type = 108; + pub const BPF_FUNC_send_signal: Type = 109; + pub const BPF_FUNC_tcp_gen_syncookie: Type = 110; + pub const BPF_FUNC_skb_output: Type = 111; + pub const BPF_FUNC_probe_read_user: Type = 112; + pub const BPF_FUNC_probe_read_kernel: Type = 113; + pub const BPF_FUNC_probe_read_user_str: Type = 114; + pub const BPF_FUNC_probe_read_kernel_str: Type = 115; + pub const BPF_FUNC_tcp_send_ack: Type = 116; + pub const BPF_FUNC_send_signal_thread: Type = 117; + pub const BPF_FUNC_jiffies64: Type = 118; + pub const BPF_FUNC_read_branch_records: Type = 119; + pub const BPF_FUNC_get_ns_current_pid_tgid: Type = 120; + pub const BPF_FUNC_xdp_output: Type = 121; + pub const BPF_FUNC_get_netns_cookie: Type = 122; + pub const BPF_FUNC_get_current_ancestor_cgroup_id: Type = 123; + pub const BPF_FUNC_sk_assign: Type = 124; + pub const BPF_FUNC_ktime_get_boot_ns: Type = 125; + pub const BPF_FUNC_seq_printf: Type = 126; + pub const BPF_FUNC_seq_write: Type = 127; + pub const BPF_FUNC_sk_cgroup_id: Type = 128; + pub const BPF_FUNC_sk_ancestor_cgroup_id: Type = 129; + pub const BPF_FUNC_ringbuf_output: Type = 130; + pub const BPF_FUNC_ringbuf_reserve: Type = 131; + pub const BPF_FUNC_ringbuf_submit: Type = 132; + pub const BPF_FUNC_ringbuf_discard: Type = 133; + pub const BPF_FUNC_ringbuf_query: Type = 134; + pub const BPF_FUNC_csum_level: Type = 135; + pub const BPF_FUNC_skc_to_tcp6_sock: Type = 136; + pub const BPF_FUNC_skc_to_tcp_sock: Type = 137; + pub const BPF_FUNC_skc_to_tcp_timewait_sock: Type = 138; + pub const BPF_FUNC_skc_to_tcp_request_sock: Type = 139; + pub const BPF_FUNC_skc_to_udp6_sock: Type = 140; + pub const BPF_FUNC_get_task_stack: Type = 141; + pub const BPF_FUNC_load_hdr_opt: Type = 142; + pub const BPF_FUNC_store_hdr_opt: Type = 143; + pub const BPF_FUNC_reserve_hdr_opt: Type = 144; + pub const BPF_FUNC_inode_storage_get: Type = 145; + pub const BPF_FUNC_inode_storage_delete: Type = 146; + pub const BPF_FUNC_d_path: Type = 147; + pub const BPF_FUNC_copy_from_user: Type = 148; + pub const BPF_FUNC_snprintf_btf: Type = 149; + pub const BPF_FUNC_seq_printf_btf: Type = 150; + pub const BPF_FUNC_skb_cgroup_classid: Type = 151; + pub const BPF_FUNC_redirect_neigh: Type = 152; + pub const BPF_FUNC_per_cpu_ptr: Type = 153; + pub const BPF_FUNC_this_cpu_ptr: Type = 154; + pub const BPF_FUNC_redirect_peer: Type = 155; + pub const BPF_FUNC_task_storage_get: Type = 156; + pub const BPF_FUNC_task_storage_delete: Type = 157; + pub const BPF_FUNC_get_current_task_btf: Type = 158; + pub const BPF_FUNC_bprm_opts_set: Type = 159; + pub const BPF_FUNC_ktime_get_coarse_ns: Type = 160; + pub const BPF_FUNC_ima_inode_hash: Type = 161; + pub const BPF_FUNC_sock_from_file: Type = 162; + pub const BPF_FUNC_check_mtu: Type = 163; + pub const BPF_FUNC_for_each_map_elem: Type = 164; + pub const BPF_FUNC_snprintf: Type = 165; + pub const BPF_FUNC_sys_bpf: Type = 166; + pub const BPF_FUNC_btf_find_by_name_kind: Type = 167; + pub const BPF_FUNC_sys_close: Type = 168; + pub const BPF_FUNC_timer_init: Type = 169; + pub const BPF_FUNC_timer_set_callback: Type = 170; + pub const BPF_FUNC_timer_start: Type = 171; + pub const BPF_FUNC_timer_cancel: Type = 172; + pub const BPF_FUNC_get_func_ip: Type = 173; + pub const BPF_FUNC_get_attach_cookie: Type = 174; + pub const BPF_FUNC_task_pt_regs: Type = 175; + pub const BPF_FUNC_get_branch_snapshot: Type = 176; + pub const BPF_FUNC_trace_vprintk: Type = 177; + pub const BPF_FUNC_skc_to_unix_sock: Type = 178; + pub const BPF_FUNC_kallsyms_lookup_name: Type = 179; + pub const BPF_FUNC_find_vma: Type = 180; + pub const BPF_FUNC_loop: Type = 181; + pub const BPF_FUNC_strncmp: Type = 182; + pub const BPF_FUNC_get_func_arg: Type = 183; + pub const BPF_FUNC_get_func_ret: Type = 184; + pub const BPF_FUNC_get_func_arg_cnt: Type = 185; + pub const BPF_FUNC_get_retval: Type = 186; + pub const BPF_FUNC_set_retval: Type = 187; + pub const BPF_FUNC_xdp_get_buff_len: Type = 188; + pub const BPF_FUNC_xdp_load_bytes: Type = 189; + pub const BPF_FUNC_xdp_store_bytes: Type = 190; + pub const BPF_FUNC_copy_from_user_task: Type = 191; + pub const BPF_FUNC_skb_set_tstamp: Type = 192; + pub const BPF_FUNC_ima_file_hash: Type = 193; + pub const BPF_FUNC_kptr_xchg: Type = 194; + pub const BPF_FUNC_map_lookup_percpu_elem: Type = 195; + pub const BPF_FUNC_skc_to_mptcp_sock: Type = 196; + pub const BPF_FUNC_dynptr_from_mem: Type = 197; + pub const BPF_FUNC_ringbuf_reserve_dynptr: Type = 198; + pub const BPF_FUNC_ringbuf_submit_dynptr: Type = 199; + pub const BPF_FUNC_ringbuf_discard_dynptr: Type = 200; + pub const BPF_FUNC_dynptr_read: Type = 201; + pub const BPF_FUNC_dynptr_write: Type = 202; + pub const BPF_FUNC_dynptr_data: Type = 203; + pub const BPF_FUNC_tcp_raw_gen_syncookie_ipv4: Type = 204; + pub const BPF_FUNC_tcp_raw_gen_syncookie_ipv6: Type = 205; + pub const BPF_FUNC_tcp_raw_check_syncookie_ipv4: Type = 206; + pub const BPF_FUNC_tcp_raw_check_syncookie_ipv6: Type = 207; + pub const BPF_FUNC_ktime_get_tai_ns: Type = 208; + pub const BPF_FUNC_user_ringbuf_drain: Type = 209; + pub const BPF_FUNC_cgrp_storage_get: Type = 210; + pub const BPF_FUNC_cgrp_storage_delete: Type = 211; + pub const __BPF_FUNC_MAX_ID: Type = 212; } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mdio_driver_common { - pub driver: device_driver, - pub flags: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub struct bpf_link_info { + pub type_: __u32, + pub id: __u32, + pub prog_id: __u32, + pub __bindgen_anon_1: bpf_link_info__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mii_timestamper { - pub rxtstamp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_timestamper, - arg2: *mut sk_buff, - arg3: ::aya_bpf::cty::c_int, - ) -> bool_, - >, - pub txtstamp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_timestamper, - arg2: *mut sk_buff, - arg3: ::aya_bpf::cty::c_int, - ), - >, - pub hwtstamp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut mii_timestamper, arg2: *mut ifreq) -> ::aya_bpf::cty::c_int, - >, - pub link_state: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut mii_timestamper, arg2: *mut phy_device), - >, - pub ts_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut mii_timestamper, - arg2: *mut ethtool_ts_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub device: *mut device, +#[derive(Copy, Clone)] +pub union bpf_link_info__bindgen_ty_1 { + pub raw_tracepoint: bpf_link_info__bindgen_ty_1__bindgen_ty_1, + pub tracing: bpf_link_info__bindgen_ty_1__bindgen_ty_2, + pub cgroup: bpf_link_info__bindgen_ty_1__bindgen_ty_3, + pub iter: bpf_link_info__bindgen_ty_1__bindgen_ty_4, + pub netns: bpf_link_info__bindgen_ty_1__bindgen_ty_5, + pub xdp: bpf_link_info__bindgen_ty_1__bindgen_ty_6, + pub struct_ops: bpf_link_info__bindgen_ty_1__bindgen_ty_7, + pub netfilter: bpf_link_info__bindgen_ty_1__bindgen_ty_8, + pub kprobe_multi: bpf_link_info__bindgen_ty_1__bindgen_ty_9, + pub uprobe_multi: bpf_link_info__bindgen_ty_1__bindgen_ty_10, + pub perf_event: bpf_link_info__bindgen_ty_1__bindgen_ty_11, + pub tcx: bpf_link_info__bindgen_ty_1__bindgen_ty_12, + pub netkit: bpf_link_info__bindgen_ty_1__bindgen_ty_13, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phy_package_shared { - pub addr: ::aya_bpf::cty::c_int, - pub refcnt: refcount_t, - pub flags: ::aya_bpf::cty::c_ulong, - pub priv_size: usize, - pub priv_: *mut ::aya_bpf::cty::c_void, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_1 { + pub tp_name: __u64, + pub tp_name_len: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phy_driver { - pub mdiodrv: mdio_driver_common, - pub phy_id: u32_, - pub name: *mut ::aya_bpf::cty::c_char, - pub phy_id_mask: u32_, - pub features: *const ::aya_bpf::cty::c_ulong, - pub flags: u32_, - pub driver_data: *const ::aya_bpf::cty::c_void, - pub soft_reset: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub config_init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub probe: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub get_features: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub get_rate_matching: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: phy_interface_t::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub suspend: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub resume: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub config_aneg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub aneg_done: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub read_status: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub config_intr: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub handle_interrupt: - ::core::option::Option irqreturn_t>, - pub remove: ::core::option::Option, - pub match_phy_device: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub set_wol: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut ethtool_wolinfo, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_wol: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut ethtool_wolinfo), - >, - pub link_change_notify: ::core::option::Option, - pub read_mmd: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub write_mmd: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: ::aya_bpf::cty::c_int, - arg3: u16_, - arg4: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub read_page: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub write_page: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub module_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut ethtool_modinfo, - ) -> ::aya_bpf::cty::c_int, - >, - pub module_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub cable_test_start: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub cable_test_tdr_start: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *const phy_tdr_config, - ) -> ::aya_bpf::cty::c_int, - >, - pub cable_test_get_status: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut bool_) -> ::aya_bpf::cty::c_int, - >, - pub get_sset_count: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub get_strings: - ::core::option::Option, - pub get_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut ethtool_stats, arg3: *mut u64_), - >, - pub get_tunable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut ethtool_tunable, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_tunable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut ethtool_tunable, - arg3: *const ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_loopback: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device, arg2: bool_) -> ::aya_bpf::cty::c_int, - >, - pub get_sqi: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub get_sqi_max: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_bpf::cty::c_int, - >, - pub get_plca_cfg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut phy_plca_cfg, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_plca_cfg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *const phy_plca_cfg, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_plca_status: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: *mut phy_plca_status, - ) -> ::aya_bpf::cty::c_int, - >, - pub led_brightness_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: u8_, - arg3: led_brightness::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub led_blink_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phy_device, - arg2: u8_, - arg3: *mut ::aya_bpf::cty::c_ulong, - arg4: *mut ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_2 { + pub attach_type: __u32, + pub target_obj_id: __u32, + pub target_btf_id: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_dissector { - pub used_keys: ::aya_bpf::cty::c_uint, - pub offset: [::aya_bpf::cty::c_ushort; 31usize], +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_3 { + pub cgroup_id: __u64, + pub attach_type: __u32, } -pub mod devlink_port_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_PORT_TYPE_NOTSET: Type = 0; - pub const DEVLINK_PORT_TYPE_AUTO: Type = 1; - pub const DEVLINK_PORT_TYPE_ETH: Type = 2; - pub const DEVLINK_PORT_TYPE_IB: Type = 3; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4 { + pub target_name: __u64, + pub target_name_len: __u32, + pub __bindgen_anon_1: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1, + pub __bindgen_anon_2: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2, } -pub mod devlink_port_flavour { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_PORT_FLAVOUR_PHYSICAL: Type = 0; - pub const DEVLINK_PORT_FLAVOUR_CPU: Type = 1; - pub const DEVLINK_PORT_FLAVOUR_DSA: Type = 2; - pub const DEVLINK_PORT_FLAVOUR_PCI_PF: Type = 3; - pub const DEVLINK_PORT_FLAVOUR_PCI_VF: Type = 4; - pub const DEVLINK_PORT_FLAVOUR_VIRTUAL: Type = 5; - pub const DEVLINK_PORT_FLAVOUR_UNUSED: Type = 6; - pub const DEVLINK_PORT_FLAVOUR_PCI_SF: Type = 7; +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1 { + pub map: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_port_phys_attrs { - pub port_number: u32_, - pub split_subport_number: u32_, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_1__bindgen_ty_1 { + pub map_id: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2 { + pub cgroup: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_1, + pub task: bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_port_pci_pf_attrs { - pub controller: u32_, - pub pf: u16_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: u8, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_1 { + pub cgroup_id: __u64, + pub order: __u32, } -impl devlink_port_pci_pf_attrs { - #[inline] - pub fn external(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_external(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(external: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let external: u8 = unsafe { ::core::mem::transmute(external) }; - external as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_4__bindgen_ty_2__bindgen_ty_2 { + pub tid: __u32, + pub pid: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_port_pci_vf_attrs { - pub controller: u32_, - pub pf: u16_, - pub vf: u16_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 3usize], +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_5 { + pub netns_ino: __u32, + pub attach_type: __u32, } -impl devlink_port_pci_vf_attrs { - #[inline] - pub fn external(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_external(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(external: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let external: u8 = unsafe { ::core::mem::transmute(external) }; - external as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_6 { + pub ifindex: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_port_pci_sf_attrs { - pub controller: u32_, - pub sf: u32_, - pub pf: u16_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: u8, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_7 { + pub map_id: __u32, } -impl devlink_port_pci_sf_attrs { - #[inline] - pub fn external(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_external(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(external: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let external: u8 = unsafe { ::core::mem::transmute(external) }; - external as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_8 { + pub pf: __u32, + pub hooknum: __u32, + pub priority: __s32, + pub flags: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_9 { + pub addrs: __u64, + pub count: __u32, + pub flags: __u32, + pub missed: __u64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_10 { + pub path: __u64, + pub offsets: __u64, + pub ref_ctr_offsets: __u64, + pub cookies: __u64, + pub path_size: __u32, + pub count: __u32, + pub flags: __u32, + pub pid: __u32, } #[repr(C)] #[derive(Copy, Clone)] -pub struct devlink_port_attrs { - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub lanes: u32_, - pub flavour: devlink_port_flavour::Type, - pub switch_id: netdev_phys_item_id, - pub __bindgen_anon_1: devlink_port_attrs__bindgen_ty_1, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_11 { + pub type_: __u32, + pub __bindgen_anon_1: bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union devlink_port_attrs__bindgen_ty_1 { - pub phys: devlink_port_phys_attrs, - pub pci_pf: devlink_port_pci_pf_attrs, - pub pci_vf: devlink_port_pci_vf_attrs, - pub pci_sf: devlink_port_pci_sf_attrs, +pub union bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1 { + pub uprobe: bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_1, + pub kprobe: bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_2, + pub tracepoint: bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_3, + pub event: bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_4, } -impl devlink_port_attrs { - #[inline] - pub fn split(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_split(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn splittable(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_splittable(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(split: u8_, splittable: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let split: u8 = unsafe { ::core::mem::transmute(split) }; - split as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let splittable: u8 = unsafe { ::core::mem::transmute(splittable) }; - splittable as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_1 { + pub file_name: __u64, + pub name_len: __u32, + pub offset: __u32, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct devlink_port { - pub list: list_head, - pub region_list: list_head, - pub devlink: *mut devlink, - pub index: ::aya_bpf::cty::c_uint, - pub type_lock: spinlock_t, - pub type_: devlink_port_type::Type, - pub desired_type: devlink_port_type::Type, - pub __bindgen_anon_1: devlink_port__bindgen_ty_1, - pub attrs: devlink_port_attrs, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub type_warn_dw: delayed_work, - pub reporter_list: list_head, - pub devlink_rate: *mut devlink_rate, - pub linecard: *mut devlink_linecard, +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_2 { + pub func_name: __u64, + pub name_len: __u32, + pub offset: __u32, + pub addr: __u64, + pub missed: __u64, } #[repr(C)] -#[derive(Copy, Clone)] -pub union devlink_port__bindgen_ty_1 { - pub type_eth: devlink_port__bindgen_ty_1__bindgen_ty_1, - pub type_ib: devlink_port__bindgen_ty_1__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_3 { + pub tp_name: __u64, + pub name_len: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_port__bindgen_ty_1__bindgen_ty_1 { - pub netdev: *mut net_device, - pub ifindex: ::aya_bpf::cty::c_int, - pub ifname: [::aya_bpf::cty::c_char; 16usize], +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_11__bindgen_ty_1__bindgen_ty_4 { + pub config: __u64, + pub type_: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_port__bindgen_ty_1__bindgen_ty_2 { - pub ibdev: *mut ib_device, +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_12 { + pub ifindex: __u32, + pub attach_type: __u32, } -impl devlink_port { - #[inline] - pub fn attrs_set(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_attrs_set(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn switch_port(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_switch_port(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn registered(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_registered(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn initialized(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } - } - #[inline] - pub fn set_initialized(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - attrs_set: u8_, - switch_port: u8_, - registered: u8_, - initialized: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let attrs_set: u8 = unsafe { ::core::mem::transmute(attrs_set) }; - attrs_set as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let switch_port: u8 = unsafe { ::core::mem::transmute(switch_port) }; - switch_port as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let registered: u8 = unsafe { ::core::mem::transmute(registered) }; - registered as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let initialized: u8 = unsafe { ::core::mem::transmute(initialized) }; - initialized as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_info__bindgen_ty_1__bindgen_ty_13 { + pub ifindex: __u32, + pub attach_type: __u32, } -pub mod phylink_op_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const PHYLINK_NETDEV: Type = 0; - pub const PHYLINK_DEV: Type = 1; +#[repr(C)] +#[derive(Debug)] +pub struct btf_id_set8 { + pub cnt: u32_, + pub flags: u32_, + pub pairs: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phylink_config { - pub dev: *mut device, - pub type_: phylink_op_type::Type, - pub legacy_pre_march2020: bool_, - pub poll_fixed_state: bool_, - pub mac_managed_pm: bool_, - pub ovr_an_inband: bool_, - pub get_fixed_state: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phylink_config, arg2: *mut phylink_link_state), - >, - pub supported_interfaces: [::aya_bpf::cty::c_ulong; 1usize], - pub mac_capabilities: ::aya_bpf::cty::c_ulong, +pub struct btf_id_set8__bindgen_ty_1 { + pub id: u32_, + pub flags: u32_, } +pub type btf_kfunc_filter_t = ::core::option::Option< + unsafe extern "C" fn(arg1: *const bpf_prog, arg2: u32_) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Copy, Clone)] -pub struct dsa_port { - pub __bindgen_anon_1: dsa_port__bindgen_ty_1, - pub tag_ops: *const dsa_device_ops, - pub dst: *mut dsa_switch_tree, - pub rcv: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> *mut sk_buff, +pub struct bpf_func_proto { + pub func: ::core::option::Option< + unsafe extern "C" fn(arg1: u64_, arg2: u64_, arg3: u64_, arg4: u64_, arg5: u64_) -> u64_, >, - pub ds: *mut dsa_switch, - pub index: ::aya_bpf::cty::c_uint, - pub type_: dsa_port__bindgen_ty_2::Type, - pub name: *const ::aya_bpf::cty::c_char, - pub cpu_dp: *mut dsa_port, - pub mac: [u8_; 6usize], - pub stp_state: u8_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub dn: *mut device_node, - pub ageing_time: ::aya_bpf::cty::c_uint, - pub bridge: *mut dsa_bridge, - pub devlink_port: devlink_port, - pub pl: *mut phylink, - pub pl_config: phylink_config, - pub lag: *mut dsa_lag, - pub hsr_dev: *mut net_device, - pub list: list_head, - pub orig_ethtool_ops: *const ethtool_ops, - pub addr_lists_lock: mutex, - pub fdbs: list_head, - pub mdbs: list_head, - pub vlans_lock: mutex, - pub __bindgen_anon_2: dsa_port__bindgen_ty_3, + pub gpl_only: bool_, + pub pkt_access: bool_, + pub might_sleep: bool_, + pub ret_type: bpf_return_type::Type, + pub __bindgen_anon_1: bpf_func_proto__bindgen_ty_1, + pub __bindgen_anon_2: bpf_func_proto__bindgen_ty_2, + pub ret_btf_id: *mut ::aya_ebpf::cty::c_int, + pub allowed: ::core::option::Option bool_>, } #[repr(C)] #[derive(Copy, Clone)] -pub union dsa_port__bindgen_ty_1 { - pub master: *mut net_device, - pub slave: *mut net_device, +pub union bpf_func_proto__bindgen_ty_1 { + pub __bindgen_anon_1: bpf_func_proto__bindgen_ty_1__bindgen_ty_1, + pub arg_type: [bpf_arg_type::Type; 5usize], } -pub mod dsa_port__bindgen_ty_2 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DSA_PORT_TYPE_UNUSED: Type = 0; - pub const DSA_PORT_TYPE_CPU: Type = 1; - pub const DSA_PORT_TYPE_DSA: Type = 2; - pub const DSA_PORT_TYPE_USER: Type = 3; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_func_proto__bindgen_ty_1__bindgen_ty_1 { + pub arg1_type: bpf_arg_type::Type, + pub arg2_type: bpf_arg_type::Type, + pub arg3_type: bpf_arg_type::Type, + pub arg4_type: bpf_arg_type::Type, + pub arg5_type: bpf_arg_type::Type, } #[repr(C)] #[derive(Copy, Clone)] -pub union dsa_port__bindgen_ty_3 { - pub vlans: list_head, - pub user_vlans: list_head, +pub union bpf_func_proto__bindgen_ty_2 { + pub __bindgen_anon_1: bpf_func_proto__bindgen_ty_2__bindgen_ty_1, + pub arg_btf_id: [*mut u32_; 5usize], + pub __bindgen_anon_2: bpf_func_proto__bindgen_ty_2__bindgen_ty_2, + pub arg_size: [usize; 5usize], } -impl dsa_port { - #[inline] - pub fn vlan_filtering(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_vlan_filtering(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn learning(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_learning(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn lag_tx_enabled(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_lag_tx_enabled(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn master_admin_up(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } - } - #[inline] - pub fn set_master_admin_up(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn master_oper_up(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } - } - #[inline] - pub fn set_master_oper_up(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn cpu_port_in_lag(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } - } - #[inline] - pub fn set_cpu_port_in_lag(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) - } - } - #[inline] - pub fn setup(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } - } - #[inline] - pub fn set_setup(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - vlan_filtering: u8_, - learning: u8_, - lag_tx_enabled: u8_, - master_admin_up: u8_, - master_oper_up: u8_, - cpu_port_in_lag: u8_, - setup: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let vlan_filtering: u8 = unsafe { ::core::mem::transmute(vlan_filtering) }; - vlan_filtering as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let learning: u8 = unsafe { ::core::mem::transmute(learning) }; - learning as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let lag_tx_enabled: u8 = unsafe { ::core::mem::transmute(lag_tx_enabled) }; - lag_tx_enabled as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let master_admin_up: u8 = unsafe { ::core::mem::transmute(master_admin_up) }; - master_admin_up as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let master_oper_up: u8 = unsafe { ::core::mem::transmute(master_oper_up) }; - master_oper_up as u64 - }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let cpu_port_in_lag: u8 = unsafe { ::core::mem::transmute(cpu_port_in_lag) }; - cpu_port_in_lag as u64 - }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let setup: u8 = unsafe { ::core::mem::transmute(setup) }; - setup as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_func_proto__bindgen_ty_2__bindgen_ty_1 { + pub arg1_btf_id: *mut u32_, + pub arg2_btf_id: *mut u32_, + pub arg3_btf_id: *mut u32_, + pub arg4_btf_id: *mut u32_, + pub arg5_btf_id: *mut u32_, } -pub mod netdev_lag_tx_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NETDEV_LAG_TX_TYPE_UNKNOWN: Type = 0; - pub const NETDEV_LAG_TX_TYPE_RANDOM: Type = 1; - pub const NETDEV_LAG_TX_TYPE_BROADCAST: Type = 2; - pub const NETDEV_LAG_TX_TYPE_ROUNDROBIN: Type = 3; - pub const NETDEV_LAG_TX_TYPE_ACTIVEBACKUP: Type = 4; - pub const NETDEV_LAG_TX_TYPE_HASH: Type = 5; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_func_proto__bindgen_ty_2__bindgen_ty_2 { + pub arg1_size: usize, + pub arg2_size: usize, + pub arg3_size: usize, + pub arg4_size: usize, + pub arg5_size: usize, } -pub mod netdev_lag_hash { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NETDEV_LAG_HASH_NONE: Type = 0; - pub const NETDEV_LAG_HASH_L2: Type = 1; - pub const NETDEV_LAG_HASH_L34: Type = 2; - pub const NETDEV_LAG_HASH_L23: Type = 3; - pub const NETDEV_LAG_HASH_E23: Type = 4; - pub const NETDEV_LAG_HASH_E34: Type = 5; - pub const NETDEV_LAG_HASH_VLAN_SRCMAC: Type = 6; - pub const NETDEV_LAG_HASH_UNKNOWN: Type = 7; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iomap { + pub addr: u64_, + pub offset: loff_t, + pub length: u64_, + pub type_: u16_, + pub flags: u16_, + pub bdev: *mut block_device, + pub dax_dev: *mut dax_device, + pub inline_data: *mut ::aya_ebpf::cty::c_void, + pub private: *mut ::aya_ebpf::cty::c_void, + pub folio_ops: *const iomap_folio_ops, + pub validity_cookie: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netdev_lag_upper_info { - pub tx_type: netdev_lag_tx_type::Type, - pub hash_type: netdev_lag_hash::Type, +pub struct iomap_folio_ops { + pub get_folio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut iomap_iter, + arg2: loff_t, + arg3: ::aya_ebpf::cty::c_uint, + ) -> *mut folio, + >, + pub put_folio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: loff_t, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut folio, + ), + >, + pub iomap_valid: + ::core::option::Option bool_>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct netdev_notifier_changeupper_info { - pub info: netdev_notifier_info, - pub upper_dev: *mut net_device, - pub master: bool_, - pub linking: bool_, - pub upper_info: *mut ::aya_bpf::cty::c_void, +pub struct iomap_iter { + pub inode: *mut inode, + pub pos: loff_t, + pub len: u64_, + pub processed: s64, + pub flags: ::aya_ebpf::cty::c_uint, + pub iomap: iomap, + pub srcmap: iomap, + pub private: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_match { - pub dissector: *mut flow_dissector, - pub mask: *mut ::aya_bpf::cty::c_void, - pub key: *mut ::aya_bpf::cty::c_void, +pub struct gpio_desc { + pub gdev: *mut gpio_device, + pub flags: ::aya_ebpf::cty::c_ulong, + pub label: *const ::aya_ebpf::cty::c_char, + pub name: *const ::aya_ebpf::cty::c_char, } -pub mod flow_action_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FLOW_ACTION_ACCEPT: Type = 0; - pub const FLOW_ACTION_DROP: Type = 1; - pub const FLOW_ACTION_TRAP: Type = 2; - pub const FLOW_ACTION_GOTO: Type = 3; - pub const FLOW_ACTION_REDIRECT: Type = 4; - pub const FLOW_ACTION_MIRRED: Type = 5; - pub const FLOW_ACTION_REDIRECT_INGRESS: Type = 6; - pub const FLOW_ACTION_MIRRED_INGRESS: Type = 7; - pub const FLOW_ACTION_VLAN_PUSH: Type = 8; - pub const FLOW_ACTION_VLAN_POP: Type = 9; - pub const FLOW_ACTION_VLAN_MANGLE: Type = 10; - pub const FLOW_ACTION_TUNNEL_ENCAP: Type = 11; - pub const FLOW_ACTION_TUNNEL_DECAP: Type = 12; - pub const FLOW_ACTION_MANGLE: Type = 13; - pub const FLOW_ACTION_ADD: Type = 14; - pub const FLOW_ACTION_CSUM: Type = 15; - pub const FLOW_ACTION_MARK: Type = 16; - pub const FLOW_ACTION_PTYPE: Type = 17; - pub const FLOW_ACTION_PRIORITY: Type = 18; - pub const FLOW_ACTION_RX_QUEUE_MAPPING: Type = 19; - pub const FLOW_ACTION_WAKE: Type = 20; - pub const FLOW_ACTION_QUEUE: Type = 21; - pub const FLOW_ACTION_SAMPLE: Type = 22; - pub const FLOW_ACTION_POLICE: Type = 23; - pub const FLOW_ACTION_CT: Type = 24; - pub const FLOW_ACTION_CT_METADATA: Type = 25; - pub const FLOW_ACTION_MPLS_PUSH: Type = 26; - pub const FLOW_ACTION_MPLS_POP: Type = 27; - pub const FLOW_ACTION_MPLS_MANGLE: Type = 28; - pub const FLOW_ACTION_GATE: Type = 29; - pub const FLOW_ACTION_PPPOE_PUSH: Type = 30; - pub const FLOW_ACTION_JUMP: Type = 31; - pub const FLOW_ACTION_PIPE: Type = 32; - pub const FLOW_ACTION_VLAN_PUSH_ETH: Type = 33; - pub const FLOW_ACTION_VLAN_POP_ETH: Type = 34; - pub const FLOW_ACTION_CONTINUE: Type = 35; - pub const NUM_FLOW_ACTIONS: Type = 36; -} -pub mod flow_action_hw_stats { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FLOW_ACTION_HW_STATS_IMMEDIATE: Type = 1; - pub const FLOW_ACTION_HW_STATS_DELAYED: Type = 2; - pub const FLOW_ACTION_HW_STATS_ANY: Type = 3; - pub const FLOW_ACTION_HW_STATS_DISABLED: Type = 4; - pub const FLOW_ACTION_HW_STATS_DONT_CARE: Type = 7; -} -pub type action_destr = - ::core::option::Option; -pub mod flow_action_mangle_base { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FLOW_ACT_MANGLE_UNSPEC: Type = 0; - pub const FLOW_ACT_MANGLE_HDR_TYPE_ETH: Type = 1; - pub const FLOW_ACT_MANGLE_HDR_TYPE_IP4: Type = 2; - pub const FLOW_ACT_MANGLE_HDR_TYPE_IP6: Type = 3; - pub const FLOW_ACT_MANGLE_HDR_TYPE_TCP: Type = 4; - pub const FLOW_ACT_MANGLE_HDR_TYPE_UDP: Type = 5; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct gpio_device { + pub dev: device, + pub chrdev: cdev, + pub id: ::aya_ebpf::cty::c_int, + pub mockdev: *mut device, + pub owner: *mut module, + pub chip: *mut gpio_chip, + pub descs: *mut gpio_desc, + pub base: ::aya_ebpf::cty::c_int, + pub ngpio: u16_, + pub label: *const ::aya_ebpf::cty::c_char, + pub data: *mut ::aya_ebpf::cty::c_void, + pub list: list_head, + pub line_state_notifier: blocking_notifier_head, + pub device_notifier: blocking_notifier_head, + pub sem: rw_semaphore, + pub pin_ranges: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_flowtable { - _unused: [u8; 0], +pub struct wake_irq { + pub dev: *mut device, + pub status: ::aya_ebpf::cty::c_uint, + pub irq: ::aya_ebpf::cty::c_int, + pub name: *const ::aya_ebpf::cty::c_char, +} +pub mod device_link_state { + pub type Type = ::aya_ebpf::cty::c_int; + pub const DL_STATE_NONE: Type = -1; + pub const DL_STATE_DORMANT: Type = 0; + pub const DL_STATE_AVAILABLE: Type = 1; + pub const DL_STATE_CONSUMER_PROBE: Type = 2; + pub const DL_STATE_ACTIVE: Type = 3; + pub const DL_STATE_SUPPLIER_UNBIND: Type = 4; } #[repr(C)] #[derive(Copy, Clone)] -pub struct flow_action_entry { - pub id: flow_action_id::Type, - pub hw_index: u32_, - pub cookie: ::aya_bpf::cty::c_ulong, - pub miss_cookie: u64_, - pub hw_stats: flow_action_hw_stats::Type, - pub destructor: action_destr, - pub destructor_priv: *mut ::aya_bpf::cty::c_void, - pub __bindgen_anon_1: flow_action_entry__bindgen_ty_1, - pub user_cookie: *mut flow_action_cookie, +pub struct device_link { + pub supplier: *mut device, + pub s_node: list_head, + pub consumer: *mut device, + pub c_node: list_head, + pub link_dev: device, + pub status: device_link_state::Type, + pub flags: u32_, + pub rpm_active: refcount_t, + pub kref: kref, + pub rm_work: work_struct, + pub supplier_preactivated: bool_, } #[repr(C)] #[derive(Copy, Clone)] -pub union flow_action_entry__bindgen_ty_1 { - pub chain_index: u32_, - pub dev: *mut net_device, - pub vlan: flow_action_entry__bindgen_ty_1__bindgen_ty_1, - pub vlan_push_eth: flow_action_entry__bindgen_ty_1__bindgen_ty_2, - pub mangle: flow_action_entry__bindgen_ty_1__bindgen_ty_3, - pub tunnel: *mut ip_tunnel_info, - pub csum_flags: u32_, - pub mark: u32_, - pub ptype: u16_, - pub rx_queue: u16_, - pub priority: u32_, - pub queue: flow_action_entry__bindgen_ty_1__bindgen_ty_4, - pub sample: flow_action_entry__bindgen_ty_1__bindgen_ty_5, - pub police: flow_action_entry__bindgen_ty_1__bindgen_ty_6, - pub ct: flow_action_entry__bindgen_ty_1__bindgen_ty_7, - pub ct_metadata: flow_action_entry__bindgen_ty_1__bindgen_ty_8, - pub mpls_push: flow_action_entry__bindgen_ty_1__bindgen_ty_9, - pub mpls_pop: flow_action_entry__bindgen_ty_1__bindgen_ty_10, - pub mpls_mangle: flow_action_entry__bindgen_ty_1__bindgen_ty_11, - pub gate: flow_action_entry__bindgen_ty_1__bindgen_ty_12, - pub pppoe: flow_action_entry__bindgen_ty_1__bindgen_ty_13, +pub struct ptr_ring { + pub producer: ::aya_ebpf::cty::c_int, + pub producer_lock: spinlock_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub consumer_head: ::aya_ebpf::cty::c_int, + pub consumer_tail: ::aya_ebpf::cty::c_int, + pub consumer_lock: spinlock_t, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, + pub __bindgen_padding_0: u32, + pub size: ::aya_ebpf::cty::c_int, + pub batch: ::aya_ebpf::cty::c_int, + pub queue: *mut *mut ::aya_ebpf::cty::c_void, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 48usize]>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_1 { - pub vid: u16_, - pub proto: __be16, - pub prio: u8_, +pub struct qdisc_walker { + pub stop: ::aya_ebpf::cty::c_int, + pub skip: ::aya_ebpf::cty::c_int, + pub count: ::aya_ebpf::cty::c_int, + pub fn_: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut Qdisc, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut qdisc_walker, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_2 { - pub dst: [::aya_bpf::cty::c_uchar; 6usize], - pub src: [::aya_bpf::cty::c_uchar; 6usize], +#[derive(Copy, Clone)] +pub struct seg6_pernet_data { + pub lock: mutex, + pub tun_src: *mut in6_addr, + pub hmac_infos: rhashtable, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_3 { - pub htype: flow_action_mangle_base::Type, - pub offset: u32_, - pub mask: u32_, - pub val: u32_, +#[derive(Copy, Clone)] +pub struct raw_hashinfo { + pub lock: spinlock_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub ht: [hlist_head; 256usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_4 { - pub ctx: u32_, - pub index: u32_, - pub vf: u8_, +#[derive(Copy, Clone)] +pub struct fib_nh { + pub nh_common: fib_nh_common, + pub nh_hash: hlist_node, + pub nh_parent: *mut fib_info, + pub nh_tclassid: __u32, + pub nh_saddr: __be32, + pub nh_saddr_genid: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_5 { - pub psample_group: *mut psample_group, - pub rate: u32_, - pub trunc_size: u32_, - pub truncate: bool_, +pub struct fib_info { + pub fib_hash: hlist_node, + pub fib_lhash: hlist_node, + pub nh_list: list_head, + pub fib_net: *mut net, + pub fib_treeref: refcount_t, + pub fib_clntref: refcount_t, + pub fib_flags: ::aya_ebpf::cty::c_uint, + pub fib_dead: ::aya_ebpf::cty::c_uchar, + pub fib_protocol: ::aya_ebpf::cty::c_uchar, + pub fib_scope: ::aya_ebpf::cty::c_uchar, + pub fib_type: ::aya_ebpf::cty::c_uchar, + pub fib_prefsrc: __be32, + pub fib_tb_id: u32_, + pub fib_priority: u32_, + pub fib_metrics: *mut dst_metrics, + pub fib_nhs: ::aya_ebpf::cty::c_int, + pub fib_nh_is_v6: bool_, + pub nh_updated: bool_, + pub pfsrc_removed: bool_, + pub nh: *mut nexthop, + pub rcu: callback_head, + pub fib_nh: __IncompleteArrayField, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_6 { - pub burst: u32_, - pub rate_bytes_ps: u64_, - pub peakrate_bytes_ps: u64_, - pub avrate: u32_, - pub overhead: u16_, - pub burst_pkt: u64_, - pub rate_pkt_ps: u64_, - pub mtu: u32_, - pub exceed: flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_1, - pub notexceed: flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_2, +#[derive(Copy, Clone)] +pub struct nexthop { + pub rb_node: rb_node, + pub fi_list: list_head, + pub f6i_list: list_head, + pub fdb_list: list_head, + pub grp_list: list_head, + pub net: *mut net, + pub id: u32_, + pub protocol: u8_, + pub nh_flags: u8_, + pub is_group: bool_, + pub refcnt: refcount_t, + pub rcu: callback_head, + pub __bindgen_anon_1: nexthop__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_1 { - pub act_id: flow_action_id::Type, - pub extval: u32_, +#[derive(Copy, Clone)] +pub union nexthop__bindgen_ty_1 { + pub nh_info: *mut nh_info, + pub nh_grp: *mut nh_group, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_2 { - pub act_id: flow_action_id::Type, - pub extval: u32_, +#[derive(Copy, Clone)] +pub struct nh_info { + pub dev_hash: hlist_node, + pub nh_parent: *mut nexthop, + pub family: u8_, + pub reject_nh: bool_, + pub fdb_nh: bool_, + pub __bindgen_anon_1: nh_info__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_7 { - pub action: ::aya_bpf::cty::c_int, - pub zone: u16_, - pub flow_table: *mut nf_flowtable, +#[derive(Copy, Clone)] +pub union nh_info__bindgen_ty_1 { + pub fib_nhc: fib_nh_common, + pub fib_nh: fib_nh, + pub fib6_nh: fib6_nh, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_8 { - pub cookie: ::aya_bpf::cty::c_ulong, - pub mark: u32_, - pub labels: [u32_; 4usize], - pub orig_dir: bool_, +pub struct nh_res_bucket { + pub nh_entry: *mut nh_grp_entry, + pub used_time: atomic_long_t, + pub migrated_time: ::aya_ebpf::cty::c_ulong, + pub occupied: bool_, + pub nh_flags: u8_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_9 { - pub label: u32_, - pub proto: __be16, - pub tc: u8_, - pub bos: u8_, - pub ttl: u8_, +#[derive(Copy, Clone)] +pub struct nh_grp_entry { + pub nh: *mut nexthop, + pub weight: u8_, + pub __bindgen_anon_1: nh_grp_entry__bindgen_ty_1, + pub nh_list: list_head, + pub nh_parent: *mut nexthop, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_10 { - pub proto: __be16, +#[derive(Copy, Clone)] +pub union nh_grp_entry__bindgen_ty_1 { + pub hthr: nh_grp_entry__bindgen_ty_1__bindgen_ty_1, + pub res: nh_grp_entry__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_11 { - pub label: u32_, - pub tc: u8_, - pub bos: u8_, - pub ttl: u8_, +pub struct nh_grp_entry__bindgen_ty_1__bindgen_ty_1 { + pub upper_bound: atomic_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_12 { - pub prio: s32, - pub basetime: u64_, - pub cycletime: u64_, - pub cycletimeext: u64_, - pub num_entries: u32_, - pub entries: *mut action_gate_entry, +pub struct nh_grp_entry__bindgen_ty_1__bindgen_ty_2 { + pub uw_nh_entry: list_head, + pub count_buckets: u16_, + pub wants_buckets: u16_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_13 { - pub sid: u16_, +#[derive(Debug)] +pub struct nh_res_table { + pub net: *mut net, + pub nhg_id: u32_, + pub upkeep_dw: delayed_work, + pub uw_nh_entries: list_head, + pub unbalanced_since: ::aya_ebpf::cty::c_ulong, + pub idle_timer: u32_, + pub unbalanced_timer: u32_, + pub num_nh_buckets: u16_, + pub nh_buckets: __IncompleteArrayField, } #[repr(C)] -pub struct flow_action { - pub num_entries: ::aya_bpf::cty::c_uint, - pub entries: __IncompleteArrayField, +pub struct nh_group { + pub spare: *mut nh_group, + pub num_nh: u16_, + pub is_multipath: bool_, + pub hash_threshold: bool_, + pub resilient: bool_, + pub fdb_nh: bool_, + pub has_v4: bool_, + pub res_table: *mut nh_res_table, + pub nh_entries: __IncompleteArrayField, } #[repr(C)] -pub struct flow_rule { - pub match_: flow_match, - pub action: flow_action, +#[derive(Debug, Copy, Clone)] +pub struct fscrypt_direct_key { + pub dk_sb: *mut super_block, + pub dk_node: hlist_node, + pub dk_refcount: refcount_t, + pub dk_mode: *const fscrypt_mode, + pub dk_key: fscrypt_prepared_key, + pub dk_descriptor: [u8_; 8usize], + pub dk_raw: [u8_; 64usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dsa_chip_data { - pub host_dev: *mut device, - pub sw_addr: ::aya_bpf::cty::c_int, - pub netdev: [*mut device; 12usize], - pub eeprom_len: ::aya_bpf::cty::c_int, - pub of_node: *mut device_node, - pub port_names: [*mut ::aya_bpf::cty::c_char; 12usize], - pub port_dn: [*mut device_node; 12usize], - pub rtable: [s8; 4usize], +#[derive(Copy, Clone)] +pub struct tty_audit_buf { + pub mutex: mutex, + pub dev: dev_t, + pub icanon: bool_, + pub valid: usize, + pub data: *mut u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_platform_data { - pub netdev: *mut device, - pub of_netdev: *mut net_device, - pub nr_chips: ::aya_bpf::cty::c_int, - pub chip: *mut dsa_chip_data, +pub struct serial_icounter_struct { + pub cts: ::aya_ebpf::cty::c_int, + pub dsr: ::aya_ebpf::cty::c_int, + pub rng: ::aya_ebpf::cty::c_int, + pub dcd: ::aya_ebpf::cty::c_int, + pub rx: ::aya_ebpf::cty::c_int, + pub tx: ::aya_ebpf::cty::c_int, + pub frame: ::aya_ebpf::cty::c_int, + pub overrun: ::aya_ebpf::cty::c_int, + pub parity: ::aya_ebpf::cty::c_int, + pub brk: ::aya_ebpf::cty::c_int, + pub buf_overrun: ::aya_ebpf::cty::c_int, + pub reserved: [::aya_ebpf::cty::c_int; 9usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phylink_link_state { - pub advertising: [::aya_bpf::cty::c_ulong; 2usize], - pub lp_advertising: [::aya_bpf::cty::c_ulong; 2usize], - pub interface: phy_interface_t::Type, - pub speed: ::aya_bpf::cty::c_int, - pub duplex: ::aya_bpf::cty::c_int, - pub pause: ::aya_bpf::cty::c_int, - pub rate_matching: ::aya_bpf::cty::c_int, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 3usize], +pub struct serial_struct { + pub type_: ::aya_ebpf::cty::c_int, + pub line: ::aya_ebpf::cty::c_int, + pub port: ::aya_ebpf::cty::c_uint, + pub irq: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, + pub xmit_fifo_size: ::aya_ebpf::cty::c_int, + pub custom_divisor: ::aya_ebpf::cty::c_int, + pub baud_base: ::aya_ebpf::cty::c_int, + pub close_delay: ::aya_ebpf::cty::c_ushort, + pub io_type: ::aya_ebpf::cty::c_char, + pub reserved_char: [::aya_ebpf::cty::c_char; 1usize], + pub hub6: ::aya_ebpf::cty::c_int, + pub closing_wait: ::aya_ebpf::cty::c_ushort, + pub closing_wait2: ::aya_ebpf::cty::c_ushort, + pub iomem_base: *mut ::aya_ebpf::cty::c_uchar, + pub iomem_reg_shift: ::aya_ebpf::cty::c_ushort, + pub port_high: ::aya_ebpf::cty::c_uint, + pub iomap_base: ::aya_ebpf::cty::c_ulong, } -impl phylink_link_state { - #[inline] - pub fn link(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_link(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn an_complete(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_an_complete(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - link: ::aya_bpf::cty::c_uint, - an_complete: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let link: u32 = unsafe { ::core::mem::transmute(link) }; - link as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let an_complete: u32 = unsafe { ::core::mem::transmute(an_complete) }; - an_complete as u64 - }); - __bindgen_bitfield_unit - } +#[repr(C)] +pub struct net_generic { + pub __bindgen_anon_1: net_generic__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct phylink_pcs { - pub ops: *const phylink_pcs_ops, - pub poll: bool_, +pub struct net_generic__bindgen_ty_1 { + pub s: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, + pub bindgen_union_field: [u64; 3usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct phylink_pcs_ops { - pub pcs_validate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phylink_pcs, - arg2: *mut ::aya_bpf::cty::c_ulong, - arg3: *const phylink_link_state, - ) -> ::aya_bpf::cty::c_int, - >, - pub pcs_get_state: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut phylink_pcs, arg2: *mut phylink_link_state), - >, - pub pcs_config: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phylink_pcs, - arg2: ::aya_bpf::cty::c_uint, - arg3: phy_interface_t::Type, - arg4: *const ::aya_bpf::cty::c_ulong, - arg5: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub pcs_an_restart: ::core::option::Option, - pub pcs_link_up: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut phylink_pcs, - arg2: ::aya_bpf::cty::c_uint, - arg3: phy_interface_t::Type, - arg4: ::aya_bpf::cty::c_int, - arg5: ::aya_bpf::cty::c_int, - ), - >, +pub struct net_generic__bindgen_ty_1__bindgen_ty_1 { + pub len: ::aya_ebpf::cty::c_uint, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug)] -pub struct flow_action_cookie { - pub cookie_len: u32_, - pub cookie: __IncompleteArrayField, +pub struct net_generic__bindgen_ty_1__bindgen_ty_2 { + pub __empty_ptr: net_generic__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, + pub ptr: __IncompleteArrayField<*mut ::aya_ebpf::cty::c_void>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_stats { - pub pkts: u64_, - pub bytes: u64_, - pub drops: u64_, - pub lastused: u64_, - pub used_hw_stats: flow_action_hw_stats::Type, - pub used_hw_stats_valid: bool_, -} -pub mod flow_cls_command { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FLOW_CLS_REPLACE: Type = 0; - pub const FLOW_CLS_DESTROY: Type = 1; - pub const FLOW_CLS_STATS: Type = 2; - pub const FLOW_CLS_TMPLT_CREATE: Type = 3; - pub const FLOW_CLS_TMPLT_DESTROY: Type = 4; -} +pub struct net_generic__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_cls_common_offload { - pub chain_index: u32_, - pub protocol: __be16, - pub prio: u32_, - pub extack: *mut netlink_ext_ack, +pub struct rt_waiter_node { + pub entry: rb_node, + pub prio: ::aya_ebpf::cty::c_int, + pub deadline: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct flow_cls_offload { - pub common: flow_cls_common_offload, - pub command: flow_cls_command::Type, - pub use_act_stats: bool_, - pub cookie: ::aya_bpf::cty::c_ulong, - pub rule: *mut flow_rule, - pub stats: flow_stats, - pub classid: u32_, -} -pub mod devlink_sb_pool_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_SB_POOL_TYPE_INGRESS: Type = 0; - pub const DEVLINK_SB_POOL_TYPE_EGRESS: Type = 1; -} -pub mod devlink_sb_threshold_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_SB_THRESHOLD_TYPE_STATIC: Type = 0; - pub const DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC: Type = 1; -} -pub mod devlink_rate_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_RATE_TYPE_LEAF: Type = 0; - pub const DEVLINK_RATE_TYPE_NODE: Type = 1; -} -pub mod devlink_param_cmode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_PARAM_CMODE_RUNTIME: Type = 0; - pub const DEVLINK_PARAM_CMODE_DRIVERINIT: Type = 1; - pub const DEVLINK_PARAM_CMODE_PERMANENT: Type = 2; - pub const __DEVLINK_PARAM_CMODE_MAX: Type = 3; - pub const DEVLINK_PARAM_CMODE_MAX: Type = 2; +pub struct rt_mutex_waiter { + pub tree: rt_waiter_node, + pub pi_tree: rt_waiter_node, + pub task: *mut task_struct, + pub lock: *mut rt_mutex_base, + pub wake_state: ::aya_ebpf::cty::c_uint, + pub ww_ctx: *mut ww_acquire_ctx, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct devlink_rate { - pub list: list_head, - pub type_: devlink_rate_type::Type, - pub devlink: *mut devlink, - pub priv_: *mut ::aya_bpf::cty::c_void, - pub tx_share: u64_, - pub tx_max: u64_, - pub parent: *mut devlink_rate, - pub __bindgen_anon_1: devlink_rate__bindgen_ty_1, - pub tx_priority: u32_, - pub tx_weight: u32_, +#[derive(Debug, Copy, Clone)] +pub struct robust_list { + pub next: *mut robust_list, } #[repr(C)] -#[derive(Copy, Clone)] -pub union devlink_rate__bindgen_ty_1 { - pub devlink_port: *mut devlink_port, - pub __bindgen_anon_1: devlink_rate__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct robust_list_head { + pub list: robust_list, + pub futex_offset: ::aya_ebpf::cty::c_long, + pub list_op_pending: *mut robust_list, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct devlink_rate__bindgen_ty_1__bindgen_ty_1 { - pub name: *mut ::aya_bpf::cty::c_char, - pub refcnt: refcount_t, +#[derive(Copy, Clone)] +pub union futex_key { + pub shared: futex_key__bindgen_ty_1, + pub private: futex_key__bindgen_ty_2, + pub both: futex_key__bindgen_ty_3, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_sb_pool_info { - pub pool_type: devlink_sb_pool_type::Type, - pub size: u32_, - pub threshold_type: devlink_sb_threshold_type::Type, - pub cell_size: u32_, +pub struct futex_key__bindgen_ty_1 { + pub i_seq: u64_, + pub pgoff: ::aya_ebpf::cty::c_ulong, + pub offset: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] -pub union devlink_param_value { - pub vu8: u8_, - pub vu16: u16_, - pub vu32: u32_, - pub vstr: [::aya_bpf::cty::c_char; 32usize], - pub vbool: bool_, +pub struct futex_key__bindgen_ty_2 { + pub __bindgen_anon_1: futex_key__bindgen_ty_2__bindgen_ty_1, + pub address: ::aya_ebpf::cty::c_ulong, + pub offset: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] -pub struct devlink_param_gset_ctx { - pub val: devlink_param_value, - pub cmode: devlink_param_cmode::Type, +pub union futex_key__bindgen_ty_2__bindgen_ty_1 { + pub mm: *mut mm_struct, + pub __tmp: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct switchdev_mst_state { - pub msti: u16_, - pub state: u8_, +pub struct futex_key__bindgen_ty_3 { + pub ptr: u64_, + pub word: ::aya_ebpf::cty::c_ulong, + pub offset: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_brport_flags { - pub val: ::aya_bpf::cty::c_ulong, - pub mask: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_vlan_msti { - pub vid: u16_, - pub msti: u16_, -} -pub mod switchdev_obj_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const SWITCHDEV_OBJ_ID_UNDEFINED: Type = 0; - pub const SWITCHDEV_OBJ_ID_PORT_VLAN: Type = 1; - pub const SWITCHDEV_OBJ_ID_PORT_MDB: Type = 2; - pub const SWITCHDEV_OBJ_ID_HOST_MDB: Type = 3; - pub const SWITCHDEV_OBJ_ID_MRP: Type = 4; - pub const SWITCHDEV_OBJ_ID_RING_TEST_MRP: Type = 5; - pub const SWITCHDEV_OBJ_ID_RING_ROLE_MRP: Type = 6; - pub const SWITCHDEV_OBJ_ID_RING_STATE_MRP: Type = 7; - pub const SWITCHDEV_OBJ_ID_IN_TEST_MRP: Type = 8; - pub const SWITCHDEV_OBJ_ID_IN_ROLE_MRP: Type = 9; - pub const SWITCHDEV_OBJ_ID_IN_STATE_MRP: Type = 10; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_obj { +#[derive(Copy, Clone)] +pub struct futex_pi_state { pub list: list_head, - pub orig_dev: *mut net_device, - pub id: switchdev_obj_id::Type, - pub flags: u32_, - pub complete_priv: *mut ::aya_bpf::cty::c_void, - pub complete: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net_device, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ::aya_bpf::cty::c_void, - ), - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_obj_port_vlan { - pub obj: switchdev_obj, - pub flags: u16_, - pub vid: u16_, - pub changed: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_obj_port_mdb { - pub obj: switchdev_obj, - pub addr: [::aya_bpf::cty::c_uchar; 6usize], - pub vid: u16_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_obj_mrp { - pub obj: switchdev_obj, - pub p_port: *mut net_device, - pub s_port: *mut net_device, - pub ring_id: u32_, - pub prio: u16_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct switchdev_obj_ring_role_mrp { - pub obj: switchdev_obj, - pub ring_role: u8_, - pub ring_id: u32_, - pub sw_backup: u8_, -} -pub mod dsa_tag_protocol { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DSA_TAG_PROTO_NONE: Type = 0; - pub const DSA_TAG_PROTO_BRCM: Type = 1; - pub const DSA_TAG_PROTO_BRCM_LEGACY: Type = 22; - pub const DSA_TAG_PROTO_BRCM_PREPEND: Type = 2; - pub const DSA_TAG_PROTO_DSA: Type = 3; - pub const DSA_TAG_PROTO_EDSA: Type = 4; - pub const DSA_TAG_PROTO_GSWIP: Type = 5; - pub const DSA_TAG_PROTO_KSZ9477: Type = 6; - pub const DSA_TAG_PROTO_KSZ9893: Type = 7; - pub const DSA_TAG_PROTO_LAN9303: Type = 8; - pub const DSA_TAG_PROTO_MTK: Type = 9; - pub const DSA_TAG_PROTO_QCA: Type = 10; - pub const DSA_TAG_PROTO_TRAILER: Type = 11; - pub const DSA_TAG_PROTO_8021Q: Type = 12; - pub const DSA_TAG_PROTO_SJA1105: Type = 13; - pub const DSA_TAG_PROTO_KSZ8795: Type = 14; - pub const DSA_TAG_PROTO_OCELOT: Type = 15; - pub const DSA_TAG_PROTO_AR9331: Type = 16; - pub const DSA_TAG_PROTO_RTL4_A: Type = 17; - pub const DSA_TAG_PROTO_HELLCREEK: Type = 18; - pub const DSA_TAG_PROTO_XRS700X: Type = 19; - pub const DSA_TAG_PROTO_OCELOT_8021Q: Type = 20; - pub const DSA_TAG_PROTO_SEVILLE: Type = 21; - pub const DSA_TAG_PROTO_SJA1110: Type = 23; - pub const DSA_TAG_PROTO_RTL8_4: Type = 24; - pub const DSA_TAG_PROTO_RTL8_4T: Type = 25; - pub const DSA_TAG_PROTO_RZN1_A5PSW: Type = 26; - pub const DSA_TAG_PROTO_LAN937X: Type = 27; + pub pi_mutex: rt_mutex_base, + pub owner: *mut task_struct, + pub refcount: refcount_t, + pub key: futex_key, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dsa_device_ops { - pub xmit: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> *mut sk_buff, - >, - pub rcv: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> *mut sk_buff, - >, - pub flow_dissect: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const sk_buff, - arg2: *mut __be16, - arg3: *mut ::aya_bpf::cty::c_int, - ), - >, - pub connect: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_bpf::cty::c_int, - >, - pub disconnect: ::core::option::Option, - pub needed_headroom: ::aya_bpf::cty::c_uint, - pub needed_tailroom: ::aya_bpf::cty::c_uint, - pub name: *const ::aya_bpf::cty::c_char, - pub proto: dsa_tag_protocol::Type, - pub promisc_on_master: bool_, +#[derive(Copy, Clone)] +pub struct perf_event_mmap_page { + pub version: __u32, + pub compat_version: __u32, + pub lock: __u32, + pub index: __u32, + pub offset: __s64, + pub time_enabled: __u64, + pub time_running: __u64, + pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1, + pub pmc_width: __u16, + pub time_shift: __u16, + pub time_mult: __u32, + pub time_offset: __u64, + pub time_zero: __u64, + pub size: __u32, + pub __reserved_1: __u32, + pub time_cycles: __u64, + pub time_mask: __u64, + pub __reserved: [__u8; 928usize], + pub data_head: __u64, + pub data_tail: __u64, + pub data_offset: __u64, + pub data_size: __u64, + pub aux_head: __u64, + pub aux_tail: __u64, + pub aux_offset: __u64, + pub aux_size: __u64, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dsa_8021q_context { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub union perf_event_mmap_page__bindgen_ty_1 { + pub capabilities: __u64, + pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_switch { - pub dev: *mut device, - pub dst: *mut dsa_switch_tree, - pub index: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, - pub nb: notifier_block, - pub priv_: *mut ::aya_bpf::cty::c_void, - pub tagger_data: *mut ::aya_bpf::cty::c_void, - pub cd: *mut dsa_chip_data, - pub ops: *const dsa_switch_ops, - pub phys_mii_mask: u32_, - pub slave_mii_bus: *mut mii_bus, - pub ageing_time_min: ::aya_bpf::cty::c_uint, - pub ageing_time_max: ::aya_bpf::cty::c_uint, - pub tag_8021q_ctx: *mut dsa_8021q_context, - pub devlink: *mut devlink, - pub num_tx_queues: ::aya_bpf::cty::c_uint, - pub num_lag_ids: ::aya_bpf::cty::c_uint, - pub max_num_bridges: ::aya_bpf::cty::c_uint, - pub num_ports: ::aya_bpf::cty::c_uint, +pub struct perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { + pub _bitfield_align_1: [u64; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, } -impl dsa_switch { +impl perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { #[inline] - pub fn setup(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + pub fn cap_bit0(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } } #[inline] - pub fn set_setup(&mut self, val: u32_) { + pub fn set_cap_bit0(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u64 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn vlan_filtering_is_global(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + pub fn cap_bit0_is_deprecated(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } } #[inline] - pub fn set_vlan_filtering_is_global(&mut self, val: u32_) { + pub fn set_cap_bit0_is_deprecated(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u64 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn needs_standalone_vlan_filtering(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + pub fn cap_user_rdpmc(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } } #[inline] - pub fn set_needs_standalone_vlan_filtering(&mut self, val: u32_) { + pub fn set_cap_user_rdpmc(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u64 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn configure_vlan_while_not_filtering(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + pub fn cap_user_time(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } } #[inline] - pub fn set_configure_vlan_while_not_filtering(&mut self, val: u32_) { + pub fn set_cap_user_time(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u64 = ::core::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn untag_bridge_pvid(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + pub fn cap_user_time_zero(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u64) } } #[inline] - pub fn set_untag_bridge_pvid(&mut self, val: u32_) { + pub fn set_cap_user_time_zero(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u64 = ::core::mem::transmute(val); self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] - pub fn assisted_learning_on_cpu_port(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } + pub fn cap_user_time_short(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u64) } } #[inline] - pub fn set_assisted_learning_on_cpu_port(&mut self, val: u32_) { + pub fn set_cap_user_time_short(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); + let val: u64 = ::core::mem::transmute(val); self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] - pub fn vlan_filtering(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } - } - #[inline] - pub fn set_vlan_filtering(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) - } - } - #[inline] - pub fn mtu_enforcement_ingress(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } - } - #[inline] - pub fn set_mtu_enforcement_ingress(&mut self, val: u32_) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(7usize, 1u8, val as u64) - } - } - #[inline] - pub fn fdb_isolation(&self) -> u32_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) } + pub fn cap_____res(&self) -> __u64 { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 58u8) as u64) } } #[inline] - pub fn set_fdb_isolation(&mut self, val: u32_) { + pub fn set_cap_____res(&mut self, val: __u64) { unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(8usize, 1u8, val as u64) + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 58u8, val as u64) } } #[inline] pub fn new_bitfield_1( - setup: u32_, - vlan_filtering_is_global: u32_, - needs_standalone_vlan_filtering: u32_, - configure_vlan_while_not_filtering: u32_, - untag_bridge_pvid: u32_, - assisted_learning_on_cpu_port: u32_, - vlan_filtering: u32_, - mtu_enforcement_ingress: u32_, - fdb_isolation: u32_, - ) -> __BindgenBitfieldUnit<[u8; 2usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); + cap_bit0: __u64, + cap_bit0_is_deprecated: __u64, + cap_user_rdpmc: __u64, + cap_user_time: __u64, + cap_user_time_zero: __u64, + cap_user_time_short: __u64, + cap_____res: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let setup: u32 = unsafe { ::core::mem::transmute(setup) }; - setup as u64 + let cap_bit0: u64 = unsafe { ::core::mem::transmute(cap_bit0) }; + cap_bit0 as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let vlan_filtering_is_global: u32 = - unsafe { ::core::mem::transmute(vlan_filtering_is_global) }; - vlan_filtering_is_global as u64 + let cap_bit0_is_deprecated: u64 = + unsafe { ::core::mem::transmute(cap_bit0_is_deprecated) }; + cap_bit0_is_deprecated as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { - let needs_standalone_vlan_filtering: u32 = - unsafe { ::core::mem::transmute(needs_standalone_vlan_filtering) }; - needs_standalone_vlan_filtering as u64 + let cap_user_rdpmc: u64 = unsafe { ::core::mem::transmute(cap_user_rdpmc) }; + cap_user_rdpmc as u64 }); __bindgen_bitfield_unit.set(3usize, 1u8, { - let configure_vlan_while_not_filtering: u32 = - unsafe { ::core::mem::transmute(configure_vlan_while_not_filtering) }; - configure_vlan_while_not_filtering as u64 + let cap_user_time: u64 = unsafe { ::core::mem::transmute(cap_user_time) }; + cap_user_time as u64 }); __bindgen_bitfield_unit.set(4usize, 1u8, { - let untag_bridge_pvid: u32 = unsafe { ::core::mem::transmute(untag_bridge_pvid) }; - untag_bridge_pvid as u64 + let cap_user_time_zero: u64 = unsafe { ::core::mem::transmute(cap_user_time_zero) }; + cap_user_time_zero as u64 }); __bindgen_bitfield_unit.set(5usize, 1u8, { - let assisted_learning_on_cpu_port: u32 = - unsafe { ::core::mem::transmute(assisted_learning_on_cpu_port) }; - assisted_learning_on_cpu_port as u64 - }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let vlan_filtering: u32 = unsafe { ::core::mem::transmute(vlan_filtering) }; - vlan_filtering as u64 - }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let mtu_enforcement_ingress: u32 = - unsafe { ::core::mem::transmute(mtu_enforcement_ingress) }; - mtu_enforcement_ingress as u64 + let cap_user_time_short: u64 = unsafe { ::core::mem::transmute(cap_user_time_short) }; + cap_user_time_short as u64 }); - __bindgen_bitfield_unit.set(8usize, 1u8, { - let fdb_isolation: u32 = unsafe { ::core::mem::transmute(fdb_isolation) }; - fdb_isolation as u64 + __bindgen_bitfield_unit.set(6usize, 58u8, { + let cap_____res: u64 = unsafe { ::core::mem::transmute(cap_____res) }; + cap_____res as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct dsa_lag { - pub dev: *mut net_device, - pub id: ::aya_bpf::cty::c_uint, - pub fdb_lock: mutex, - pub fdbs: list_head, +pub struct perf_buffer { pub refcount: refcount_t, + pub callback_head: callback_head, + pub nr_pages: ::aya_ebpf::cty::c_int, + pub overwrite: ::aya_ebpf::cty::c_int, + pub paused: ::aya_ebpf::cty::c_int, + pub poll: atomic_t, + pub head: local_t, + pub nest: ::aya_ebpf::cty::c_uint, + pub events: local_t, + pub wakeup: local_t, + pub lost: local_t, + pub watermark: ::aya_ebpf::cty::c_long, + pub aux_watermark: ::aya_ebpf::cty::c_long, + pub event_lock: spinlock_t, + pub event_list: list_head, + pub mmap_count: atomic_t, + pub mmap_locked: ::aya_ebpf::cty::c_ulong, + pub mmap_user: *mut user_struct, + pub aux_head: ::aya_ebpf::cty::c_long, + pub aux_nest: ::aya_ebpf::cty::c_uint, + pub aux_wakeup: ::aya_ebpf::cty::c_long, + pub aux_pgoff: ::aya_ebpf::cty::c_ulong, + pub aux_nr_pages: ::aya_ebpf::cty::c_int, + pub aux_overwrite: ::aya_ebpf::cty::c_int, + pub aux_mmap_count: atomic_t, + pub aux_mmap_locked: ::aya_ebpf::cty::c_ulong, + pub free_aux: ::core::option::Option, + pub aux_refcount: refcount_t, + pub aux_in_sampling: ::aya_ebpf::cty::c_int, + pub aux_pages: *mut *mut ::aya_ebpf::cty::c_void, + pub aux_priv: *mut ::aya_ebpf::cty::c_void, + pub user_page: *mut perf_event_mmap_page, + pub data_pages: __IncompleteArrayField<*mut ::aya_ebpf::cty::c_void>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_switch_tree { - pub list: list_head, - pub ports: list_head, - pub nh: raw_notifier_head, - pub index: ::aya_bpf::cty::c_uint, - pub refcount: kref, - pub lags: *mut *mut dsa_lag, - pub tag_ops: *const dsa_device_ops, - pub default_proto: dsa_tag_protocol::Type, - pub setup: bool_, - pub pd: *mut dsa_platform_data, - pub rtable: list_head, - pub lags_len: ::aya_bpf::cty::c_uint, - pub last_switch: ::aya_bpf::cty::c_uint, +pub struct merkle_tree_params { + pub hash_alg: *const fsverity_hash_alg, + pub hashstate: *const u8_, + pub digest_size: ::aya_ebpf::cty::c_uint, + pub block_size: ::aya_ebpf::cty::c_uint, + pub hashes_per_block: ::aya_ebpf::cty::c_uint, + pub blocks_per_page: ::aya_ebpf::cty::c_uint, + pub log_digestsize: u8_, + pub log_blocksize: u8_, + pub log_arity: u8_, + pub log_blocks_per_page: u8_, + pub num_levels: ::aya_ebpf::cty::c_uint, + pub tree_size: u64_, + pub tree_pages: ::aya_ebpf::cty::c_ulong, + pub level_start: [::aya_ebpf::cty::c_ulong; 8usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct fsverity_info { + pub tree_params: merkle_tree_params, + pub root_hash: [u8_; 64usize], + pub file_digest: [u8_; 64usize], + pub inode: *const inode, + pub hash_block_verified: *mut ::aya_ebpf::cty::c_ulong, + pub hash_page_init_lock: spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_mall_mirror_tc_entry { - pub to_local_port: u8_, - pub ingress: bool_, +pub struct fsverity_hash_alg { + pub tfm: *mut crypto_shash, + pub name: *const ::aya_ebpf::cty::c_char, + pub digest_size: ::aya_ebpf::cty::c_uint, + pub block_size: ::aya_ebpf::cty::c_uint, + pub algo_id: hash_algo::Type, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_mall_policer_tc_entry { - pub burst: u32_, - pub rate_bytes_per_sec: u64_, +pub struct io_uring_cmd { + pub file: *mut file, + pub sqe: *const io_uring_sqe, + pub task_work_cb: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut io_uring_cmd, arg2: ::aya_ebpf::cty::c_uint), + >, + pub cmd_op: u32_, + pub flags: u32_, + pub pdu: [u8_; 32usize], +} +#[repr(C)] +#[derive(Debug)] +pub struct rps_map { + pub len: ::aya_ebpf::cty::c_uint, + pub rcu: callback_head, + pub cpus: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_bridge { +pub struct rps_dev_flow { + pub cpu: u16_, + pub filter: u16_, + pub last_qtail: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug)] +pub struct rps_dev_flow_table { + pub mask: ::aya_ebpf::cty::c_uint, + pub rcu: callback_head, + pub flows: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdp_mem_info { + pub type_: u32_, + pub id: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdp_frame { + pub data: *mut ::aya_ebpf::cty::c_void, + pub len: u16_, + pub headroom: u16_, + pub metasize: u32_, + pub mem: xdp_mem_info, + pub dev_rx: *mut net_device, + pub frame_sz: u32_, + pub flags: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdp_buff { + pub data: *mut ::aya_ebpf::cty::c_void, + pub data_end: *mut ::aya_ebpf::cty::c_void, + pub data_meta: *mut ::aya_ebpf::cty::c_void, + pub data_hard_start: *mut ::aya_ebpf::cty::c_void, + pub rxq: *mut xdp_rxq_info, + pub txq: *mut xdp_txq_info, + pub frame_sz: u32_, + pub flags: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdp_rxq_info { pub dev: *mut net_device, - pub num: ::aya_bpf::cty::c_uint, - pub tx_fwd_offload: bool_, - pub refcount: refcount_t, + pub queue_index: u32_, + pub reg_state: u32_, + pub mem: xdp_mem_info, + pub napi_id: ::aya_ebpf::cty::c_uint, + pub frag_size: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, } -pub mod dsa_db_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DSA_DB_PORT: Type = 0; - pub const DSA_DB_LAG: Type = 1; - pub const DSA_DB_BRIDGE: Type = 2; +impl xdp_rxq_info { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Copy, Clone)] -pub struct dsa_db { - pub type_: dsa_db_type::Type, - pub __bindgen_anon_1: dsa_db__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct netdev_rx_queue { + pub xdp_rxq: xdp_rxq_info, + pub rps_map: *mut rps_map, + pub rps_flow_table: *mut rps_dev_flow_table, + pub kobj: kobject, + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub pool: *mut xsk_buff_pool, + pub napi: *mut napi_struct, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, +} +impl netdev_rx_queue { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct netdev_name_node { + pub hlist: hlist_node, + pub list: list_head, + pub dev: *mut net_device, + pub name: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdp_md { + pub data: __u32, + pub data_end: __u32, + pub data_meta: __u32, + pub ingress_ifindex: __u32, + pub rx_queue_index: __u32, + pub egress_ifindex: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdp_txq_info { + pub dev: *mut net_device, } #[repr(C)] #[derive(Copy, Clone)] -pub union dsa_db__bindgen_ty_1 { - pub dp: *const dsa_port, - pub lag: dsa_lag, - pub bridge: dsa_bridge, +pub struct netpoll_info { + pub refcnt: refcount_t, + pub dev_lock: semaphore, + pub txq: sk_buff_head, + pub tx_work: delayed_work, + pub netpoll: *mut netpoll, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fixed_phy_status { - _unused: [u8; 0], +pub struct vlan_group { + pub nr_vlan_devs: ::aya_ebpf::cty::c_uint, + pub hlist: hlist_node, + pub vlan_devices_arrays: [*mut *mut net_device; 16usize], } -pub type dsa_fdb_dump_cb_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_uchar, - arg2: u16_, - arg3: bool_, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dsa_switch_ops { - pub get_tag_protocol: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: dsa_tag_protocol::Type, - ) -> dsa_tag_protocol::Type, - >, - pub change_tag_protocol: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: dsa_tag_protocol::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub connect_tag_protocol: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: dsa_tag_protocol::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_change_master: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut net_device, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub setup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_bpf::cty::c_int, - >, - pub teardown: ::core::option::Option, - pub port_setup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_teardown: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int), - >, - pub get_phy_flags: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int) -> u32_, - >, - pub phy_read: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub phy_write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub adjust_link: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut phy_device, - ), - >, - pub fixed_link_update: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut fixed_phy_status, - ), - >, - pub phylink_get_caps: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut phylink_config, - ), - >, - pub phylink_mac_select_pcs: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: phy_interface_t::Type, - ) -> *mut phylink_pcs, - >, - pub phylink_mac_link_state: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut phylink_link_state, - ) -> ::aya_bpf::cty::c_int, - >, - pub phylink_mac_config: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: *const phylink_link_state, - ), - >, - pub phylink_mac_an_restart: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int), - >, - pub phylink_mac_link_down: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: phy_interface_t::Type, - ), - >, - pub phylink_mac_link_up: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: phy_interface_t::Type, - arg5: *mut phy_device, - arg6: ::aya_bpf::cty::c_int, - arg7: ::aya_bpf::cty::c_int, - arg8: bool_, - arg9: bool_, - ), - >, - pub phylink_fixed_state: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut phylink_link_state, - ), - >, - pub get_strings: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u32_, - arg4: *mut u8, - ), - >, - pub get_ethtool_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int, arg3: *mut u64), - >, - pub get_sset_count: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_ethtool_phy_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int, arg3: *mut u64), - >, - pub get_eth_phy_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_eth_phy_stats, - ), - >, - pub get_eth_mac_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_eth_mac_stats, - ), - >, - pub get_eth_ctrl_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_eth_ctrl_stats, - ), - >, - pub get_rmon_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_rmon_stats, - arg4: *mut *const ethtool_rmon_hist_range, - ), - >, - pub get_stats64: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut rtnl_link_stats64, - ), - >, - pub get_pause_stats: ::core::option::Option< +pub struct vlan_info { + pub real_dev: *mut net_device, + pub grp: vlan_group, + pub vid_list: list_head, + pub nr_vids: ::aya_ebpf::cty::c_uint, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union inet_addr { + pub all: [__u32; 4usize], + pub ip: __be32, + pub ip6: [__be32; 4usize], + pub in_: in_addr, + pub in6: in6_addr, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct netpoll { + pub dev: *mut net_device, + pub dev_tracker: netdevice_tracker, + pub dev_name: [::aya_ebpf::cty::c_char; 16usize], + pub name: *const ::aya_ebpf::cty::c_char, + pub local_ip: inet_addr, + pub remote_ip: inet_addr, + pub ipv6: bool_, + pub local_port: u16_, + pub remote_port: u16_, + pub remote_mac: [u8_; 6usize], +} +pub mod bpf_link_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_LINK_TYPE_UNSPEC: Type = 0; + pub const BPF_LINK_TYPE_RAW_TRACEPOINT: Type = 1; + pub const BPF_LINK_TYPE_TRACING: Type = 2; + pub const BPF_LINK_TYPE_CGROUP: Type = 3; + pub const BPF_LINK_TYPE_ITER: Type = 4; + pub const BPF_LINK_TYPE_NETNS: Type = 5; + pub const BPF_LINK_TYPE_XDP: Type = 6; + pub const BPF_LINK_TYPE_PERF_EVENT: Type = 7; + pub const BPF_LINK_TYPE_KPROBE_MULTI: Type = 8; + pub const BPF_LINK_TYPE_STRUCT_OPS: Type = 9; + pub const BPF_LINK_TYPE_NETFILTER: Type = 10; + pub const BPF_LINK_TYPE_TCX: Type = 11; + pub const BPF_LINK_TYPE_UPROBE_MULTI: Type = 12; + pub const BPF_LINK_TYPE_NETKIT: Type = 13; + pub const __MAX_BPF_LINK_TYPE: Type = 14; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link { + pub refcnt: atomic64_t, + pub id: u32_, + pub type_: bpf_link_type::Type, + pub ops: *const bpf_link_ops, + pub prog: *mut bpf_prog, + pub work: work_struct, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_link_ops { + pub release: ::core::option::Option, + pub dealloc: ::core::option::Option, + pub detach: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub update_prog: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_pause_stats, - ), + arg1: *mut bpf_link, + arg2: *mut bpf_prog, + arg3: *mut bpf_prog, + ) -> ::aya_ebpf::cty::c_int, >, - pub self_test: ::core::option::Option< + pub show_fdinfo: + ::core::option::Option, + pub fill_link_info: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_test, - arg4: *mut u64_, - ), + arg1: *const bpf_link, + arg2: *mut bpf_link_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub get_wol: ::core::option::Option< + pub update_map: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_wolinfo, - ), + arg1: *mut bpf_link, + arg2: *mut bpf_map, + arg3: *mut bpf_map, + ) -> ::aya_ebpf::cty::c_int, >, - pub set_wol: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_wolinfo, - ) -> ::aya_bpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_mprog_fp { + pub prog: *mut bpf_prog, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_mprog_cp { + pub link: *mut bpf_link, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_mprog_entry { + pub fp_items: [bpf_mprog_fp; 64usize], + pub parent: *mut bpf_mprog_bundle, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_mprog_bundle { + pub a: bpf_mprog_entry, + pub b: bpf_mprog_entry, + pub cp_items: [bpf_mprog_cp; 64usize], + pub ref_: *mut bpf_prog, + pub revision: atomic64_t, + pub count: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct timens_offsets { + pub monotonic: timespec64, + pub boottime: timespec64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct time_namespace { + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub ns: ns_common, + pub offsets: timens_offsets, + pub vvar_page: *mut page, + pub frozen_offsets: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct eventfs_attr { + pub mode: ::aya_ebpf::cty::c_int, + pub uid: kuid_t, + pub gid: kgid_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct eventfs_inode { + pub __bindgen_anon_1: eventfs_inode__bindgen_ty_1, + pub children: list_head, + pub entries: *const eventfs_entry, + pub name: *const ::aya_ebpf::cty::c_char, + pub events_dir: *mut dentry, + pub entry_attrs: *mut eventfs_attr, + pub data: *mut ::aya_ebpf::cty::c_void, + pub attr: eventfs_attr, + pub kref: kref, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, + pub ino: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union eventfs_inode__bindgen_ty_1 { + pub list: list_head, + pub rcu: callback_head, +} +impl eventfs_inode { + #[inline] + pub fn is_freed(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_freed(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_events(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_events(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn nr_entries(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 30u8) as u32) } + } + #[inline] + pub fn set_nr_entries(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 30u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + is_freed: ::aya_ebpf::cty::c_uint, + is_events: ::aya_ebpf::cty::c_uint, + nr_entries: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let is_freed: u32 = unsafe { ::core::mem::transmute(is_freed) }; + is_freed as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let is_events: u32 = unsafe { ::core::mem::transmute(is_events) }; + is_events as u64 + }); + __bindgen_bitfield_unit.set(2usize, 30u8, { + let nr_entries: u32 = unsafe { ::core::mem::transmute(nr_entries) }; + nr_entries as u64 + }); + __bindgen_bitfield_unit + } +} +pub type u_char = ::aya_ebpf::cty::c_uchar; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct libipw_device { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iw_public_data { + pub spy_data: *mut iw_spy_data, + pub libipw: *mut libipw_device, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phylink { + _unused: [u8; 0], +} +pub mod phylink_op_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const PHYLINK_NETDEV: Type = 0; + pub const PHYLINK_DEV: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phylink_config { + pub dev: *mut device, + pub type_: phylink_op_type::Type, + pub poll_fixed_state: bool_, + pub mac_managed_pm: bool_, + pub ovr_an_inband: bool_, + pub get_fixed_state: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phylink_config, arg2: *mut phylink_link_state), >, - pub get_ts_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_ts_info, - ) -> ::aya_bpf::cty::c_int, + pub supported_interfaces: [::aya_ebpf::cty::c_ulong; 1usize], + pub mac_capabilities: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct dsa_port { + pub __bindgen_anon_1: dsa_port__bindgen_ty_1, + pub tag_ops: *const dsa_device_ops, + pub dst: *mut dsa_switch_tree, + pub rcv: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> *mut sk_buff, >, - pub get_mm: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_mm_state, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_mm: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_mm_cfg, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_mm_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_mm_stats, - ), - >, - pub port_get_default_prio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_set_default_prio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_get_dscp_prio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_add_dscp_prio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - arg4: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_del_dscp_prio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u8_, - arg4: u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub suspend: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_bpf::cty::c_int, - >, - pub resume: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_bpf::cty::c_int, - >, - pub port_enable: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut phy_device, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_disable: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int), - >, - pub preferred_default_local_cpu_port: - ::core::option::Option *mut dsa_port>, - pub set_mac_eee: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_eee, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_mac_eee: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_eee, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_eeprom_len: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_bpf::cty::c_int, - >, - pub get_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_regs_len: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_regs: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_regs, - arg4: *mut ::aya_bpf::cty::c_void, - ), - >, - pub port_prechangeupper: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut netdev_notifier_changeupper_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_ageing_time: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_bridge_join: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: dsa_bridge, - arg4: *mut bool_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_bridge_leave: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int, arg3: dsa_bridge), - >, - pub port_stp_state_set: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int, arg3: u8_), - >, - pub port_mst_state_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_mst_state, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_fast_age: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int), - >, - pub port_vlan_fast_age: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_pre_bridge_flags: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: switchdev_brport_flags, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_bridge_flags: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: switchdev_brport_flags, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_set_host_flood: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: bool_, - arg4: bool_, - ), - >, - pub port_vlan_filtering: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: bool_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_vlan_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_port_vlan, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_vlan_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_port_vlan, - ) -> ::aya_bpf::cty::c_int, - >, - pub vlan_msti_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: dsa_bridge, - arg3: *const switchdev_vlan_msti, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_fdb_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: u16_, - arg5: dsa_db, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_fdb_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: u16_, - arg5: dsa_db, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_fdb_dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: dsa_fdb_dump_cb_t, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub lag_fdb_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: dsa_lag, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: u16_, - arg5: dsa_db, - ) -> ::aya_bpf::cty::c_int, - >, - pub lag_fdb_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: dsa_lag, - arg3: *const ::aya_bpf::cty::c_uchar, - arg4: u16_, - arg5: dsa_db, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mdb_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_port_mdb, - arg4: dsa_db, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mdb_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_port_mdb, - arg4: dsa_db, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_rxnfc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_rxnfc, - arg4: *mut u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_rxnfc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ethtool_rxnfc, - ) -> ::aya_bpf::cty::c_int, - >, - pub cls_flower_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut flow_cls_offload, - arg4: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub cls_flower_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut flow_cls_offload, - arg4: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub cls_flower_stats: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut flow_cls_offload, - arg4: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mirror_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut dsa_mall_mirror_tc_entry, - arg4: bool_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mirror_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut dsa_mall_mirror_tc_entry, - ), - >, - pub port_policer_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut dsa_mall_policer_tc_entry, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_policer_del: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_bpf::cty::c_int), - >, - pub port_setup_tc: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: tc_setup_type::Type, - arg4: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub crosschip_bridge_join: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - arg5: dsa_bridge, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub crosschip_bridge_leave: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - arg5: dsa_bridge, - ), - >, - pub crosschip_lag_change: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub crosschip_lag_join: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: dsa_lag, - arg5: *mut netdev_lag_upper_info, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub crosschip_lag_leave: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: dsa_lag, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_hwtstamp_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ifreq, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_hwtstamp_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut ifreq, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_txtstamp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut sk_buff, - ), - >, - pub port_rxtstamp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut sk_buff, - arg4: ::aya_bpf::cty::c_uint, - ) -> bool_, - >, - pub devlink_param_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: u32_, - arg3: *mut devlink_param_gset_ctx, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_param_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: u32_, - arg3: *mut devlink_param_gset_ctx, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_info_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: *mut devlink_info_req, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_pool_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: *mut devlink_sb_pool_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_pool_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: u32_, - arg5: devlink_sb_threshold_type::Type, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_port_pool_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: u16_, - arg5: *mut u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_port_pool_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: u16_, - arg5: u32_, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_tc_pool_bind_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: u16_, - arg5: devlink_sb_pool_type::Type, - arg6: *mut u16_, - arg7: *mut u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_tc_pool_bind_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: u16_, - arg5: devlink_sb_pool_type::Type, - arg6: u16_, - arg7: u32_, - arg8: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_occ_snapshot: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_occ_max_clear: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_occ_port_pool_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: u16_, - arg5: *mut u32_, - arg6: *mut u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub devlink_sb_occ_tc_port_bind_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_uint, - arg4: u16_, - arg5: devlink_sb_pool_type::Type, - arg6: *mut u32_, - arg7: *mut u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_change_mtu: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_max_mtu: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_lag_change: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_lag_join: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: dsa_lag, - arg4: *mut netdev_lag_upper_info, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_lag_leave: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: dsa_lag, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_hsr_join: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut net_device, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_hsr_leave: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut net_device, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mrp_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_mrp, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mrp_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_mrp, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mrp_add_ring_role: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_ring_role_mrp, - ) -> ::aya_bpf::cty::c_int, - >, - pub port_mrp_del_ring_role: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: *const switchdev_obj_ring_role_mrp, - ) -> ::aya_bpf::cty::c_int, - >, - pub tag_8021q_vlan_add: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u16_, - arg4: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub tag_8021q_vlan_del: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dsa_switch, - arg2: ::aya_bpf::cty::c_int, - arg3: u16_, - ) -> ::aya_bpf::cty::c_int, - >, - pub master_state_change: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: *const net_device, arg3: bool_), + pub ds: *mut dsa_switch, + pub index: ::aya_ebpf::cty::c_uint, + pub type_: dsa_port__bindgen_ty_2::Type, + pub name: *const ::aya_ebpf::cty::c_char, + pub cpu_dp: *mut dsa_port, + pub mac: [u8_; 6usize], + pub stp_state: u8_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub dn: *mut device_node, + pub ageing_time: ::aya_ebpf::cty::c_uint, + pub bridge: *mut dsa_bridge, + pub devlink_port: devlink_port, + pub pl: *mut phylink, + pub pl_config: phylink_config, + pub lag: *mut dsa_lag, + pub hsr_dev: *mut net_device, + pub list: list_head, + pub orig_ethtool_ops: *const ethtool_ops, + pub addr_lists_lock: mutex, + pub fdbs: list_head, + pub mdbs: list_head, + pub vlans_lock: mutex, + pub __bindgen_anon_2: dsa_port__bindgen_ty_3, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union dsa_port__bindgen_ty_1 { + pub conduit: *mut net_device, + pub user: *mut net_device, +} +pub mod dsa_port__bindgen_ty_2 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DSA_PORT_TYPE_UNUSED: Type = 0; + pub const DSA_PORT_TYPE_CPU: Type = 1; + pub const DSA_PORT_TYPE_DSA: Type = 2; + pub const DSA_PORT_TYPE_USER: Type = 3; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union dsa_port__bindgen_ty_3 { + pub vlans: list_head, + pub user_vlans: list_head, +} +impl dsa_port { + #[inline] + pub fn vlan_filtering(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_vlan_filtering(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn learning(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_learning(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn lag_tx_enabled(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_lag_tx_enabled(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn conduit_admin_up(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_conduit_admin_up(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn conduit_oper_up(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } + } + #[inline] + pub fn set_conduit_oper_up(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn cpu_port_in_lag(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } + } + #[inline] + pub fn set_cpu_port_in_lag(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn setup(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + } + #[inline] + pub fn set_setup(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + vlan_filtering: u8_, + learning: u8_, + lag_tx_enabled: u8_, + conduit_admin_up: u8_, + conduit_oper_up: u8_, + cpu_port_in_lag: u8_, + setup: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let vlan_filtering: u8 = unsafe { ::core::mem::transmute(vlan_filtering) }; + vlan_filtering as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let learning: u8 = unsafe { ::core::mem::transmute(learning) }; + learning as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let lag_tx_enabled: u8 = unsafe { ::core::mem::transmute(lag_tx_enabled) }; + lag_tx_enabled as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let conduit_admin_up: u8 = unsafe { ::core::mem::transmute(conduit_admin_up) }; + conduit_admin_up as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let conduit_oper_up: u8 = unsafe { ::core::mem::transmute(conduit_oper_up) }; + conduit_oper_up as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let cpu_port_in_lag: u8 = unsafe { ::core::mem::transmute(cpu_port_in_lag) }; + cpu_port_in_lag as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let setup: u8 = unsafe { ::core::mem::transmute(setup) }; + setup as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mdio_device { + pub dev: device, + pub bus: *mut mii_bus, + pub modalias: [::aya_ebpf::cty::c_char; 32usize], + pub bus_match: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut device, arg2: *mut device_driver) -> ::aya_ebpf::cty::c_int, >, + pub device_free: ::core::option::Option, + pub device_remove: ::core::option::Option, + pub addr: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, + pub reset_state: ::aya_ebpf::cty::c_int, + pub reset_gpio: *mut gpio_desc, + pub reset_ctrl: *mut reset_control, + pub reset_assert_delay: ::aya_ebpf::cty::c_uint, + pub reset_deassert_delay: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct pipe_inode_info { - pub mutex: mutex, - pub rd_wait: wait_queue_head_t, - pub wr_wait: wait_queue_head_t, - pub head: ::aya_bpf::cty::c_uint, - pub tail: ::aya_bpf::cty::c_uint, - pub max_usage: ::aya_bpf::cty::c_uint, - pub ring_size: ::aya_bpf::cty::c_uint, - pub note_loss: bool_, - pub nr_accounted: ::aya_bpf::cty::c_uint, - pub readers: ::aya_bpf::cty::c_uint, - pub writers: ::aya_bpf::cty::c_uint, - pub files: ::aya_bpf::cty::c_uint, - pub r_counter: ::aya_bpf::cty::c_uint, - pub w_counter: ::aya_bpf::cty::c_uint, - pub poll_usage: bool_, - pub tmp_page: *mut page, - pub fasync_readers: *mut fasync_struct, - pub fasync_writers: *mut fasync_struct, - pub bufs: *mut pipe_buffer, - pub user: *mut user_struct, - pub watch_queue: *mut watch_queue, +#[derive(Debug, Copy, Clone)] +pub struct phy_c45_device_ids { + pub devices_in_package: u32_, + pub mmds_present: u32_, + pub device_ids: [u32_; 32usize], +} +pub mod phy_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const PHY_DOWN: Type = 0; + pub const PHY_READY: Type = 1; + pub const PHY_HALTED: Type = 2; + pub const PHY_ERROR: Type = 3; + pub const PHY_UP: Type = 4; + pub const PHY_RUNNING: Type = 5; + pub const PHY_NOLINK: Type = 6; + pub const PHY_CABLETEST: Type = 7; +} +pub mod phy_interface_t { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const PHY_INTERFACE_MODE_NA: Type = 0; + pub const PHY_INTERFACE_MODE_INTERNAL: Type = 1; + pub const PHY_INTERFACE_MODE_MII: Type = 2; + pub const PHY_INTERFACE_MODE_GMII: Type = 3; + pub const PHY_INTERFACE_MODE_SGMII: Type = 4; + pub const PHY_INTERFACE_MODE_TBI: Type = 5; + pub const PHY_INTERFACE_MODE_REVMII: Type = 6; + pub const PHY_INTERFACE_MODE_RMII: Type = 7; + pub const PHY_INTERFACE_MODE_REVRMII: Type = 8; + pub const PHY_INTERFACE_MODE_RGMII: Type = 9; + pub const PHY_INTERFACE_MODE_RGMII_ID: Type = 10; + pub const PHY_INTERFACE_MODE_RGMII_RXID: Type = 11; + pub const PHY_INTERFACE_MODE_RGMII_TXID: Type = 12; + pub const PHY_INTERFACE_MODE_RTBI: Type = 13; + pub const PHY_INTERFACE_MODE_SMII: Type = 14; + pub const PHY_INTERFACE_MODE_XGMII: Type = 15; + pub const PHY_INTERFACE_MODE_XLGMII: Type = 16; + pub const PHY_INTERFACE_MODE_MOCA: Type = 17; + pub const PHY_INTERFACE_MODE_PSGMII: Type = 18; + pub const PHY_INTERFACE_MODE_QSGMII: Type = 19; + pub const PHY_INTERFACE_MODE_TRGMII: Type = 20; + pub const PHY_INTERFACE_MODE_100BASEX: Type = 21; + pub const PHY_INTERFACE_MODE_1000BASEX: Type = 22; + pub const PHY_INTERFACE_MODE_2500BASEX: Type = 23; + pub const PHY_INTERFACE_MODE_5GBASER: Type = 24; + pub const PHY_INTERFACE_MODE_RXAUI: Type = 25; + pub const PHY_INTERFACE_MODE_XAUI: Type = 26; + pub const PHY_INTERFACE_MODE_10GBASER: Type = 27; + pub const PHY_INTERFACE_MODE_25GBASER: Type = 28; + pub const PHY_INTERFACE_MODE_USXGMII: Type = 29; + pub const PHY_INTERFACE_MODE_10GKR: Type = 30; + pub const PHY_INTERFACE_MODE_QUSGMII: Type = 31; + pub const PHY_INTERFACE_MODE_1000BASEKX: Type = 32; + pub const PHY_INTERFACE_MODE_MAX: Type = 33; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pipe_buffer { - pub page: *mut page, - pub offset: ::aya_bpf::cty::c_uint, - pub len: ::aya_bpf::cty::c_uint, - pub ops: *const pipe_buf_operations, - pub flags: ::aya_bpf::cty::c_uint, - pub private: ::aya_bpf::cty::c_ulong, +pub struct phy_led_trigger { + _unused: [u8; 0], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pipe_buf_operations { - pub confirm: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut pipe_inode_info, - arg2: *mut pipe_buffer, - ) -> ::aya_bpf::cty::c_int, - >, - pub release: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut pipe_inode_info, arg2: *mut pipe_buffer), - >, - pub try_steal: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut pipe_inode_info, arg2: *mut pipe_buffer) -> bool_, - >, - pub get: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut pipe_inode_info, arg2: *mut pipe_buffer) -> bool_, - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct user_event_mm { - pub mms_link: list_head, - pub enablers: list_head, - pub mm: *mut mm_struct, - pub next: *mut user_event_mm, - pub refcnt: refcount_t, - pub tasks: refcount_t, - pub put_rwork: rcu_work, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fiemap_extent_info { - pub fi_flags: ::aya_bpf::cty::c_uint, - pub fi_extents_mapped: ::aya_bpf::cty::c_uint, - pub fi_extents_max: ::aya_bpf::cty::c_uint, - pub fi_extents_start: *mut fiemap_extent, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fileattr { - pub flags: u32_, - pub fsx_xflags: u32_, - pub fsx_extsize: u32_, - pub fsx_nextents: u32_, - pub fsx_projid: u32_, - pub fsx_cowextsize: u32_, +#[derive(Copy, Clone)] +pub struct phy_device { + pub mdio: mdio_device, + pub drv: *mut phy_driver, + pub devlink: *mut device_link, + pub phy_id: u32_, + pub c45_ids: phy_c45_device_ids, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 3usize], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 3usize]>, + pub rate_matching: ::aya_ebpf::cty::c_int, + pub state: phy_state::Type, + pub dev_flags: u32_, + pub interface: phy_interface_t::Type, + pub possible_interfaces: [::aya_ebpf::cty::c_ulong; 1usize], + pub speed: ::aya_ebpf::cty::c_int, + pub duplex: ::aya_ebpf::cty::c_int, + pub port: ::aya_ebpf::cty::c_int, + pub pause: ::aya_ebpf::cty::c_int, + pub asym_pause: ::aya_ebpf::cty::c_int, + pub master_slave_get: u8_, + pub master_slave_set: u8_, + pub master_slave_state: u8_, + pub supported: [::aya_ebpf::cty::c_ulong; 2usize], + pub advertising: [::aya_ebpf::cty::c_ulong; 2usize], + pub lp_advertising: [::aya_ebpf::cty::c_ulong; 2usize], + pub adv_old: [::aya_ebpf::cty::c_ulong; 2usize], + pub supported_eee: [::aya_ebpf::cty::c_ulong; 2usize], + pub advertising_eee: [::aya_ebpf::cty::c_ulong; 2usize], + pub eee_enabled: bool_, + pub host_interfaces: [::aya_ebpf::cty::c_ulong; 1usize], + pub eee_broken_modes: u32_, + pub phy_led_triggers: *mut phy_led_trigger, + pub phy_num_led_triggers: ::aya_ebpf::cty::c_uint, + pub last_triggered: *mut phy_led_trigger, + pub led_link_trigger: *mut phy_led_trigger, + pub leds: list_head, + pub irq: ::aya_ebpf::cty::c_int, + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub shared: *mut phy_package_shared, + pub skb: *mut sk_buff, + pub ehdr: *mut ::aya_ebpf::cty::c_void, + pub nest: *mut nlattr, + pub state_queue: delayed_work, + pub lock: mutex, + pub sfp_bus_attached: bool_, + pub sfp_bus: *mut sfp_bus, + pub phylink: *mut phylink, + pub attached_dev: *mut net_device, + pub mii_ts: *mut mii_timestamper, + pub psec: *mut pse_control, + pub mdix: u8_, + pub mdix_ctrl: u8_, + pub pma_extable: ::aya_ebpf::cty::c_int, + pub link_down_events: ::aya_ebpf::cty::c_uint, + pub phy_link_change: + ::core::option::Option, + pub adjust_link: ::core::option::Option, + pub macsec_ops: *const macsec_ops, } -impl fileattr { +impl phy_device { #[inline] - pub fn flags_valid(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn is_c45(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_flags_valid(&mut self, val: bool_) { + pub fn set_is_c45(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn fsx_valid(&self) -> bool_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + pub fn is_internal(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_fsx_valid(&mut self, val: bool_) { + pub fn set_is_internal(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - flags_valid: bool_, - fsx_valid: bool_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let flags_valid: u8 = unsafe { ::core::mem::transmute(flags_valid) }; - flags_valid as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let fsx_valid: u8 = unsafe { ::core::mem::transmute(fsx_valid) }; - fsx_valid as u64 - }); - __bindgen_bitfield_unit + pub fn is_pseudo_fixed_link(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fiemap_extent { - pub fe_logical: __u64, - pub fe_physical: __u64, - pub fe_length: __u64, - pub fe_reserved64: [__u64; 2usize], - pub fe_flags: __u32, - pub fe_reserved: [__u32; 3usize], -} -pub mod devlink_eswitch_encap_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_ESWITCH_ENCAP_MODE_NONE: Type = 0; - pub const DEVLINK_ESWITCH_ENCAP_MODE_BASIC: Type = 1; -} -pub mod devlink_selftest_status { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_SELFTEST_STATUS_SKIP: Type = 0; - pub const DEVLINK_SELFTEST_STATUS_PASS: Type = 1; - pub const DEVLINK_SELFTEST_STATUS_FAIL: Type = 2; -} -pub mod devlink_trap_action { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_TRAP_ACTION_DROP: Type = 0; - pub const DEVLINK_TRAP_ACTION_TRAP: Type = 1; - pub const DEVLINK_TRAP_ACTION_MIRROR: Type = 2; -} -pub mod devlink_trap_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_TRAP_TYPE_DROP: Type = 0; - pub const DEVLINK_TRAP_TYPE_EXCEPTION: Type = 1; - pub const DEVLINK_TRAP_TYPE_CONTROL: Type = 2; -} -pub mod devlink_reload_action { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_RELOAD_ACTION_UNSPEC: Type = 0; - pub const DEVLINK_RELOAD_ACTION_DRIVER_REINIT: Type = 1; - pub const DEVLINK_RELOAD_ACTION_FW_ACTIVATE: Type = 2; - pub const __DEVLINK_RELOAD_ACTION_MAX: Type = 3; - pub const DEVLINK_RELOAD_ACTION_MAX: Type = 2; -} -pub mod devlink_reload_limit { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_RELOAD_LIMIT_UNSPEC: Type = 0; - pub const DEVLINK_RELOAD_LIMIT_NO_RESET: Type = 1; - pub const __DEVLINK_RELOAD_LIMIT_MAX: Type = 2; - pub const DEVLINK_RELOAD_LIMIT_MAX: Type = 1; -} -pub mod devlink_linecard_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_LINECARD_STATE_UNSPEC: Type = 0; - pub const DEVLINK_LINECARD_STATE_UNPROVISIONED: Type = 1; - pub const DEVLINK_LINECARD_STATE_UNPROVISIONING: Type = 2; - pub const DEVLINK_LINECARD_STATE_PROVISIONING: Type = 3; - pub const DEVLINK_LINECARD_STATE_PROVISIONING_FAILED: Type = 4; - pub const DEVLINK_LINECARD_STATE_PROVISIONED: Type = 5; - pub const DEVLINK_LINECARD_STATE_ACTIVE: Type = 6; - pub const __DEVLINK_LINECARD_STATE_MAX: Type = 7; - pub const DEVLINK_LINECARD_STATE_MAX: Type = 6; -} -pub mod devlink_dpipe_field_mapping_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE: Type = 0; - pub const DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX: Type = 1; -} -pub mod devlink_port_fn_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_PORT_FN_STATE_INACTIVE: Type = 0; - pub const DEVLINK_PORT_FN_STATE_ACTIVE: Type = 1; -} -pub mod devlink_port_fn_opstate { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_PORT_FN_OPSTATE_DETACHED: Type = 0; - pub const DEVLINK_PORT_FN_OPSTATE_ATTACHED: Type = 1; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct devlink_dev_stats { - pub reload_stats: [u32_; 6usize], - pub remote_reload_stats: [u32_; 6usize], -} -#[repr(C)] -pub struct devlink { - pub index: u32_, - pub ports: xarray, - pub rate_list: list_head, - pub sb_list: list_head, - pub dpipe_table_list: list_head, - pub resource_list: list_head, - pub params: xarray, - pub region_list: list_head, - pub reporter_list: list_head, - pub dpipe_headers: *mut devlink_dpipe_headers, - pub trap_list: list_head, - pub trap_group_list: list_head, - pub trap_policer_list: list_head, - pub linecard_list: list_head, - pub ops: *const devlink_ops, - pub snapshot_ids: xarray, - pub stats: devlink_dev_stats, - pub dev: *mut device, - pub _net: possible_net_t, - pub lock: mutex, - pub lock_key: lock_class_key, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub refcount: refcount_t, - pub rwork: rcu_work, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 24usize]>, - pub priv_: __IncompleteArrayField<::aya_bpf::cty::c_char>, -} -impl devlink { #[inline] - pub fn reload_failed(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn set_is_pseudo_fixed_link(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } } #[inline] - pub fn set_reload_failed(&mut self, val: u8_) { + pub fn is_gigabit_capable(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_gigabit_capable(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1(reload_failed: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let reload_failed: u8 = unsafe { ::core::mem::transmute(reload_failed) }; - reload_failed as u64 - }); - __bindgen_bitfield_unit + pub fn has_fixups(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit + pub fn set_has_fixups(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct devlink_linecard { - pub list: list_head, - pub devlink: *mut devlink, - pub index: ::aya_bpf::cty::c_uint, - pub ops: *const devlink_linecard_ops, - pub priv_: *mut ::aya_bpf::cty::c_void, - pub state: devlink_linecard_state::Type, - pub state_lock: mutex, - pub type_: *const ::aya_bpf::cty::c_char, - pub types: *mut devlink_linecard_type, - pub types_count: ::aya_bpf::cty::c_uint, - pub nested_devlink: *mut devlink, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct devlink_port_new_attrs { - pub flavour: devlink_port_flavour::Type, - pub port_index: ::aya_bpf::cty::c_uint, - pub controller: u32_, - pub sfnum: u32_, - pub pfnum: u16_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: u8, -} -impl devlink_port_new_attrs { #[inline] - pub fn port_index_valid(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn suspended(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } } #[inline] - pub fn set_port_index_valid(&mut self, val: u8_) { + pub fn set_suspended(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] - pub fn controller_valid(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + pub fn suspended_by_mdio_bus(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } } #[inline] - pub fn set_controller_valid(&mut self, val: u8_) { + pub fn set_suspended_by_mdio_bus(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] - pub fn sfnum_valid(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + pub fn sysfs_links(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } } #[inline] - pub fn set_sfnum_valid(&mut self, val: u8_) { + pub fn set_sysfs_links(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn loopback_enabled(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) } + } + #[inline] + pub fn set_loopback_enabled(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 1u8, val as u64) + } + } + #[inline] + pub fn downshifted_rate(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u32) } + } + #[inline] + pub fn set_downshifted_rate(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(9usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_on_sfp_module(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u32) } + } + #[inline] + pub fn set_is_on_sfp_module(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(10usize, 1u8, val as u64) + } + } + #[inline] + pub fn mac_managed_pm(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) } + } + #[inline] + pub fn set_mac_managed_pm(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 1u8, val as u64) + } + } + #[inline] + pub fn wol_enabled(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u32) } + } + #[inline] + pub fn set_wol_enabled(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(12usize, 1u8, val as u64) + } + } + #[inline] + pub fn autoneg(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u32) } + } + #[inline] + pub fn set_autoneg(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(13usize, 1u8, val as u64) + } + } + #[inline] + pub fn link(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) } + } + #[inline] + pub fn set_link(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(14usize, 1u8, val as u64) + } + } + #[inline] + pub fn autoneg_complete(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) } + } + #[inline] + pub fn set_autoneg_complete(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(15usize, 1u8, val as u64) + } + } + #[inline] + pub fn interrupts(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 1u8) as u32) } + } + #[inline] + pub fn set_interrupts(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(16usize, 1u8, val as u64) + } + } + #[inline] + pub fn irq_suspended(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u32) } + } + #[inline] + pub fn set_irq_suspended(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(17usize, 1u8, val as u64) + } + } + #[inline] + pub fn irq_rerun(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(18usize, 1u8) as u32) } + } + #[inline] + pub fn set_irq_rerun(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(18usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - port_index_valid: u8_, - controller_valid: u8_, - sfnum_valid: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + is_c45: ::aya_ebpf::cty::c_uint, + is_internal: ::aya_ebpf::cty::c_uint, + is_pseudo_fixed_link: ::aya_ebpf::cty::c_uint, + is_gigabit_capable: ::aya_ebpf::cty::c_uint, + has_fixups: ::aya_ebpf::cty::c_uint, + suspended: ::aya_ebpf::cty::c_uint, + suspended_by_mdio_bus: ::aya_ebpf::cty::c_uint, + sysfs_links: ::aya_ebpf::cty::c_uint, + loopback_enabled: ::aya_ebpf::cty::c_uint, + downshifted_rate: ::aya_ebpf::cty::c_uint, + is_on_sfp_module: ::aya_ebpf::cty::c_uint, + mac_managed_pm: ::aya_ebpf::cty::c_uint, + wol_enabled: ::aya_ebpf::cty::c_uint, + autoneg: ::aya_ebpf::cty::c_uint, + link: ::aya_ebpf::cty::c_uint, + autoneg_complete: ::aya_ebpf::cty::c_uint, + interrupts: ::aya_ebpf::cty::c_uint, + irq_suspended: ::aya_ebpf::cty::c_uint, + irq_rerun: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 3usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 3usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let port_index_valid: u8 = unsafe { ::core::mem::transmute(port_index_valid) }; - port_index_valid as u64 + let is_c45: u32 = unsafe { ::core::mem::transmute(is_c45) }; + is_c45 as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let controller_valid: u8 = unsafe { ::core::mem::transmute(controller_valid) }; - controller_valid as u64 + let is_internal: u32 = unsafe { ::core::mem::transmute(is_internal) }; + is_internal as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { - let sfnum_valid: u8 = unsafe { ::core::mem::transmute(sfnum_valid) }; - sfnum_valid as u64 + let is_pseudo_fixed_link: u32 = unsafe { ::core::mem::transmute(is_pseudo_fixed_link) }; + is_pseudo_fixed_link as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let is_gigabit_capable: u32 = unsafe { ::core::mem::transmute(is_gigabit_capable) }; + is_gigabit_capable as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let has_fixups: u32 = unsafe { ::core::mem::transmute(has_fixups) }; + has_fixups as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let suspended: u32 = unsafe { ::core::mem::transmute(suspended) }; + suspended as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let suspended_by_mdio_bus: u32 = + unsafe { ::core::mem::transmute(suspended_by_mdio_bus) }; + suspended_by_mdio_bus as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let sysfs_links: u32 = unsafe { ::core::mem::transmute(sysfs_links) }; + sysfs_links as u64 + }); + __bindgen_bitfield_unit.set(8usize, 1u8, { + let loopback_enabled: u32 = unsafe { ::core::mem::transmute(loopback_enabled) }; + loopback_enabled as u64 + }); + __bindgen_bitfield_unit.set(9usize, 1u8, { + let downshifted_rate: u32 = unsafe { ::core::mem::transmute(downshifted_rate) }; + downshifted_rate as u64 + }); + __bindgen_bitfield_unit.set(10usize, 1u8, { + let is_on_sfp_module: u32 = unsafe { ::core::mem::transmute(is_on_sfp_module) }; + is_on_sfp_module as u64 + }); + __bindgen_bitfield_unit.set(11usize, 1u8, { + let mac_managed_pm: u32 = unsafe { ::core::mem::transmute(mac_managed_pm) }; + mac_managed_pm as u64 + }); + __bindgen_bitfield_unit.set(12usize, 1u8, { + let wol_enabled: u32 = unsafe { ::core::mem::transmute(wol_enabled) }; + wol_enabled as u64 + }); + __bindgen_bitfield_unit.set(13usize, 1u8, { + let autoneg: u32 = unsafe { ::core::mem::transmute(autoneg) }; + autoneg as u64 + }); + __bindgen_bitfield_unit.set(14usize, 1u8, { + let link: u32 = unsafe { ::core::mem::transmute(link) }; + link as u64 + }); + __bindgen_bitfield_unit.set(15usize, 1u8, { + let autoneg_complete: u32 = unsafe { ::core::mem::transmute(autoneg_complete) }; + autoneg_complete as u64 + }); + __bindgen_bitfield_unit.set(16usize, 1u8, { + let interrupts: u32 = unsafe { ::core::mem::transmute(interrupts) }; + interrupts as u64 + }); + __bindgen_bitfield_unit.set(17usize, 1u8, { + let irq_suspended: u32 = unsafe { ::core::mem::transmute(irq_suspended) }; + irq_suspended as u64 + }); + __bindgen_bitfield_unit.set(18usize, 1u8, { + let irq_rerun: u32 = unsafe { ::core::mem::transmute(irq_rerun) }; + irq_rerun as u64 }); __bindgen_bitfield_unit } } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct devlink_linecard_ops { - pub provision: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_linecard, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *const ::aya_bpf::cty::c_char, - arg4: *const ::aya_bpf::cty::c_void, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub unprovision: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_linecard, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub same_provision: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_linecard, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *const ::aya_bpf::cty::c_char, - arg4: *const ::aya_bpf::cty::c_void, - ) -> bool_, - >, - pub types_count: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_linecard, - arg2: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_uint, - >, - pub types_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_linecard, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut *const ::aya_bpf::cty::c_char, - arg5: *mut *const ::aya_bpf::cty::c_void, - ), - >, +pub mod netdev_lag_tx_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NETDEV_LAG_TX_TYPE_UNKNOWN: Type = 0; + pub const NETDEV_LAG_TX_TYPE_RANDOM: Type = 1; + pub const NETDEV_LAG_TX_TYPE_BROADCAST: Type = 2; + pub const NETDEV_LAG_TX_TYPE_ROUNDROBIN: Type = 3; + pub const NETDEV_LAG_TX_TYPE_ACTIVEBACKUP: Type = 4; + pub const NETDEV_LAG_TX_TYPE_HASH: Type = 5; +} +pub mod netdev_lag_hash { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NETDEV_LAG_HASH_NONE: Type = 0; + pub const NETDEV_LAG_HASH_L2: Type = 1; + pub const NETDEV_LAG_HASH_L34: Type = 2; + pub const NETDEV_LAG_HASH_L23: Type = 3; + pub const NETDEV_LAG_HASH_E23: Type = 4; + pub const NETDEV_LAG_HASH_E34: Type = 5; + pub const NETDEV_LAG_HASH_VLAN_SRCMAC: Type = 6; + pub const NETDEV_LAG_HASH_UNKNOWN: Type = 7; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_dpipe_field { - pub name: *const ::aya_bpf::cty::c_char, - pub id: ::aya_bpf::cty::c_uint, - pub bitwidth: ::aya_bpf::cty::c_uint, - pub mapping_type: devlink_dpipe_field_mapping_type::Type, +pub struct netdev_lag_upper_info { + pub tx_type: netdev_lag_tx_type::Type, + pub hash_type: netdev_lag_hash::Type, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_dpipe_header { - pub name: *const ::aya_bpf::cty::c_char, - pub id: ::aya_bpf::cty::c_uint, - pub fields: *mut devlink_dpipe_field, - pub fields_count: ::aya_bpf::cty::c_uint, - pub global: bool_, +pub struct netdev_notifier_changeupper_info { + pub info: netdev_notifier_info, + pub upper_dev: *mut net_device, + pub master: bool_, + pub linking: bool_, + pub upper_info: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_dpipe_headers { - pub headers: *mut *mut devlink_dpipe_header, - pub headers_count: ::aya_bpf::cty::c_uint, +pub struct iw_param { + pub value: __s32, + pub fixed: __u8, + pub disabled: __u8, + pub flags: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_flash_update_params { - pub fw: *const firmware, - pub component: *const ::aya_bpf::cty::c_char, - pub overwrite_mask: u32_, +pub struct iw_point { + pub pointer: *mut ::aya_ebpf::cty::c_void, + pub length: __u16, + pub flags: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_trap_policer { - pub id: u32_, - pub init_rate: u64_, - pub init_burst: u64_, - pub max_rate: u64_, - pub min_rate: u64_, - pub max_burst: u64_, - pub min_burst: u64_, +pub struct iw_freq { + pub m: __s32, + pub e: __s16, + pub i: __u8, + pub flags: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_trap_group { - pub name: *const ::aya_bpf::cty::c_char, - pub id: u16_, - pub generic: bool_, - pub init_policer_id: u32_, +pub struct iw_quality { + pub qual: __u8, + pub level: __u8, + pub noise: __u8, + pub updated: __u8, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_trap { - pub type_: devlink_trap_type::Type, - pub init_action: devlink_trap_action::Type, - pub generic: bool_, - pub id: u16_, - pub name: *const ::aya_bpf::cty::c_char, - pub init_group_id: u16_, - pub metadata_cap: u32_, +pub struct iw_discarded { + pub nwid: __u32, + pub code: __u32, + pub fragment: __u32, + pub retries: __u32, + pub misc: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_ops { - pub supported_flash_update_params: u32_, - pub reload_actions: ::aya_bpf::cty::c_ulong, - pub reload_limits: ::aya_bpf::cty::c_ulong, - pub reload_down: ::core::option::Option< +pub struct iw_missed { + pub beacon: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iw_statistics { + pub status: __u16, + pub qual: iw_quality, + pub discard: iw_discarded, + pub miss: iw_missed, +} +#[repr(C)] +pub struct iwreq_data { + pub name: __BindgenUnionField<[::aya_ebpf::cty::c_char; 16usize]>, + pub essid: __BindgenUnionField, + pub nwid: __BindgenUnionField, + pub freq: __BindgenUnionField, + pub sens: __BindgenUnionField, + pub bitrate: __BindgenUnionField, + pub txpower: __BindgenUnionField, + pub rts: __BindgenUnionField, + pub frag: __BindgenUnionField, + pub mode: __BindgenUnionField<__u32>, + pub retry: __BindgenUnionField, + pub encoding: __BindgenUnionField, + pub power: __BindgenUnionField, + pub qual: __BindgenUnionField, + pub ap_addr: __BindgenUnionField, + pub addr: __BindgenUnionField, + pub param: __BindgenUnionField, + pub data: __BindgenUnionField, + pub bindgen_union_field: [u64; 2usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iw_priv_args { + pub cmd: __u32, + pub set_args: __u16, + pub get_args: __u16, + pub name: [::aya_ebpf::cty::c_char; 16usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_match { + pub dissector: *mut flow_dissector, + pub mask: *mut ::aya_ebpf::cty::c_void, + pub key: *mut ::aya_ebpf::cty::c_void, +} +pub mod flow_action_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FLOW_ACTION_ACCEPT: Type = 0; + pub const FLOW_ACTION_DROP: Type = 1; + pub const FLOW_ACTION_TRAP: Type = 2; + pub const FLOW_ACTION_GOTO: Type = 3; + pub const FLOW_ACTION_REDIRECT: Type = 4; + pub const FLOW_ACTION_MIRRED: Type = 5; + pub const FLOW_ACTION_REDIRECT_INGRESS: Type = 6; + pub const FLOW_ACTION_MIRRED_INGRESS: Type = 7; + pub const FLOW_ACTION_VLAN_PUSH: Type = 8; + pub const FLOW_ACTION_VLAN_POP: Type = 9; + pub const FLOW_ACTION_VLAN_MANGLE: Type = 10; + pub const FLOW_ACTION_TUNNEL_ENCAP: Type = 11; + pub const FLOW_ACTION_TUNNEL_DECAP: Type = 12; + pub const FLOW_ACTION_MANGLE: Type = 13; + pub const FLOW_ACTION_ADD: Type = 14; + pub const FLOW_ACTION_CSUM: Type = 15; + pub const FLOW_ACTION_MARK: Type = 16; + pub const FLOW_ACTION_PTYPE: Type = 17; + pub const FLOW_ACTION_PRIORITY: Type = 18; + pub const FLOW_ACTION_RX_QUEUE_MAPPING: Type = 19; + pub const FLOW_ACTION_WAKE: Type = 20; + pub const FLOW_ACTION_QUEUE: Type = 21; + pub const FLOW_ACTION_SAMPLE: Type = 22; + pub const FLOW_ACTION_POLICE: Type = 23; + pub const FLOW_ACTION_CT: Type = 24; + pub const FLOW_ACTION_CT_METADATA: Type = 25; + pub const FLOW_ACTION_MPLS_PUSH: Type = 26; + pub const FLOW_ACTION_MPLS_POP: Type = 27; + pub const FLOW_ACTION_MPLS_MANGLE: Type = 28; + pub const FLOW_ACTION_GATE: Type = 29; + pub const FLOW_ACTION_PPPOE_PUSH: Type = 30; + pub const FLOW_ACTION_JUMP: Type = 31; + pub const FLOW_ACTION_PIPE: Type = 32; + pub const FLOW_ACTION_VLAN_PUSH_ETH: Type = 33; + pub const FLOW_ACTION_VLAN_POP_ETH: Type = 34; + pub const FLOW_ACTION_CONTINUE: Type = 35; + pub const NUM_FLOW_ACTIONS: Type = 36; +} +pub mod flow_action_hw_stats { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FLOW_ACTION_HW_STATS_IMMEDIATE: Type = 1; + pub const FLOW_ACTION_HW_STATS_DELAYED: Type = 2; + pub const FLOW_ACTION_HW_STATS_ANY: Type = 3; + pub const FLOW_ACTION_HW_STATS_DISABLED: Type = 4; + pub const FLOW_ACTION_HW_STATS_DONT_CARE: Type = 7; +} +pub type action_destr = + ::core::option::Option; +pub mod flow_action_mangle_base { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FLOW_ACT_MANGLE_UNSPEC: Type = 0; + pub const FLOW_ACT_MANGLE_HDR_TYPE_ETH: Type = 1; + pub const FLOW_ACT_MANGLE_HDR_TYPE_IP4: Type = 2; + pub const FLOW_ACT_MANGLE_HDR_TYPE_IP6: Type = 3; + pub const FLOW_ACT_MANGLE_HDR_TYPE_TCP: Type = 4; + pub const FLOW_ACT_MANGLE_HDR_TYPE_UDP: Type = 5; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_flowtable { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct flow_action_entry { + pub id: flow_action_id::Type, + pub hw_index: u32_, + pub cookie: ::aya_ebpf::cty::c_ulong, + pub miss_cookie: u64_, + pub hw_stats: flow_action_hw_stats::Type, + pub destructor: action_destr, + pub destructor_priv: *mut ::aya_ebpf::cty::c_void, + pub __bindgen_anon_1: flow_action_entry__bindgen_ty_1, + pub user_cookie: *mut flow_action_cookie, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union flow_action_entry__bindgen_ty_1 { + pub chain_index: u32_, + pub dev: *mut net_device, + pub vlan: flow_action_entry__bindgen_ty_1__bindgen_ty_1, + pub vlan_push_eth: flow_action_entry__bindgen_ty_1__bindgen_ty_2, + pub mangle: flow_action_entry__bindgen_ty_1__bindgen_ty_3, + pub tunnel: *mut ip_tunnel_info, + pub csum_flags: u32_, + pub mark: u32_, + pub ptype: u16_, + pub rx_queue: u16_, + pub priority: u32_, + pub queue: flow_action_entry__bindgen_ty_1__bindgen_ty_4, + pub sample: flow_action_entry__bindgen_ty_1__bindgen_ty_5, + pub police: flow_action_entry__bindgen_ty_1__bindgen_ty_6, + pub ct: flow_action_entry__bindgen_ty_1__bindgen_ty_7, + pub ct_metadata: flow_action_entry__bindgen_ty_1__bindgen_ty_8, + pub mpls_push: flow_action_entry__bindgen_ty_1__bindgen_ty_9, + pub mpls_pop: flow_action_entry__bindgen_ty_1__bindgen_ty_10, + pub mpls_mangle: flow_action_entry__bindgen_ty_1__bindgen_ty_11, + pub gate: flow_action_entry__bindgen_ty_1__bindgen_ty_12, + pub pppoe: flow_action_entry__bindgen_ty_1__bindgen_ty_13, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_1 { + pub vid: u16_, + pub proto: __be16, + pub prio: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_2 { + pub dst: [::aya_ebpf::cty::c_uchar; 6usize], + pub src: [::aya_ebpf::cty::c_uchar; 6usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_3 { + pub htype: flow_action_mangle_base::Type, + pub offset: u32_, + pub mask: u32_, + pub val: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_4 { + pub ctx: u32_, + pub index: u32_, + pub vf: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_5 { + pub psample_group: *mut psample_group, + pub rate: u32_, + pub trunc_size: u32_, + pub truncate: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_6 { + pub burst: u32_, + pub rate_bytes_ps: u64_, + pub peakrate_bytes_ps: u64_, + pub avrate: u32_, + pub overhead: u16_, + pub burst_pkt: u64_, + pub rate_pkt_ps: u64_, + pub mtu: u32_, + pub exceed: flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_1, + pub notexceed: flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_2, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_1 { + pub act_id: flow_action_id::Type, + pub extval: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_6__bindgen_ty_2 { + pub act_id: flow_action_id::Type, + pub extval: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_7 { + pub action: ::aya_ebpf::cty::c_int, + pub zone: u16_, + pub flow_table: *mut nf_flowtable, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_8 { + pub cookie: ::aya_ebpf::cty::c_ulong, + pub mark: u32_, + pub labels: [u32_; 4usize], + pub orig_dir: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_9 { + pub label: u32_, + pub proto: __be16, + pub tc: u8_, + pub bos: u8_, + pub ttl: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_10 { + pub proto: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_11 { + pub label: u32_, + pub tc: u8_, + pub bos: u8_, + pub ttl: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_12 { + pub prio: s32, + pub basetime: u64_, + pub cycletime: u64_, + pub cycletimeext: u64_, + pub num_entries: u32_, + pub entries: *mut action_gate_entry, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct flow_action_entry__bindgen_ty_1__bindgen_ty_13 { + pub sid: u16_, +} +#[repr(C)] +pub struct flow_action { + pub num_entries: ::aya_ebpf::cty::c_uint, + pub entries: __IncompleteArrayField, +} +#[repr(C)] +pub struct flow_rule { + pub match_: flow_match, + pub action: flow_action, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phy_plca_cfg { + pub version: ::aya_ebpf::cty::c_int, + pub enabled: ::aya_ebpf::cty::c_int, + pub node_id: ::aya_ebpf::cty::c_int, + pub node_cnt: ::aya_ebpf::cty::c_int, + pub to_tmr: ::aya_ebpf::cty::c_int, + pub burst_cnt: ::aya_ebpf::cty::c_int, + pub burst_tmr: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phy_plca_status { + pub pst: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phy_tdr_config { + pub first: u32_, + pub last: u32_, + pub step: u32_, + pub pair: s8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mdio_bus_stats { + pub transfers: u64_stats_t, + pub errors: u64_stats_t, + pub writes: u64_stats_t, + pub reads: u64_stats_t, + pub syncp: u64_stats_sync, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mii_bus { + pub owner: *mut module, + pub name: *const ::aya_ebpf::cty::c_char, + pub id: [::aya_ebpf::cty::c_char; 61usize], + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub read: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: bool_, - arg3: devlink_reload_action::Type, - arg4: devlink_reload_limit::Type, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_bus, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub reload_up: ::core::option::Option< + pub write: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: devlink_reload_action::Type, - arg3: devlink_reload_limit::Type, - arg4: *mut u32_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_bus, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_type_set: ::core::option::Option< + pub read_c45: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: devlink_port_type::Type, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_bus, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_split: ::core::option::Option< + pub write_c45: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *mut devlink_port, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_bus, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + arg5: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_unsplit: ::core::option::Option< + pub reset: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub stats: [mdio_bus_stats; 32usize], + pub mdio_lock: mutex, + pub parent: *mut device, + pub state: mii_bus__bindgen_ty_1::Type, + pub dev: device, + pub mdio_map: [*mut mdio_device; 32usize], + pub phy_mask: u32_, + pub phy_ignore_ta_mask: u32_, + pub irq: [::aya_ebpf::cty::c_int; 32usize], + pub reset_delay_us: ::aya_ebpf::cty::c_int, + pub reset_post_delay_us: ::aya_ebpf::cty::c_int, + pub reset_gpiod: *mut gpio_desc, + pub shared_lock: mutex, + pub shared: [*mut phy_package_shared; 32usize], +} +pub mod mii_bus__bindgen_ty_1 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const MDIOBUS_ALLOCATED: Type = 1; + pub const MDIOBUS_REGISTERED: Type = 2; + pub const MDIOBUS_UNREGISTERED: Type = 3; + pub const MDIOBUS_RELEASED: Type = 4; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mdio_driver_common { + pub driver: device_driver, + pub flags: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mii_timestamper { + pub rxtstamp: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *mut devlink_port, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_timestamper, + arg2: *mut sk_buff, + arg3: ::aya_ebpf::cty::c_int, + ) -> bool_, >, - pub sb_pool_get: ::core::option::Option< + pub txtstamp: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: *mut devlink_sb_pool_info, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_timestamper, + arg2: *mut sk_buff, + arg3: ::aya_ebpf::cty::c_int, + ), >, - pub sb_pool_set: ::core::option::Option< + pub hwtstamp: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: u32_, - arg5: devlink_sb_threshold_type::Type, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_timestamper, + arg2: *mut kernel_hwtstamp_config, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub sb_port_pool_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: *mut u32_, - ) -> ::aya_bpf::cty::c_int, + pub link_state: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut mii_timestamper, arg2: *mut phy_device), >, - pub sb_port_pool_set: ::core::option::Option< + pub ts_info: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: u32_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut mii_timestamper, + arg2: *mut ethtool_ts_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub sb_tc_pool_bind_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: devlink_sb_pool_type::Type, - arg5: *mut u16_, - arg6: *mut u32_, - ) -> ::aya_bpf::cty::c_int, + pub device: *mut device, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phy_package_shared { + pub base_addr: u8_, + pub refcnt: refcount_t, + pub flags: ::aya_ebpf::cty::c_ulong, + pub priv_size: usize, + pub priv_: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct phy_driver { + pub mdiodrv: mdio_driver_common, + pub phy_id: u32_, + pub name: *mut ::aya_ebpf::cty::c_char, + pub phy_id_mask: u32_, + pub features: *const ::aya_ebpf::cty::c_ulong, + pub flags: u32_, + pub driver_data: *const ::aya_ebpf::cty::c_void, + pub soft_reset: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub sb_tc_pool_bind_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: devlink_sb_pool_type::Type, - arg5: u16_, - arg6: u32_, - arg7: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub config_init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub sb_occ_snapshot: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + pub probe: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub sb_occ_max_clear: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + pub get_features: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub sb_occ_port_pool_get: ::core::option::Option< + pub get_rate_matching: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: *mut u32_, - arg5: *mut u32_, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: phy_interface_t::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub sb_occ_tc_port_bind_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: ::aya_bpf::cty::c_uint, - arg3: u16_, - arg4: devlink_sb_pool_type::Type, - arg5: *mut u32_, - arg6: *mut u32_, - ) -> ::aya_bpf::cty::c_int, + pub suspend: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub eswitch_mode_get: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut devlink, arg2: *mut u16_) -> ::aya_bpf::cty::c_int, + pub resume: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub eswitch_mode_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: u16_, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub config_aneg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub eswitch_inline_mode_get: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut devlink, arg2: *mut u8_) -> ::aya_bpf::cty::c_int, - >, - pub eswitch_inline_mode_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: u8_, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub eswitch_encap_mode_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *mut devlink_eswitch_encap_mode::Type, - ) -> ::aya_bpf::cty::c_int, - >, - pub eswitch_encap_mode_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: devlink_eswitch_encap_mode::Type, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub info_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *mut devlink_info_req, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub flash_update: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *mut devlink_flash_update_params, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub trap_init: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, - >, - pub trap_fini: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap, - arg3: *mut ::aya_bpf::cty::c_void, - ), - >, - pub trap_action_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap, - arg3: devlink_trap_action::Type, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub trap_group_init: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap_group, - ) -> ::aya_bpf::cty::c_int, - >, - pub trap_group_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap_group, - arg3: *const devlink_trap_policer, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub trap_group_action_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap_group, - arg3: devlink_trap_action::Type, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub aneg_done: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub trap_drop_counter_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap, - arg3: *mut u64_, - ) -> ::aya_bpf::cty::c_int, + pub read_status: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub trap_policer_init: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap_policer, - ) -> ::aya_bpf::cty::c_int, + pub config_intr: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub trap_policer_fini: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut devlink, arg2: *const devlink_trap_policer), + pub handle_interrupt: + ::core::option::Option irqreturn_t>, + pub remove: ::core::option::Option, + pub match_phy_device: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub trap_policer_set: ::core::option::Option< + pub set_wol: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap_policer, - arg3: u64_, - arg4: u64_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut ethtool_wolinfo, + ) -> ::aya_ebpf::cty::c_int, >, - pub trap_policer_counter_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_trap_policer, - arg3: *mut u64_, - ) -> ::aya_bpf::cty::c_int, + pub get_wol: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut ethtool_wolinfo), >, - pub port_function_hw_addr_get: ::core::option::Option< + pub link_change_notify: ::core::option::Option, + pub read_mmd: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: *mut u8_, - arg3: *mut ::aya_bpf::cty::c_int, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_function_hw_addr_set: ::core::option::Option< + pub write_mmd: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: *const u8_, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: u16_, + arg4: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_fn_roce_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: *mut bool_, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub read_page: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub port_fn_roce_set: ::core::option::Option< + pub write_page: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: bool_, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_fn_migratable_get: ::core::option::Option< + pub module_info: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: *mut bool_, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut ethtool_modinfo, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_fn_migratable_set: ::core::option::Option< + pub module_eeprom: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: bool_, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_new: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink, - arg2: *const devlink_port_new_attrs, - arg3: *mut netlink_ext_ack, - arg4: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + pub cable_test_start: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub port_del: ::core::option::Option< + pub cable_test_tdr_start: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *const phy_tdr_config, + ) -> ::aya_ebpf::cty::c_int, >, - pub port_fn_state_get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: *mut devlink_port_fn_state::Type, - arg3: *mut devlink_port_fn_opstate::Type, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub cable_test_get_status: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut bool_) -> ::aya_ebpf::cty::c_int, >, - pub port_fn_state_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_port, - arg2: devlink_port_fn_state::Type, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub get_sset_count: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub rate_leaf_tx_share_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u64_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub get_strings: + ::core::option::Option, + pub get_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device, arg2: *mut ethtool_stats, arg3: *mut u64_), >, - pub rate_leaf_tx_max_set: ::core::option::Option< + pub get_tunable: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u64_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut ethtool_tunable, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_leaf_tx_priority_set: ::core::option::Option< + pub set_tunable: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u32_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut ethtool_tunable, + arg3: *const ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_leaf_tx_weight_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u32_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub set_loopback: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device, arg2: bool_) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_tx_share_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u64_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub get_sqi: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_tx_max_set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u64_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + pub get_sqi_max: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phy_device) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_tx_priority_set: ::core::option::Option< + pub get_plca_cfg: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u32_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut phy_plca_cfg, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_tx_weight_set: ::core::option::Option< + pub set_plca_cfg: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u32_, - arg4: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *const phy_plca_cfg, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_new: ::core::option::Option< + pub get_plca_status: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut *mut ::aya_bpf::cty::c_void, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: *mut phy_plca_status, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_del: ::core::option::Option< + pub led_brightness_set: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: u8_, + arg3: led_brightness::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_leaf_parent_set: ::core::option::Option< + pub led_blink_set: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut devlink_rate, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: *mut ::aya_bpf::cty::c_void, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: u8_, + arg3: *mut ::aya_ebpf::cty::c_ulong, + arg4: *mut ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub rate_node_parent_set: ::core::option::Option< + pub led_hw_is_supported: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink_rate, - arg2: *mut devlink_rate, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: *mut ::aya_bpf::cty::c_void, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phy_device, + arg2: u8_, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub selftest_check: ::core::option::Option< + pub led_hw_control_set: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - arg3: *mut netlink_ext_ack, - ) -> bool_, + arg1: *mut phy_device, + arg2: u8_, + arg3: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, - pub selftest_run: ::core::option::Option< + pub led_hw_control_get: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut devlink, - arg2: ::aya_bpf::cty::c_uint, - arg3: *mut netlink_ext_ack, - ) -> devlink_selftest_status::Type, + arg1: *mut phy_device, + arg2: u8_, + arg3: *mut ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct devlink_linecard_type { - pub type_: *const ::aya_bpf::cty::c_char, - pub priv_: *const ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct merkle_tree_params { - pub hash_alg: *mut fsverity_hash_alg, - pub hashstate: *const u8_, - pub digest_size: ::aya_bpf::cty::c_uint, - pub block_size: ::aya_bpf::cty::c_uint, - pub hashes_per_block: ::aya_bpf::cty::c_uint, - pub blocks_per_page: ::aya_bpf::cty::c_uint, - pub log_digestsize: u8_, - pub log_blocksize: u8_, - pub log_arity: u8_, - pub log_blocks_per_page: u8_, - pub num_levels: ::aya_bpf::cty::c_uint, - pub tree_size: u64_, - pub tree_pages: ::aya_bpf::cty::c_ulong, - pub level_start: [::aya_bpf::cty::c_ulong; 8usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fsverity_info { - pub tree_params: merkle_tree_params, - pub root_hash: [u8_; 64usize], - pub file_digest: [u8_; 64usize], - pub inode: *const inode, - pub hash_block_verified: *mut ::aya_bpf::cty::c_ulong, - pub hash_page_init_lock: spinlock_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fsverity_hash_alg { - pub tfm: *mut crypto_shash, - pub name: *const ::aya_bpf::cty::c_char, - pub digest_size: ::aya_bpf::cty::c_uint, - pub block_size: ::aya_bpf::cty::c_uint, - pub algo_id: hash_algo::Type, +pub struct dsa_chip_data { + pub host_dev: *mut device, + pub sw_addr: ::aya_ebpf::cty::c_int, + pub netdev: [*mut device; 12usize], + pub eeprom_len: ::aya_ebpf::cty::c_int, + pub of_node: *mut device_node, + pub port_names: [*mut ::aya_ebpf::cty::c_char; 12usize], + pub port_dn: [*mut device_node; 12usize], + pub rtable: [s8; 4usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct gpio_desc { - pub gdev: *mut gpio_device, - pub flags: ::aya_bpf::cty::c_ulong, - pub label: *const ::aya_bpf::cty::c_char, - pub name: *const ::aya_bpf::cty::c_char, - pub debounce_period_us: ::aya_bpf::cty::c_uint, +pub struct dsa_platform_data { + pub netdev: *mut device, + pub of_netdev: *mut net_device, + pub nr_chips: ::aya_ebpf::cty::c_int, + pub chip: *mut dsa_chip_data, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cdrom_device_info { - pub ops: *const cdrom_device_ops, - pub list: list_head, - pub disk: *mut gendisk, - pub handle: *mut ::aya_bpf::cty::c_void, - pub mask: ::aya_bpf::cty::c_int, - pub speed: ::aya_bpf::cty::c_int, - pub capacity: ::aya_bpf::cty::c_int, - pub _bitfield_align_1: [u32; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, - pub vfs_events: ::aya_bpf::cty::c_uint, - pub ioctl_events: ::aya_bpf::cty::c_uint, - pub use_count: ::aya_bpf::cty::c_int, - pub name: [::aya_bpf::cty::c_char; 20usize], - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, - pub cdda_method: ::aya_bpf::cty::c_int, - pub last_sense: __u8, - pub media_written: __u8, - pub mmc3_profile: ::aya_bpf::cty::c_ushort, - pub for_data: ::aya_bpf::cty::c_int, - pub exit: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cdrom_device_info) -> ::aya_bpf::cty::c_int, - >, - pub mrw_mode_page: ::aya_bpf::cty::c_int, - pub last_media_change_ms: __s64, +pub struct phylink_link_state { + pub advertising: [::aya_ebpf::cty::c_ulong; 2usize], + pub lp_advertising: [::aya_ebpf::cty::c_ulong; 2usize], + pub interface: phy_interface_t::Type, + pub speed: ::aya_ebpf::cty::c_int, + pub duplex: ::aya_ebpf::cty::c_int, + pub pause: ::aya_ebpf::cty::c_int, + pub rate_matching: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 3usize], } -impl cdrom_device_info { +impl phylink_link_state { #[inline] - pub fn options(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 30u8) as u32) } + pub fn link(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_options(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_link(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 30u8, val as u64) + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn mc_flags(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(30usize, 2u8) as u32) } + pub fn an_complete(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_mc_flags(&mut self, val: ::aya_bpf::cty::c_uint) { + pub fn set_an_complete(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(30usize, 2u8, val as u64) + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - options: ::aya_bpf::cty::c_uint, - mc_flags: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 4usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 30u8, { - let options: u32 = unsafe { ::core::mem::transmute(options) }; - options as u64 - }); - __bindgen_bitfield_unit.set(30usize, 2u8, { - let mc_flags: u32 = unsafe { ::core::mem::transmute(mc_flags) }; - mc_flags as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn sanyo_slot(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 2u8) as u8) } - } - #[inline] - pub fn set_sanyo_slot(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(0usize, 2u8, val as u64) - } - } - #[inline] - pub fn keeplocked(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_keeplocked(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn reserved(&self) -> __u8 { - unsafe { ::core::mem::transmute(self._bitfield_2.get(3usize, 5u8) as u8) } - } - #[inline] - pub fn set_reserved(&mut self, val: __u8) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(3usize, 5u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_2( - sanyo_slot: __u8, - keeplocked: __u8, - reserved: __u8, + link: ::aya_ebpf::cty::c_uint, + an_complete: ::aya_ebpf::cty::c_uint, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 2u8, { - let sanyo_slot: u8 = unsafe { ::core::mem::transmute(sanyo_slot) }; - sanyo_slot as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let keeplocked: u8 = unsafe { ::core::mem::transmute(keeplocked) }; - keeplocked as u64 + __bindgen_bitfield_unit.set(0usize, 1u8, { + let link: u32 = unsafe { ::core::mem::transmute(link) }; + link as u64 }); - __bindgen_bitfield_unit.set(3usize, 5u8, { - let reserved: u8 = unsafe { ::core::mem::transmute(reserved) }; - reserved as u64 + __bindgen_bitfield_unit.set(1usize, 1u8, { + let an_complete: u32 = unsafe { ::core::mem::transmute(an_complete) }; + an_complete as u64 }); __bindgen_bitfield_unit } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cdrom_msf0 { - pub minute: __u8, - pub second: __u8, - pub frame: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union cdrom_addr { - pub msf: cdrom_msf0, - pub lba: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cdrom_multisession { - pub addr: cdrom_addr, - pub xa_flag: __u8, - pub addr_format: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cdrom_mcn { - pub medium_catalog_number: [__u8; 14usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct packet_command { - pub cmd: [::aya_bpf::cty::c_uchar; 12usize], - pub buffer: *mut ::aya_bpf::cty::c_uchar, - pub buflen: ::aya_bpf::cty::c_uint, - pub stat: ::aya_bpf::cty::c_int, - pub sshdr: *mut scsi_sense_hdr, - pub data_direction: ::aya_bpf::cty::c_uchar, - pub quiet: ::aya_bpf::cty::c_int, - pub timeout: ::aya_bpf::cty::c_int, - pub reserved: [*mut ::aya_bpf::cty::c_void; 1usize], +pub struct phylink_pcs { + pub ops: *const phylink_pcs_ops, + pub phylink: *mut phylink, + pub neg_mode: bool_, + pub poll: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cdrom_device_ops { - pub open: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub release: ::core::option::Option, - pub drive_status: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub check_events: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_uint, - >, - pub tray_move: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub lock_door: ::core::option::Option< +pub struct phylink_pcs_ops { + pub pcs_validate: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phylink_pcs, + arg2: *mut ::aya_ebpf::cty::c_ulong, + arg3: *const phylink_link_state, + ) -> ::aya_ebpf::cty::c_int, >, - pub select_speed: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + pub pcs_enable: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phylink_pcs) -> ::aya_ebpf::cty::c_int, >, - pub get_last_session: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: *mut cdrom_multisession, - ) -> ::aya_bpf::cty::c_int, + pub pcs_disable: ::core::option::Option, + pub pcs_pre_config: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phylink_pcs, arg2: phy_interface_t::Type), >, - pub get_mcn: ::core::option::Option< + pub pcs_post_config: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: *mut cdrom_mcn, - ) -> ::aya_bpf::cty::c_int, - >, - pub reset: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cdrom_device_info) -> ::aya_bpf::cty::c_int, + arg1: *mut phylink_pcs, + arg2: phy_interface_t::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub audio_ioctl: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: ::aya_bpf::cty::c_uint, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, + pub pcs_get_state: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut phylink_pcs, arg2: *mut phylink_link_state), >, - pub generic_packet: ::core::option::Option< + pub pcs_config: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: *mut packet_command, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phylink_pcs, + arg2: ::aya_ebpf::cty::c_uint, + arg3: phy_interface_t::Type, + arg4: *const ::aya_ebpf::cty::c_ulong, + arg5: bool_, + ) -> ::aya_ebpf::cty::c_int, >, - pub read_cdda_bpc: ::core::option::Option< + pub pcs_an_restart: ::core::option::Option, + pub pcs_link_up: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut cdrom_device_info, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: u32_, - arg4: u32_, - arg5: *mut u8_, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut phylink_pcs, + arg2: ::aya_ebpf::cty::c_uint, + arg3: phy_interface_t::Type, + arg4: ::aya_ebpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_int, + ), >, - pub capability: ::aya_bpf::cty::c_int, } -pub mod tca_id { - pub type Type = ::aya_bpf::cty::c_uint; - pub const TCA_ID_UNSPEC: Type = 0; - pub const TCA_ID_POLICE: Type = 1; - pub const TCA_ID_GACT: Type = 5; - pub const TCA_ID_IPT: Type = 6; - pub const TCA_ID_PEDIT: Type = 7; - pub const TCA_ID_MIRRED: Type = 8; - pub const TCA_ID_NAT: Type = 9; - pub const TCA_ID_XT: Type = 10; - pub const TCA_ID_SKBEDIT: Type = 11; - pub const TCA_ID_VLAN: Type = 12; - pub const TCA_ID_BPF: Type = 13; - pub const TCA_ID_CONNMARK: Type = 14; - pub const TCA_ID_SKBMOD: Type = 15; - pub const TCA_ID_CSUM: Type = 16; - pub const TCA_ID_TUNNEL_KEY: Type = 17; - pub const TCA_ID_SIMP: Type = 22; - pub const TCA_ID_IFE: Type = 25; - pub const TCA_ID_SAMPLE: Type = 26; - pub const TCA_ID_CTINFO: Type = 27; - pub const TCA_ID_MPLS: Type = 28; - pub const TCA_ID_CT: Type = 29; - pub const TCA_ID_GATE: Type = 30; - pub const __TCA_ID_MAX: Type = 255; +#[repr(C)] +#[derive(Debug)] +pub struct flow_action_cookie { + pub cookie_len: u32_, + pub cookie: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcf_t { - pub install: __u64, - pub lastuse: __u64, - pub expires: __u64, - pub firstuse: __u64, +pub struct flow_stats { + pub pkts: u64_, + pub bytes: u64_, + pub drops: u64_, + pub lastused: u64_, + pub used_hw_stats: flow_action_hw_stats::Type, + pub used_hw_stats_valid: bool_, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct qdisc_walker { - pub stop: ::aya_bpf::cty::c_int, - pub skip: ::aya_bpf::cty::c_int, - pub count: ::aya_bpf::cty::c_int, - pub fn_: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut Qdisc, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut qdisc_walker, - ) -> ::aya_bpf::cty::c_int, - >, +pub mod flow_cls_command { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FLOW_CLS_REPLACE: Type = 0; + pub const FLOW_CLS_DESTROY: Type = 1; + pub const FLOW_CLS_STATS: Type = 2; + pub const FLOW_CLS_TMPLT_CREATE: Type = 3; + pub const FLOW_CLS_TMPLT_DESTROY: Type = 4; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcf_walker { - pub stop: ::aya_bpf::cty::c_int, - pub skip: ::aya_bpf::cty::c_int, - pub count: ::aya_bpf::cty::c_int, - pub nonempty: bool_, - pub cookie: ::aya_bpf::cty::c_ulong, - pub fn_: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tcf_proto, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut tcf_walker, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct flow_cls_common_offload { + pub chain_index: u32_, + pub protocol: __be16, + pub prio: u32_, + pub extack: *mut netlink_ext_ack, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcf_exts { - pub type_: __u32, - pub nr_actions: ::aya_bpf::cty::c_int, - pub actions: *mut *mut tc_action, - pub net: *mut net, - pub ns_tracker: netns_tracker, - pub miss_cookie_node: *mut tcf_exts_miss_cookie_node, - pub action: ::aya_bpf::cty::c_int, - pub police: ::aya_bpf::cty::c_int, +pub struct flow_cls_offload { + pub common: flow_cls_common_offload, + pub command: flow_cls_command::Type, + pub use_act_stats: bool_, + pub cookie: ::aya_ebpf::cty::c_ulong, + pub rule: *mut flow_rule, + pub stats: flow_stats, + pub classid: u32_, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct tcf_idrinfo { - pub lock: mutex, - pub action_idr: idr, - pub net: *mut net, +pub mod devlink_param_cmode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_PARAM_CMODE_RUNTIME: Type = 0; + pub const DEVLINK_PARAM_CMODE_DRIVERINIT: Type = 1; + pub const DEVLINK_PARAM_CMODE_PERMANENT: Type = 2; + pub const __DEVLINK_PARAM_CMODE_MAX: Type = 3; + pub const DEVLINK_PARAM_CMODE_MAX: Type = 2; } #[repr(C)] #[derive(Copy, Clone)] -pub struct tc_action { - pub ops: *const tc_action_ops, - pub type_: __u32, - pub idrinfo: *mut tcf_idrinfo, - pub tcfa_index: u32_, - pub tcfa_refcnt: refcount_t, - pub tcfa_bindcnt: atomic_t, - pub tcfa_action: ::aya_bpf::cty::c_int, - pub tcfa_tm: tcf_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, - pub tcfa_bstats: gnet_stats_basic_sync, - pub tcfa_bstats_hw: gnet_stats_basic_sync, - pub tcfa_qstats: gnet_stats_queue, - pub tcfa_rate_est: *mut net_rate_estimator, - pub tcfa_lock: spinlock_t, - pub cpu_bstats: *mut gnet_stats_basic_sync, - pub cpu_bstats_hw: *mut gnet_stats_basic_sync, - pub cpu_qstats: *mut gnet_stats_queue, - pub user_cookie: *mut tc_cookie, - pub goto_chain: *mut tcf_chain, - pub tcfa_flags: u32_, - pub hw_stats: u8_, - pub used_hw_stats: u8_, - pub used_hw_stats_valid: bool_, - pub in_hw_count: u32_, -} -impl tc_action { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } +pub union devlink_param_value { + pub vu8: u8_, + pub vu16: u16_, + pub vu32: u32_, + pub vstr: [::aya_ebpf::cty::c_char; 32usize], + pub vbool: bool_, } -pub type tc_action_priv_destructor = - ::core::option::Option; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tc_action_ops { - pub head: list_head, - pub kind: [::aya_bpf::cty::c_char; 16usize], - pub id: tca_id::Type, - pub net_id: ::aya_bpf::cty::c_uint, - pub size: usize, - pub owner: *mut module, - pub act: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *const tc_action, - arg3: *mut tcf_result, - ) -> ::aya_bpf::cty::c_int, - >, - pub dump: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut tc_action, - arg3: ::aya_bpf::cty::c_int, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub cleanup: ::core::option::Option, - pub lookup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut *mut tc_action, - arg3: u32_, - ) -> ::aya_bpf::cty::c_int, - >, - pub init: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut nlattr, - arg3: *mut nlattr, - arg4: *mut *mut tc_action, - arg5: *mut tcf_proto, - arg6: u32_, - arg7: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub walk: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut net, - arg2: *mut sk_buff, - arg3: *mut netlink_callback, - arg4: ::aya_bpf::cty::c_int, - arg5: *const tc_action_ops, - arg6: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, - pub stats_update: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tc_action, - arg2: u64_, - arg3: u64_, - arg4: u64_, - arg5: u64_, - arg6: bool_, - ), - >, - pub get_fill_size: - ::core::option::Option usize>, - pub get_dev: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const tc_action, - arg2: *mut tc_action_priv_destructor, - ) -> *mut net_device, - >, - pub get_psample_group: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const tc_action, - arg2: *mut tc_action_priv_destructor, - ) -> *mut psample_group, - >, - pub offload_act_setup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut tc_action, - arg2: *mut ::aya_bpf::cty::c_void, - arg3: *mut u32_, - arg4: bool_, - arg5: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, +#[derive(Copy, Clone)] +pub struct devlink_param_gset_ctx { + pub val: devlink_param_value, + pub cmode: devlink_param_cmode::Type, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tc_cookie { - pub data: *mut u8_, - pub len: u32_, - pub rcu: callback_head, -} -pub mod ethtool_podl_pse_admin_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN: Type = 1; - pub const ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED: Type = 2; - pub const ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED: Type = 3; -} -pub mod ethtool_podl_pse_pw_d_status { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN: Type = 1; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED: Type = 2; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING: Type = 3; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING: Type = 4; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP: Type = 5; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE: Type = 6; - pub const ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR: Type = 7; +pub struct switchdev_mst_state { + pub msti: u16_, + pub state: u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pse_control_config { - pub admin_cotrol: ethtool_podl_pse_admin_state::Type, +pub struct switchdev_brport_flags { + pub val: ::aya_ebpf::cty::c_ulong, + pub mask: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pse_control_status { - pub podl_admin_state: ethtool_podl_pse_admin_state::Type, - pub podl_pw_status: ethtool_podl_pse_pw_d_status::Type, -} -pub type irq_write_msi_msg_t = - ::core::option::Option; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct platform_msi_priv_data { - pub dev: *mut device, - pub host_data: *mut ::aya_bpf::cty::c_void, - pub arg: msi_alloc_info_t, - pub write_msg: irq_write_msi_msg_t, - pub devid: ::aya_bpf::cty::c_int, +pub struct switchdev_vlan_msti { + pub vid: u16_, + pub msti: u16_, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __kernel_sockaddr_storage { - pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1, +pub mod switchdev_obj_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const SWITCHDEV_OBJ_ID_UNDEFINED: Type = 0; + pub const SWITCHDEV_OBJ_ID_PORT_VLAN: Type = 1; + pub const SWITCHDEV_OBJ_ID_PORT_MDB: Type = 2; + pub const SWITCHDEV_OBJ_ID_HOST_MDB: Type = 3; + pub const SWITCHDEV_OBJ_ID_MRP: Type = 4; + pub const SWITCHDEV_OBJ_ID_RING_TEST_MRP: Type = 5; + pub const SWITCHDEV_OBJ_ID_RING_ROLE_MRP: Type = 6; + pub const SWITCHDEV_OBJ_ID_RING_STATE_MRP: Type = 7; + pub const SWITCHDEV_OBJ_ID_IN_TEST_MRP: Type = 8; + pub const SWITCHDEV_OBJ_ID_IN_ROLE_MRP: Type = 9; + pub const SWITCHDEV_OBJ_ID_IN_STATE_MRP: Type = 10; } #[repr(C)] -#[derive(Copy, Clone)] -pub union __kernel_sockaddr_storage__bindgen_ty_1 { - pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1, - pub __align: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct switchdev_obj { + pub list: list_head, + pub orig_dev: *mut net_device, + pub id: switchdev_obj_id::Type, + pub flags: u32_, + pub complete_priv: *mut ::aya_ebpf::cty::c_void, + pub complete: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net_device, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ::aya_ebpf::cty::c_void, + ), + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1 { - pub ss_family: __kernel_sa_family_t, - pub __data: [::aya_bpf::cty::c_char; 126usize], +pub struct switchdev_obj_port_vlan { + pub obj: switchdev_obj, + pub flags: u16_, + pub vid: u16_, + pub changed: bool_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ip_mc_list { - pub interface: *mut in_device, - pub multiaddr: __be32, - pub sfmode: ::aya_bpf::cty::c_uint, - pub sources: *mut ip_sf_list, - pub tomb: *mut ip_sf_list, - pub sfcount: [::aya_bpf::cty::c_ulong; 2usize], - pub __bindgen_anon_1: ip_mc_list__bindgen_ty_1, - pub next_hash: *mut ip_mc_list, - pub timer: timer_list, - pub users: ::aya_bpf::cty::c_int, - pub refcnt: refcount_t, - pub lock: spinlock_t, - pub tm_running: ::aya_bpf::cty::c_char, - pub reporter: ::aya_bpf::cty::c_char, - pub unsolicit_count: ::aya_bpf::cty::c_char, - pub loaded: ::aya_bpf::cty::c_char, - pub gsquery: ::aya_bpf::cty::c_uchar, - pub crcount: ::aya_bpf::cty::c_uchar, - pub rcu: callback_head, +#[derive(Debug, Copy, Clone)] +pub struct switchdev_obj_port_mdb { + pub obj: switchdev_obj, + pub addr: [::aya_ebpf::cty::c_uchar; 6usize], + pub vid: u16_, } #[repr(C)] -#[derive(Copy, Clone)] -pub union ip_mc_list__bindgen_ty_1 { - pub next: *mut ip_mc_list, - pub next_rcu: *mut ip_mc_list, +#[derive(Debug, Copy, Clone)] +pub struct switchdev_obj_mrp { + pub obj: switchdev_obj, + pub p_port: *mut net_device, + pub s_port: *mut net_device, + pub ring_id: u32_, + pub prio: u16_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ip_sf_list { - pub sf_next: *mut ip_sf_list, - pub sf_count: [::aya_bpf::cty::c_ulong; 2usize], - pub sf_inaddr: __be32, - pub sf_gsresp: ::aya_bpf::cty::c_uchar, - pub sf_oldin: ::aya_bpf::cty::c_uchar, - pub sf_crcount: ::aya_bpf::cty::c_uchar, +pub struct switchdev_obj_ring_role_mrp { + pub obj: switchdev_obj, + pub ring_role: u8_, + pub ring_id: u32_, + pub sw_backup: u8_, +} +pub mod dsa_tag_protocol { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DSA_TAG_PROTO_NONE: Type = 0; + pub const DSA_TAG_PROTO_BRCM: Type = 1; + pub const DSA_TAG_PROTO_BRCM_LEGACY: Type = 22; + pub const DSA_TAG_PROTO_BRCM_PREPEND: Type = 2; + pub const DSA_TAG_PROTO_DSA: Type = 3; + pub const DSA_TAG_PROTO_EDSA: Type = 4; + pub const DSA_TAG_PROTO_GSWIP: Type = 5; + pub const DSA_TAG_PROTO_KSZ9477: Type = 6; + pub const DSA_TAG_PROTO_KSZ9893: Type = 7; + pub const DSA_TAG_PROTO_LAN9303: Type = 8; + pub const DSA_TAG_PROTO_MTK: Type = 9; + pub const DSA_TAG_PROTO_QCA: Type = 10; + pub const DSA_TAG_PROTO_TRAILER: Type = 11; + pub const DSA_TAG_PROTO_8021Q: Type = 12; + pub const DSA_TAG_PROTO_SJA1105: Type = 13; + pub const DSA_TAG_PROTO_KSZ8795: Type = 14; + pub const DSA_TAG_PROTO_OCELOT: Type = 15; + pub const DSA_TAG_PROTO_AR9331: Type = 16; + pub const DSA_TAG_PROTO_RTL4_A: Type = 17; + pub const DSA_TAG_PROTO_HELLCREEK: Type = 18; + pub const DSA_TAG_PROTO_XRS700X: Type = 19; + pub const DSA_TAG_PROTO_OCELOT_8021Q: Type = 20; + pub const DSA_TAG_PROTO_SEVILLE: Type = 21; + pub const DSA_TAG_PROTO_SJA1110: Type = 23; + pub const DSA_TAG_PROTO_RTL8_4: Type = 24; + pub const DSA_TAG_PROTO_RTL8_4T: Type = 25; + pub const DSA_TAG_PROTO_RZN1_A5PSW: Type = 26; + pub const DSA_TAG_PROTO_LAN937X: Type = 27; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kernfs_syscall_ops { - pub show_options: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut seq_file, arg2: *mut kernfs_root) -> ::aya_bpf::cty::c_int, - >, - pub mkdir: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut kernfs_node, - arg2: *const ::aya_bpf::cty::c_char, - arg3: umode_t, - ) -> ::aya_bpf::cty::c_int, +pub struct dsa_device_ops { + pub xmit: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> *mut sk_buff, >, - pub rmdir: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut kernfs_node) -> ::aya_bpf::cty::c_int, + pub rcv: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sk_buff, arg2: *mut net_device) -> *mut sk_buff, >, - pub rename: ::core::option::Option< + pub flow_dissect: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut kernfs_node, - arg2: *mut kernfs_node, - arg3: *const ::aya_bpf::cty::c_char, - ) -> ::aya_bpf::cty::c_int, + arg1: *const sk_buff, + arg2: *mut __be16, + arg3: *mut ::aya_ebpf::cty::c_int, + ), >, - pub show_path: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut seq_file, - arg2: *mut kernfs_node, - arg3: *mut kernfs_root, - ) -> ::aya_bpf::cty::c_int, + pub connect: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_ebpf::cty::c_int, >, + pub disconnect: ::core::option::Option, + pub needed_headroom: ::aya_ebpf::cty::c_uint, + pub needed_tailroom: ::aya_ebpf::cty::c_uint, + pub name: *const ::aya_ebpf::cty::c_char, + pub proto: dsa_tag_protocol::Type, + pub promisc_on_conduit: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct debugfs_u32_array { - pub array: *mut u32_, - pub n_elements: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cma { - pub base_pfn: ::aya_bpf::cty::c_ulong, - pub count: ::aya_bpf::cty::c_ulong, - pub bitmap: *mut ::aya_bpf::cty::c_ulong, - pub order_per_bit: ::aya_bpf::cty::c_uint, - pub lock: spinlock_t, - pub mem_head: hlist_head, - pub mem_head_lock: spinlock_t, - pub dfs_bitmap: debugfs_u32_array, - pub name: [::aya_bpf::cty::c_char; 64usize], - pub nr_pages_succeeded: atomic64_t, - pub nr_pages_failed: atomic64_t, - pub cma_kobj: *mut cma_kobject, - pub reserve_pages_on_error: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kstatfs { - pub f_type: ::aya_bpf::cty::c_long, - pub f_bsize: ::aya_bpf::cty::c_long, - pub f_blocks: u64_, - pub f_bfree: u64_, - pub f_bavail: u64_, - pub f_files: u64_, - pub f_ffree: u64_, - pub f_fsid: __kernel_fsid_t, - pub f_namelen: ::aya_bpf::cty::c_long, - pub f_frsize: ::aya_bpf::cty::c_long, - pub f_flags: ::aya_bpf::cty::c_long, - pub f_spare: [::aya_bpf::cty::c_long; 4usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct perf_event_mmap_page { - pub version: __u32, - pub compat_version: __u32, - pub lock: __u32, - pub index: __u32, - pub offset: __s64, - pub time_enabled: __u64, - pub time_running: __u64, - pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1, - pub pmc_width: __u16, - pub time_shift: __u16, - pub time_mult: __u32, - pub time_offset: __u64, - pub time_zero: __u64, - pub size: __u32, - pub __reserved_1: __u32, - pub time_cycles: __u64, - pub time_mask: __u64, - pub __reserved: [__u8; 928usize], - pub data_head: __u64, - pub data_tail: __u64, - pub data_offset: __u64, - pub data_size: __u64, - pub aux_head: __u64, - pub aux_tail: __u64, - pub aux_offset: __u64, - pub aux_size: __u64, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union perf_event_mmap_page__bindgen_ty_1 { - pub capabilities: __u64, - pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1, +pub struct dsa_8021q_context { + _unused: [u8; 0], } #[repr(C)] -#[repr(align(8))] #[derive(Debug, Copy, Clone)] -pub struct perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { - pub _bitfield_align_1: [u64; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +pub struct dsa_switch { + pub dev: *mut device, + pub dst: *mut dsa_switch_tree, + pub index: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, + pub nb: notifier_block, + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub tagger_data: *mut ::aya_ebpf::cty::c_void, + pub cd: *mut dsa_chip_data, + pub ops: *const dsa_switch_ops, + pub phys_mii_mask: u32_, + pub user_mii_bus: *mut mii_bus, + pub ageing_time_min: ::aya_ebpf::cty::c_uint, + pub ageing_time_max: ::aya_ebpf::cty::c_uint, + pub tag_8021q_ctx: *mut dsa_8021q_context, + pub devlink: *mut devlink, + pub num_tx_queues: ::aya_ebpf::cty::c_uint, + pub num_lag_ids: ::aya_ebpf::cty::c_uint, + pub max_num_bridges: ::aya_ebpf::cty::c_uint, + pub num_ports: ::aya_ebpf::cty::c_uint, } -impl perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { +impl dsa_switch { #[inline] - pub fn cap_bit0(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } + pub fn setup(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_cap_bit0(&mut self, val: __u64) { + pub fn set_setup(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn cap_bit0_is_deprecated(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } + pub fn vlan_filtering_is_global(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_cap_bit0_is_deprecated(&mut self, val: __u64) { + pub fn set_vlan_filtering_is_global(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn cap_user_rdpmc(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } + pub fn needs_standalone_vlan_filtering(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] - pub fn set_cap_user_rdpmc(&mut self, val: __u64) { + pub fn set_needs_standalone_vlan_filtering(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] - pub fn cap_user_time(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } + pub fn configure_vlan_while_not_filtering(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] - pub fn set_cap_user_time(&mut self, val: __u64) { + pub fn set_configure_vlan_while_not_filtering(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] - pub fn cap_user_time_zero(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u64) } + pub fn untag_bridge_pvid(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] - pub fn set_cap_user_time_zero(&mut self, val: __u64) { + pub fn set_untag_bridge_pvid(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] - pub fn cap_user_time_short(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u64) } + pub fn assisted_learning_on_cpu_port(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } } #[inline] - pub fn set_cap_user_time_short(&mut self, val: __u64) { + pub fn set_assisted_learning_on_cpu_port(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] - pub fn cap_____res(&self) -> __u64 { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 58u8) as u64) } + pub fn vlan_filtering(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } } #[inline] - pub fn set_cap_____res(&mut self, val: __u64) { + pub fn set_vlan_filtering(&mut self, val: u32_) { unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 58u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn mtu_enforcement_ingress(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } + } + #[inline] + pub fn set_mtu_enforcement_ingress(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn fdb_isolation(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) } + } + #[inline] + pub fn set_fdb_isolation(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(8usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - cap_bit0: __u64, - cap_bit0_is_deprecated: __u64, - cap_user_rdpmc: __u64, - cap_user_time: __u64, - cap_user_time_zero: __u64, - cap_user_time_short: __u64, - cap_____res: __u64, - ) -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + setup: u32_, + vlan_filtering_is_global: u32_, + needs_standalone_vlan_filtering: u32_, + configure_vlan_while_not_filtering: u32_, + untag_bridge_pvid: u32_, + assisted_learning_on_cpu_port: u32_, + vlan_filtering: u32_, + mtu_enforcement_ingress: u32_, + fdb_isolation: u32_, + ) -> __BindgenBitfieldUnit<[u8; 2usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let cap_bit0: u64 = unsafe { ::core::mem::transmute(cap_bit0) }; - cap_bit0 as u64 + let setup: u32 = unsafe { ::core::mem::transmute(setup) }; + setup as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let cap_bit0_is_deprecated: u64 = - unsafe { ::core::mem::transmute(cap_bit0_is_deprecated) }; - cap_bit0_is_deprecated as u64 + let vlan_filtering_is_global: u32 = + unsafe { ::core::mem::transmute(vlan_filtering_is_global) }; + vlan_filtering_is_global as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { - let cap_user_rdpmc: u64 = unsafe { ::core::mem::transmute(cap_user_rdpmc) }; - cap_user_rdpmc as u64 + let needs_standalone_vlan_filtering: u32 = + unsafe { ::core::mem::transmute(needs_standalone_vlan_filtering) }; + needs_standalone_vlan_filtering as u64 }); __bindgen_bitfield_unit.set(3usize, 1u8, { - let cap_user_time: u64 = unsafe { ::core::mem::transmute(cap_user_time) }; - cap_user_time as u64 + let configure_vlan_while_not_filtering: u32 = + unsafe { ::core::mem::transmute(configure_vlan_while_not_filtering) }; + configure_vlan_while_not_filtering as u64 }); __bindgen_bitfield_unit.set(4usize, 1u8, { - let cap_user_time_zero: u64 = unsafe { ::core::mem::transmute(cap_user_time_zero) }; - cap_user_time_zero as u64 + let untag_bridge_pvid: u32 = unsafe { ::core::mem::transmute(untag_bridge_pvid) }; + untag_bridge_pvid as u64 }); __bindgen_bitfield_unit.set(5usize, 1u8, { - let cap_user_time_short: u64 = unsafe { ::core::mem::transmute(cap_user_time_short) }; - cap_user_time_short as u64 + let assisted_learning_on_cpu_port: u32 = + unsafe { ::core::mem::transmute(assisted_learning_on_cpu_port) }; + assisted_learning_on_cpu_port as u64 }); - __bindgen_bitfield_unit.set(6usize, 58u8, { - let cap_____res: u64 = unsafe { ::core::mem::transmute(cap_____res) }; - cap_____res as u64 + __bindgen_bitfield_unit.set(6usize, 1u8, { + let vlan_filtering: u32 = unsafe { ::core::mem::transmute(vlan_filtering) }; + vlan_filtering as u64 }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -pub struct perf_buffer { - pub refcount: refcount_t, - pub callback_head: callback_head, - pub nr_pages: ::aya_bpf::cty::c_int, - pub overwrite: ::aya_bpf::cty::c_int, - pub paused: ::aya_bpf::cty::c_int, - pub poll: atomic_t, - pub head: local_t, - pub nest: ::aya_bpf::cty::c_uint, - pub events: local_t, - pub wakeup: local_t, - pub lost: local_t, - pub watermark: ::aya_bpf::cty::c_long, - pub aux_watermark: ::aya_bpf::cty::c_long, - pub event_lock: spinlock_t, - pub event_list: list_head, - pub mmap_count: atomic_t, - pub mmap_locked: ::aya_bpf::cty::c_ulong, - pub mmap_user: *mut user_struct, - pub aux_head: ::aya_bpf::cty::c_long, - pub aux_nest: ::aya_bpf::cty::c_uint, - pub aux_wakeup: ::aya_bpf::cty::c_long, - pub aux_pgoff: ::aya_bpf::cty::c_ulong, - pub aux_nr_pages: ::aya_bpf::cty::c_int, - pub aux_overwrite: ::aya_bpf::cty::c_int, - pub aux_mmap_count: atomic_t, - pub aux_mmap_locked: ::aya_bpf::cty::c_ulong, - pub free_aux: ::core::option::Option, - pub aux_refcount: refcount_t, - pub aux_in_sampling: ::aya_bpf::cty::c_int, - pub aux_pages: *mut *mut ::aya_bpf::cty::c_void, - pub aux_priv: *mut ::aya_bpf::cty::c_void, - pub user_page: *mut perf_event_mmap_page, - pub data_pages: __IncompleteArrayField<*mut ::aya_bpf::cty::c_void>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct key_preparsed_payload { - pub orig_description: *const ::aya_bpf::cty::c_char, - pub description: *mut ::aya_bpf::cty::c_char, - pub payload: key_payload, - pub data: *const ::aya_bpf::cty::c_void, - pub datalen: usize, - pub quotalen: usize, - pub expiry: time64_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct key_match_data { - pub cmp: ::core::option::Option< - unsafe extern "C" fn(arg1: *const key, arg2: *const key_match_data) -> bool_, - >, - pub raw_data: *const ::aya_bpf::cty::c_void, - pub preparsed: *mut ::aya_bpf::cty::c_void, - pub lookup_type: ::aya_bpf::cty::c_uint, -} -pub mod kernel_pkey_operation { - pub type Type = ::aya_bpf::cty::c_uint; - pub const kernel_pkey_encrypt: Type = 0; - pub const kernel_pkey_decrypt: Type = 1; - pub const kernel_pkey_sign: Type = 2; - pub const kernel_pkey_verify: Type = 3; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct kernel_pkey_params { - pub key: *mut key, - pub encoding: *const ::aya_bpf::cty::c_char, - pub hash_algo: *const ::aya_bpf::cty::c_char, - pub info: *mut ::aya_bpf::cty::c_char, - pub in_len: __u32, - pub __bindgen_anon_1: kernel_pkey_params__bindgen_ty_1, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 7usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union kernel_pkey_params__bindgen_ty_1 { - pub out_len: __u32, - pub in2_len: __u32, -} -impl kernel_pkey_params { - #[inline] - pub fn op(&self) -> kernel_pkey_operation::Type { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 8u8) as u32) } - } - #[inline] - pub fn set_op(&mut self, val: kernel_pkey_operation::Type) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 8u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(op: kernel_pkey_operation::Type) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 8u8, { - let op: u32 = unsafe { ::core::mem::transmute(op) }; - op as u64 + __bindgen_bitfield_unit.set(7usize, 1u8, { + let mtu_enforcement_ingress: u32 = + unsafe { ::core::mem::transmute(mtu_enforcement_ingress) }; + mtu_enforcement_ingress as u64 + }); + __bindgen_bitfield_unit.set(8usize, 1u8, { + let fdb_isolation: u32 = unsafe { ::core::mem::transmute(fdb_isolation) }; + fdb_isolation as u64 }); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kernel_pkey_query { - pub supported_ops: __u32, - pub key_size: __u32, - pub max_data_size: __u16, - pub max_sig_size: __u16, - pub max_enc_size: __u16, - pub max_dec_size: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cgroup_taskset { - pub src_csets: list_head, - pub dst_csets: list_head, - pub nr_tasks: ::aya_bpf::cty::c_int, - pub ssid: ::aya_bpf::cty::c_int, - pub csets: *mut list_head, - pub cur_cset: *mut css_set, - pub cur_task: *mut task_struct, -} -pub mod bpf_link_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const BPF_LINK_TYPE_UNSPEC: Type = 0; - pub const BPF_LINK_TYPE_RAW_TRACEPOINT: Type = 1; - pub const BPF_LINK_TYPE_TRACING: Type = 2; - pub const BPF_LINK_TYPE_CGROUP: Type = 3; - pub const BPF_LINK_TYPE_ITER: Type = 4; - pub const BPF_LINK_TYPE_NETNS: Type = 5; - pub const BPF_LINK_TYPE_XDP: Type = 6; - pub const BPF_LINK_TYPE_PERF_EVENT: Type = 7; - pub const BPF_LINK_TYPE_KPROBE_MULTI: Type = 8; - pub const BPF_LINK_TYPE_STRUCT_OPS: Type = 9; - pub const BPF_LINK_TYPE_NETFILTER: Type = 10; - pub const MAX_BPF_LINK_TYPE: Type = 11; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_link { - pub refcnt: atomic64_t, - pub id: u32_, - pub type_: bpf_link_type::Type, - pub ops: *const bpf_link_ops, - pub prog: *mut bpf_prog, - pub work: work_struct, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_link_ops { - pub release: ::core::option::Option, - pub dealloc: ::core::option::Option, - pub detach: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub update_prog: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut bpf_link, - arg2: *mut bpf_prog, - arg3: *mut bpf_prog, - ) -> ::aya_bpf::cty::c_int, - >, - pub show_fdinfo: - ::core::option::Option, - pub fill_link_info: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const bpf_link, - arg2: *mut bpf_link_info, - ) -> ::aya_bpf::cty::c_int, - >, - pub update_map: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut bpf_link, - arg2: *mut bpf_map, - arg3: *mut bpf_map, - ) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct mmu_notifier_subscriptions { - pub list: hlist_head, - pub has_itree: bool_, - pub lock: spinlock_t, - pub invalidate_seq: ::aya_bpf::cty::c_ulong, - pub active_invalidate_ranges: ::aya_bpf::cty::c_ulong, - pub itree: rb_root_cached, - pub wq: wait_queue_head_t, - pub deferred_list: hlist_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf { - pub addr: __u64, - pub len: __u32, - pub bid: __u16, - pub resv: __u16, -} -#[repr(C)] -pub struct io_uring_buf_ring { - pub __bindgen_anon_1: io_uring_buf_ring__bindgen_ty_1, -} -#[repr(C)] -pub struct io_uring_buf_ring__bindgen_ty_1 { - pub __bindgen_anon_1: __BindgenUnionField, - pub __bindgen_anon_2: __BindgenUnionField, - pub bindgen_union_field: [u64; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_1 { - pub resv1: __u64, - pub resv2: __u32, - pub resv3: __u16, - pub tail: __u16, -} -#[repr(C)] -#[derive(Debug)] -pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2 { - pub __empty_bufs: io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, - pub bufs: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_buffer_list { - pub __bindgen_anon_1: io_buffer_list__bindgen_ty_1, - pub bgid: __u16, - pub buf_nr_pages: __u16, - pub nr_entries: __u16, - pub head: __u16, - pub mask: __u16, - pub is_mapped: __u8, - pub is_mmap: __u8, -} -#[repr(C)] #[derive(Copy, Clone)] -pub union io_buffer_list__bindgen_ty_1 { - pub buf_list: list_head, - pub __bindgen_anon_1: io_buffer_list__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_buffer_list__bindgen_ty_1__bindgen_ty_1 { - pub buf_pages: *mut *mut page, - pub buf_ring: *mut io_uring_buf_ring, +pub struct dsa_lag { + pub dev: *mut net_device, + pub id: ::aya_ebpf::cty::c_uint, + pub fdb_lock: mutex, + pub fdbs: list_head, + pub refcount: refcount_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_buffer { +pub struct dsa_switch_tree { pub list: list_head, - pub addr: __u64, - pub len: __u32, - pub bid: __u16, - pub bgid: __u16, + pub ports: list_head, + pub nh: raw_notifier_head, + pub index: ::aya_ebpf::cty::c_uint, + pub refcount: kref, + pub lags: *mut *mut dsa_lag, + pub tag_ops: *const dsa_device_ops, + pub default_proto: dsa_tag_protocol::Type, + pub setup: bool_, + pub pd: *mut dsa_platform_data, + pub rtable: list_head, + pub lags_len: ::aya_ebpf::cty::c_uint, + pub last_switch: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_poll { - pub file: *mut file, - pub head: *mut wait_queue_head, - pub events: __poll_t, - pub retries: ::aya_bpf::cty::c_int, - pub wait: wait_queue_entry, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct async_poll { - pub __bindgen_anon_1: async_poll__bindgen_ty_1, - pub double_poll: *mut io_poll, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union async_poll__bindgen_ty_1 { - pub poll: io_poll, - pub cache: io_cache_entry, +pub struct dsa_mall_mirror_tc_entry { + pub to_local_port: u8_, + pub ingress: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct btf_id_dtor_kfunc { - pub btf_id: u32_, - pub kfunc_btf_id: u32_, +pub struct dsa_mall_policer_tc_entry { + pub burst: u32_, + pub rate_bytes_per_sec: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct robust_list { - pub next: *mut robust_list, +pub struct dsa_bridge { + pub dev: *mut net_device, + pub num: ::aya_ebpf::cty::c_uint, + pub tx_fwd_offload: bool_, + pub refcount: refcount_t, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct robust_list_head { - pub list: robust_list, - pub futex_offset: ::aya_bpf::cty::c_long, - pub list_op_pending: *mut robust_list, +pub mod dsa_db_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DSA_DB_PORT: Type = 0; + pub const DSA_DB_LAG: Type = 1; + pub const DSA_DB_BRIDGE: Type = 2; } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pin_cookie {} -#[repr(C)] #[derive(Copy, Clone)] -pub struct dl_bw { - pub lock: raw_spinlock_t, - pub bw: u64_, - pub total_bw: u64_, +pub struct dsa_db { + pub type_: dsa_db_type::Type, + pub __bindgen_anon_1: dsa_db__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct cpudl { - pub lock: raw_spinlock_t, - pub size: ::aya_bpf::cty::c_int, - pub free_cpus: cpumask_var_t, - pub elements: *mut cpudl_item, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cpupri_vec { - pub count: atomic_t, - pub mask: cpumask_var_t, +pub union dsa_db__bindgen_ty_1 { + pub dp: *const dsa_port, + pub lag: dsa_lag, + pub bridge: dsa_bridge, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cpupri { - pub pri_to_cpu: [cpupri_vec; 101usize], - pub cpu_to_pri: *mut ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct root_domain { - pub refcount: atomic_t, - pub rto_count: atomic_t, - pub rcu: callback_head, - pub span: cpumask_var_t, - pub online: cpumask_var_t, - pub overload: ::aya_bpf::cty::c_int, - pub overutilized: ::aya_bpf::cty::c_int, - pub dlo_mask: cpumask_var_t, - pub dlo_count: atomic_t, - pub dl_bw: dl_bw, - pub cpudl: cpudl, - pub visit_gen: u64_, - pub rto_push_work: irq_work, - pub rto_lock: raw_spinlock_t, - pub rto_loop: ::aya_bpf::cty::c_int, - pub rto_cpu: ::aya_bpf::cty::c_int, - pub rto_loop_next: atomic_t, - pub rto_loop_start: atomic_t, - pub rto_mask: cpumask_var_t, - pub cpupri: cpupri, - pub max_cpu_capacity: ::aya_bpf::cty::c_ulong, - pub pd: *mut perf_domain, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cfs_rq { - pub load: load_weight, - pub nr_running: ::aya_bpf::cty::c_uint, - pub h_nr_running: ::aya_bpf::cty::c_uint, - pub idle_nr_running: ::aya_bpf::cty::c_uint, - pub idle_h_nr_running: ::aya_bpf::cty::c_uint, - pub exec_clock: u64_, - pub min_vruntime: u64_, - pub forceidle_seq: ::aya_bpf::cty::c_uint, - pub min_vruntime_fi: u64_, - pub tasks_timeline: rb_root_cached, - pub curr: *mut sched_entity, - pub next: *mut sched_entity, - pub last: *mut sched_entity, - pub skip: *mut sched_entity, - pub nr_spread_over: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, - pub avg: sched_avg, - pub removed: cfs_rq__bindgen_ty_1, - pub tg_load_avg_contrib: ::aya_bpf::cty::c_ulong, - pub propagate: ::aya_bpf::cty::c_long, - pub prop_runnable_sum: ::aya_bpf::cty::c_long, - pub h_load: ::aya_bpf::cty::c_ulong, - pub last_h_load_update: u64_, - pub h_load_next: *mut sched_entity, - pub rq: *mut rq, - pub on_list: ::aya_bpf::cty::c_int, - pub leaf_cfs_rq_list: list_head, - pub tg: *mut task_group, - pub idle: ::aya_bpf::cty::c_int, - pub runtime_enabled: ::aya_bpf::cty::c_int, - pub runtime_remaining: s64, - pub throttled_pelt_idle: u64_, - pub throttled_clock: u64_, - pub throttled_clock_pelt: u64_, - pub throttled_clock_pelt_time: u64_, - pub throttled: ::aya_bpf::cty::c_int, - pub throttle_count: ::aya_bpf::cty::c_int, - pub throttled_list: list_head, - pub throttled_csd_list: list_head, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cfs_rq__bindgen_ty_1 { - pub lock: raw_spinlock_t, - pub nr: ::aya_bpf::cty::c_int, - pub load_avg: ::aya_bpf::cty::c_ulong, - pub util_avg: ::aya_bpf::cty::c_ulong, - pub runnable_avg: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl cfs_rq__bindgen_ty_1 { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -impl cfs_rq { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cfs_bandwidth { - pub lock: raw_spinlock_t, - pub period: ktime_t, - pub quota: u64_, - pub runtime: u64_, - pub burst: u64_, - pub runtime_snap: u64_, - pub hierarchical_quota: s64, - pub idle: u8_, - pub period_active: u8_, - pub slack_started: u8_, - pub period_timer: hrtimer, - pub slack_timer: hrtimer, - pub throttled_cfs_rq: list_head, - pub nr_periods: ::aya_bpf::cty::c_int, - pub nr_throttled: ::aya_bpf::cty::c_int, - pub nr_burst: ::aya_bpf::cty::c_int, - pub throttled_time: u64_, - pub burst_time: u64_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct task_group { - pub css: cgroup_subsys_state, - pub se: *mut *mut sched_entity, - pub cfs_rq: *mut *mut cfs_rq, - pub shares: ::aya_bpf::cty::c_ulong, - pub idle: ::aya_bpf::cty::c_int, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub load_avg: atomic_long_t, - pub rcu: callback_head, - pub list: list_head, - pub parent: *mut task_group, - pub siblings: list_head, - pub children: list_head, - pub autogroup: *mut autogroup, - pub cfs_bandwidth: cfs_bandwidth, - pub uclamp_pct: [::aya_bpf::cty::c_uint; 2usize], - pub uclamp_req: [uclamp_se; 2usize], - pub uclamp: [uclamp_se; 2usize], - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, -} -impl task_group { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct autogroup { - pub kref: kref, - pub tg: *mut task_group, - pub lock: rw_semaphore, - pub id: ::aya_bpf::cty::c_ulong, - pub nice: ::aya_bpf::cty::c_int, +pub struct fixed_phy_status { + _unused: [u8; 0], } +pub type dsa_fdb_dump_cb_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_uchar, + arg2: u16_, + arg3: bool_, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sched_domain_shared { - pub ref_: atomic_t, - pub nr_busy_cpus: atomic_t, - pub has_idle_cores: ::aya_bpf::cty::c_int, - pub nr_idle_scan: ::aya_bpf::cty::c_int, -} -#[repr(C)] -pub struct sched_domain { - pub parent: *mut sched_domain, - pub child: *mut sched_domain, - pub groups: *mut sched_group, - pub min_interval: ::aya_bpf::cty::c_ulong, - pub max_interval: ::aya_bpf::cty::c_ulong, - pub busy_factor: ::aya_bpf::cty::c_uint, - pub imbalance_pct: ::aya_bpf::cty::c_uint, - pub cache_nice_tries: ::aya_bpf::cty::c_uint, - pub imb_numa_nr: ::aya_bpf::cty::c_uint, - pub nohz_idle: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, - pub level: ::aya_bpf::cty::c_int, - pub last_balance: ::aya_bpf::cty::c_ulong, - pub balance_interval: ::aya_bpf::cty::c_uint, - pub nr_balance_failed: ::aya_bpf::cty::c_uint, - pub max_newidle_lb_cost: u64_, - pub last_decay_max_lb_cost: ::aya_bpf::cty::c_ulong, - pub avg_scan_cost: u64_, - pub lb_count: [::aya_bpf::cty::c_uint; 3usize], - pub lb_failed: [::aya_bpf::cty::c_uint; 3usize], - pub lb_balanced: [::aya_bpf::cty::c_uint; 3usize], - pub lb_imbalance: [::aya_bpf::cty::c_uint; 3usize], - pub lb_gained: [::aya_bpf::cty::c_uint; 3usize], - pub lb_hot_gained: [::aya_bpf::cty::c_uint; 3usize], - pub lb_nobusyg: [::aya_bpf::cty::c_uint; 3usize], - pub lb_nobusyq: [::aya_bpf::cty::c_uint; 3usize], - pub alb_count: ::aya_bpf::cty::c_uint, - pub alb_failed: ::aya_bpf::cty::c_uint, - pub alb_pushed: ::aya_bpf::cty::c_uint, - pub sbe_count: ::aya_bpf::cty::c_uint, - pub sbe_balanced: ::aya_bpf::cty::c_uint, - pub sbe_pushed: ::aya_bpf::cty::c_uint, - pub sbf_count: ::aya_bpf::cty::c_uint, - pub sbf_balanced: ::aya_bpf::cty::c_uint, - pub sbf_pushed: ::aya_bpf::cty::c_uint, - pub ttwu_wake_remote: ::aya_bpf::cty::c_uint, - pub ttwu_move_affine: ::aya_bpf::cty::c_uint, - pub ttwu_move_balance: ::aya_bpf::cty::c_uint, - pub name: *mut ::aya_bpf::cty::c_char, - pub __bindgen_anon_1: sched_domain__bindgen_ty_1, - pub shared: *mut sched_domain_shared, - pub span_weight: ::aya_bpf::cty::c_uint, - pub span: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union sched_domain__bindgen_ty_1 { - pub private: *mut ::aya_bpf::cty::c_void, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug)] -pub struct sched_group { - pub next: *mut sched_group, - pub ref_: atomic_t, - pub group_weight: ::aya_bpf::cty::c_uint, - pub sgc: *mut sched_group_capacity, - pub asym_prefer_cpu: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, - pub cpumask: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Debug)] -pub struct sched_group_capacity { - pub ref_: atomic_t, - pub capacity: ::aya_bpf::cty::c_ulong, - pub min_capacity: ::aya_bpf::cty::c_ulong, - pub max_capacity: ::aya_bpf::cty::c_ulong, - pub next_update: ::aya_bpf::cty::c_ulong, - pub imbalance: ::aya_bpf::cty::c_int, - pub id: ::aya_bpf::cty::c_int, - pub cpumask: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cpu_stop_work { - pub list: list_head, - pub fn_: cpu_stop_fn_t, - pub caller: ::aya_bpf::cty::c_ulong, - pub arg: *mut ::aya_bpf::cty::c_void, - pub done: *mut cpu_stop_done, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cpudl_item { - pub dl: u64_, - pub cpu: ::aya_bpf::cty::c_int, - pub idx: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rt_prio_array { - pub bitmap: [::aya_bpf::cty::c_ulong; 2usize], - pub queue: [list_head; 100usize], -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct uclamp_bucket { - pub _bitfield_align_1: [u64; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, -} -impl uclamp_bucket { - #[inline] - pub fn value(&self) -> ::aya_bpf::cty::c_ulong { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 11u8) as u64) } - } - #[inline] - pub fn set_value(&mut self, val: ::aya_bpf::cty::c_ulong) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 11u8, val as u64) - } - } - #[inline] - pub fn tasks(&self) -> ::aya_bpf::cty::c_ulong { - unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 53u8) as u64) } - } - #[inline] - pub fn set_tasks(&mut self, val: ::aya_bpf::cty::c_ulong) { - unsafe { - let val: u64 = ::core::mem::transmute(val); - self._bitfield_1.set(11usize, 53u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - value: ::aya_bpf::cty::c_ulong, - tasks: ::aya_bpf::cty::c_ulong, - ) -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 11u8, { - let value: u64 = unsafe { ::core::mem::transmute(value) }; - value as u64 - }); - __bindgen_bitfield_unit.set(11usize, 53u8, { - let tasks: u64 = unsafe { ::core::mem::transmute(tasks) }; - tasks as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uclamp_rq { - pub value: ::aya_bpf::cty::c_uint, - pub bucket: [uclamp_bucket; 5usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rt_rq { - pub active: rt_prio_array, - pub rt_nr_running: ::aya_bpf::cty::c_uint, - pub rr_nr_running: ::aya_bpf::cty::c_uint, - pub highest_prio: rt_rq__bindgen_ty_1, - pub rt_nr_migratory: ::aya_bpf::cty::c_uint, - pub rt_nr_total: ::aya_bpf::cty::c_uint, - pub overloaded: ::aya_bpf::cty::c_int, - pub pushable_tasks: plist_head, - pub rt_queued: ::aya_bpf::cty::c_int, - pub rt_throttled: ::aya_bpf::cty::c_int, - pub rt_time: u64_, - pub rt_runtime: u64_, - pub rt_runtime_lock: raw_spinlock_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rt_rq__bindgen_ty_1 { - pub curr: ::aya_bpf::cty::c_int, - pub next: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dl_rq { - pub root: rb_root_cached, - pub dl_nr_running: ::aya_bpf::cty::c_uint, - pub earliest_dl: dl_rq__bindgen_ty_1, - pub dl_nr_migratory: ::aya_bpf::cty::c_uint, - pub overloaded: ::aya_bpf::cty::c_int, - pub pushable_dl_tasks_root: rb_root_cached, - pub running_bw: u64_, - pub this_bw: u64_, - pub extra_bw: u64_, - pub bw_ratio: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dl_rq__bindgen_ty_1 { - pub curr: u64_, - pub next: u64_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rq { - pub __lock: raw_spinlock_t, - pub nr_running: ::aya_bpf::cty::c_uint, - pub nr_numa_running: ::aya_bpf::cty::c_uint, - pub nr_preferred_running: ::aya_bpf::cty::c_uint, - pub numa_migrate_on: ::aya_bpf::cty::c_uint, - pub last_blocked_load_update_tick: ::aya_bpf::cty::c_ulong, - pub has_blocked_load: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub nohz_csd: call_single_data_t, - pub nohz_tick_stopped: ::aya_bpf::cty::c_uint, - pub nohz_flags: atomic_t, - pub ttwu_pending: ::aya_bpf::cty::c_uint, - pub nr_switches: u64_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 8usize]>, - pub uclamp: [uclamp_rq; 2usize], - pub uclamp_flags: ::aya_bpf::cty::c_uint, - pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 24usize]>, - pub cfs: cfs_rq, - pub rt: rt_rq, - pub dl: dl_rq, - pub leaf_cfs_rq_list: list_head, - pub tmp_alone_branch: *mut list_head, - pub nr_uninterruptible: ::aya_bpf::cty::c_uint, - pub curr: *mut task_struct, - pub idle: *mut task_struct, - pub stop: *mut task_struct, - pub next_balance: ::aya_bpf::cty::c_ulong, - pub prev_mm: *mut mm_struct, - pub clock_update_flags: ::aya_bpf::cty::c_uint, - pub clock: u64_, - pub _bitfield_align_4: [u8; 0], - pub _bitfield_4: __BindgenBitfieldUnit<[u8; 40usize]>, - pub clock_task: u64_, - pub clock_pelt: u64_, - pub lost_idle_time: ::aya_bpf::cty::c_ulong, - pub clock_pelt_idle: u64_, - pub clock_idle: u64_, - pub nr_iowait: atomic_t, - pub last_seen_need_resched_ns: u64_, - pub ticks_without_resched: ::aya_bpf::cty::c_int, - pub membarrier_state: ::aya_bpf::cty::c_int, - pub rd: *mut root_domain, - pub sd: *mut sched_domain, - pub cpu_capacity: ::aya_bpf::cty::c_ulong, - pub cpu_capacity_orig: ::aya_bpf::cty::c_ulong, - pub balance_callback: *mut balance_callback, - pub nohz_idle_balance: ::aya_bpf::cty::c_uchar, - pub idle_balance: ::aya_bpf::cty::c_uchar, - pub misfit_task_load: ::aya_bpf::cty::c_ulong, - pub active_balance: ::aya_bpf::cty::c_int, - pub push_cpu: ::aya_bpf::cty::c_int, - pub active_balance_work: cpu_stop_work, - pub cpu: ::aya_bpf::cty::c_int, - pub online: ::aya_bpf::cty::c_int, - pub cfs_tasks: list_head, - pub _bitfield_align_5: [u8; 0], - pub _bitfield_5: __BindgenBitfieldUnit<[u8; 56usize]>, - pub avg_rt: sched_avg, - pub avg_dl: sched_avg, - pub avg_irq: sched_avg, - pub idle_stamp: u64_, - pub avg_idle: u64_, - pub wake_stamp: ::aya_bpf::cty::c_ulong, - pub wake_avg_idle: u64_, - pub max_idle_balance_cost: u64_, - pub hotplug_wait: rcuwait, - pub prev_irq_time: u64_, - pub prev_steal_time: u64_, - pub prev_steal_time_rq: u64_, - pub calc_load_update: ::aya_bpf::cty::c_ulong, - pub calc_load_active: ::aya_bpf::cty::c_long, - pub _bitfield_align_6: [u8; 0], - pub _bitfield_6: __BindgenBitfieldUnit<[u8; 8usize]>, - pub hrtick_csd: call_single_data_t, - pub hrtick_timer: hrtimer, - pub hrtick_time: ktime_t, - pub rq_sched_info: sched_info, - pub rq_cpu_time: ::aya_bpf::cty::c_ulonglong, - pub yld_count: ::aya_bpf::cty::c_uint, - pub sched_count: ::aya_bpf::cty::c_uint, - pub sched_goidle: ::aya_bpf::cty::c_uint, - pub ttwu_count: ::aya_bpf::cty::c_uint, - pub ttwu_local: ::aya_bpf::cty::c_uint, - pub idle_state: *mut cpuidle_state, - pub nr_pinned: ::aya_bpf::cty::c_uint, - pub push_busy: ::aya_bpf::cty::c_uint, - pub push_work: cpu_stop_work, - pub core: *mut rq, - pub core_pick: *mut task_struct, - pub core_enabled: ::aya_bpf::cty::c_uint, - pub core_sched_seq: ::aya_bpf::cty::c_uint, - pub core_tree: rb_root, - pub core_task_seq: ::aya_bpf::cty::c_uint, - pub core_pick_seq: ::aya_bpf::cty::c_uint, - pub core_cookie: ::aya_bpf::cty::c_ulong, - pub core_forceidle_count: ::aya_bpf::cty::c_uint, - pub core_forceidle_seq: ::aya_bpf::cty::c_uint, - pub core_forceidle_occupation: ::aya_bpf::cty::c_uint, - pub core_forceidle_start: u64_, - pub scratch_mask: cpumask_var_t, - pub _bitfield_align_7: [u8; 0], - pub _bitfield_7: __BindgenBitfieldUnit<[u8; 8usize]>, - pub cfsb_csd: call_single_data_t, - pub cfsb_csd_list: list_head, - pub _bitfield_align_8: [u8; 0], - pub _bitfield_8: __BindgenBitfieldUnit<[u8; 16usize]>, -} -impl rq { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_6() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_7() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_8() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct perf_domain { - pub em_pd: *mut em_perf_domain, - pub next: *mut perf_domain, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct balance_callback { - pub next: *mut balance_callback, - pub func: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rq_flags { - pub flags: ::aya_bpf::cty::c_ulong, - pub cookie: pin_cookie, - pub clock_update_flags: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct affinity_context { - pub new_mask: *const cpumask, - pub user_mask: *mut cpumask, - pub flags: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pse_controller_ops { - pub ethtool_get_status: ::core::option::Option< +pub struct dsa_switch_ops { + pub get_tag_protocol: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut pse_controller_dev, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut netlink_ext_ack, - arg4: *mut pse_control_status, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: dsa_tag_protocol::Type, + ) -> dsa_tag_protocol::Type, >, - pub ethtool_set_config: ::core::option::Option< + pub change_tag_protocol: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut pse_controller_dev, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut netlink_ext_ack, - arg4: *const pse_control_config, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: dsa_tag_protocol::Type, + ) -> ::aya_ebpf::cty::c_int, >, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct pse_controller_dev { - pub ops: *const pse_controller_ops, - pub owner: *mut module, - pub list: list_head, - pub pse_control_head: list_head, - pub dev: *mut device, - pub of_pse_n_cells: ::aya_bpf::cty::c_int, - pub of_xlate: ::core::option::Option< + pub connect_tag_protocol: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut pse_controller_dev, - arg2: *const of_phandle_args, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: dsa_tag_protocol::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub nr_lines: ::aya_bpf::cty::c_uint, - pub lock: mutex, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pse_control { - pub pcdev: *mut pse_controller_dev, - pub list: list_head, - pub id: ::aya_bpf::cty::c_uint, - pub refcnt: kref, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_xdp_link { - pub link: bpf_link, - pub dev: *mut net_device, - pub flags: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct netpoll_info { - pub refcnt: refcount_t, - pub dev_lock: semaphore, - pub txq: sk_buff_head, - pub tx_work: delayed_work, - pub netpoll: *mut netpoll, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct netdev_name_node { - pub hlist: hlist_node, - pub list: list_head, - pub dev: *mut net_device, - pub name: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug)] -pub struct cpu_rmap { - pub refcount: kref, - pub size: u16_, - pub obj: *mut *mut ::aya_bpf::cty::c_void, - pub near: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cpu_rmap__bindgen_ty_1 { - pub index: u16_, - pub dist: u16_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union inet_addr { - pub all: [__u32; 4usize], - pub ip: __be32, - pub ip6: [__be32; 4usize], - pub in_: in_addr, - pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct netpoll { - pub dev: *mut net_device, - pub dev_tracker: netdevice_tracker, - pub dev_name: [::aya_bpf::cty::c_char; 16usize], - pub name: *const ::aya_bpf::cty::c_char, - pub local_ip: inet_addr, - pub remote_ip: inet_addr, - pub ipv6: bool_, - pub local_port: u16_, - pub remote_port: u16_, - pub remote_mac: [u8_; 6usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct udp_tunnel_info { - pub type_: ::aya_bpf::cty::c_ushort, - pub sa_family: sa_family_t, - pub port: __be16, - pub hw_priv: u8_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct udp_tunnel_nic_shared { - pub udp_tunnel_nic_info: *mut udp_tunnel_nic, - pub devices: list_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union futex_key { - pub shared: futex_key__bindgen_ty_1, - pub private: futex_key__bindgen_ty_2, - pub both: futex_key__bindgen_ty_3, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct futex_key__bindgen_ty_1 { - pub i_seq: u64_, - pub pgoff: ::aya_bpf::cty::c_ulong, - pub offset: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct futex_key__bindgen_ty_2 { - pub __bindgen_anon_1: futex_key__bindgen_ty_2__bindgen_ty_1, - pub address: ::aya_bpf::cty::c_ulong, - pub offset: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union futex_key__bindgen_ty_2__bindgen_ty_1 { - pub mm: *mut mm_struct, - pub __tmp: u64_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct futex_key__bindgen_ty_3 { - pub ptr: u64_, - pub word: ::aya_bpf::cty::c_ulong, - pub offset: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct futex_pi_state { - pub list: list_head, - pub pi_mutex: rt_mutex_base, - pub owner: *mut task_struct, - pub refcount: refcount_t, - pub key: futex_key, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mnt_idmap { - pub owner: *mut user_namespace, - pub count: refcount_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct blk_integrity_iter { - pub prot_buf: *mut ::aya_bpf::cty::c_void, - pub data_buf: *mut ::aya_bpf::cty::c_void, - pub seed: sector_t, - pub data_size: ::aya_bpf::cty::c_uint, - pub interval: ::aya_bpf::cty::c_ushort, - pub tuple_size: ::aya_bpf::cty::c_uchar, - pub disk_name: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct uncached_list { - pub lock: spinlock_t, - pub head: list_head, - pub quarantine: list_head, -} -pub type __kernel_mqd_t = ::aya_bpf::cty::c_int; -pub type mqd_t = __kernel_mqd_t; -pub mod audit_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const AUDIT_STATE_DISABLED: Type = 0; - pub const AUDIT_STATE_BUILD: Type = 1; - pub const AUDIT_STATE_RECORD: Type = 2; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct audit_cap_data { - pub permitted: kernel_cap_t, - pub inheritable: kernel_cap_t, - pub __bindgen_anon_1: audit_cap_data__bindgen_ty_1, - pub ambient: kernel_cap_t, - pub rootid: kuid_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union audit_cap_data__bindgen_ty_1 { - pub fE: ::aya_bpf::cty::c_uint, - pub effective: kernel_cap_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct audit_names { - pub list: list_head, - pub name: *mut filename, - pub name_len: ::aya_bpf::cty::c_int, - pub hidden: bool_, - pub ino: ::aya_bpf::cty::c_ulong, - pub dev: dev_t, - pub mode: umode_t, - pub uid: kuid_t, - pub gid: kgid_t, - pub rdev: dev_t, - pub osid: u32_, - pub fcap: audit_cap_data, - pub fcap_ver: ::aya_bpf::cty::c_uint, - pub type_: ::aya_bpf::cty::c_uchar, - pub should_free: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mq_attr { - pub mq_flags: __kernel_long_t, - pub mq_maxmsg: __kernel_long_t, - pub mq_msgsize: __kernel_long_t, - pub mq_curmsgs: __kernel_long_t, - pub __reserved: [__kernel_long_t; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct open_how { - pub flags: __u64, - pub mode: __u64, - pub resolve: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_ntp_val { - pub oldval: ::aya_bpf::cty::c_longlong, - pub newval: ::aya_bpf::cty::c_longlong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_ntp_data { - pub vals: [audit_ntp_val; 6usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_proctitle { - pub len: ::aya_bpf::cty::c_int, - pub value: *mut ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct audit_context { - pub dummy: ::aya_bpf::cty::c_int, - pub context: audit_context__bindgen_ty_1::Type, - pub state: audit_state::Type, - pub current_state: audit_state::Type, - pub serial: ::aya_bpf::cty::c_uint, - pub major: ::aya_bpf::cty::c_int, - pub uring_op: ::aya_bpf::cty::c_int, - pub ctime: timespec64, - pub argv: [::aya_bpf::cty::c_ulong; 4usize], - pub return_code: ::aya_bpf::cty::c_long, - pub prio: u64_, - pub return_valid: ::aya_bpf::cty::c_int, - pub preallocated_names: [audit_names; 5usize], - pub name_count: ::aya_bpf::cty::c_int, - pub names_list: list_head, - pub filterkey: *mut ::aya_bpf::cty::c_char, - pub pwd: path, - pub aux: *mut audit_aux_data, - pub aux_pids: *mut audit_aux_data, - pub sockaddr: *mut __kernel_sockaddr_storage, - pub sockaddr_len: usize, - pub ppid: pid_t, - pub uid: kuid_t, - pub euid: kuid_t, - pub suid: kuid_t, - pub fsuid: kuid_t, - pub gid: kgid_t, - pub egid: kgid_t, - pub sgid: kgid_t, - pub fsgid: kgid_t, - pub personality: ::aya_bpf::cty::c_ulong, - pub arch: ::aya_bpf::cty::c_int, - pub target_pid: pid_t, - pub target_auid: kuid_t, - pub target_uid: kuid_t, - pub target_sessionid: ::aya_bpf::cty::c_uint, - pub target_sid: u32_, - pub target_comm: [::aya_bpf::cty::c_char; 16usize], - pub trees: *mut audit_tree_refs, - pub first_trees: *mut audit_tree_refs, - pub killed_trees: list_head, - pub tree_count: ::aya_bpf::cty::c_int, - pub type_: ::aya_bpf::cty::c_int, - pub __bindgen_anon_1: audit_context__bindgen_ty_2, - pub fds: [::aya_bpf::cty::c_int; 2usize], - pub proctitle: audit_proctitle, -} -pub mod audit_context__bindgen_ty_1 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const AUDIT_CTX_UNUSED: Type = 0; - pub const AUDIT_CTX_SYSCALL: Type = 1; - pub const AUDIT_CTX_URING: Type = 2; -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union audit_context__bindgen_ty_2 { - pub socketcall: audit_context__bindgen_ty_2__bindgen_ty_1, - pub ipc: audit_context__bindgen_ty_2__bindgen_ty_2, - pub mq_getsetattr: audit_context__bindgen_ty_2__bindgen_ty_3, - pub mq_notify: audit_context__bindgen_ty_2__bindgen_ty_4, - pub mq_sendrecv: audit_context__bindgen_ty_2__bindgen_ty_5, - pub mq_open: audit_context__bindgen_ty_2__bindgen_ty_6, - pub capset: audit_context__bindgen_ty_2__bindgen_ty_7, - pub mmap: audit_context__bindgen_ty_2__bindgen_ty_8, - pub openat2: open_how, - pub execve: audit_context__bindgen_ty_2__bindgen_ty_9, - pub module: audit_context__bindgen_ty_2__bindgen_ty_10, - pub time: audit_context__bindgen_ty_2__bindgen_ty_11, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_1 { - pub nargs: ::aya_bpf::cty::c_int, - pub args: [::aya_bpf::cty::c_long; 6usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_2 { - pub uid: kuid_t, - pub gid: kgid_t, - pub mode: umode_t, - pub osid: u32_, - pub has_perm: ::aya_bpf::cty::c_int, - pub perm_uid: uid_t, - pub perm_gid: gid_t, - pub perm_mode: umode_t, - pub qbytes: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_3 { - pub mqdes: mqd_t, - pub mqstat: mq_attr, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_4 { - pub mqdes: mqd_t, - pub sigev_signo: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_5 { - pub mqdes: mqd_t, - pub msg_len: usize, - pub msg_prio: ::aya_bpf::cty::c_uint, - pub abs_timeout: timespec64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_6 { - pub oflag: ::aya_bpf::cty::c_int, - pub mode: umode_t, - pub attr: mq_attr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_7 { - pub pid: pid_t, - pub cap: audit_cap_data, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_8 { - pub fd: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_9 { - pub argc: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_10 { - pub name: *mut ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct audit_context__bindgen_ty_2__bindgen_ty_11 { - pub ntp_data: audit_ntp_data, - pub tk_injoffset: timespec64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cma_kobject { - pub kobj: kobject, - pub cma: *mut cma, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fsnotify_ops { - pub handle_event: ::core::option::Option< + pub port_change_conduit: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut fsnotify_group, - arg2: u32_, - arg3: *const ::aya_bpf::cty::c_void, - arg4: ::aya_bpf::cty::c_int, - arg5: *mut inode, - arg6: *const qstr, - arg7: u32_, - arg8: *mut fsnotify_iter_info, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut net_device, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, >, - pub handle_inode_event: ::core::option::Option< + pub setup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_ebpf::cty::c_int, + >, + pub teardown: ::core::option::Option, + pub port_setup: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut fsnotify_mark, - arg2: u32_, - arg3: *mut inode, - arg4: *mut inode, - arg5: *const qstr, - arg6: u32_, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub free_group_priv: ::core::option::Option, - pub freeing_mark: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fsnotify_mark, arg2: *mut fsnotify_group), + pub port_teardown: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int), >, - pub free_event: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fsnotify_group, arg2: *mut fsnotify_event), + pub get_phy_flags: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int) -> u32_, >, - pub free_mark: ::core::option::Option, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct inotify_group_private_data { - pub idr_lock: spinlock_t, - pub idr: idr, - pub ucounts: *mut ucounts, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fanotify_group_private_data { - pub merge_hash: *mut hlist_head, - pub access_list: list_head, - pub access_waitq: wait_queue_head_t, - pub flags: ::aya_bpf::cty::c_int, - pub f_flags: ::aya_bpf::cty::c_int, - pub ucounts: *mut ucounts, - pub error_events_pool: mempool_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fsnotify_group { - pub ops: *const fsnotify_ops, - pub refcnt: refcount_t, - pub notification_lock: spinlock_t, - pub notification_list: list_head, - pub notification_waitq: wait_queue_head_t, - pub q_len: ::aya_bpf::cty::c_uint, - pub max_events: ::aya_bpf::cty::c_uint, - pub priority: ::aya_bpf::cty::c_uint, - pub shutdown: bool_, - pub flags: ::aya_bpf::cty::c_int, - pub owner_flags: ::aya_bpf::cty::c_uint, - pub mark_mutex: mutex, - pub user_waits: atomic_t, - pub marks_list: list_head, - pub fsn_fa: *mut fasync_struct, - pub overflow_event: *mut fsnotify_event, - pub memcg: *mut mem_cgroup, - pub __bindgen_anon_1: fsnotify_group__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fsnotify_group__bindgen_ty_1 { - pub private: *mut ::aya_bpf::cty::c_void, - pub inotify_data: inotify_group_private_data, - pub fanotify_data: fanotify_group_private_data, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fsnotify_iter_info { - pub marks: [*mut fsnotify_mark; 5usize], - pub current_group: *mut fsnotify_group, - pub report_mask: ::aya_bpf::cty::c_uint, - pub srcu_idx: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fsnotify_mark { - pub mask: __u32, - pub refcnt: refcount_t, - pub group: *mut fsnotify_group, - pub g_list: list_head, - pub lock: spinlock_t, - pub obj_list: hlist_node, - pub connector: *mut fsnotify_mark_connector, - pub ignore_mask: __u32, - pub flags: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fsnotify_event { - pub list: list_head, -} -#[repr(C)] -pub struct fid { - pub __bindgen_anon_1: fid__bindgen_ty_1, -} -#[repr(C)] -pub struct fid__bindgen_ty_1 { - pub i32_: __BindgenUnionField, - pub udf: __BindgenUnionField, - pub __bindgen_anon_1: __BindgenUnionField, - pub bindgen_union_field: [u32; 5usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fid__bindgen_ty_1__bindgen_ty_1 { - pub ino: u32_, - pub gen: u32_, - pub parent_ino: u32_, - pub parent_gen: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fid__bindgen_ty_1__bindgen_ty_2 { - pub block: u32_, - pub partref: u16_, - pub parent_partref: u16_, - pub generation: u32_, - pub parent_block: u32_, - pub parent_generation: u32_, -} -#[repr(C)] -#[derive(Debug)] -pub struct fid__bindgen_ty_1__bindgen_ty_3 { - pub __empty_raw: fid__bindgen_ty_1__bindgen_ty_3__bindgen_ty_1, - pub raw: __IncompleteArrayField<__u32>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fid__bindgen_ty_1__bindgen_ty_3__bindgen_ty_1 {} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct watch_list { - pub rcu: callback_head, - pub watchers: hlist_head, - pub release_watch: ::core::option::Option, - pub lock: spinlock_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct key_user { - pub node: rb_node, - pub cons_lock: mutex, - pub lock: spinlock_t, - pub usage: refcount_t, - pub nkeys: atomic_t, - pub nikeys: atomic_t, - pub uid: kuid_t, - pub qnkeys: ::aya_bpf::cty::c_int, - pub qnbytes: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct watch_type_filter { - pub type_: watch_notification_type::Type, - pub subtype_filter: [__u32; 1usize], - pub info_filter: __u32, - pub info_mask: __u32, -} -#[repr(C)] -pub struct watch_filter { - pub __bindgen_anon_1: watch_filter__bindgen_ty_1, - pub nr_filters: u32_, - pub filters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union watch_filter__bindgen_ty_1 { - pub rcu: callback_head, - pub type_filter: [::aya_bpf::cty::c_ulong; 1usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct watch_queue { - pub rcu: callback_head, - pub filter: *mut watch_filter, - pub pipe: *mut pipe_inode_info, - pub watches: hlist_head, - pub notes: *mut *mut page, - pub notes_bitmap: *mut ::aya_bpf::cty::c_ulong, - pub usage: kref, - pub lock: spinlock_t, - pub nr_notes: ::aya_bpf::cty::c_uint, - pub nr_pages: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct watch { - pub __bindgen_anon_1: watch__bindgen_ty_1, - pub queue: *mut watch_queue, - pub queue_node: hlist_node, - pub watch_list: *mut watch_list, - pub list_node: hlist_node, - pub cred: *const cred, - pub private: *mut ::aya_bpf::cty::c_void, - pub id: u64_, - pub usage: kref, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union watch__bindgen_ty_1 { - pub rcu: callback_head, - pub info_id: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct simple_xattrs { - pub rb_root: rb_root, - pub lock: rwlock_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdr_netobj { - pub len: ::aya_bpf::cty::c_uint, - pub data: *mut u8_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdr_buf { - pub head: [kvec; 1usize], - pub tail: [kvec; 1usize], - pub bvec: *mut bio_vec, - pub pages: *mut *mut page, - pub page_base: ::aya_bpf::cty::c_uint, - pub page_len: ::aya_bpf::cty::c_uint, - pub flags: ::aya_bpf::cty::c_uint, - pub buflen: ::aya_bpf::cty::c_uint, - pub len: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdr_stream { - pub p: *mut __be32, - pub buf: *mut xdr_buf, - pub end: *mut __be32, - pub iov: *mut kvec, - pub scratch: kvec, - pub page_ptr: *mut *mut page, - pub nwords: ::aya_bpf::cty::c_uint, - pub rqst: *mut rpc_rqst, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rpc_rqst { - pub rq_xprt: *mut rpc_xprt, - pub rq_snd_buf: xdr_buf, - pub rq_rcv_buf: xdr_buf, - pub rq_task: *mut rpc_task, - pub rq_cred: *mut rpc_cred, - pub rq_xid: __be32, - pub rq_cong: ::aya_bpf::cty::c_int, - pub rq_seqno: u32_, - pub rq_enc_pages_num: ::aya_bpf::cty::c_int, - pub rq_enc_pages: *mut *mut page, - pub rq_release_snd_buf: ::core::option::Option, - pub __bindgen_anon_1: rpc_rqst__bindgen_ty_1, - pub rq_xmit: list_head, - pub rq_xmit2: list_head, - pub rq_buffer: *mut ::aya_bpf::cty::c_void, - pub rq_callsize: usize, - pub rq_rbuffer: *mut ::aya_bpf::cty::c_void, - pub rq_rcvsize: usize, - pub rq_xmit_bytes_sent: usize, - pub rq_reply_bytes_recvd: usize, - pub rq_private_buf: xdr_buf, - pub rq_majortimeo: ::aya_bpf::cty::c_ulong, - pub rq_minortimeo: ::aya_bpf::cty::c_ulong, - pub rq_timeout: ::aya_bpf::cty::c_ulong, - pub rq_rtt: ktime_t, - pub rq_retries: ::aya_bpf::cty::c_uint, - pub rq_connect_cookie: ::aya_bpf::cty::c_uint, - pub rq_pin: atomic_t, - pub rq_bytes_sent: u32_, - pub rq_xtime: ktime_t, - pub rq_ntrans: ::aya_bpf::cty::c_int, - pub rq_bc_list: list_head, - pub rq_bc_pa_state: ::aya_bpf::cty::c_ulong, - pub rq_bc_pa_list: list_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union rpc_rqst__bindgen_ty_1 { - pub rq_list: list_head, - pub rq_recv: rb_node, -} -pub type kxdreproc_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_rqst, - arg2: *mut xdr_stream, - arg3: *const ::aya_bpf::cty::c_void, - ), ->; -pub type kxdrdproc_t = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_rqst, - arg2: *mut xdr_stream, - arg3: *mut ::aya_bpf::cty::c_void, - ) -> ::aya_bpf::cty::c_int, ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_message { - pub rpc_proc: *const rpc_procinfo, - pub rpc_argp: *mut ::aya_bpf::cty::c_void, - pub rpc_resp: *mut ::aya_bpf::cty::c_void, - pub rpc_cred: *const cred, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_procinfo { - pub p_proc: u32_, - pub p_encode: kxdreproc_t, - pub p_decode: kxdrdproc_t, - pub p_arglen: ::aya_bpf::cty::c_uint, - pub p_replen: ::aya_bpf::cty::c_uint, - pub p_timer: ::aya_bpf::cty::c_uint, - pub p_statidx: u32_, - pub p_name: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_wait { - pub list: list_head, - pub links: list_head, - pub timer_list: list_head, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rpc_task { - pub tk_count: atomic_t, - pub tk_status: ::aya_bpf::cty::c_int, - pub tk_task: list_head, - pub tk_callback: ::core::option::Option, - pub tk_action: ::core::option::Option, - pub tk_timeout: ::aya_bpf::cty::c_ulong, - pub tk_runstate: ::aya_bpf::cty::c_ulong, - pub tk_waitqueue: *mut rpc_wait_queue, - pub u: rpc_task__bindgen_ty_1, - pub tk_msg: rpc_message, - pub tk_calldata: *mut ::aya_bpf::cty::c_void, - pub tk_ops: *const rpc_call_ops, - pub tk_client: *mut rpc_clnt, - pub tk_xprt: *mut rpc_xprt, - pub tk_op_cred: *mut rpc_cred, - pub tk_rqstp: *mut rpc_rqst, - pub tk_workqueue: *mut workqueue_struct, - pub tk_start: ktime_t, - pub tk_owner: pid_t, - pub tk_rpc_status: ::aya_bpf::cty::c_int, - pub tk_flags: ::aya_bpf::cty::c_ushort, - pub tk_timeouts: ::aya_bpf::cty::c_ushort, - pub tk_pid: ::aya_bpf::cty::c_ushort, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union rpc_task__bindgen_ty_1 { - pub tk_work: work_struct, - pub tk_wait: rpc_wait, -} -impl rpc_task { - #[inline] - pub fn tk_priority(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u8) } - } - #[inline] - pub fn set_tk_priority(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 2u8, val as u64) - } - } - #[inline] - pub fn tk_garb_retry(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 2u8) as u8) } - } - #[inline] - pub fn set_tk_garb_retry(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 2u8, val as u64) - } - } - #[inline] - pub fn tk_cred_retry(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 2u8) as u8) } - } - #[inline] - pub fn set_tk_cred_retry(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 2u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - tk_priority: ::aya_bpf::cty::c_uchar, - tk_garb_retry: ::aya_bpf::cty::c_uchar, - tk_cred_retry: ::aya_bpf::cty::c_uchar, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 2u8, { - let tk_priority: u8 = unsafe { ::core::mem::transmute(tk_priority) }; - tk_priority as u64 - }); - __bindgen_bitfield_unit.set(2usize, 2u8, { - let tk_garb_retry: u8 = unsafe { ::core::mem::transmute(tk_garb_retry) }; - tk_garb_retry as u64 - }); - __bindgen_bitfield_unit.set(4usize, 2u8, { - let tk_cred_retry: u8 = unsafe { ::core::mem::transmute(tk_cred_retry) }; - tk_cred_retry as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_timer { - pub list: list_head, - pub expires: ::aya_bpf::cty::c_ulong, - pub dwork: delayed_work, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rpc_wait_queue { - pub lock: spinlock_t, - pub tasks: [list_head; 4usize], - pub maxpriority: ::aya_bpf::cty::c_uchar, - pub priority: ::aya_bpf::cty::c_uchar, - pub nr: ::aya_bpf::cty::c_uchar, - pub qlen: ::aya_bpf::cty::c_ushort, - pub timer_list: rpc_timer, - pub name: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_call_ops { - pub rpc_call_prepare: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut ::aya_bpf::cty::c_void), + pub phy_read: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub rpc_call_done: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut ::aya_bpf::cty::c_void), + pub phy_write: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: u16_, + ) -> ::aya_ebpf::cty::c_int, >, - pub rpc_count_stats: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut ::aya_bpf::cty::c_void), + pub adjust_link: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut phy_device, + ), >, - pub rpc_release: - ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_iostats { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_pipe_dir_head { - pub pdh_entries: list_head, - pub pdh_dentry: *mut dentry, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_rtt { - pub timeo: ::aya_bpf::cty::c_ulong, - pub srtt: [::aya_bpf::cty::c_ulong; 5usize], - pub sdrtt: [::aya_bpf::cty::c_ulong; 5usize], - pub ntimeouts: [::aya_bpf::cty::c_int; 5usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_timeout { - pub to_initval: ::aya_bpf::cty::c_ulong, - pub to_maxval: ::aya_bpf::cty::c_ulong, - pub to_increment: ::aya_bpf::cty::c_ulong, - pub to_retries: ::aya_bpf::cty::c_uint, - pub to_exponential: ::aya_bpf::cty::c_uchar, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_sysfs_client { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_xprt_iter { - pub xpi_xpswitch: *mut rpc_xprt_switch, - pub xpi_cursor: *mut rpc_xprt, - pub xpi_ops: *const rpc_xprt_iter_ops, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rpc_clnt { - pub cl_count: refcount_t, - pub cl_clid: ::aya_bpf::cty::c_uint, - pub cl_clients: list_head, - pub cl_tasks: list_head, - pub cl_pid: atomic_t, - pub cl_lock: spinlock_t, - pub cl_xprt: *mut rpc_xprt, - pub cl_procinfo: *const rpc_procinfo, - pub cl_prog: u32_, - pub cl_vers: u32_, - pub cl_maxproc: u32_, - pub cl_auth: *mut rpc_auth, - pub cl_stats: *mut rpc_stat, - pub cl_metrics: *mut rpc_iostats, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub cl_rtt: *mut rpc_rtt, - pub cl_timeout: *const rpc_timeout, - pub cl_swapper: atomic_t, - pub cl_nodelen: ::aya_bpf::cty::c_int, - pub cl_nodename: [::aya_bpf::cty::c_char; 65usize], - pub cl_pipedir_objects: rpc_pipe_dir_head, - pub cl_parent: *mut rpc_clnt, - pub cl_rtt_default: rpc_rtt, - pub cl_timeout_default: rpc_timeout, - pub cl_program: *const rpc_program, - pub cl_principal: *const ::aya_bpf::cty::c_char, - pub cl_debugfs: *mut dentry, - pub cl_sysfs: *mut rpc_sysfs_client, - pub __bindgen_anon_1: rpc_clnt__bindgen_ty_1, - pub cl_cred: *const cred, - pub cl_max_connect: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union rpc_clnt__bindgen_ty_1 { - pub cl_xpi: rpc_xprt_iter, - pub cl_work: work_struct, -} -impl rpc_clnt { - #[inline] - pub fn cl_softrtry(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_cl_softrtry(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn cl_softerr(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } - } - #[inline] - pub fn set_cl_softerr(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn cl_discrtry(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } - } - #[inline] - pub fn set_cl_discrtry(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } - #[inline] - pub fn cl_noretranstimeo(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } - } - #[inline] - pub fn set_cl_noretranstimeo(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) - } - } - #[inline] - pub fn cl_autobind(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } - } - #[inline] - pub fn set_cl_autobind(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) - } - } - #[inline] - pub fn cl_chatty(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } - } - #[inline] - pub fn set_cl_chatty(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - cl_softrtry: ::aya_bpf::cty::c_uint, - cl_softerr: ::aya_bpf::cty::c_uint, - cl_discrtry: ::aya_bpf::cty::c_uint, - cl_noretranstimeo: ::aya_bpf::cty::c_uint, - cl_autobind: ::aya_bpf::cty::c_uint, - cl_chatty: ::aya_bpf::cty::c_uint, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let cl_softrtry: u32 = unsafe { ::core::mem::transmute(cl_softrtry) }; - cl_softrtry as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let cl_softerr: u32 = unsafe { ::core::mem::transmute(cl_softerr) }; - cl_softerr as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let cl_discrtry: u32 = unsafe { ::core::mem::transmute(cl_discrtry) }; - cl_discrtry as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let cl_noretranstimeo: u32 = unsafe { ::core::mem::transmute(cl_noretranstimeo) }; - cl_noretranstimeo as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let cl_autobind: u32 = unsafe { ::core::mem::transmute(cl_autobind) }; - cl_autobind as u64 - }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let cl_chatty: u32 = unsafe { ::core::mem::transmute(cl_chatty) }; - cl_chatty as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct svc_xprt { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_sysfs_xprt { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rpc_xprt { - pub kref: kref, - pub ops: *const rpc_xprt_ops, - pub id: ::aya_bpf::cty::c_uint, - pub timeout: *const rpc_timeout, - pub addr: __kernel_sockaddr_storage, - pub addrlen: usize, - pub prot: ::aya_bpf::cty::c_int, - pub cong: ::aya_bpf::cty::c_ulong, - pub cwnd: ::aya_bpf::cty::c_ulong, - pub max_payload: usize, - pub binding: rpc_wait_queue, - pub sending: rpc_wait_queue, - pub pending: rpc_wait_queue, - pub backlog: rpc_wait_queue, - pub free: list_head, - pub max_reqs: ::aya_bpf::cty::c_uint, - pub min_reqs: ::aya_bpf::cty::c_uint, - pub num_reqs: ::aya_bpf::cty::c_uint, - pub state: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub swapper: atomic_t, - pub bind_index: ::aya_bpf::cty::c_uint, - pub xprt_switch: list_head, - pub bind_timeout: ::aya_bpf::cty::c_ulong, - pub reestablish_timeout: ::aya_bpf::cty::c_ulong, - pub connect_cookie: ::aya_bpf::cty::c_uint, - pub task_cleanup: work_struct, - pub timer: timer_list, - pub last_used: ::aya_bpf::cty::c_ulong, - pub idle_timeout: ::aya_bpf::cty::c_ulong, - pub connect_timeout: ::aya_bpf::cty::c_ulong, - pub max_reconnect_timeout: ::aya_bpf::cty::c_ulong, - pub queuelen: atomic_long_t, - pub transport_lock: spinlock_t, - pub reserve_lock: spinlock_t, - pub queue_lock: spinlock_t, - pub xid: u32_, - pub snd_task: *mut rpc_task, - pub xmit_queue: list_head, - pub xmit_queuelen: atomic_long_t, - pub bc_xprt: *mut svc_xprt, - pub bc_serv: *mut svc_serv, - pub bc_alloc_max: ::aya_bpf::cty::c_uint, - pub bc_alloc_count: ::aya_bpf::cty::c_uint, - pub bc_slot_count: atomic_t, - pub bc_pa_lock: spinlock_t, - pub bc_pa_list: list_head, - pub recv_queue: rb_root, - pub stat: rpc_xprt__bindgen_ty_1, - pub xprt_net: *mut net, - pub ns_tracker: netns_tracker, - pub servername: *const ::aya_bpf::cty::c_char, - pub address_strings: [*const ::aya_bpf::cty::c_char; 6usize], - pub debugfs: *mut dentry, - pub rcu: callback_head, - pub xprt_class: *const xprt_class, - pub xprt_sysfs: *mut rpc_sysfs_xprt, - pub main: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_xprt__bindgen_ty_1 { - pub bind_count: ::aya_bpf::cty::c_ulong, - pub connect_count: ::aya_bpf::cty::c_ulong, - pub connect_start: ::aya_bpf::cty::c_ulong, - pub connect_time: ::aya_bpf::cty::c_ulong, - pub sends: ::aya_bpf::cty::c_ulong, - pub recvs: ::aya_bpf::cty::c_ulong, - pub bad_xids: ::aya_bpf::cty::c_ulong, - pub max_slots: ::aya_bpf::cty::c_ulong, - pub req_u: ::aya_bpf::cty::c_ulonglong, - pub bklog_u: ::aya_bpf::cty::c_ulonglong, - pub sending_u: ::aya_bpf::cty::c_ulonglong, - pub pending_u: ::aya_bpf::cty::c_ulonglong, -} -impl rpc_xprt { - #[inline] - pub fn resvport(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_resvport(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn reuseport(&self) -> ::aya_bpf::cty::c_uchar { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_reuseport(&mut self, val: ::aya_bpf::cty::c_uchar) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - resvport: ::aya_bpf::cty::c_uchar, - reuseport: ::aya_bpf::cty::c_uchar, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let resvport: u8 = unsafe { ::core::mem::transmute(resvport) }; - resvport as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let reuseport: u8 = unsafe { ::core::mem::transmute(reuseport) }; - reuseport as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_cred { - pub cr_hash: hlist_node, - pub cr_lru: list_head, - pub cr_rcu: callback_head, - pub cr_auth: *mut rpc_auth, - pub cr_ops: *const rpc_credops, - pub cr_expire: ::aya_bpf::cty::c_ulong, - pub cr_flags: ::aya_bpf::cty::c_ulong, - pub cr_count: refcount_t, - pub cr_cred: *const cred, -} -pub type rpc_authflavor_t = u32_; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct auth_cred { - pub cred: *const cred, - pub principal: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_cred_cache { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_auth { - pub au_cslack: ::aya_bpf::cty::c_uint, - pub au_rslack: ::aya_bpf::cty::c_uint, - pub au_verfsize: ::aya_bpf::cty::c_uint, - pub au_ralign: ::aya_bpf::cty::c_uint, - pub au_flags: ::aya_bpf::cty::c_ulong, - pub au_ops: *const rpc_authops, - pub au_flavor: rpc_authflavor_t, - pub au_count: refcount_t, - pub au_credcache: *mut rpc_cred_cache, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_credops { - pub cr_name: *const ::aya_bpf::cty::c_char, - pub cr_init: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_auth, arg2: *mut rpc_cred) -> ::aya_bpf::cty::c_int, - >, - pub crdestroy: ::core::option::Option, - pub crmatch: ::core::option::Option< + pub fixed_link_update: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut auth_cred, - arg2: *mut rpc_cred, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut fixed_phy_status, + ), >, - pub crmarshal: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_bpf::cty::c_int, + pub phylink_get_caps: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut phylink_config, + ), >, - pub crrefresh: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub crvalidate: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_bpf::cty::c_int, + pub phylink_mac_select_pcs: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: phy_interface_t::Type, + ) -> *mut phylink_pcs, >, - pub crwrap_req: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_bpf::cty::c_int, + pub phylink_mac_prepare: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: phy_interface_t::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub crunwrap_resp: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_bpf::cty::c_int, + pub phylink_mac_config: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *const phylink_link_state, + ), >, - pub crkey_timeout: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub crstringify_acceptor: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_cred) -> *mut ::aya_bpf::cty::c_char, + pub phylink_mac_finish: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: phy_interface_t::Type, + ) -> ::aya_ebpf::cty::c_int, >, - pub crneed_reencode: ::core::option::Option bool_>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_authops { - pub owner: *mut module, - pub au_flavor: rpc_authflavor_t, - pub au_name: *mut ::aya_bpf::cty::c_char, - pub create: ::core::option::Option< + pub phylink_mac_link_down: ::core::option::Option< unsafe extern "C" fn( - arg1: *const rpc_auth_create_args, - arg2: *mut rpc_clnt, - ) -> *mut rpc_auth, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: phy_interface_t::Type, + ), >, - pub destroy: ::core::option::Option, - pub hash_cred: ::core::option::Option< + pub phylink_mac_link_up: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut auth_cred, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: phy_interface_t::Type, + arg5: *mut phy_device, + arg6: ::aya_ebpf::cty::c_int, + arg7: ::aya_ebpf::cty::c_int, + arg8: bool_, + arg9: bool_, + ), >, - pub lookup_cred: ::core::option::Option< + pub phylink_fixed_state: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rpc_auth, - arg2: *mut auth_cred, - arg3: ::aya_bpf::cty::c_int, - ) -> *mut rpc_cred, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut phylink_link_state, + ), >, - pub crcreate: ::core::option::Option< + pub get_strings: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rpc_auth, - arg2: *mut auth_cred, - arg3: ::aya_bpf::cty::c_int, - arg4: gfp_t, - ) -> *mut rpc_cred, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u32_, + arg4: *mut u8, + ), >, - pub info2flavor: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpcsec_gss_info) -> rpc_authflavor_t, + pub get_ethtool_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u64), >, - pub flavor2info: ::core::option::Option< + pub get_sset_count: ::core::option::Option< unsafe extern "C" fn( - arg1: rpc_authflavor_t, - arg2: *mut rpcsec_gss_info, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub key_timeout: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_auth, arg2: *mut rpc_cred) -> ::aya_bpf::cty::c_int, + pub get_ethtool_phy_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int, arg3: *mut u64), >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_auth_create_args { - pub pseudoflavor: rpc_authflavor_t, - pub target_name: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpcsec_gss_oid { - pub len: ::aya_bpf::cty::c_uint, - pub data: [u8_; 32usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpcsec_gss_info { - pub oid: rpcsec_gss_oid, - pub qop: u32_, - pub service: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_xprt_ops { - pub set_buffer_size: - ::core::option::Option, - pub reserve_xprt: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_xprt, arg2: *mut rpc_task) -> ::aya_bpf::cty::c_int, + pub get_eth_phy_stats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_eth_phy_stats, + ), >, - pub release_xprt: - ::core::option::Option, - pub alloc_slot: - ::core::option::Option, - pub free_slot: - ::core::option::Option, - pub rpcbind: ::core::option::Option, - pub set_port: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_xprt, arg2: ::aya_bpf::cty::c_ushort), + pub get_eth_mac_stats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_eth_mac_stats, + ), >, - pub connect: - ::core::option::Option, - pub get_srcaddr: ::core::option::Option< + pub get_eth_ctrl_stats: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rpc_xprt, - arg2: *mut ::aya_bpf::cty::c_char, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_eth_ctrl_stats, + ), >, - pub get_srcport: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_xprt) -> ::aya_bpf::cty::c_ushort, + pub get_rmon_stats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_rmon_stats, + arg4: *mut *const ethtool_rmon_hist_range, + ), >, - pub buf_alloc: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub buf_free: ::core::option::Option, - pub prepare_request: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_rqst, arg2: *mut xdr_buf) -> ::aya_bpf::cty::c_int, + pub get_stats64: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut rtnl_link_stats64, + ), >, - pub send_request: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub wait_for_reply_request: ::core::option::Option, - pub timer: - ::core::option::Option, - pub release_request: ::core::option::Option, - pub close: ::core::option::Option, - pub destroy: ::core::option::Option, - pub set_connect_timeout: ::core::option::Option< + pub get_pause_stats: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rpc_xprt, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_ulong, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_pause_stats, ), >, - pub print_stats: - ::core::option::Option, - pub enable_swap: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub disable_swap: ::core::option::Option, - pub inject_disconnect: ::core::option::Option, - pub bc_setup: ::core::option::Option< + pub self_test: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rpc_xprt, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_test, + arg4: *mut u64_, + ), >, - pub bc_maxpayload: ::core::option::Option usize>, - pub bc_num_slots: - ::core::option::Option ::aya_bpf::cty::c_uint>, - pub bc_free_rqst: ::core::option::Option, - pub bc_destroy: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_xprt, arg2: ::aya_bpf::cty::c_uint), + pub get_wol: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_wolinfo, + ), >, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct svc_serv { - pub sv_program: *mut svc_program, - pub sv_stats: *mut svc_stat, - pub sv_lock: spinlock_t, - pub sv_refcnt: kref, - pub sv_nrthreads: ::aya_bpf::cty::c_uint, - pub sv_maxconn: ::aya_bpf::cty::c_uint, - pub sv_max_payload: ::aya_bpf::cty::c_uint, - pub sv_max_mesg: ::aya_bpf::cty::c_uint, - pub sv_xdrsize: ::aya_bpf::cty::c_uint, - pub sv_permsocks: list_head, - pub sv_tempsocks: list_head, - pub sv_tmpcnt: ::aya_bpf::cty::c_int, - pub sv_temptimer: timer_list, - pub sv_name: *mut ::aya_bpf::cty::c_char, - pub sv_nrpools: ::aya_bpf::cty::c_uint, - pub sv_pools: *mut svc_pool, - pub sv_threadfn: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void) -> ::aya_bpf::cty::c_int, + pub set_wol: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_wolinfo, + ) -> ::aya_ebpf::cty::c_int, >, - pub sv_cb_list: list_head, - pub sv_cb_lock: spinlock_t, - pub sv_cb_waitq: wait_queue_head_t, - pub sv_bc_enabled: bool_, -} -#[repr(C)] -#[derive(Debug)] -pub struct xprt_class { - pub list: list_head, - pub ident: ::aya_bpf::cty::c_int, - pub setup: - ::core::option::Option *mut rpc_xprt>, - pub owner: *mut module, - pub name: [::aya_bpf::cty::c_char; 32usize], - pub netid: __IncompleteArrayField<*const ::aya_bpf::cty::c_char>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xprt_create { - pub ident: ::aya_bpf::cty::c_int, - pub net: *mut net, - pub srcaddr: *mut sockaddr, - pub dstaddr: *mut sockaddr, - pub addrlen: usize, - pub servername: *const ::aya_bpf::cty::c_char, - pub bc_xprt: *mut svc_xprt, - pub bc_xps: *mut rpc_xprt_switch, - pub flags: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_sysfs_xprt_switch { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rpc_xprt_switch { - pub xps_lock: spinlock_t, - pub xps_kref: kref, - pub xps_id: ::aya_bpf::cty::c_uint, - pub xps_nxprts: ::aya_bpf::cty::c_uint, - pub xps_nactive: ::aya_bpf::cty::c_uint, - pub xps_nunique_destaddr_xprts: ::aya_bpf::cty::c_uint, - pub xps_queuelen: atomic_long_t, - pub xps_xprt_list: list_head, - pub xps_net: *mut net, - pub xps_iter_ops: *const rpc_xprt_iter_ops, - pub xps_sysfs: *mut rpc_sysfs_xprt_switch, - pub xps_rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_stat { - pub program: *const rpc_program, - pub netcnt: ::aya_bpf::cty::c_uint, - pub netudpcnt: ::aya_bpf::cty::c_uint, - pub nettcpcnt: ::aya_bpf::cty::c_uint, - pub nettcpconn: ::aya_bpf::cty::c_uint, - pub netreconn: ::aya_bpf::cty::c_uint, - pub rpccnt: ::aya_bpf::cty::c_uint, - pub rpcretrans: ::aya_bpf::cty::c_uint, - pub rpcauthrefresh: ::aya_bpf::cty::c_uint, - pub rpcgarbage: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_program { - pub name: *const ::aya_bpf::cty::c_char, - pub number: u32_, - pub nrvers: ::aya_bpf::cty::c_uint, - pub version: *mut *const rpc_version, - pub stats: *mut rpc_stat, - pub pipe_dir_name: *const ::aya_bpf::cty::c_char, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct svc_stat { - pub program: *mut svc_program, - pub netcnt: ::aya_bpf::cty::c_uint, - pub netudpcnt: ::aya_bpf::cty::c_uint, - pub nettcpcnt: ::aya_bpf::cty::c_uint, - pub nettcpconn: ::aya_bpf::cty::c_uint, - pub rpccnt: ::aya_bpf::cty::c_uint, - pub rpcbadfmt: ::aya_bpf::cty::c_uint, - pub rpcbadauth: ::aya_bpf::cty::c_uint, - pub rpcbadclnt: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct svc_program { - pub pg_next: *mut svc_program, - pub pg_prog: u32_, - pub pg_lovers: ::aya_bpf::cty::c_uint, - pub pg_hivers: ::aya_bpf::cty::c_uint, - pub pg_nvers: ::aya_bpf::cty::c_uint, - pub pg_vers: *mut *const svc_version, - pub pg_name: *mut ::aya_bpf::cty::c_char, - pub pg_class: *mut ::aya_bpf::cty::c_char, - pub pg_stats: *mut svc_stat, - pub pg_authenticate: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub pg_init_request: ::core::option::Option< + pub get_ts_info: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut svc_rqst, - arg2: *const svc_program, - arg3: *mut svc_process_info, - ) -> __be32, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_ts_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub pg_rpcbind_set: ::core::option::Option< + pub get_mm: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut net, - arg2: *const svc_program, - arg3: u32_, - arg4: ::aya_bpf::cty::c_int, - arg5: ::aya_bpf::cty::c_ushort, - arg6: ::aya_bpf::cty::c_ushort, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_mm_state, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_mm: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_mm_cfg, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_mm_stats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_mm_stats, + ), + >, + pub port_get_default_prio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_set_default_prio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_get_dscp_prio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_add_dscp_prio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + arg4: u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_del_dscp_prio: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u8_, + arg4: u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub suspend: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_ebpf::cty::c_int, + >, + pub resume: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_ebpf::cty::c_int, + >, + pub port_enable: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut phy_device, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_disable: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int), + >, + pub port_set_mac_address: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const ::aya_ebpf::cty::c_uchar, + ) -> ::aya_ebpf::cty::c_int, + >, + pub preferred_default_local_cpu_port: + ::core::option::Option *mut dsa_port>, + pub set_mac_eee: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_eee, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_mac_eee: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_eee, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_eeprom_len: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch) -> ::aya_ebpf::cty::c_int, + >, + pub get_eeprom: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_eeprom: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_regs_len: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_regs: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_regs, + arg4: *mut ::aya_ebpf::cty::c_void, + ), + >, + pub port_prechangeupper: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut netdev_notifier_changeupper_info, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_ageing_time: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_bridge_join: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: dsa_bridge, + arg4: *mut bool_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_bridge_leave: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int, arg3: dsa_bridge), + >, + pub port_stp_state_set: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int, arg3: u8_), + >, + pub port_mst_state_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_mst_state, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fast_age: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int), + >, + pub port_vlan_fast_age: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_pre_bridge_flags: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: switchdev_brport_flags, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_bridge_flags: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: switchdev_brport_flags, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_set_host_flood: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: bool_, + arg4: bool_, + ), + >, + pub port_vlan_filtering: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: bool_, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_vlan_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_port_vlan, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_vlan_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_port_vlan, + ) -> ::aya_ebpf::cty::c_int, + >, + pub vlan_msti_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: dsa_bridge, + arg3: *const switchdev_vlan_msti, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fdb_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const ::aya_ebpf::cty::c_uchar, + arg4: u16_, + arg5: dsa_db, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fdb_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const ::aya_ebpf::cty::c_uchar, + arg4: u16_, + arg5: dsa_db, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_fdb_dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: dsa_fdb_dump_cb_t, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lag_fdb_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: dsa_lag, + arg3: *const ::aya_ebpf::cty::c_uchar, + arg4: u16_, + arg5: dsa_db, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lag_fdb_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: dsa_lag, + arg3: *const ::aya_ebpf::cty::c_uchar, + arg4: u16_, + arg5: dsa_db, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mdb_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_port_mdb, + arg4: dsa_db, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mdb_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_port_mdb, + arg4: dsa_db, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_rxnfc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_rxnfc, + arg4: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_rxnfc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ethtool_rxnfc, + ) -> ::aya_ebpf::cty::c_int, + >, + pub cls_flower_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut flow_cls_offload, + arg4: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub cls_flower_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut flow_cls_offload, + arg4: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub cls_flower_stats: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut flow_cls_offload, + arg4: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mirror_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut dsa_mall_mirror_tc_entry, + arg4: bool_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mirror_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut dsa_mall_mirror_tc_entry, + ), + >, + pub port_policer_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut dsa_mall_policer_tc_entry, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_policer_del: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: ::aya_ebpf::cty::c_int), + >, + pub port_setup_tc: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: tc_setup_type::Type, + arg4: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, + >, + pub crosschip_bridge_join: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + arg5: dsa_bridge, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub crosschip_bridge_leave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + arg5: dsa_bridge, + ), + >, + pub crosschip_lag_change: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub crosschip_lag_join: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: dsa_lag, + arg5: *mut netdev_lag_upper_info, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub crosschip_lag_leave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: dsa_lag, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_hwtstamp_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ifreq, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_hwtstamp_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut ifreq, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_txtstamp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut sk_buff, + ), + >, + pub port_rxtstamp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut sk_buff, + arg4: ::aya_ebpf::cty::c_uint, + ) -> bool_, + >, + pub devlink_param_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: u32_, + arg3: *mut devlink_param_gset_ctx, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_param_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: u32_, + arg3: *mut devlink_param_gset_ctx, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_info_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: *mut devlink_info_req, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_pool_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: *mut devlink_sb_pool_info, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_pool_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_uint, + arg3: u16_, + arg4: u32_, + arg5: devlink_sb_threshold_type::Type, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_port_pool_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: u16_, + arg5: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_port_pool_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: u16_, + arg5: u32_, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_tc_pool_bind_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: u16_, + arg5: devlink_sb_pool_type::Type, + arg6: *mut u16_, + arg7: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_tc_pool_bind_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: u16_, + arg5: devlink_sb_pool_type::Type, + arg6: u16_, + arg7: u32_, + arg8: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_occ_snapshot: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_occ_max_clear: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_occ_port_pool_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: u16_, + arg5: *mut u32_, + arg6: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub devlink_sb_occ_tc_port_bind_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_uint, + arg4: u16_, + arg5: devlink_sb_pool_type::Type, + arg6: *mut u32_, + arg7: *mut u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_change_mtu: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_max_mtu: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_lag_change: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_lag_join: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: dsa_lag, + arg4: *mut netdev_lag_upper_info, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_lag_leave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: dsa_lag, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_hsr_join: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut net_device, + arg4: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_hsr_leave: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut net_device, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mrp_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_mrp, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mrp_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_mrp, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mrp_add_ring_role: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_ring_role_mrp, + ) -> ::aya_ebpf::cty::c_int, + >, + pub port_mrp_del_ring_role: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: *const switchdev_obj_ring_role_mrp, + ) -> ::aya_ebpf::cty::c_int, + >, + pub tag_8021q_vlan_add: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u16_, + arg4: u16_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub tag_8021q_vlan_del: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dsa_switch, + arg2: ::aya_ebpf::cty::c_int, + arg3: u16_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub conduit_state_change: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut dsa_switch, arg2: *const net_device, arg3: bool_), >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rpc_xprt_iter_ops { - pub xpi_rewind: ::core::option::Option, - pub xpi_xprt: - ::core::option::Option *mut rpc_xprt>, - pub xpi_next: - ::core::option::Option *mut rpc_xprt>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rpc_version { - pub number: u32_, - pub nrprocs: ::aya_bpf::cty::c_uint, - pub procs: *const rpc_procinfo, - pub counts: *mut ::aya_bpf::cty::c_uint, +pub struct iw_request_info { + pub cmd: __u16, + pub flags: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_fh { - pub size: ::aya_bpf::cty::c_ushort, - pub data: [::aya_bpf::cty::c_uchar; 128usize], -} -pub mod nfs3_stable_how { - pub type Type = ::aya_bpf::cty::c_int; - pub const NFS_UNSTABLE: Type = 0; - pub const NFS_DATA_SYNC: Type = 1; - pub const NFS_FILE_SYNC: Type = 2; - pub const NFS_INVALID_STABLE_HOW: Type = -1; +pub struct iw_spy_data { + pub spy_number: ::aya_ebpf::cty::c_int, + pub spy_address: [u_char; 48usize], + pub spy_stat: [iw_quality; 8usize], + pub spy_thr_low: iw_quality, + pub spy_thr_high: iw_quality, + pub spy_thr_under: [u_char; 8usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_label { - pub lfs: u32, - pub pi: u32, - pub len: u32_, - pub label: *mut ::aya_bpf::cty::c_char, +pub struct reset_control { + pub rcdev: *mut reset_controller_dev, + pub list: list_head, + pub id: ::aya_ebpf::cty::c_uint, + pub refcnt: kref, + pub acquired: bool_, + pub shared: bool_, + pub array: bool_, + pub deassert_count: atomic_t, + pub triggered_count: atomic_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_verifier { - pub data: [::aya_bpf::cty::c_char; 8usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs4_stateid_struct { - pub __bindgen_anon_1: nfs4_stateid_struct__bindgen_ty_1, - pub type_: nfs4_stateid_struct__bindgen_ty_2::Type, +pub struct reset_control_ops { + pub reset: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut reset_controller_dev, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub assert: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut reset_controller_dev, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub deassert: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut reset_controller_dev, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub status: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut reset_controller_dev, + arg2: ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] -#[derive(Copy, Clone)] -pub union nfs4_stateid_struct__bindgen_ty_1 { - pub data: [::aya_bpf::cty::c_char; 16usize], - pub __bindgen_anon_1: nfs4_stateid_struct__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct reset_controller_dev { + pub ops: *const reset_control_ops, + pub owner: *mut module, + pub list: list_head, + pub reset_control_head: list_head, + pub dev: *mut device, + pub of_node: *mut device_node, + pub of_reset_n_cells: ::aya_ebpf::cty::c_int, + pub of_xlate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut reset_controller_dev, + arg2: *const of_phandle_args, + ) -> ::aya_ebpf::cty::c_int, + >, + pub nr_resets: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_stateid_struct__bindgen_ty_1__bindgen_ty_1 { - pub seqid: __be32, - pub other: [::aya_bpf::cty::c_char; 12usize], +pub struct folio_batch { + pub nr: ::aya_ebpf::cty::c_uchar, + pub percpu_pvec_drained: bool_, + pub folios: [*mut folio; 15usize], } -pub mod nfs4_stateid_struct__bindgen_ty_2 { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NFS4_INVALID_STATEID_TYPE: Type = 0; - pub const NFS4_SPECIAL_STATEID_TYPE: Type = 1; - pub const NFS4_OPEN_STATEID_TYPE: Type = 2; - pub const NFS4_LOCK_STATEID_TYPE: Type = 3; - pub const NFS4_DELEGATION_STATEID_TYPE: Type = 4; - pub const NFS4_LAYOUT_STATEID_TYPE: Type = 5; - pub const NFS4_PNFS_DS_STATEID_TYPE: Type = 6; - pub const NFS4_REVOKED_STATEID_TYPE: Type = 7; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct dst_cache { + pub cache: *mut dst_cache_pcpu, + pub reset_ts: ::aya_ebpf::cty::c_ulong, } -pub type nfs4_stateid = nfs4_stateid_struct; -pub mod nfs4_change_attr_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR: Type = 0; - pub const NFS4_CHANGE_TYPE_IS_VERSION_COUNTER: Type = 1; - pub const NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS: Type = 2; - pub const NFS4_CHANGE_TYPE_IS_TIME_METADATA: Type = 3; - pub const NFS4_CHANGE_TYPE_IS_UNDEFINED: Type = 4; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct dst_cache_pcpu { + pub refresh_ts: ::aya_ebpf::cty::c_ulong, + pub dst: *mut dst_entry, + pub cookie: u32_, + pub __bindgen_anon_1: dst_cache_pcpu__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct gss_ctx { - pub mech_type: *mut gss_api_mech, - pub internal_ctx_id: *mut ::aya_bpf::cty::c_void, - pub slack: ::aya_bpf::cty::c_uint, - pub align: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union dst_cache_pcpu__bindgen_ty_1 { + pub in_saddr: in_addr, + pub in6_saddr: in6_addr, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct gss_api_mech { - pub gm_list: list_head, - pub gm_owner: *mut module, - pub gm_oid: rpcsec_gss_oid, - pub gm_name: *mut ::aya_bpf::cty::c_char, - pub gm_ops: *const gss_api_ops, - pub gm_pf_num: ::aya_bpf::cty::c_int, - pub gm_pfs: *mut pf_desc, - pub gm_upcall_enctypes: *const ::aya_bpf::cty::c_char, +#[derive(Copy, Clone)] +pub struct mctp_dev { + pub dev: *mut net_device, + pub refs: refcount_t, + pub net: ::aya_ebpf::cty::c_uint, + pub ops: *const mctp_netdev_ops, + pub addrs: *mut u8_, + pub num_addrs: usize, + pub addrs_lock: spinlock_t, + pub rcu: callback_head, } +pub type mctp_eid_t = __u8; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pf_desc { - pub pseudoflavor: u32_, - pub qop: u32_, - pub service: u32_, - pub name: *mut ::aya_bpf::cty::c_char, - pub auth_domain_name: *mut ::aya_bpf::cty::c_char, - pub domain: *mut auth_domain, - pub datatouch: bool_, +#[derive(Copy, Clone)] +pub struct mctp_sk_key { + pub peer_addr: mctp_eid_t, + pub local_addr: mctp_eid_t, + pub tag: __u8, + pub sk: *mut sock, + pub hlist: hlist_node, + pub sklist: hlist_node, + pub lock: spinlock_t, + pub refs: refcount_t, + pub reasm_head: *mut sk_buff, + pub reasm_tailp: *mut *mut sk_buff, + pub reasm_dead: bool_, + pub last_seq: u8_, + pub valid: bool_, + pub expiry: ::aya_ebpf::cty::c_ulong, + pub dev_flow_state: ::aya_ebpf::cty::c_ulong, + pub dev: *mut mctp_dev, + pub manual_alloc: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct auth_domain { - pub ref_: kref, - pub hash: hlist_node, - pub name: *mut ::aya_bpf::cty::c_char, - pub flavour: *mut auth_ops, - pub callback_head: callback_head, +pub struct mctp_netdev_ops { + pub release_flow: + ::core::option::Option, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mnt_namespace { + pub ns: ns_common, + pub root: *mut mount, + pub mounts: rb_root, + pub user_ns: *mut user_namespace, + pub ucounts: *mut ucounts, + pub seq: u64_, + pub poll: wait_queue_head_t, + pub event: u64_, + pub nr_mounts: ::aya_ebpf::cty::c_uint, + pub pending_mounts: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct gss_api_ops { - pub gss_import_sec_context: ::core::option::Option< +pub struct fsnotify_ops { + pub handle_event: ::core::option::Option< unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_void, - arg2: usize, - arg3: *mut gss_ctx, - arg4: *mut time64_t, - arg5: gfp_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub gss_get_mic: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut gss_ctx, arg2: *mut xdr_buf, arg3: *mut xdr_netobj) -> u32_, - >, - pub gss_verify_mic: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut gss_ctx, arg2: *mut xdr_buf, arg3: *mut xdr_netobj) -> u32_, + arg1: *mut fsnotify_group, + arg2: u32_, + arg3: *const ::aya_ebpf::cty::c_void, + arg4: ::aya_ebpf::cty::c_int, + arg5: *mut inode, + arg6: *const qstr, + arg7: u32_, + arg8: *mut fsnotify_iter_info, + ) -> ::aya_ebpf::cty::c_int, >, - pub gss_wrap: ::core::option::Option< + pub handle_inode_event: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut gss_ctx, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut xdr_buf, - arg4: *mut *mut page, - ) -> u32_, + arg1: *mut fsnotify_mark, + arg2: u32_, + arg3: *mut inode, + arg4: *mut inode, + arg5: *const qstr, + arg6: u32_, + ) -> ::aya_ebpf::cty::c_int, >, - pub gss_unwrap: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gss_ctx, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut xdr_buf, - ) -> u32_, + pub free_group_priv: ::core::option::Option, + pub freeing_mark: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fsnotify_mark, arg2: *mut fsnotify_group), >, - pub gss_delete_sec_context: - ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_string { - pub len: ::aya_bpf::cty::c_uint, - pub data: *mut ::aya_bpf::cty::c_char, + pub free_event: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fsnotify_group, arg2: *mut fsnotify_event), + >, + pub free_mark: ::core::option::Option, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_fsid { - pub major: u64, - pub minor: u64, +#[derive(Copy, Clone)] +pub struct inotify_group_private_data { + pub idr_lock: spinlock_t, + pub idr: idr, + pub ucounts: *mut ucounts, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_threshold { - pub bm: __u32, - pub l_type: __u32, - pub rd_sz: __u64, - pub wr_sz: __u64, - pub rd_io_sz: __u64, - pub wr_io_sz: __u64, +#[derive(Copy, Clone)] +pub struct fanotify_group_private_data { + pub merge_hash: *mut hlist_head, + pub access_list: list_head, + pub access_waitq: wait_queue_head_t, + pub flags: ::aya_ebpf::cty::c_int, + pub f_flags: ::aya_ebpf::cty::c_int, + pub ucounts: *mut ucounts, + pub error_events_pool: mempool_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nfs_fattr { - pub valid: ::aya_bpf::cty::c_uint, - pub mode: umode_t, - pub nlink: __u32, - pub uid: kuid_t, - pub gid: kgid_t, - pub rdev: dev_t, - pub size: __u64, - pub du: nfs_fattr__bindgen_ty_1, - pub fsid: nfs_fsid, - pub fileid: __u64, - pub mounted_on_fileid: __u64, - pub atime: timespec64, - pub mtime: timespec64, - pub ctime: timespec64, - pub change_attr: __u64, - pub pre_change_attr: __u64, - pub pre_size: __u64, - pub pre_mtime: timespec64, - pub pre_ctime: timespec64, - pub time_start: ::aya_bpf::cty::c_ulong, - pub gencount: ::aya_bpf::cty::c_ulong, - pub owner_name: *mut nfs4_string, - pub group_name: *mut nfs4_string, - pub mdsthreshold: *mut nfs4_threshold, - pub label: *mut nfs4_label, +pub struct fsnotify_group { + pub ops: *const fsnotify_ops, + pub refcnt: refcount_t, + pub notification_lock: spinlock_t, + pub notification_list: list_head, + pub notification_waitq: wait_queue_head_t, + pub q_len: ::aya_ebpf::cty::c_uint, + pub max_events: ::aya_ebpf::cty::c_uint, + pub priority: ::aya_ebpf::cty::c_uint, + pub shutdown: bool_, + pub flags: ::aya_ebpf::cty::c_int, + pub owner_flags: ::aya_ebpf::cty::c_uint, + pub mark_mutex: mutex, + pub user_waits: atomic_t, + pub marks_list: list_head, + pub fsn_fa: *mut fasync_struct, + pub overflow_event: *mut fsnotify_event, + pub memcg: *mut mem_cgroup, + pub __bindgen_anon_1: fsnotify_group__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub union nfs_fattr__bindgen_ty_1 { - pub nfs2: nfs_fattr__bindgen_ty_1__bindgen_ty_1, - pub nfs3: nfs_fattr__bindgen_ty_1__bindgen_ty_2, +pub union fsnotify_group__bindgen_ty_1 { + pub private: *mut ::aya_ebpf::cty::c_void, + pub inotify_data: inotify_group_private_data, + pub fanotify_data: fanotify_group_private_data, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_fattr__bindgen_ty_1__bindgen_ty_1 { - pub blocksize: __u32, - pub blocks: __u32, +pub struct fsnotify_iter_info { + pub marks: [*mut fsnotify_mark; 5usize], + pub current_group: *mut fsnotify_group, + pub report_mask: ::aya_ebpf::cty::c_uint, + pub srcu_idx: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_fattr__bindgen_ty_1__bindgen_ty_2 { - pub used: __u64, +#[derive(Copy, Clone)] +pub struct fsnotify_mark { + pub mask: __u32, + pub refcnt: refcount_t, + pub group: *mut fsnotify_group, + pub g_list: list_head, + pub lock: spinlock_t, + pub obj_list: hlist_node, + pub connector: *mut fsnotify_mark_connector, + pub ignore_mask: __u32, + pub flags: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_fsinfo { - pub fattr: *mut nfs_fattr, - pub rtmax: __u32, - pub rtpref: __u32, - pub rtmult: __u32, - pub wtmax: __u32, - pub wtpref: __u32, - pub wtmult: __u32, - pub dtpref: __u32, - pub maxfilesize: __u64, - pub time_delta: timespec64, - pub lease_time: __u32, - pub nlayouttypes: __u32, - pub layouttype: [__u32; 8usize], - pub blksize: __u32, - pub clone_blksize: __u32, - pub change_attr_type: nfs4_change_attr_type::Type, - pub xattr_support: __u32, +pub struct fsnotify_event { + pub list: list_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_fsstat { - pub fattr: *mut nfs_fattr, - pub tbytes: __u64, - pub fbytes: __u64, - pub abytes: __u64, - pub tfiles: __u64, - pub ffiles: __u64, - pub afiles: __u64, +#[derive(Copy, Clone)] +pub struct fs_pin { + pub wait: wait_queue_head_t, + pub done: ::aya_ebpf::cty::c_int, + pub s_list: hlist_node, + pub m_list: hlist_node, + pub kill: ::core::option::Option, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_pathconf { - pub fattr: *mut nfs_fattr, - pub max_link: __u32, - pub max_namelen: __u32, +#[derive(Copy, Clone)] +pub struct mount { + pub mnt_hash: hlist_node, + pub mnt_parent: *mut mount, + pub mnt_mountpoint: *mut dentry, + pub mnt: vfsmount, + pub __bindgen_anon_1: mount__bindgen_ty_1, + pub mnt_pcp: *mut mnt_pcp, + pub mnt_mounts: list_head, + pub mnt_child: list_head, + pub mnt_instance: list_head, + pub mnt_devname: *const ::aya_ebpf::cty::c_char, + pub __bindgen_anon_2: mount__bindgen_ty_2, + pub mnt_expire: list_head, + pub mnt_share: list_head, + pub mnt_slave_list: list_head, + pub mnt_slave: list_head, + pub mnt_master: *mut mount, + pub mnt_ns: *mut mnt_namespace, + pub mnt_mp: *mut mountpoint, + pub __bindgen_anon_3: mount__bindgen_ty_3, + pub mnt_umounting: list_head, + pub mnt_fsnotify_marks: *mut fsnotify_mark_connector, + pub mnt_fsnotify_mask: __u32, + pub mnt_id: ::aya_ebpf::cty::c_int, + pub mnt_id_unique: u64_, + pub mnt_group_id: ::aya_ebpf::cty::c_int, + pub mnt_expiry_mark: ::aya_ebpf::cty::c_int, + pub mnt_pins: hlist_head, + pub mnt_stuck_children: hlist_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_change_info { - pub atomic: u32_, - pub before: u64_, - pub after: u64_, +#[derive(Copy, Clone)] +pub union mount__bindgen_ty_1 { + pub mnt_rcu: callback_head, + pub mnt_llist: llist_node, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_slot { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub union mount__bindgen_ty_2 { + pub mnt_node: rb_node, + pub mnt_list: list_head, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_sequence_args { - pub sa_slot: *mut nfs4_slot, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: [u8; 7usize], -} -impl nfs4_sequence_args { - #[inline] - pub fn sa_cache_this(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_sa_cache_this(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn sa_privileged(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_sa_privileged(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - sa_cache_this: u8_, - sa_privileged: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let sa_cache_this: u8 = unsafe { ::core::mem::transmute(sa_cache_this) }; - sa_cache_this as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let sa_privileged: u8 = unsafe { ::core::mem::transmute(sa_privileged) }; - sa_privileged as u64 - }); - __bindgen_bitfield_unit - } +#[derive(Copy, Clone)] +pub union mount__bindgen_ty_3 { + pub mnt_mp_list: hlist_node, + pub mnt_umount: hlist_node, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_sequence_res { - pub sr_slot: *mut nfs4_slot, - pub sr_timestamp: ::aya_bpf::cty::c_ulong, - pub sr_status: ::aya_bpf::cty::c_int, - pub sr_status_flags: u32_, - pub sr_highest_slotid: u32_, - pub sr_target_highest_slotid: u32_, +pub struct mnt_pcp { + pub mnt_count: ::aya_ebpf::cty::c_int, + pub mnt_writers: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_lock_context { - pub count: refcount_t, - pub list: list_head, - pub open_context: *mut nfs_open_context, - pub lockowner: fl_owner_t, - pub io_count: atomic_t, - pub callback_head: callback_head, +pub struct mountpoint { + pub m_hash: hlist_node, + pub m_dentry: *mut dentry, + pub m_list: hlist_head, + pub m_count: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_open_context { - pub lock_context: nfs_lock_context, - pub flock_owner: fl_owner_t, - pub dentry: *mut dentry, - pub cred: *const cred, - pub ll_cred: *mut rpc_cred, - pub state: *mut nfs4_state, - pub mode: fmode_t, - pub flags: ::aya_bpf::cty::c_ulong, - pub error: ::aya_bpf::cty::c_int, - pub list: list_head, - pub mdsthreshold: *mut nfs4_threshold, - pub callback_head: callback_head, +pub struct disk_stats { + pub nsecs: [u64_; 4usize], + pub sectors: [::aya_ebpf::cty::c_ulong; 4usize], + pub ios: [::aya_ebpf::cty::c_ulong; 4usize], + pub merges: [::aya_ebpf::cty::c_ulong; 4usize], + pub io_ticks: ::aya_ebpf::cty::c_ulong, + pub in_flight: [local_t; 2usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nlm_host { - _unused: [u8; 0], +pub struct throtl_service_queue { + pub parent_sq: *mut throtl_service_queue, + pub queued: [list_head; 2usize], + pub nr_queued: [::aya_ebpf::cty::c_uint; 2usize], + pub pending_tree: rb_root_cached, + pub nr_pending: ::aya_ebpf::cty::c_uint, + pub first_pending_disptime: ::aya_ebpf::cty::c_ulong, + pub pending_timer: timer_list, +} +pub mod tca_id { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const TCA_ID_UNSPEC: Type = 0; + pub const TCA_ID_POLICE: Type = 1; + pub const TCA_ID_GACT: Type = 5; + pub const TCA_ID_IPT: Type = 6; + pub const TCA_ID_PEDIT: Type = 7; + pub const TCA_ID_MIRRED: Type = 8; + pub const TCA_ID_NAT: Type = 9; + pub const TCA_ID_XT: Type = 10; + pub const TCA_ID_SKBEDIT: Type = 11; + pub const TCA_ID_VLAN: Type = 12; + pub const TCA_ID_BPF: Type = 13; + pub const TCA_ID_CONNMARK: Type = 14; + pub const TCA_ID_SKBMOD: Type = 15; + pub const TCA_ID_CSUM: Type = 16; + pub const TCA_ID_TUNNEL_KEY: Type = 17; + pub const TCA_ID_SIMP: Type = 22; + pub const TCA_ID_IFE: Type = 25; + pub const TCA_ID_SAMPLE: Type = 26; + pub const TCA_ID_CTINFO: Type = 27; + pub const TCA_ID_MPLS: Type = 28; + pub const TCA_ID_CT: Type = 29; + pub const TCA_ID_GATE: Type = 30; + pub const __TCA_ID_MAX: Type = 255; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_iostats { - _unused: [u8; 0], +pub struct tcf_t { + pub install: __u64, + pub lastuse: __u64, + pub expires: __u64, + pub firstuse: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_auth_info { - pub flavor_len: ::aya_bpf::cty::c_uint, - pub flavors: [rpc_authflavor_t; 12usize], +pub struct tcf_walker { + pub stop: ::aya_ebpf::cty::c_int, + pub skip: ::aya_ebpf::cty::c_int, + pub count: ::aya_ebpf::cty::c_int, + pub nonempty: bool_, + pub cookie: ::aya_ebpf::cty::c_ulong, + pub fn_: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tcf_proto, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut tcf_walker, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fscache_volume { - _unused: [u8; 0], +pub struct tcf_exts { + pub type_: __u32, + pub nr_actions: ::aya_ebpf::cty::c_int, + pub actions: *mut *mut tc_action, + pub net: *mut net, + pub ns_tracker: netns_tracker, + pub miss_cookie_node: *mut tcf_exts_miss_cookie_node, + pub action: ::aya_ebpf::cty::c_int, + pub police: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pnfs_layoutdriver_type { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct tcf_idrinfo { + pub lock: mutex, + pub action_idr: idr, + pub net: *mut net, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nfs_server { - pub nfs_client: *mut nfs_client, - pub client_link: list_head, - pub master_link: list_head, - pub client: *mut rpc_clnt, - pub client_acl: *mut rpc_clnt, - pub nlm_host: *mut nlm_host, - pub io_stats: *mut nfs_iostats, - pub writeback: atomic_long_t, - pub write_congested: ::aya_bpf::cty::c_uint, - pub flags: ::aya_bpf::cty::c_uint, - pub fattr_valid: ::aya_bpf::cty::c_uint, - pub caps: ::aya_bpf::cty::c_uint, - pub rsize: ::aya_bpf::cty::c_uint, - pub rpages: ::aya_bpf::cty::c_uint, - pub wsize: ::aya_bpf::cty::c_uint, - pub wpages: ::aya_bpf::cty::c_uint, - pub wtmult: ::aya_bpf::cty::c_uint, - pub dtsize: ::aya_bpf::cty::c_uint, - pub port: ::aya_bpf::cty::c_ushort, - pub bsize: ::aya_bpf::cty::c_uint, - pub gxasize: ::aya_bpf::cty::c_uint, - pub sxasize: ::aya_bpf::cty::c_uint, - pub lxasize: ::aya_bpf::cty::c_uint, - pub acregmin: ::aya_bpf::cty::c_uint, - pub acregmax: ::aya_bpf::cty::c_uint, - pub acdirmin: ::aya_bpf::cty::c_uint, - pub acdirmax: ::aya_bpf::cty::c_uint, - pub namelen: ::aya_bpf::cty::c_uint, - pub options: ::aya_bpf::cty::c_uint, - pub clone_blksize: ::aya_bpf::cty::c_uint, - pub change_attr_type: nfs4_change_attr_type::Type, - pub fsid: nfs_fsid, - pub maxfilesize: __u64, - pub time_delta: timespec64, - pub mount_time: ::aya_bpf::cty::c_ulong, - pub super_: *mut super_block, - pub s_dev: dev_t, - pub auth_info: nfs_auth_info, - pub fscache: *mut fscache_volume, - pub fscache_uniq: *mut ::aya_bpf::cty::c_char, - pub pnfs_blksize: u32_, - pub attr_bitmask: [u32_; 3usize], - pub attr_bitmask_nl: [u32_; 3usize], - pub exclcreat_bitmask: [u32_; 3usize], - pub cache_consistency_bitmask: [u32_; 3usize], - pub acl_bitmask: u32_, - pub fh_expire_type: u32_, - pub pnfs_curr_ld: *mut pnfs_layoutdriver_type, - pub roc_rpcwaitq: rpc_wait_queue, - pub pnfs_ld_data: *mut ::aya_bpf::cty::c_void, - pub state_owners: rb_root, - pub openowner_id: ida, - pub lockowner_id: ida, - pub state_owners_lru: list_head, - pub layouts: list_head, - pub delegations: list_head, - pub ss_copies: list_head, - pub mig_gen: ::aya_bpf::cty::c_ulong, - pub mig_status: ::aya_bpf::cty::c_ulong, - pub destroy: ::core::option::Option, - pub active: atomic_t, - pub mountd_address: __kernel_sockaddr_storage, - pub mountd_addrlen: usize, - pub mountd_version: u32_, - pub mountd_port: ::aya_bpf::cty::c_ushort, - pub mountd_protocol: ::aya_bpf::cty::c_ushort, - pub uoc_rpcwaitq: rpc_wait_queue, - pub read_hdrsize: ::aya_bpf::cty::c_uint, - pub cred: *const cred, - pub has_sec_mnt_opts: bool_, +pub struct tc_action { + pub ops: *const tc_action_ops, + pub type_: __u32, + pub idrinfo: *mut tcf_idrinfo, + pub tcfa_index: u32_, + pub tcfa_refcnt: refcount_t, + pub tcfa_bindcnt: atomic_t, + pub tcfa_action: ::aya_ebpf::cty::c_int, + pub tcfa_tm: tcf_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub tcfa_bstats: gnet_stats_basic_sync, + pub tcfa_bstats_hw: gnet_stats_basic_sync, + pub tcfa_qstats: gnet_stats_queue, + pub tcfa_rate_est: *mut net_rate_estimator, + pub tcfa_lock: spinlock_t, + pub cpu_bstats: *mut gnet_stats_basic_sync, + pub cpu_bstats_hw: *mut gnet_stats_basic_sync, + pub cpu_qstats: *mut gnet_stats_queue, + pub user_cookie: *mut tc_cookie, + pub goto_chain: *mut tcf_chain, + pub tcfa_flags: u32_, + pub hw_stats: u8_, + pub used_hw_stats: u8_, + pub used_hw_stats_valid: bool_, + pub in_hw_count: u32_, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_subversion { - _unused: [u8; 0], +impl tc_action { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } } +pub type tc_action_priv_destructor = + ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct idmap { - _unused: [u8; 0], +pub struct tc_action_ops { + pub head: list_head, + pub kind: [::aya_ebpf::cty::c_char; 16usize], + pub id: tca_id::Type, + pub net_id: ::aya_ebpf::cty::c_uint, + pub size: usize, + pub owner: *mut module, + pub act: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *const tc_action, + arg3: *mut tcf_result, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dump: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut tc_action, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub cleanup: ::core::option::Option, + pub lookup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut *mut tc_action, + arg3: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub init: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut nlattr, + arg3: *mut nlattr, + arg4: *mut *mut tc_action, + arg5: *mut tcf_proto, + arg6: u32_, + arg7: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub walk: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *mut sk_buff, + arg3: *mut netlink_callback, + arg4: ::aya_ebpf::cty::c_int, + arg5: *const tc_action_ops, + arg6: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub stats_update: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tc_action, + arg2: u64_, + arg3: u64_, + arg4: u64_, + arg5: u64_, + arg6: bool_, + ), + >, + pub get_fill_size: + ::core::option::Option usize>, + pub get_dev: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const tc_action, + arg2: *mut tc_action_priv_destructor, + ) -> *mut net_device, + >, + pub get_psample_group: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const tc_action, + arg2: *mut tc_action_priv_destructor, + ) -> *mut psample_group, + >, + pub offload_act_setup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut tc_action, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut u32_, + arg4: bool_, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_slot_table { - _unused: [u8; 0], +pub struct tc_cookie { + pub data: *mut u8_, + pub len: u32_, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_session { - _unused: [u8; 0], +pub struct io_bitmap { + pub sequence: u64_, + pub refcnt: refcount_t, + pub max: ::aya_ebpf::cty::c_uint, + pub bitmap: [::aya_ebpf::cty::c_ulong; 1024usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs_client { - pub cl_count: refcount_t, - pub cl_mds_count: atomic_t, - pub cl_cons_state: ::aya_bpf::cty::c_int, - pub cl_res_state: ::aya_bpf::cty::c_ulong, - pub cl_flags: ::aya_bpf::cty::c_ulong, - pub cl_addr: __kernel_sockaddr_storage, - pub cl_addrlen: usize, - pub cl_hostname: *mut ::aya_bpf::cty::c_char, - pub cl_acceptor: *mut ::aya_bpf::cty::c_char, - pub cl_share_link: list_head, - pub cl_superblocks: list_head, - pub cl_rpcclient: *mut rpc_clnt, - pub rpc_ops: *const nfs_rpc_ops, - pub cl_proto: ::aya_bpf::cty::c_int, - pub cl_nfs_mod: *mut nfs_subversion, - pub cl_minorversion: u32_, - pub cl_nconnect: ::aya_bpf::cty::c_uint, - pub cl_max_connect: ::aya_bpf::cty::c_uint, - pub cl_principal: *const ::aya_bpf::cty::c_char, - pub cl_ds_clients: list_head, - pub cl_clientid: u64_, - pub cl_confirm: nfs4_verifier, - pub cl_state: ::aya_bpf::cty::c_ulong, - pub cl_lock: spinlock_t, - pub cl_lease_time: ::aya_bpf::cty::c_ulong, - pub cl_last_renewal: ::aya_bpf::cty::c_ulong, - pub cl_renewd: delayed_work, - pub cl_rpcwaitq: rpc_wait_queue, - pub cl_idmap: *mut idmap, - pub cl_owner_id: *const ::aya_bpf::cty::c_char, - pub cl_cb_ident: u32_, - pub cl_mvops: *const nfs4_minor_version_ops, - pub cl_mig_gen: ::aya_bpf::cty::c_ulong, - pub cl_slot_tbl: *mut nfs4_slot_table, - pub cl_seqid: u32_, - pub cl_exchange_flags: u32_, - pub cl_session: *mut nfs4_session, - pub cl_preserve_clid: bool_, - pub cl_serverowner: *mut nfs41_server_owner, - pub cl_serverscope: *mut nfs41_server_scope, - pub cl_implid: *mut nfs41_impl_id, - pub cl_sp4_flags: ::aya_bpf::cty::c_ulong, - pub cl_lock_waitq: wait_queue_head_t, - pub cl_ipaddr: [::aya_bpf::cty::c_char; 48usize], - pub cl_net: *mut net, - pub pending_cb_stateids: list_head, +#[derive(Debug, Copy, Clone)] +pub struct pinctrl { + pub node: list_head, + pub dev: *mut device, + pub states: list_head, + pub state: *mut pinctrl_state, + pub dt_maps: list_head, + pub users: kref, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pnfs_layout_segment { - _unused: [u8; 0], +pub struct pinctrl_state { + pub node: list_head, + pub name: *const ::aya_ebpf::cty::c_char, + pub settings: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_seqid { - pub sequence: *mut nfs_seqid_counter, - pub list: list_head, - pub task: *mut rpc_task, +pub struct xdp_desc { + pub addr: __u64, + pub len: __u32, + pub options: __u32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_write_verifier { - pub data: [::aya_bpf::cty::c_char; 8usize], +pub struct xsk_buff_pool { + pub dev: *mut device, + pub netdev: *mut net_device, + pub xsk_tx_list: list_head, + pub xsk_tx_list_lock: spinlock_t, + pub users: refcount_t, + pub umem: *mut xdp_umem, + pub work: work_struct, + pub free_list: list_head, + pub xskb_list: list_head, + pub heads_cnt: u32_, + pub queue_id: u16_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub fq: *mut xsk_queue, + pub cq: *mut xsk_queue, + pub dma_pages: *mut dma_addr_t, + pub heads: *mut xdp_buff_xsk, + pub tx_descs: *mut xdp_desc, + pub chunk_mask: u64_, + pub addrs_cnt: u64_, + pub free_list_cnt: u32_, + pub dma_pages_cnt: u32_, + pub free_heads_cnt: u32_, + pub headroom: u32_, + pub chunk_size: u32_, + pub chunk_shift: u32_, + pub frame_len: u32_, + pub tx_metadata_len: u8_, + pub cached_need_wakeup: u8_, + pub uses_need_wakeup: bool_, + pub dma_need_sync: bool_, + pub unaligned: bool_, + pub tx_sw_csum: bool_, + pub addrs: *mut ::aya_ebpf::cty::c_void, + pub cq_lock: spinlock_t, + pub free_heads: __IncompleteArrayField<*mut xdp_buff_xsk>, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, +} +impl xsk_buff_pool { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_writeverf { - pub verifier: nfs_write_verifier, - pub committed: nfs3_stable_how::Type, +pub struct xdp_umem { + pub addrs: *mut ::aya_ebpf::cty::c_void, + pub size: u64_, + pub headroom: u32_, + pub chunk_size: u32_, + pub chunks: u32_, + pub npgs: u32_, + pub user: *mut user_struct, + pub users: refcount_t, + pub flags: u8_, + pub tx_metadata_len: u8_, + pub zc: bool_, + pub pgs: *mut *mut page, + pub id: ::aya_ebpf::cty::c_int, + pub xsk_dma_list: list_head, + pub work: work_struct, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs_pgio_args { - pub seq_args: nfs4_sequence_args, - pub fh: *mut nfs_fh, - pub context: *mut nfs_open_context, - pub lock_context: *mut nfs_lock_context, - pub stateid: nfs4_stateid, - pub offset: __u64, - pub count: __u32, - pub pgbase: ::aya_bpf::cty::c_uint, - pub pages: *mut *mut page, - pub __bindgen_anon_1: nfs_pgio_args__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct xsk_queue { + pub ring_mask: u32_, + pub nentries: u32_, + pub cached_prod: u32_, + pub cached_cons: u32_, + pub ring: *mut xdp_ring, + pub invalid_descs: u64_, + pub queue_empty_descs: u64_, + pub ring_vmalloc_size: usize, } #[repr(C)] -#[derive(Copy, Clone)] -pub union nfs_pgio_args__bindgen_ty_1 { - pub replen: ::aya_bpf::cty::c_uint, - pub __bindgen_anon_1: nfs_pgio_args__bindgen_ty_1__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct xdp_buff_xsk { + pub xdp: xdp_buff, + pub cb: [u8_; 24usize], + pub dma: dma_addr_t, + pub frame_dma: dma_addr_t, + pub pool: *mut xsk_buff_pool, + pub orig_addr: u64_, + pub free_list_node: list_head, + pub xskb_list_node: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_pgio_args__bindgen_ty_1__bindgen_ty_1 { - pub bitmask: *const u32_, - pub bitmask_store: [u32_; 3usize], - pub stable: nfs3_stable_how::Type, +pub struct xdp_ring { + pub producer: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub __bindgen_padding_0: u32, + pub pad1: u32_, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, + pub __bindgen_padding_1: u32, + pub consumer: u32_, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 56usize]>, + pub __bindgen_padding_2: u32, + pub pad2: u32_, + pub flags: u32_, + pub _bitfield_align_4: [u8; 0], + pub _bitfield_4: __BindgenBitfieldUnit<[u8; 56usize]>, + pub pad3: u32_, + pub _bitfield_align_5: [u8; 0], + pub _bitfield_5: __BindgenBitfieldUnit<[u8; 56usize]>, + pub __bindgen_padding_3: u32, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nfs_pgio_res { - pub seq_res: nfs4_sequence_res, - pub fattr: *mut nfs_fattr, - pub count: __u64, - pub op_status: __u32, - pub __bindgen_anon_1: nfs_pgio_res__bindgen_ty_1, +pub struct pipe_inode_info { + pub mutex: mutex, + pub rd_wait: wait_queue_head_t, + pub wr_wait: wait_queue_head_t, + pub head: ::aya_ebpf::cty::c_uint, + pub tail: ::aya_ebpf::cty::c_uint, + pub max_usage: ::aya_ebpf::cty::c_uint, + pub ring_size: ::aya_ebpf::cty::c_uint, + pub nr_accounted: ::aya_ebpf::cty::c_uint, + pub readers: ::aya_ebpf::cty::c_uint, + pub writers: ::aya_ebpf::cty::c_uint, + pub files: ::aya_ebpf::cty::c_uint, + pub r_counter: ::aya_ebpf::cty::c_uint, + pub w_counter: ::aya_ebpf::cty::c_uint, + pub poll_usage: bool_, + pub note_loss: bool_, + pub tmp_page: *mut page, + pub fasync_readers: *mut fasync_struct, + pub fasync_writers: *mut fasync_struct, + pub bufs: *mut pipe_buffer, + pub user: *mut user_struct, + pub watch_queue: *mut watch_queue, } #[repr(C)] -#[derive(Copy, Clone)] -pub union nfs_pgio_res__bindgen_ty_1 { - pub __bindgen_anon_1: nfs_pgio_res__bindgen_ty_1__bindgen_ty_1, - pub __bindgen_anon_2: nfs_pgio_res__bindgen_ty_1__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct user_event_mm { + pub mms_link: list_head, + pub enablers: list_head, + pub mm: *mut mm_struct, + pub next: *mut user_event_mm, + pub refcnt: refcount_t, + pub tasks: refcount_t, + pub put_rwork: rcu_work, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_pgio_res__bindgen_ty_1__bindgen_ty_1 { - pub replen: ::aya_bpf::cty::c_uint, - pub eof: ::aya_bpf::cty::c_int, - pub scratch: *mut ::aya_bpf::cty::c_void, +pub struct pipe_buffer { + pub page: *mut page, + pub offset: ::aya_ebpf::cty::c_uint, + pub len: ::aya_ebpf::cty::c_uint, + pub ops: *const pipe_buf_operations, + pub flags: ::aya_ebpf::cty::c_uint, + pub private: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_pgio_res__bindgen_ty_1__bindgen_ty_2 { - pub verf: *mut nfs_writeverf, - pub server: *const nfs_server, +pub struct pipe_buf_operations { + pub confirm: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut pipe_inode_info, + arg2: *mut pipe_buffer, + ) -> ::aya_ebpf::cty::c_int, + >, + pub release: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut pipe_inode_info, arg2: *mut pipe_buffer), + >, + pub try_steal: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut pipe_inode_info, arg2: *mut pipe_buffer) -> bool_, + >, + pub get: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut pipe_inode_info, arg2: *mut pipe_buffer) -> bool_, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_commitargs { - pub seq_args: nfs4_sequence_args, - pub fh: *mut nfs_fh, - pub offset: __u64, - pub count: __u32, - pub bitmask: *const u32_, +pub struct fiemap_extent_info { + pub fi_flags: ::aya_ebpf::cty::c_uint, + pub fi_extents_mapped: ::aya_ebpf::cty::c_uint, + pub fi_extents_max: ::aya_ebpf::cty::c_uint, + pub fi_extents_start: *mut fiemap_extent, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_commitres { - pub seq_res: nfs4_sequence_res, - pub op_status: __u32, - pub fattr: *mut nfs_fattr, - pub verf: *mut nfs_writeverf, - pub server: *const nfs_server, +pub struct fileattr { + pub flags: u32_, + pub fsx_xflags: u32_, + pub fsx_extsize: u32_, + pub fsx_nextents: u32_, + pub fsx_projid: u32_, + pub fsx_cowextsize: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 3usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs_removeargs { - pub seq_args: nfs4_sequence_args, - pub fh: *const nfs_fh, - pub name: qstr, +impl fileattr { + #[inline] + pub fn flags_valid(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_flags_valid(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn fsx_valid(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_fsx_valid(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + flags_valid: bool_, + fsx_valid: bool_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let flags_valid: u8 = unsafe { ::core::mem::transmute(flags_valid) }; + flags_valid as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let fsx_valid: u8 = unsafe { ::core::mem::transmute(fsx_valid) }; + fsx_valid as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_removeres { - pub seq_res: nfs4_sequence_res, - pub server: *mut nfs_server, - pub dir_attr: *mut nfs_fattr, - pub cinfo: nfs4_change_info, +pub struct fiemap_extent { + pub fe_logical: __u64, + pub fe_physical: __u64, + pub fe_length: __u64, + pub fe_reserved64: [__u64; 2usize], + pub fe_flags: __u32, + pub fe_reserved: [__u32; 3usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_renameargs { - pub seq_args: nfs4_sequence_args, - pub old_dir: *const nfs_fh, - pub new_dir: *const nfs_fh, - pub old_name: *const qstr, - pub new_name: *const qstr, +pub struct io_cache_entry { + pub node: io_wq_work_node, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_renameres { - pub seq_res: nfs4_sequence_res, - pub server: *mut nfs_server, - pub old_cinfo: nfs4_change_info, - pub old_fattr: *mut nfs_fattr, - pub new_cinfo: nfs4_change_info, - pub new_fattr: *mut nfs_fattr, +#[derive(Copy, Clone)] +pub struct io_rsrc_put { + pub tag: u64_, + pub __bindgen_anon_1: io_rsrc_put__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_entry { - pub ino: __u64, - pub cookie: __u64, - pub name: *const ::aya_bpf::cty::c_char, - pub len: ::aya_bpf::cty::c_uint, - pub eof: ::aya_bpf::cty::c_int, - pub fh: *mut nfs_fh, - pub fattr: *mut nfs_fattr, - pub d_type: ::aya_bpf::cty::c_uchar, - pub server: *mut nfs_server, +#[derive(Copy, Clone)] +pub union io_rsrc_put__bindgen_ty_1 { + pub rsrc: *mut ::aya_ebpf::cty::c_void, + pub file: *mut file, + pub buf: *mut io_mapped_ubuf, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_readdir_arg { - pub dentry: *mut dentry, - pub cred: *const cred, - pub verf: *mut __be32, - pub cookie: u64_, - pub pages: *mut *mut page, - pub page_len: ::aya_bpf::cty::c_uint, - pub plus: bool_, +#[derive(Copy, Clone)] +pub struct io_rsrc_node { + pub __bindgen_anon_1: io_rsrc_node__bindgen_ty_1, + pub refs: ::aya_ebpf::cty::c_int, + pub empty: bool_, + pub type_: u16_, + pub node: list_head, + pub item: io_rsrc_put, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_readdir_res { - pub verf: *mut __be32, +#[derive(Copy, Clone)] +pub union io_rsrc_node__bindgen_ty_1 { + pub cache: io_cache_entry, + pub ctx: *mut io_ring_ctx, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_pathname { - pub ncomponents: ::aya_bpf::cty::c_uint, - pub components: [nfs4_string; 512usize], +#[derive(Debug)] +pub struct io_mapped_ubuf { + pub ubuf: u64_, + pub ubuf_end: u64_, + pub nr_bvecs: ::aya_ebpf::cty::c_uint, + pub acct_pages: ::aya_ebpf::cty::c_ulong, + pub bvec: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_fs_location { - pub nservers: ::aya_bpf::cty::c_uint, - pub servers: [nfs4_string; 10usize], - pub rootpath: nfs4_pathname, +pub struct io_rsrc_data { + pub ctx: *mut io_ring_ctx, + pub tags: *mut *mut u64_, + pub nr: ::aya_ebpf::cty::c_uint, + pub rsrc_type: u16_, + pub quiesce: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_fs_locations { - pub fattr: *mut nfs_fattr, - pub server: *const nfs_server, - pub fs_path: nfs4_pathname, - pub nlocations: ::aya_bpf::cty::c_int, - pub locations: [nfs4_fs_location; 10usize], +pub struct pin_cookie {} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct __call_single_data { + pub node: __call_single_node, + pub func: smp_call_func_t, + pub info: *mut ::aya_ebpf::cty::c_void, } +pub type call_single_data_t = __call_single_data; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfstime4 { - pub seconds: u64_, - pub nseconds: u32_, +#[derive(Copy, Clone)] +pub struct dl_bw { + pub lock: raw_spinlock_t, + pub bw: u64_, + pub total_bw: u64_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pnfs_commit_ops { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct cpudl { + pub lock: raw_spinlock_t, + pub size: ::aya_ebpf::cty::c_int, + pub free_cpus: cpumask_var_t, + pub elements: *mut cpudl_item, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pnfs_ds_commit_info { - pub commits: list_head, - pub nwritten: ::aya_bpf::cty::c_uint, - pub ncommitting: ::aya_bpf::cty::c_uint, - pub ops: *const pnfs_commit_ops, +pub struct cpupri_vec { + pub count: atomic_t, + pub mask: cpumask_var_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs41_server_owner { - pub minor_id: u64, - pub major_id_sz: u32, - pub major_id: [::aya_bpf::cty::c_char; 1024usize], +pub struct cpupri { + pub pri_to_cpu: [cpupri_vec; 101usize], + pub cpu_to_pri: *mut ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct root_domain { + pub refcount: atomic_t, + pub rto_count: atomic_t, + pub rcu: callback_head, + pub span: cpumask_var_t, + pub online: cpumask_var_t, + pub overload: ::aya_ebpf::cty::c_int, + pub overutilized: ::aya_ebpf::cty::c_int, + pub dlo_mask: cpumask_var_t, + pub dlo_count: atomic_t, + pub dl_bw: dl_bw, + pub cpudl: cpudl, + pub visit_gen: u64_, + pub rto_push_work: irq_work, + pub rto_lock: raw_spinlock_t, + pub rto_loop: ::aya_ebpf::cty::c_int, + pub rto_cpu: ::aya_ebpf::cty::c_int, + pub rto_loop_next: atomic_t, + pub rto_loop_start: atomic_t, + pub rto_mask: cpumask_var_t, + pub cpupri: cpupri, + pub max_cpu_capacity: ::aya_ebpf::cty::c_ulong, + pub pd: *mut perf_domain, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cfs_rq { + pub load: load_weight, + pub nr_running: ::aya_ebpf::cty::c_uint, + pub h_nr_running: ::aya_ebpf::cty::c_uint, + pub idle_nr_running: ::aya_ebpf::cty::c_uint, + pub idle_h_nr_running: ::aya_ebpf::cty::c_uint, + pub avg_vruntime: s64, + pub avg_load: u64_, + pub exec_clock: u64_, + pub min_vruntime: u64_, + pub forceidle_seq: ::aya_ebpf::cty::c_uint, + pub min_vruntime_fi: u64_, + pub tasks_timeline: rb_root_cached, + pub curr: *mut sched_entity, + pub next: *mut sched_entity, + pub nr_spread_over: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub avg: sched_avg, + pub removed: cfs_rq__bindgen_ty_1, + pub last_update_tg_load_avg: u64_, + pub tg_load_avg_contrib: ::aya_ebpf::cty::c_ulong, + pub propagate: ::aya_ebpf::cty::c_long, + pub prop_runnable_sum: ::aya_ebpf::cty::c_long, + pub h_load: ::aya_ebpf::cty::c_ulong, + pub last_h_load_update: u64_, + pub h_load_next: *mut sched_entity, + pub rq: *mut rq, + pub on_list: ::aya_ebpf::cty::c_int, + pub leaf_cfs_rq_list: list_head, + pub tg: *mut task_group, + pub idle: ::aya_ebpf::cty::c_int, + pub runtime_enabled: ::aya_ebpf::cty::c_int, + pub runtime_remaining: s64, + pub throttled_pelt_idle: u64_, + pub throttled_clock: u64_, + pub throttled_clock_pelt: u64_, + pub throttled_clock_pelt_time: u64_, + pub throttled_clock_self: u64_, + pub throttled_clock_self_time: u64_, + pub throttled: ::aya_ebpf::cty::c_int, + pub throttle_count: ::aya_ebpf::cty::c_int, + pub throttled_list: list_head, + pub throttled_csd_list: list_head, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cfs_rq__bindgen_ty_1 { + pub lock: raw_spinlock_t, + pub nr: ::aya_ebpf::cty::c_int, + pub load_avg: ::aya_ebpf::cty::c_ulong, + pub util_avg: ::aya_ebpf::cty::c_ulong, + pub runnable_avg: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl cfs_rq__bindgen_ty_1 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +impl cfs_rq { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs41_server_scope { - pub server_scope_sz: u32, - pub server_scope: [::aya_bpf::cty::c_char; 1024usize], +pub struct uclamp_bucket { + pub _bitfield_align_1: [u64; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +} +impl uclamp_bucket { + #[inline] + pub fn value(&self) -> ::aya_ebpf::cty::c_ulong { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 11u8) as u64) } + } + #[inline] + pub fn set_value(&mut self, val: ::aya_ebpf::cty::c_ulong) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 11u8, val as u64) + } + } + #[inline] + pub fn tasks(&self) -> ::aya_ebpf::cty::c_ulong { + unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 53u8) as u64) } + } + #[inline] + pub fn set_tasks(&mut self, val: ::aya_ebpf::cty::c_ulong) { + unsafe { + let val: u64 = ::core::mem::transmute(val); + self._bitfield_1.set(11usize, 53u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + value: ::aya_ebpf::cty::c_ulong, + tasks: ::aya_ebpf::cty::c_ulong, + ) -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 11u8, { + let value: u64 = unsafe { ::core::mem::transmute(value) }; + value as u64 + }); + __bindgen_bitfield_unit.set(11usize, 53u8, { + let tasks: u64 = unsafe { ::core::mem::transmute(tasks) }; + tasks as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs41_impl_id { - pub domain: [::aya_bpf::cty::c_char; 1025usize], - pub name: [::aya_bpf::cty::c_char; 1025usize], - pub date: nfstime4, +pub struct uclamp_rq { + pub value: ::aya_ebpf::cty::c_uint, + pub bucket: [uclamp_bucket; 5usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_page_array { - pub pagevec: *mut *mut page, - pub npages: ::aya_bpf::cty::c_uint, - pub page_array: [*mut page; 8usize], +pub struct rt_prio_array { + pub bitmap: [::aya_ebpf::cty::c_ulong; 2usize], + pub queue: [list_head; 100usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rt_rq { + pub active: rt_prio_array, + pub rt_nr_running: ::aya_ebpf::cty::c_uint, + pub rr_nr_running: ::aya_ebpf::cty::c_uint, + pub highest_prio: rt_rq__bindgen_ty_1, + pub overloaded: ::aya_ebpf::cty::c_int, + pub pushable_tasks: plist_head, + pub rt_queued: ::aya_ebpf::cty::c_int, + pub rt_throttled: ::aya_ebpf::cty::c_int, + pub rt_time: u64_, + pub rt_runtime: u64_, + pub rt_runtime_lock: raw_spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_page { - _unused: [u8; 0], +pub struct rt_rq__bindgen_ty_1 { + pub curr: ::aya_ebpf::cty::c_int, + pub next: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_rw_ops { - _unused: [u8; 0], +pub struct dl_rq { + pub root: rb_root_cached, + pub dl_nr_running: ::aya_ebpf::cty::c_uint, + pub earliest_dl: dl_rq__bindgen_ty_1, + pub overloaded: ::aya_ebpf::cty::c_int, + pub pushable_dl_tasks_root: rb_root_cached, + pub running_bw: u64_, + pub this_bw: u64_, + pub extra_bw: u64_, + pub max_bw: u64_, + pub bw_ratio: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_io_completion { - _unused: [u8; 0], +pub struct dl_rq__bindgen_ty_1 { + pub curr: u64_, + pub next: u64_, } +pub type cpu_stop_fn_t = ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void) -> ::aya_ebpf::cty::c_int, +>; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_direct_req { - _unused: [u8; 0], +pub struct cpu_stop_work { + pub list: list_head, + pub fn_: cpu_stop_fn_t, + pub caller: ::aya_ebpf::cty::c_ulong, + pub arg: *mut ::aya_ebpf::cty::c_void, + pub done: *mut cpu_stop_done, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nfs_pgio_header { - pub inode: *mut inode, - pub cred: *const cred, - pub pages: list_head, - pub req: *mut nfs_page, - pub verf: nfs_writeverf, - pub rw_mode: fmode_t, - pub lseg: *mut pnfs_layout_segment, - pub io_start: loff_t, - pub mds_ops: *const rpc_call_ops, - pub release: ::core::option::Option, - pub completion_ops: *const nfs_pgio_completion_ops, - pub rw_ops: *const nfs_rw_ops, - pub io_completion: *mut nfs_io_completion, - pub dreq: *mut nfs_direct_req, - pub netfs: *mut ::aya_bpf::cty::c_void, - pub pnfs_error: ::aya_bpf::cty::c_int, - pub error: ::aya_bpf::cty::c_int, - pub good_bytes: ::aya_bpf::cty::c_uint, - pub flags: ::aya_bpf::cty::c_ulong, - pub task: rpc_task, - pub fattr: nfs_fattr, - pub args: nfs_pgio_args, - pub res: nfs_pgio_res, - pub timestamp: ::aya_bpf::cty::c_ulong, - pub pgio_done_cb: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut nfs_pgio_header, - ) -> ::aya_bpf::cty::c_int, - >, - pub mds_offset: __u64, - pub page_array: nfs_page_array, - pub ds_clp: *mut nfs_client, - pub ds_commit_idx: u32_, - pub pgio_mirror_idx: u32_, +pub struct rq { + pub __lock: raw_spinlock_t, + pub nr_running: ::aya_ebpf::cty::c_uint, + pub nr_numa_running: ::aya_ebpf::cty::c_uint, + pub nr_preferred_running: ::aya_ebpf::cty::c_uint, + pub numa_migrate_on: ::aya_ebpf::cty::c_uint, + pub last_blocked_load_update_tick: ::aya_ebpf::cty::c_ulong, + pub has_blocked_load: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub nohz_csd: call_single_data_t, + pub nohz_tick_stopped: ::aya_ebpf::cty::c_uint, + pub nohz_flags: atomic_t, + pub ttwu_pending: ::aya_ebpf::cty::c_uint, + pub nr_switches: u64_, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 8usize]>, + pub uclamp: [uclamp_rq; 2usize], + pub uclamp_flags: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 24usize]>, + pub cfs: cfs_rq, + pub rt: rt_rq, + pub dl: dl_rq, + pub leaf_cfs_rq_list: list_head, + pub tmp_alone_branch: *mut list_head, + pub nr_uninterruptible: ::aya_ebpf::cty::c_uint, + pub curr: *mut task_struct, + pub idle: *mut task_struct, + pub stop: *mut task_struct, + pub next_balance: ::aya_ebpf::cty::c_ulong, + pub prev_mm: *mut mm_struct, + pub clock_update_flags: ::aya_ebpf::cty::c_uint, + pub clock: u64_, + pub _bitfield_align_4: [u8; 0], + pub _bitfield_4: __BindgenBitfieldUnit<[u8; 40usize]>, + pub clock_task: u64_, + pub clock_pelt: u64_, + pub lost_idle_time: ::aya_ebpf::cty::c_ulong, + pub clock_pelt_idle: u64_, + pub clock_idle: u64_, + pub nr_iowait: atomic_t, + pub last_seen_need_resched_ns: u64_, + pub ticks_without_resched: ::aya_ebpf::cty::c_int, + pub membarrier_state: ::aya_ebpf::cty::c_int, + pub rd: *mut root_domain, + pub sd: *mut sched_domain, + pub cpu_capacity: ::aya_ebpf::cty::c_ulong, + pub balance_callback: *mut balance_callback, + pub nohz_idle_balance: ::aya_ebpf::cty::c_uchar, + pub idle_balance: ::aya_ebpf::cty::c_uchar, + pub misfit_task_load: ::aya_ebpf::cty::c_ulong, + pub active_balance: ::aya_ebpf::cty::c_int, + pub push_cpu: ::aya_ebpf::cty::c_int, + pub active_balance_work: cpu_stop_work, + pub cpu: ::aya_ebpf::cty::c_int, + pub online: ::aya_ebpf::cty::c_int, + pub cfs_tasks: list_head, + pub avg_rt: sched_avg, + pub avg_dl: sched_avg, + pub avg_irq: sched_avg, + pub idle_stamp: u64_, + pub avg_idle: u64_, + pub max_idle_balance_cost: u64_, + pub hotplug_wait: rcuwait, + pub prev_irq_time: u64_, + pub prev_steal_time: u64_, + pub prev_steal_time_rq: u64_, + pub calc_load_update: ::aya_ebpf::cty::c_ulong, + pub calc_load_active: ::aya_ebpf::cty::c_long, + pub _bitfield_align_5: [u8; 0], + pub _bitfield_5: __BindgenBitfieldUnit<[u8; 24usize]>, + pub hrtick_csd: call_single_data_t, + pub hrtick_timer: hrtimer, + pub hrtick_time: ktime_t, + pub rq_sched_info: sched_info, + pub rq_cpu_time: ::aya_ebpf::cty::c_ulonglong, + pub yld_count: ::aya_ebpf::cty::c_uint, + pub sched_count: ::aya_ebpf::cty::c_uint, + pub sched_goidle: ::aya_ebpf::cty::c_uint, + pub ttwu_count: ::aya_ebpf::cty::c_uint, + pub ttwu_local: ::aya_ebpf::cty::c_uint, + pub idle_state: *mut cpuidle_state, + pub nr_pinned: ::aya_ebpf::cty::c_uint, + pub push_busy: ::aya_ebpf::cty::c_uint, + pub push_work: cpu_stop_work, + pub core: *mut rq, + pub core_pick: *mut task_struct, + pub core_enabled: ::aya_ebpf::cty::c_uint, + pub core_sched_seq: ::aya_ebpf::cty::c_uint, + pub core_tree: rb_root, + pub core_task_seq: ::aya_ebpf::cty::c_uint, + pub core_pick_seq: ::aya_ebpf::cty::c_uint, + pub core_cookie: ::aya_ebpf::cty::c_ulong, + pub core_forceidle_count: ::aya_ebpf::cty::c_uint, + pub core_forceidle_seq: ::aya_ebpf::cty::c_uint, + pub core_forceidle_occupation: ::aya_ebpf::cty::c_uint, + pub core_forceidle_start: u64_, + pub scratch_mask: cpumask_var_t, + pub _bitfield_align_6: [u8; 0], + pub _bitfield_6: __BindgenBitfieldUnit<[u8; 8usize]>, + pub cfsb_csd: call_single_data_t, + pub cfsb_csd_list: list_head, + pub _bitfield_align_7: [u8; 0], + pub _bitfield_7: __BindgenBitfieldUnit<[u8; 16usize]>, +} +impl rq { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_3() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_5() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_6() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_7() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_pgio_completion_ops { - pub error_cleanup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut list_head, arg2: ::aya_bpf::cty::c_int), - >, - pub init_hdr: ::core::option::Option, - pub completion: ::core::option::Option, - pub reschedule_io: ::core::option::Option, +#[derive(Copy, Clone)] +pub struct cfs_bandwidth { + pub lock: raw_spinlock_t, + pub period: ktime_t, + pub quota: u64_, + pub runtime: u64_, + pub burst: u64_, + pub runtime_snap: u64_, + pub hierarchical_quota: s64, + pub idle: u8_, + pub period_active: u8_, + pub slack_started: u8_, + pub period_timer: hrtimer, + pub slack_timer: hrtimer, + pub throttled_cfs_rq: list_head, + pub nr_periods: ::aya_ebpf::cty::c_int, + pub nr_throttled: ::aya_ebpf::cty::c_int, + pub nr_burst: ::aya_ebpf::cty::c_int, + pub throttled_time: u64_, + pub burst_time: u64_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_mds_commit_info { - pub rpcs_out: atomic_t, - pub ncommit: atomic_long_t, +#[derive(Copy, Clone)] +pub struct task_group { + pub css: cgroup_subsys_state, + pub se: *mut *mut sched_entity, + pub cfs_rq: *mut *mut cfs_rq, + pub shares: ::aya_ebpf::cty::c_ulong, + pub idle: ::aya_ebpf::cty::c_int, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub load_avg: atomic_long_t, + pub rcu: callback_head, pub list: list_head, + pub parent: *mut task_group, + pub siblings: list_head, + pub children: list_head, + pub autogroup: *mut autogroup, + pub cfs_bandwidth: cfs_bandwidth, + pub uclamp_pct: [::aya_ebpf::cty::c_uint; 2usize], + pub uclamp_req: [uclamp_se; 2usize], + pub uclamp: [uclamp_se; 2usize], + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl task_group { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct autogroup { + pub kref: kref, + pub tg: *mut task_group, + pub lock: rw_semaphore, + pub id: ::aya_ebpf::cty::c_ulong, + pub nice: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_commit_completion_ops { - pub completion: ::core::option::Option, - pub resched_write: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_commit_info, arg2: *mut nfs_page), - >, +pub struct sched_domain_shared { + pub ref_: atomic_t, + pub nr_busy_cpus: atomic_t, + pub has_idle_cores: ::aya_ebpf::cty::c_int, + pub nr_idle_scan: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +pub struct sched_domain { + pub parent: *mut sched_domain, + pub child: *mut sched_domain, + pub groups: *mut sched_group, + pub min_interval: ::aya_ebpf::cty::c_ulong, + pub max_interval: ::aya_ebpf::cty::c_ulong, + pub busy_factor: ::aya_ebpf::cty::c_uint, + pub imbalance_pct: ::aya_ebpf::cty::c_uint, + pub cache_nice_tries: ::aya_ebpf::cty::c_uint, + pub imb_numa_nr: ::aya_ebpf::cty::c_uint, + pub nohz_idle: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, + pub level: ::aya_ebpf::cty::c_int, + pub last_balance: ::aya_ebpf::cty::c_ulong, + pub balance_interval: ::aya_ebpf::cty::c_uint, + pub nr_balance_failed: ::aya_ebpf::cty::c_uint, + pub max_newidle_lb_cost: u64_, + pub last_decay_max_lb_cost: ::aya_ebpf::cty::c_ulong, + pub lb_count: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_failed: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_balanced: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_imbalance: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_gained: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_hot_gained: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_nobusyg: [::aya_ebpf::cty::c_uint; 3usize], + pub lb_nobusyq: [::aya_ebpf::cty::c_uint; 3usize], + pub alb_count: ::aya_ebpf::cty::c_uint, + pub alb_failed: ::aya_ebpf::cty::c_uint, + pub alb_pushed: ::aya_ebpf::cty::c_uint, + pub sbe_count: ::aya_ebpf::cty::c_uint, + pub sbe_balanced: ::aya_ebpf::cty::c_uint, + pub sbe_pushed: ::aya_ebpf::cty::c_uint, + pub sbf_count: ::aya_ebpf::cty::c_uint, + pub sbf_balanced: ::aya_ebpf::cty::c_uint, + pub sbf_pushed: ::aya_ebpf::cty::c_uint, + pub ttwu_wake_remote: ::aya_ebpf::cty::c_uint, + pub ttwu_move_affine: ::aya_ebpf::cty::c_uint, + pub ttwu_move_balance: ::aya_ebpf::cty::c_uint, + pub name: *mut ::aya_ebpf::cty::c_char, + pub __bindgen_anon_1: sched_domain__bindgen_ty_1, + pub shared: *mut sched_domain_shared, + pub span_weight: ::aya_ebpf::cty::c_uint, + pub span: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nfs_commit_data { - pub task: rpc_task, - pub inode: *mut inode, - pub cred: *const cred, - pub fattr: nfs_fattr, - pub verf: nfs_writeverf, - pub pages: list_head, - pub list: list_head, - pub dreq: *mut nfs_direct_req, - pub args: nfs_commitargs, - pub res: nfs_commitres, - pub context: *mut nfs_open_context, - pub lseg: *mut pnfs_layout_segment, - pub ds_clp: *mut nfs_client, - pub ds_commit_index: ::aya_bpf::cty::c_int, - pub lwb: loff_t, - pub mds_ops: *const rpc_call_ops, - pub completion_ops: *const nfs_commit_completion_ops, - pub commit_done_cb: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut nfs_commit_data, - ) -> ::aya_bpf::cty::c_int, - >, - pub flags: ::aya_bpf::cty::c_ulong, +pub union sched_domain__bindgen_ty_1 { + pub private: *mut ::aya_ebpf::cty::c_void, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug)] +pub struct sched_group { + pub next: *mut sched_group, + pub ref_: atomic_t, + pub group_weight: ::aya_ebpf::cty::c_uint, + pub cores: ::aya_ebpf::cty::c_uint, + pub sgc: *mut sched_group_capacity, + pub asym_prefer_cpu: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, + pub cpumask: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, +} +#[repr(C)] +#[derive(Debug)] +pub struct sched_group_capacity { + pub ref_: atomic_t, + pub capacity: ::aya_ebpf::cty::c_ulong, + pub min_capacity: ::aya_ebpf::cty::c_ulong, + pub max_capacity: ::aya_ebpf::cty::c_ulong, + pub next_update: ::aya_ebpf::cty::c_ulong, + pub imbalance: ::aya_ebpf::cty::c_int, + pub id: ::aya_ebpf::cty::c_int, + pub cpumask: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_commit_info { - pub inode: *mut inode, - pub mds: *mut nfs_mds_commit_info, - pub ds: *mut pnfs_ds_commit_info, - pub dreq: *mut nfs_direct_req, - pub completion_ops: *const nfs_commit_completion_ops, +pub struct cpudl_item { + pub dl: u64_, + pub cpu: ::aya_ebpf::cty::c_int, + pub idx: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs_unlinkdata { - pub args: nfs_removeargs, - pub res: nfs_removeres, - pub dentry: *mut dentry, - pub wq: wait_queue_head_t, - pub cred: *const cred, - pub dir_attr: nfs_fattr, - pub timeout: ::aya_bpf::cty::c_long, +#[derive(Debug, Copy, Clone)] +pub struct perf_domain { + pub em_pd: *mut em_perf_domain, + pub next: *mut perf_domain, + pub rcu: callback_head, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs_renamedata { - pub args: nfs_renameargs, - pub res: nfs_renameres, - pub task: rpc_task, - pub cred: *const cred, - pub old_dir: *mut inode, - pub old_dentry: *mut dentry, - pub old_fattr: nfs_fattr, - pub new_dir: *mut inode, - pub new_dentry: *mut dentry, - pub new_fattr: nfs_fattr, - pub complete: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_renamedata), - >, - pub timeout: ::aya_bpf::cty::c_long, - pub cancelled: bool_, +#[derive(Debug, Copy, Clone)] +pub struct balance_callback { + pub next: *mut balance_callback, + pub func: ::core::option::Option, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nlmclnt_operations { - _unused: [u8; 0], +pub struct rq_flags { + pub flags: ::aya_ebpf::cty::c_ulong, + pub cookie: pin_cookie, + pub clock_update_flags: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_client_initdata { - _unused: [u8; 0], +pub struct affinity_context { + pub new_mask: *const cpumask, + pub user_mask: *mut cpumask, + pub flags: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct memory_tier { + pub list: list_head, + pub memory_types: list_head, + pub adistance_start: ::aya_ebpf::cty::c_int, + pub dev: device, + pub lower_tier_mask: nodemask_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs_rpc_ops { - pub version: u32_, - pub dentry_ops: *const dentry_operations, - pub dir_inode_ops: *const inode_operations, - pub file_inode_ops: *const inode_operations, - pub file_ops: *const file_operations, - pub nlmclnt_ops: *const nlmclnt_operations, - pub getroot: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_fsinfo, - ) -> ::aya_bpf::cty::c_int, - >, - pub submount: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fs_context, arg2: *mut nfs_server) -> ::aya_bpf::cty::c_int, - >, - pub try_get_tree: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_bpf::cty::c_int, - >, - pub getattr: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_fattr, - arg4: *mut inode, - ) -> ::aya_bpf::cty::c_int, - >, - pub setattr: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dentry, - arg2: *mut nfs_fattr, - arg3: *mut iattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub lookup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut dentry, - arg3: *mut nfs_fh, - arg4: *mut nfs_fattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub lookupp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut nfs_fh, - arg3: *mut nfs_fattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub access: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut nfs_access_entry, - arg3: *const cred, - ) -> ::aya_bpf::cty::c_int, - >, - pub readlink: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut page, - arg3: ::aya_bpf::cty::c_uint, - arg4: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub create: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut dentry, - arg3: *mut iattr, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub remove: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *mut dentry) -> ::aya_bpf::cty::c_int, - >, - pub unlink_setup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_message, arg2: *mut dentry, arg3: *mut inode), - >, - pub unlink_rpc_prepare: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_unlinkdata), - >, - pub unlink_done: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut inode) -> ::aya_bpf::cty::c_int, - >, - pub rename_setup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_message, arg2: *mut dentry, arg3: *mut dentry), - >, - pub rename_rpc_prepare: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_renamedata), - >, - pub rename_done: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut inode, - arg3: *mut inode, - ) -> ::aya_bpf::cty::c_int, - >, - pub link: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut inode, - arg3: *const qstr, - ) -> ::aya_bpf::cty::c_int, - >, - pub symlink: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut dentry, - arg3: *mut page, - arg4: ::aya_bpf::cty::c_uint, - arg5: *mut iattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub mkdir: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut dentry, - arg3: *mut iattr, - ) -> ::aya_bpf::cty::c_int, - >, - pub rmdir: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *const qstr) -> ::aya_bpf::cty::c_int, - >, - pub readdir: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_readdir_arg, - arg2: *mut nfs_readdir_res, - ) -> ::aya_bpf::cty::c_int, - >, - pub mknod: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut dentry, - arg3: *mut iattr, - arg4: dev_t, - ) -> ::aya_bpf::cty::c_int, - >, - pub statfs: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_fsstat, - ) -> ::aya_bpf::cty::c_int, - >, - pub fsinfo: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_fsinfo, - ) -> ::aya_bpf::cty::c_int, - >, - pub pathconf: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_pathconf, - ) -> ::aya_bpf::cty::c_int, - >, - pub set_capabilities: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_server, arg2: *mut nfs_fh) -> ::aya_bpf::cty::c_int, - >, - pub decode_dirent: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut xdr_stream, - arg2: *mut nfs_entry, - arg3: bool_, - ) -> ::aya_bpf::cty::c_int, - >, - pub pgio_rpc_prepare: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut nfs_pgio_header, - ) -> ::aya_bpf::cty::c_int, - >, - pub read_setup: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_pgio_header, arg2: *mut rpc_message), - >, - pub read_done: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut nfs_pgio_header, - ) -> ::aya_bpf::cty::c_int, - >, - pub write_setup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_pgio_header, - arg2: *mut rpc_message, - arg3: *mut *mut rpc_clnt, - ), - >, - pub write_done: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut nfs_pgio_header, - ) -> ::aya_bpf::cty::c_int, - >, - pub commit_setup: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_commit_data, - arg2: *mut rpc_message, - arg3: *mut *mut rpc_clnt, - ), - >, - pub commit_rpc_prepare: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_commit_data), - >, - pub commit_done: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut rpc_task, - arg2: *mut nfs_commit_data, - ) -> ::aya_bpf::cty::c_int, - >, - pub lock: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut file, - arg2: ::aya_bpf::cty::c_int, - arg3: *mut file_lock, - ) -> ::aya_bpf::cty::c_int, - >, - pub lock_check_bounds: ::core::option::Option< - unsafe extern "C" fn(arg1: *const file_lock) -> ::aya_bpf::cty::c_int, - >, - pub clear_acl_cache: ::core::option::Option, - pub close_context: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_open_context, arg2: ::aya_bpf::cty::c_int), - >, - pub open_context: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: *mut nfs_open_context, - arg3: ::aya_bpf::cty::c_int, - arg4: *mut iattr, - arg5: *mut ::aya_bpf::cty::c_int, - ) -> *mut inode, - >, - pub have_delegation: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: fmode_t) -> ::aya_bpf::cty::c_int, - >, - pub alloc_client: ::core::option::Option< - unsafe extern "C" fn(arg1: *const nfs_client_initdata) -> *mut nfs_client, - >, - pub init_client: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_client, - arg2: *const nfs_client_initdata, - ) -> *mut nfs_client, - >, - pub free_client: ::core::option::Option, - pub create_server: - ::core::option::Option *mut nfs_server>, - pub clone_server: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_fattr, - arg4: rpc_authflavor_t, - ) -> *mut nfs_server, - >, - pub discover_trunking: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_server, arg2: *mut nfs_fh) -> ::aya_bpf::cty::c_int, - >, - pub enable_swap: ::core::option::Option, - pub disable_swap: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs_access_entry { - pub rb_node: rb_node, - pub lru: list_head, - pub fsuid: kuid_t, - pub fsgid: kgid_t, - pub group_info: *mut group_info, - pub timestamp: u64_, - pub mask: __u32, - pub callback_head: callback_head, +pub struct cpuidle_state_usage { + pub disable: ::aya_ebpf::cty::c_ulonglong, + pub usage: ::aya_ebpf::cty::c_ulonglong, + pub time_ns: u64_, + pub above: ::aya_ebpf::cty::c_ulonglong, + pub below: ::aya_ebpf::cty::c_ulonglong, + pub rejected: ::aya_ebpf::cty::c_ulonglong, + pub s2idle_usage: ::aya_ebpf::cty::c_ulonglong, + pub s2idle_time: ::aya_ebpf::cty::c_ulonglong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nfs4_minor_version_ops { - pub minor_version: u32_, - pub init_caps: ::aya_bpf::cty::c_uint, - pub init_client: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_client) -> ::aya_bpf::cty::c_int, - >, - pub shutdown_client: ::core::option::Option, - pub match_stateid: ::core::option::Option< - unsafe extern "C" fn(arg1: *const nfs4_stateid, arg2: *const nfs4_stateid) -> bool_, - >, - pub find_root_sec: ::core::option::Option< +pub struct cpuidle_state { + pub name: [::aya_ebpf::cty::c_char; 16usize], + pub desc: [::aya_ebpf::cty::c_char; 32usize], + pub exit_latency_ns: s64, + pub target_residency_ns: s64, + pub flags: ::aya_ebpf::cty::c_uint, + pub exit_latency: ::aya_ebpf::cty::c_uint, + pub power_usage: ::aya_ebpf::cty::c_int, + pub target_residency: ::aya_ebpf::cty::c_uint, + pub enter: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs_fsinfo, - ) -> ::aya_bpf::cty::c_int, - >, - pub free_lock_state: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_server, arg2: *mut nfs4_lock_state), + arg1: *mut cpuidle_device, + arg2: *mut cpuidle_driver, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub test_and_free_expired: ::core::option::Option< + pub enter_dead: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs4_stateid, - arg3: *const cred, - ) -> ::aya_bpf::cty::c_int, - >, - pub alloc_seqid: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_seqid_counter, arg2: gfp_t) -> *mut nfs_seqid, + arg1: *mut cpuidle_device, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub session_trunk: ::core::option::Option< + pub enter_s2idle: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut rpc_clnt, - arg2: *mut rpc_xprt, - arg3: *mut ::aya_bpf::cty::c_void, - ), + arg1: *mut cpuidle_device, + arg2: *mut cpuidle_driver, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub call_sync_ops: *const rpc_call_ops, - pub reboot_recovery_ops: *const nfs4_state_recovery_ops, - pub nograce_recovery_ops: *const nfs4_state_recovery_ops, - pub state_renewal_ops: *const nfs4_state_maintenance_ops, - pub mig_recovery_ops: *const nfs4_mig_recovery_ops, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs4_state { - pub open_states: list_head, - pub inode_states: list_head, - pub lock_states: list_head, - pub owner: *mut nfs4_state_owner, - pub inode: *mut inode, - pub flags: ::aya_bpf::cty::c_ulong, - pub state_lock: spinlock_t, - pub seqlock: seqlock_t, - pub stateid: nfs4_stateid, - pub open_stateid: nfs4_stateid, - pub n_rdonly: ::aya_bpf::cty::c_uint, - pub n_wronly: ::aya_bpf::cty::c_uint, - pub n_rdwr: ::aya_bpf::cty::c_uint, - pub state: fmode_t, - pub count: refcount_t, - pub waitq: wait_queue_head_t, - pub callback_head: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cache_head { - pub cache_list: hlist_node, - pub expiry_time: time64_t, - pub last_refresh: time64_t, - pub ref_: kref, - pub flags: ::aya_bpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cache_req { - pub defer: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cache_req) -> *mut cache_deferred_req, - >, - pub thread_wait: ::aya_bpf::cty::c_ulong, +pub struct cpuidle_driver_kobj { + _unused: [u8; 0], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cache_deferred_req { - pub hash: hlist_node, - pub recent: list_head, - pub item: *mut cache_head, - pub owner: *mut ::aya_bpf::cty::c_void, - pub revisit: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut cache_deferred_req, arg2: ::aya_bpf::cty::c_int), - >, +pub struct cpuidle_device { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub cpu: ::aya_ebpf::cty::c_uint, + pub next_hrtimer: ktime_t, + pub last_state_idx: ::aya_ebpf::cty::c_int, + pub last_residency_ns: u64_, + pub poll_limit_ns: u64_, + pub forced_idle_latency_limit_ns: u64_, + pub states_usage: [cpuidle_state_usage; 10usize], + pub kobjs: [*mut cpuidle_state_kobj; 10usize], + pub kobj_driver: *mut cpuidle_driver_kobj, + pub kobj_dev: *mut cpuidle_device_kobj, + pub device_list: list_head, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct svc_cred { - pub cr_uid: kuid_t, - pub cr_gid: kgid_t, - pub cr_group_info: *mut group_info, - pub cr_flavor: u32_, - pub cr_raw_principal: *mut ::aya_bpf::cty::c_char, - pub cr_principal: *mut ::aya_bpf::cty::c_char, - pub cr_targ_princ: *mut ::aya_bpf::cty::c_char, - pub cr_gss_mech: *mut gss_api_mech, +impl cpuidle_device { + #[inline] + pub fn registered(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_registered(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn enabled(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_enabled(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn poll_time_limit(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_poll_time_limit(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + registered: ::aya_ebpf::cty::c_uint, + enabled: ::aya_ebpf::cty::c_uint, + poll_time_limit: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let registered: u32 = unsafe { ::core::mem::transmute(registered) }; + registered as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let enabled: u32 = unsafe { ::core::mem::transmute(enabled) }; + enabled as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let poll_time_limit: u32 = unsafe { ::core::mem::transmute(poll_time_limit) }; + poll_time_limit as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct auth_ops { - pub name: *mut ::aya_bpf::cty::c_char, +pub struct cpuidle_driver { + pub name: *const ::aya_ebpf::cty::c_char, pub owner: *mut module, - pub flavour: ::aya_bpf::cty::c_int, - pub accept: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub release: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub domain_release: ::core::option::Option, - pub set_client: - ::core::option::Option ::aya_bpf::cty::c_int>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct svc_cacherep { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct svc_rqst { - pub rq_all: list_head, - pub rq_rcu_head: callback_head, - pub rq_xprt: *mut svc_xprt, - pub rq_addr: __kernel_sockaddr_storage, - pub rq_addrlen: usize, - pub rq_daddr: __kernel_sockaddr_storage, - pub rq_daddrlen: usize, - pub rq_server: *mut svc_serv, - pub rq_pool: *mut svc_pool, - pub rq_procinfo: *const svc_procedure, - pub rq_authop: *mut auth_ops, - pub rq_cred: svc_cred, - pub rq_xprt_ctxt: *mut ::aya_bpf::cty::c_void, - pub rq_deferred: *mut svc_deferred_req, - pub rq_arg: xdr_buf, - pub rq_arg_stream: xdr_stream, - pub rq_res_stream: xdr_stream, - pub rq_scratch_page: *mut page, - pub rq_res: xdr_buf, - pub rq_pages: [*mut page; 260usize], - pub rq_respages: *mut *mut page, - pub rq_next_page: *mut *mut page, - pub rq_page_end: *mut *mut page, - pub rq_pvec: pagevec, - pub rq_vec: [kvec; 259usize], - pub rq_bvec: [bio_vec; 259usize], - pub rq_xid: __be32, - pub rq_prog: u32_, - pub rq_vers: u32_, - pub rq_proc: u32_, - pub rq_prot: u32_, - pub rq_cachetype: ::aya_bpf::cty::c_int, - pub rq_flags: ::aya_bpf::cty::c_ulong, - pub rq_qtime: ktime_t, - pub rq_argp: *mut ::aya_bpf::cty::c_void, - pub rq_resp: *mut ::aya_bpf::cty::c_void, - pub rq_accept_statp: *mut __be32, - pub rq_auth_data: *mut ::aya_bpf::cty::c_void, - pub rq_auth_stat: __be32, - pub rq_auth_slack: ::aya_bpf::cty::c_int, - pub rq_reserved: ::aya_bpf::cty::c_int, - pub rq_stime: ktime_t, - pub rq_chandle: cache_req, - pub rq_client: *mut auth_domain, - pub rq_gssclient: *mut auth_domain, - pub rq_cacherep: *mut svc_cacherep, - pub rq_task: *mut task_struct, - pub rq_bc_net: *mut net, - pub rq_lease_breaker: *mut *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct svc_pool { - pub sp_id: ::aya_bpf::cty::c_uint, - pub sp_lock: spinlock_t, - pub sp_sockets: list_head, - pub sp_nrthreads: ::aya_bpf::cty::c_uint, - pub sp_all_threads: list_head, - pub sp_sockets_queued: percpu_counter, - pub sp_threads_woken: percpu_counter, - pub sp_threads_timedout: percpu_counter, - pub sp_flags: ::aya_bpf::cty::c_ulong, pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 16usize]>, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub states: [cpuidle_state; 10usize], + pub state_count: ::aya_ebpf::cty::c_int, + pub safe_state_index: ::aya_ebpf::cty::c_int, + pub cpumask: *mut cpumask, + pub governor: *const ::aya_ebpf::cty::c_char, } -impl svc_pool { +impl cpuidle_driver { #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + pub fn bctimer(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_bctimer(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(bctimer: ::aya_ebpf::cty::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let bctimer: u32 = unsafe { ::core::mem::transmute(bctimer) }; + bctimer as u64 + }); __bindgen_bitfield_unit } } +pub mod uprobe_filter_ctx { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const UPROBE_FILTER_REGISTER: Type = 0; + pub const UPROBE_FILTER_UNREGISTER: Type = 1; + pub const UPROBE_FILTER_MMAP: Type = 2; +} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct svc_procedure { - pub pc_func: ::core::option::Option __be32>, - pub pc_decode: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut svc_rqst, arg2: *mut xdr_stream) -> bool_, +pub struct uprobe_consumer { + pub handler: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut uprobe_consumer, + arg2: *mut pt_regs, + ) -> ::aya_ebpf::cty::c_int, >, - pub pc_encode: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut svc_rqst, arg2: *mut xdr_stream) -> bool_, + pub ret_handler: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut uprobe_consumer, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut pt_regs, + ) -> ::aya_ebpf::cty::c_int, >, - pub pc_release: ::core::option::Option, - pub pc_argsize: ::aya_bpf::cty::c_uint, - pub pc_argzero: ::aya_bpf::cty::c_uint, - pub pc_ressize: ::aya_bpf::cty::c_uint, - pub pc_cachetype: ::aya_bpf::cty::c_uint, - pub pc_xdrressize: ::aya_bpf::cty::c_uint, - pub pc_name: *const ::aya_bpf::cty::c_char, + pub filter: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut uprobe_consumer, + arg2: uprobe_filter_ctx::Type, + arg3: *mut mm_struct, + ) -> bool_, + >, + pub next: *mut uprobe_consumer, } #[repr(C)] -pub struct svc_deferred_req { - pub prot: u32_, - pub xprt: *mut svc_xprt, - pub addr: __kernel_sockaddr_storage, - pub addrlen: usize, - pub daddr: __kernel_sockaddr_storage, - pub daddrlen: usize, - pub xprt_ctxt: *mut ::aya_bpf::cty::c_void, - pub handle: cache_deferred_req, - pub argslen: ::aya_bpf::cty::c_int, - pub args: __IncompleteArrayField<__be32>, +#[derive(Copy, Clone)] +pub struct arch_uprobe { + pub __bindgen_anon_1: arch_uprobe__bindgen_ty_1, + pub ops: *const uprobe_xol_ops, + pub __bindgen_anon_2: arch_uprobe__bindgen_ty_2, } #[repr(C)] #[derive(Copy, Clone)] -pub struct svc_process_info { - pub __bindgen_anon_1: svc_process_info__bindgen_ty_1, +pub union arch_uprobe__bindgen_ty_1 { + pub insn: [u8_; 16usize], + pub ixol: [u8_; 16usize], } #[repr(C)] #[derive(Copy, Clone)] -pub union svc_process_info__bindgen_ty_1 { - pub dispatch: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub mismatch: svc_process_info__bindgen_ty_1__bindgen_ty_1, +pub union arch_uprobe__bindgen_ty_2 { + pub branch: arch_uprobe__bindgen_ty_2__bindgen_ty_1, + pub defparam: arch_uprobe__bindgen_ty_2__bindgen_ty_2, + pub push: arch_uprobe__bindgen_ty_2__bindgen_ty_3, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct svc_process_info__bindgen_ty_1__bindgen_ty_1 { - pub lovers: ::aya_bpf::cty::c_uint, - pub hivers: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct svc_version { - pub vs_vers: u32_, - pub vs_nproc: u32_, - pub vs_proc: *const svc_procedure, - pub vs_count: *mut ::aya_bpf::cty::c_ulong, - pub vs_xdrsize: u32_, - pub vs_hidden: bool_, - pub vs_rpcb_optnl: bool_, - pub vs_need_cong_ctrl: bool_, - pub vs_dispatch: - ::core::option::Option ::aya_bpf::cty::c_int>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs_seqid_counter { - pub create_time: ktime_t, - pub owner_id: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_int, - pub counter: u32_, - pub lock: spinlock_t, - pub list: list_head, - pub wait: rpc_wait_queue, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs4_lock_state { - pub ls_locks: list_head, - pub ls_state: *mut nfs4_state, - pub ls_flags: ::aya_bpf::cty::c_ulong, - pub ls_seqid: nfs_seqid_counter, - pub ls_stateid: nfs4_stateid, - pub ls_count: refcount_t, - pub ls_owner: fl_owner_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_state_recovery_ops { - pub owner_flag_bit: ::aya_bpf::cty::c_int, - pub state_flag_bit: ::aya_bpf::cty::c_int, - pub recover_open: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs4_state_owner, - arg2: *mut nfs4_state, - ) -> ::aya_bpf::cty::c_int, - >, - pub recover_lock: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs4_state, arg2: *mut file_lock) -> ::aya_bpf::cty::c_int, - >, - pub establish_clid: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_client, arg2: *const cred) -> ::aya_bpf::cty::c_int, - >, - pub reclaim_complete: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_client, arg2: *const cred) -> ::aya_bpf::cty::c_int, - >, - pub detect_trunking: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_client, - arg2: *mut *mut nfs_client, - arg3: *const cred, - ) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_state_maintenance_ops { - pub sched_state_renewal: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_client, - arg2: *const cred, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_state_renewal_cred: - ::core::option::Option *const cred>, - pub renew_lease: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nfs_client, arg2: *const cred) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nfs4_mig_recovery_ops { - pub get_locations: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut nfs_server, - arg2: *mut nfs_fh, - arg3: *mut nfs4_fs_locations, - arg4: *mut page, - arg5: *const cred, - ) -> ::aya_bpf::cty::c_int, - >, - pub fsid_present: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut inode, arg2: *const cred) -> ::aya_bpf::cty::c_int, - >, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nfs4_state_owner { - pub so_server: *mut nfs_server, - pub so_lru: list_head, - pub so_expires: ::aya_bpf::cty::c_ulong, - pub so_server_node: rb_node, - pub so_cred: *const cred, - pub so_lock: spinlock_t, - pub so_count: atomic_t, - pub so_flags: ::aya_bpf::cty::c_ulong, - pub so_states: list_head, - pub so_seqid: nfs_seqid_counter, - pub so_reclaim_seqcount: seqcount_spinlock_t, - pub so_delegreturn_mutex: mutex, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timer_rand_state { - pub last_time: ::aya_bpf::cty::c_ulong, - pub last_delta: ::aya_bpf::cty::c_long, - pub last_delta2: ::aya_bpf::cty::c_long, -} -pub mod uprobe_filter_ctx { - pub type Type = ::aya_bpf::cty::c_uint; - pub const UPROBE_FILTER_REGISTER: Type = 0; - pub const UPROBE_FILTER_UNREGISTER: Type = 1; - pub const UPROBE_FILTER_MMAP: Type = 2; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uprobe_consumer { - pub handler: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut uprobe_consumer, - arg2: *mut pt_regs, - ) -> ::aya_bpf::cty::c_int, - >, - pub ret_handler: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut uprobe_consumer, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut pt_regs, - ) -> ::aya_bpf::cty::c_int, - >, - pub filter: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut uprobe_consumer, - arg2: uprobe_filter_ctx::Type, - arg3: *mut mm_struct, - ) -> bool_, - >, - pub next: *mut uprobe_consumer, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct arch_uprobe { - pub __bindgen_anon_1: arch_uprobe__bindgen_ty_1, - pub ops: *const uprobe_xol_ops, - pub __bindgen_anon_2: arch_uprobe__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union arch_uprobe__bindgen_ty_1 { - pub insn: [u8_; 16usize], - pub ixol: [u8_; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union arch_uprobe__bindgen_ty_2 { - pub branch: arch_uprobe__bindgen_ty_2__bindgen_ty_1, - pub defparam: arch_uprobe__bindgen_ty_2__bindgen_ty_2, - pub push: arch_uprobe__bindgen_ty_2__bindgen_ty_3, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct arch_uprobe__bindgen_ty_2__bindgen_ty_1 { - pub offs: s32, - pub ilen: u8_, - pub opc1: u8_, +pub struct arch_uprobe__bindgen_ty_2__bindgen_ty_1 { + pub offs: s32, + pub ilen: u8_, + pub opc1: u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -42385,10 +39643,10 @@ pub struct uprobe_xol_ops { unsafe extern "C" fn(arg1: *mut arch_uprobe, arg2: *mut pt_regs) -> bool_, >, pub pre_xol: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut arch_uprobe, arg2: *mut pt_regs) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut arch_uprobe, arg2: *mut pt_regs) -> ::aya_ebpf::cty::c_int, >, pub post_xol: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut arch_uprobe, arg2: *mut pt_regs) -> ::aya_bpf::cty::c_int, + unsafe extern "C" fn(arg1: *mut arch_uprobe, arg2: *mut pt_regs) -> ::aya_ebpf::cty::c_int, >, pub abort: ::core::option::Option, @@ -42405,2493 +39663,2395 @@ pub struct uprobe { pub inode: *mut inode, pub offset: loff_t, pub ref_ctr_offset: loff_t, - pub flags: ::aya_bpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, pub arch: arch_uprobe, } #[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct vm_special_mapping { + pub name: *const ::aya_ebpf::cty::c_char, + pub pages: *mut *mut page, + pub fault: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const vm_special_mapping, + arg2: *mut vm_area_struct, + arg3: *mut vm_fault, + ) -> vm_fault_t, + >, + pub mremap: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const vm_special_mapping, + arg2: *mut vm_area_struct, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] #[derive(Copy, Clone)] pub struct xol_area { pub wq: wait_queue_head_t, pub slot_count: atomic_t, - pub bitmap: *mut ::aya_bpf::cty::c_ulong, + pub bitmap: *mut ::aya_ebpf::cty::c_ulong, pub xol_mapping: vm_special_mapping, pub pages: [*mut page; 2usize], - pub vaddr: ::aya_bpf::cty::c_ulong, + pub vaddr: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ring_buffer_iter { - pub cpu_buffer: *mut ring_buffer_per_cpu, - pub head: ::aya_bpf::cty::c_ulong, - pub next_event: ::aya_bpf::cty::c_ulong, - pub head_page: *mut buffer_page, - pub cache_reader_page: *mut buffer_page, - pub cache_read: ::aya_bpf::cty::c_ulong, - pub cache_pages_removed: ::aya_bpf::cty::c_ulong, - pub read_stamp: u64_, - pub page_stamp: u64_, - pub event: *mut ring_buffer_event, - pub missed_events: ::aya_bpf::cty::c_int, +pub struct debugfs_u32_array { + pub array: *mut u32_, + pub n_elements: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct rb_irq_work { - pub work: irq_work, - pub waiters: wait_queue_head_t, - pub full_waiters: wait_queue_head_t, - pub wait_index: ::aya_bpf::cty::c_long, - pub waiters_pending: bool_, - pub full_waiters_pending: bool_, - pub wakeup_full: bool_, +#[derive(Debug, Copy, Clone)] +pub struct cma_kobject { + pub kobj: kobject, + pub cma: *mut cma, } #[repr(C)] #[derive(Copy, Clone)] -pub struct trace_buffer { - pub flags: ::aya_bpf::cty::c_uint, - pub cpus: ::aya_bpf::cty::c_int, - pub record_disabled: atomic_t, - pub cpumask: cpumask_var_t, - pub reader_lock_key: *mut lock_class_key, - pub mutex: mutex, - pub buffers: *mut *mut ring_buffer_per_cpu, - pub node: hlist_node, - pub clock: ::core::option::Option u64_>, - pub irq_work: rb_irq_work, - pub time_stamp_abs: bool_, -} -#[repr(C)] -#[derive(Debug)] -pub struct buffer_data_page { - pub time_stamp: u64_, - pub commit: local_t, - pub data: __IncompleteArrayField<::aya_bpf::cty::c_uchar>, +pub struct cma { + pub base_pfn: ::aya_ebpf::cty::c_ulong, + pub count: ::aya_ebpf::cty::c_ulong, + pub bitmap: *mut ::aya_ebpf::cty::c_ulong, + pub order_per_bit: ::aya_ebpf::cty::c_uint, + pub lock: spinlock_t, + pub mem_head: hlist_head, + pub mem_head_lock: spinlock_t, + pub dfs_bitmap: debugfs_u32_array, + pub name: [::aya_ebpf::cty::c_char; 64usize], + pub nr_pages_succeeded: atomic64_t, + pub nr_pages_failed: atomic64_t, + pub cma_kobj: *mut cma_kobject, + pub reserve_pages_on_error: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct buffer_page { - pub list: list_head, - pub write: local_t, - pub read: ::aya_bpf::cty::c_uint, - pub entries: local_t, - pub real_end: ::aya_bpf::cty::c_ulong, - pub page: *mut buffer_data_page, +pub struct page_pool_params_fast { + pub flags: ::aya_ebpf::cty::c_uint, + pub order: ::aya_ebpf::cty::c_uint, + pub pool_size: ::aya_ebpf::cty::c_uint, + pub nid: ::aya_ebpf::cty::c_int, + pub dev: *mut device, + pub napi: *mut napi_struct, + pub dma_dir: dma_data_direction::Type, + pub max_len: ::aya_ebpf::cty::c_uint, + pub offset: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rb_time_struct { - pub time: local64_t, +pub struct page_pool_alloc_stats { + pub fast: u64_, + pub slow: u64_, + pub slow_high_order: u64_, + pub empty: u64_, + pub refill: u64_, + pub waive: u64_, } -pub type rb_time_t = rb_time_struct; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ring_buffer_per_cpu { - pub cpu: ::aya_bpf::cty::c_int, - pub record_disabled: atomic_t, - pub resize_disabled: atomic_t, - pub buffer: *mut trace_buffer, - pub reader_lock: raw_spinlock_t, - pub lock: arch_spinlock_t, - pub lock_key: lock_class_key, - pub free_page: *mut buffer_data_page, - pub nr_pages: ::aya_bpf::cty::c_ulong, - pub current_context: ::aya_bpf::cty::c_uint, - pub pages: *mut list_head, - pub head_page: *mut buffer_page, - pub tail_page: *mut buffer_page, - pub commit_page: *mut buffer_page, - pub reader_page: *mut buffer_page, - pub lost_events: ::aya_bpf::cty::c_ulong, - pub last_overrun: ::aya_bpf::cty::c_ulong, - pub nest: ::aya_bpf::cty::c_ulong, - pub entries_bytes: local_t, - pub entries: local_t, - pub overrun: local_t, - pub commit_overrun: local_t, - pub dropped_events: local_t, - pub committing: local_t, - pub commits: local_t, - pub pages_touched: local_t, - pub pages_lost: local_t, - pub pages_read: local_t, - pub last_pages_touch: ::aya_bpf::cty::c_long, - pub shortest_full: usize, - pub read: ::aya_bpf::cty::c_ulong, - pub read_bytes: ::aya_bpf::cty::c_ulong, - pub write_stamp: rb_time_t, - pub before_stamp: rb_time_t, - pub event_stamp: [u64_; 5usize], - pub read_stamp: u64_, - pub pages_removed: ::aya_bpf::cty::c_ulong, - pub nr_pages_to_update: ::aya_bpf::cty::c_long, - pub new_pages: list_head, - pub update_pages_work: work_struct, - pub update_done: completion, - pub irq_work: rb_irq_work, +#[derive(Debug, Copy, Clone)] +pub struct pp_alloc_cache { + pub count: u32_, + pub cache: [*mut page; 128usize], } #[repr(C)] -#[derive(Debug)] -pub struct crypto_skcipher { - pub reqsize: ::aya_bpf::cty::c_uint, - pub base: crypto_tfm, +#[derive(Debug, Copy, Clone)] +pub struct page_pool_params_slow { + pub netdev: *mut net_device, + pub init_callback: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut page, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub init_arg: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Copy, Clone)] -pub struct fscrypt_keyring { - pub lock: spinlock_t, - pub key_hashtable: [hlist_head; 128usize], +pub struct page_pool { + pub p: page_pool_params_fast, + pub has_init_callback: bool_, + pub frag_users: ::aya_ebpf::cty::c_long, + pub frag_page: *mut page, + pub frag_offset: ::aya_ebpf::cty::c_uint, + pub pages_state_hold_cnt: u32_, + pub release_dw: delayed_work, + pub disconnect: + ::core::option::Option, + pub defer_start: ::aya_ebpf::cty::c_ulong, + pub defer_warn: ::aya_ebpf::cty::c_ulong, + pub alloc_stats: page_pool_alloc_stats, + pub xdp_mem_id: u32_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, + pub alloc: pp_alloc_cache, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, + pub ring: ptr_ring, + pub recycle_stats: *mut page_pool_recycle_stats, + pub pages_state_release_cnt: atomic_t, + pub user_cnt: refcount_t, + pub destroy_cnt: u64_, + pub slow: page_pool_params_slow, + pub user: page_pool__bindgen_ty_1, + pub _bitfield_align_3: [u8; 0], + pub _bitfield_3: __BindgenBitfieldUnit<[u8; 48usize]>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rtattr { - pub rta_len: ::aya_bpf::cty::c_ushort, - pub rta_type: ::aya_bpf::cty::c_ushort, +pub struct page_pool__bindgen_ty_1 { + pub list: hlist_node, + pub detach_time: u64_, + pub napi_id: u32_, + pub id: u32_, +} +impl page_pool { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iomap { - pub addr: u64_, - pub offset: loff_t, - pub length: u64_, - pub type_: u16_, - pub flags: u16_, - pub bdev: *mut block_device, - pub dax_dev: *mut dax_device, - pub inline_data: *mut ::aya_bpf::cty::c_void, - pub private: *mut ::aya_bpf::cty::c_void, - pub folio_ops: *const iomap_folio_ops, - pub validity_cookie: u64_, +pub struct page_pool_recycle_stats { + pub cached: u64_, + pub cache_full: u64_, + pub ring: u64_, + pub ring_full: u64_, + pub released_refcnt: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iomap_folio_ops { - pub get_folio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut iomap_iter, - arg2: loff_t, - arg3: ::aya_bpf::cty::c_uint, - ) -> *mut folio, - >, - pub put_folio: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut inode, - arg2: loff_t, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut folio, - ), - >, - pub iomap_valid: - ::core::option::Option bool_>, +pub struct sk_psock_progs { + pub msg_parser: *mut bpf_prog, + pub stream_parser: *mut bpf_prog, + pub stream_verdict: *mut bpf_prog, + pub skb_verdict: *mut bpf_prog, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iomap_iter { - pub inode: *mut inode, - pub pos: loff_t, - pub len: u64_, - pub processed: s64, - pub flags: ::aya_bpf::cty::c_uint, - pub iomap: iomap, - pub srcmap: iomap, - pub private: *mut ::aya_bpf::cty::c_void, +pub struct strp_stats { + pub msgs: ::aya_ebpf::cty::c_ulonglong, + pub bytes: ::aya_ebpf::cty::c_ulonglong, + pub mem_fail: ::aya_ebpf::cty::c_uint, + pub need_more_hdr: ::aya_ebpf::cty::c_uint, + pub msg_too_big: ::aya_ebpf::cty::c_uint, + pub msg_timeouts: ::aya_ebpf::cty::c_uint, + pub bad_hdr_len: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct gpio_irq_chip { - pub chip: *mut irq_chip, - pub domain: *mut irq_domain, - pub domain_ops: *const irq_domain_ops, - pub fwnode: *mut fwnode_handle, - pub parent_domain: *mut irq_domain, - pub child_to_parent_hwirq: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_uint, - arg4: *mut ::aya_bpf::cty::c_uint, - arg5: *mut ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub populate_parent_alloc_arg: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: *mut gpio_irq_fwspec, - arg3: ::aya_bpf::cty::c_uint, - arg4: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, +#[derive(Debug, Copy, Clone)] +pub struct strp_callbacks { + pub parse_msg: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut strparser, arg2: *mut sk_buff) -> ::aya_ebpf::cty::c_int, >, - pub child_offset_to_irq: ::core::option::Option< + pub rcv_msg: + ::core::option::Option, + pub read_sock_done: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_uint, + arg1: *mut strparser, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, >, - pub child_irq_domain_ops: irq_domain_ops, - pub handler: irq_flow_handler_t, - pub default_type: ::aya_bpf::cty::c_uint, - pub lock_key: *mut lock_class_key, - pub request_key: *mut lock_class_key, - pub parent_handler: irq_flow_handler_t, - pub __bindgen_anon_1: gpio_irq_chip__bindgen_ty_1, - pub num_parents: ::aya_bpf::cty::c_uint, - pub parents: *mut ::aya_bpf::cty::c_uint, - pub map: *mut ::aya_bpf::cty::c_uint, - pub threaded: bool_, - pub per_parent_data: bool_, - pub initialized: bool_, - pub domain_is_allocated_externally: bool_, - pub init_hw: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub init_valid_mask: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: *mut ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_uint, - ), + pub abort_parser: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut strparser, arg2: ::aya_ebpf::cty::c_int), >, - pub valid_mask: *mut ::aya_bpf::cty::c_ulong, - pub first: ::aya_bpf::cty::c_uint, - pub irq_enable: ::core::option::Option, - pub irq_disable: ::core::option::Option, - pub irq_unmask: ::core::option::Option, - pub irq_mask: ::core::option::Option, + pub lock: ::core::option::Option, + pub unlock: ::core::option::Option, } #[repr(C)] -#[derive(Copy, Clone)] -pub union gpio_irq_chip__bindgen_ty_1 { - pub parent_handler_data: *mut ::aya_bpf::cty::c_void, - pub parent_handler_data_array: *mut *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct strparser { + pub sk: *mut sock, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub skb_nextp: *mut *mut sk_buff, + pub skb_head: *mut sk_buff, + pub need_bytes: ::aya_ebpf::cty::c_uint, + pub msg_timer_work: delayed_work, + pub work: work_struct, + pub stats: strp_stats, + pub cb: strp_callbacks, +} +impl strparser { + #[inline] + pub fn stopped(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_stopped(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn paused(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_paused(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn aborted(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_aborted(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn interrupted(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_interrupted(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn unrecov_intr(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + } + #[inline] + pub fn set_unrecov_intr(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + stopped: u32_, + paused: u32_, + aborted: u32_, + interrupted: u32_, + unrecov_intr: u32_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let stopped: u32 = unsafe { ::core::mem::transmute(stopped) }; + stopped as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let paused: u32 = unsafe { ::core::mem::transmute(paused) }; + paused as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let aborted: u32 = unsafe { ::core::mem::transmute(aborted) }; + aborted as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let interrupted: u32 = unsafe { ::core::mem::transmute(interrupted) }; + interrupted as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let unrecov_intr: u32 = unsafe { ::core::mem::transmute(unrecov_intr) }; + unrecov_intr as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sk_psock_work_state { + pub len: u32_, + pub off: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct gpio_chip { - pub label: *const ::aya_bpf::cty::c_char, - pub gpiodev: *mut gpio_device, - pub parent: *mut device, - pub fwnode: *mut fwnode_handle, - pub owner: *mut module, - pub request: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub free: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut gpio_chip, arg2: ::aya_bpf::cty::c_uint), - >, - pub get_direction: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub direction_input: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub direction_output: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub get: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub get_multiple: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: *mut ::aya_bpf::cty::c_ulong, - arg3: *mut ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub set: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_int, - ), - >, - pub set_multiple: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: *mut ::aya_bpf::cty::c_ulong, - arg3: *mut ::aya_bpf::cty::c_ulong, - ), - >, - pub set_config: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub to_irq: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub dbg_show: - ::core::option::Option, - pub init_valid_mask: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: *mut ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub add_pin_ranges: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub en_hw_timestamp: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: u32_, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, +pub struct sk_psock { + pub sk: *mut sock, + pub sk_redir: *mut sock, + pub apply_bytes: u32_, + pub cork_bytes: u32_, + pub eval: u32_, + pub redir_ingress: bool_, + pub cork: *mut sk_msg, + pub progs: sk_psock_progs, + pub strp: strparser, + pub ingress_skb: sk_buff_head, + pub ingress_msg: list_head, + pub ingress_lock: spinlock_t, + pub state: ::aya_ebpf::cty::c_ulong, + pub link: list_head, + pub link_lock: spinlock_t, + pub refcnt: refcount_t, + pub saved_unhash: ::core::option::Option, + pub saved_destroy: ::core::option::Option, + pub saved_close: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sock, arg2: ::aya_ebpf::cty::c_long), >, - pub dis_hw_timestamp: ::core::option::Option< + pub saved_write_space: ::core::option::Option, + pub saved_data_ready: ::core::option::Option, + pub psock_update_sk_prot: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut gpio_chip, - arg2: u32_, - arg3: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub base: ::aya_bpf::cty::c_int, - pub ngpio: u16_, - pub offset: u16_, - pub names: *const *const ::aya_bpf::cty::c_char, - pub can_sleep: bool_, - pub read_reg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void) -> ::aya_bpf::cty::c_ulong, - >, - pub write_reg: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void, arg2: ::aya_bpf::cty::c_ulong), + arg1: *mut sock, + arg2: *mut sk_psock, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, >, - pub be_bits: bool_, - pub reg_dat: *mut ::aya_bpf::cty::c_void, - pub reg_set: *mut ::aya_bpf::cty::c_void, - pub reg_clr: *mut ::aya_bpf::cty::c_void, - pub reg_dir_out: *mut ::aya_bpf::cty::c_void, - pub reg_dir_in: *mut ::aya_bpf::cty::c_void, - pub bgpio_dir_unreadable: bool_, - pub bgpio_bits: ::aya_bpf::cty::c_int, - pub bgpio_lock: raw_spinlock_t, - pub bgpio_data: ::aya_bpf::cty::c_ulong, - pub bgpio_dir: ::aya_bpf::cty::c_ulong, - pub irq: gpio_irq_chip, - pub valid_mask: *mut ::aya_bpf::cty::c_ulong, + pub sk_proto: *mut proto, + pub work_mutex: mutex, + pub work_state: sk_psock_work_state, + pub work: delayed_work, + pub sk_pair: *mut sock, + pub rwork: rcu_work, } #[repr(C)] -#[derive(Copy, Clone)] -pub union gpio_irq_fwspec { - pub fwspec: irq_fwspec, - pub msiinfo: msi_alloc_info_t, +#[derive(Debug, Copy, Clone)] +pub struct sk_msg_sg { + pub start: u32_, + pub curr: u32_, + pub end: u32_, + pub size: u32_, + pub copybreak: u32_, + pub copy: [::aya_ebpf::cty::c_ulong; 1usize], + pub data: [scatterlist; 19usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct gpio_device { - pub dev: device, - pub chrdev: cdev, - pub id: ::aya_bpf::cty::c_int, - pub mockdev: *mut device, - pub owner: *mut module, - pub chip: *mut gpio_chip, - pub descs: *mut gpio_desc, - pub base: ::aya_bpf::cty::c_int, - pub ngpio: u16_, - pub label: *const ::aya_bpf::cty::c_char, - pub data: *mut ::aya_bpf::cty::c_void, +#[derive(Debug, Copy, Clone)] +pub struct sk_msg { + pub sg: sk_msg_sg, + pub data: *mut ::aya_ebpf::cty::c_void, + pub data_end: *mut ::aya_ebpf::cty::c_void, + pub apply_bytes: u32_, + pub cork_bytes: u32_, + pub flags: u32_, + pub skb: *mut sk_buff, + pub sk_redir: *mut sock, + pub sk: *mut sock, pub list: list_head, - pub notifier: blocking_notifier_head, - pub sem: rw_semaphore, - pub pin_ranges: list_head, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pfn_t { - pub val: u64_, +pub type __kernel_mqd_t = ::aya_ebpf::cty::c_int; +pub type mqd_t = __kernel_mqd_t; +pub mod audit_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const AUDIT_STATE_DISABLED: Type = 0; + pub const AUDIT_STATE_BUILD: Type = 1; + pub const AUDIT_STATE_RECORD: Type = 2; } #[repr(C)] -pub struct workqueue_struct { - pub pwqs: list_head, - pub list: list_head, - pub mutex: mutex, - pub work_color: ::aya_bpf::cty::c_int, - pub flush_color: ::aya_bpf::cty::c_int, - pub nr_pwqs_to_flush: atomic_t, - pub first_flusher: *mut wq_flusher, - pub flusher_queue: list_head, - pub flusher_overflow: list_head, - pub maydays: list_head, - pub rescuer: *mut worker, - pub nr_drainers: ::aya_bpf::cty::c_int, - pub saved_max_active: ::aya_bpf::cty::c_int, - pub unbound_attrs: *mut workqueue_attrs, - pub dfl_pwq: *mut pool_workqueue, - pub wq_dev: *mut wq_device, - pub name: [::aya_bpf::cty::c_char; 24usize], - pub rcu: callback_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, - pub flags: ::aya_bpf::cty::c_uint, - pub cpu_pwqs: *mut pool_workqueue, - pub numa_pwq_tbl: __IncompleteArrayField<*mut pool_workqueue>, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, +#[derive(Copy, Clone)] +pub struct audit_cap_data { + pub permitted: kernel_cap_t, + pub inheritable: kernel_cap_t, + pub __bindgen_anon_1: audit_cap_data__bindgen_ty_1, + pub ambient: kernel_cap_t, + pub rootid: kuid_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct worker { - pub __bindgen_anon_1: worker__bindgen_ty_1, - pub current_work: *mut work_struct, - pub current_func: work_func_t, - pub current_pwq: *mut pool_workqueue, - pub current_color: ::aya_bpf::cty::c_uint, - pub scheduled: list_head, - pub task: *mut task_struct, - pub pool: *mut worker_pool, - pub node: list_head, - pub last_active: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_uint, - pub id: ::aya_bpf::cty::c_int, - pub sleeping: ::aya_bpf::cty::c_int, - pub desc: [::aya_bpf::cty::c_char; 24usize], - pub rescue_wq: *mut workqueue_struct, - pub last_func: work_func_t, +pub union audit_cap_data__bindgen_ty_1 { + pub fE: ::aya_ebpf::cty::c_uint, + pub effective: kernel_cap_t, } #[repr(C)] #[derive(Copy, Clone)] -pub union worker__bindgen_ty_1 { - pub entry: list_head, - pub hentry: hlist_node, +pub struct audit_names { + pub list: list_head, + pub name: *mut filename, + pub name_len: ::aya_ebpf::cty::c_int, + pub hidden: bool_, + pub ino: ::aya_ebpf::cty::c_ulong, + pub dev: dev_t, + pub mode: umode_t, + pub uid: kuid_t, + pub gid: kgid_t, + pub rdev: dev_t, + pub osid: u32_, + pub fcap: audit_cap_data, + pub fcap_ver: ::aya_ebpf::cty::c_uint, + pub type_: ::aya_ebpf::cty::c_uchar, + pub should_free: bool_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pool_workqueue { - pub pool: *mut worker_pool, - pub wq: *mut workqueue_struct, - pub work_color: ::aya_bpf::cty::c_int, - pub flush_color: ::aya_bpf::cty::c_int, - pub refcnt: ::aya_bpf::cty::c_int, - pub nr_in_flight: [::aya_bpf::cty::c_int; 16usize], - pub nr_active: ::aya_bpf::cty::c_int, - pub max_active: ::aya_bpf::cty::c_int, - pub inactive_works: list_head, - pub pwqs_node: list_head, - pub mayday_node: list_head, - pub unbound_release_work: work_struct, - pub rcu: callback_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, +pub struct mq_attr { + pub mq_flags: __kernel_long_t, + pub mq_maxmsg: __kernel_long_t, + pub mq_msgsize: __kernel_long_t, + pub mq_curmsgs: __kernel_long_t, + pub __reserved: [__kernel_long_t; 4usize], } #[repr(C)] -#[derive(Copy, Clone)] -pub struct worker_pool { - pub lock: raw_spinlock_t, - pub cpu: ::aya_bpf::cty::c_int, - pub node: ::aya_bpf::cty::c_int, - pub id: ::aya_bpf::cty::c_int, - pub flags: ::aya_bpf::cty::c_uint, - pub watchdog_ts: ::aya_bpf::cty::c_ulong, - pub cpu_stall: bool_, - pub nr_running: ::aya_bpf::cty::c_int, - pub worklist: list_head, - pub nr_workers: ::aya_bpf::cty::c_int, - pub nr_idle: ::aya_bpf::cty::c_int, - pub idle_list: list_head, - pub idle_timer: timer_list, - pub idle_cull_work: work_struct, - pub mayday_timer: timer_list, - pub busy_hash: [hlist_head; 64usize], - pub manager: *mut worker, - pub workers: list_head, - pub dying_workers: list_head, - pub detach_completion: *mut completion, - pub worker_ida: ida, - pub attrs: *mut workqueue_attrs, - pub hash_node: hlist_node, - pub refcnt: ::aya_bpf::cty::c_int, - pub rcu: callback_head, +#[derive(Debug, Copy, Clone)] +pub struct open_how { + pub flags: __u64, + pub mode: __u64, + pub resolve: __u64, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct wq_flusher { - pub list: list_head, - pub flush_color: ::aya_bpf::cty::c_int, - pub done: completion, +#[derive(Debug, Copy, Clone)] +pub struct audit_ntp_val { + pub oldval: ::aya_ebpf::cty::c_longlong, + pub newval: ::aya_ebpf::cty::c_longlong, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct wq_device { - pub wq: *mut workqueue_struct, - pub dev: device, +#[derive(Debug, Copy, Clone)] +pub struct audit_ntp_data { + pub vals: [audit_ntp_val; 6usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rt_waiter_node { - pub entry: rb_node, - pub prio: ::aya_bpf::cty::c_int, - pub deadline: u64_, +pub struct audit_proctitle { + pub len: ::aya_ebpf::cty::c_int, + pub value: *mut ::aya_ebpf::cty::c_char, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rt_mutex_waiter { - pub tree: rt_waiter_node, - pub pi_tree: rt_waiter_node, - pub task: *mut task_struct, - pub lock: *mut rt_mutex_base, - pub wake_state: ::aya_bpf::cty::c_uint, - pub ww_ctx: *mut ww_acquire_ctx, +#[derive(Copy, Clone)] +pub struct audit_context { + pub dummy: ::aya_ebpf::cty::c_int, + pub context: audit_context__bindgen_ty_1::Type, + pub state: audit_state::Type, + pub current_state: audit_state::Type, + pub serial: ::aya_ebpf::cty::c_uint, + pub major: ::aya_ebpf::cty::c_int, + pub uring_op: ::aya_ebpf::cty::c_int, + pub ctime: timespec64, + pub argv: [::aya_ebpf::cty::c_ulong; 4usize], + pub return_code: ::aya_ebpf::cty::c_long, + pub prio: u64_, + pub return_valid: ::aya_ebpf::cty::c_int, + pub preallocated_names: [audit_names; 5usize], + pub name_count: ::aya_ebpf::cty::c_int, + pub names_list: list_head, + pub filterkey: *mut ::aya_ebpf::cty::c_char, + pub pwd: path, + pub aux: *mut audit_aux_data, + pub aux_pids: *mut audit_aux_data, + pub sockaddr: *mut __kernel_sockaddr_storage, + pub sockaddr_len: usize, + pub ppid: pid_t, + pub uid: kuid_t, + pub euid: kuid_t, + pub suid: kuid_t, + pub fsuid: kuid_t, + pub gid: kgid_t, + pub egid: kgid_t, + pub sgid: kgid_t, + pub fsgid: kgid_t, + pub personality: ::aya_ebpf::cty::c_ulong, + pub arch: ::aya_ebpf::cty::c_int, + pub target_pid: pid_t, + pub target_auid: kuid_t, + pub target_uid: kuid_t, + pub target_sessionid: ::aya_ebpf::cty::c_uint, + pub target_sid: u32_, + pub target_comm: [::aya_ebpf::cty::c_char; 16usize], + pub trees: *mut audit_tree_refs, + pub first_trees: *mut audit_tree_refs, + pub killed_trees: list_head, + pub tree_count: ::aya_ebpf::cty::c_int, + pub type_: ::aya_ebpf::cty::c_int, + pub __bindgen_anon_1: audit_context__bindgen_ty_2, + pub fds: [::aya_ebpf::cty::c_int; 2usize], + pub proctitle: audit_proctitle, +} +pub mod audit_context__bindgen_ty_1 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const AUDIT_CTX_UNUSED: Type = 0; + pub const AUDIT_CTX_SYSCALL: Type = 1; + pub const AUDIT_CTX_URING: Type = 2; } #[repr(C)] #[derive(Copy, Clone)] -pub struct bpf_cgroup_storage_map { - pub map: bpf_map, - pub lock: spinlock_t, - pub root: rb_root, - pub list: list_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +pub union audit_context__bindgen_ty_2 { + pub socketcall: audit_context__bindgen_ty_2__bindgen_ty_1, + pub ipc: audit_context__bindgen_ty_2__bindgen_ty_2, + pub mq_getsetattr: audit_context__bindgen_ty_2__bindgen_ty_3, + pub mq_notify: audit_context__bindgen_ty_2__bindgen_ty_4, + pub mq_sendrecv: audit_context__bindgen_ty_2__bindgen_ty_5, + pub mq_open: audit_context__bindgen_ty_2__bindgen_ty_6, + pub capset: audit_context__bindgen_ty_2__bindgen_ty_7, + pub mmap: audit_context__bindgen_ty_2__bindgen_ty_8, + pub openat2: open_how, + pub execve: audit_context__bindgen_ty_2__bindgen_ty_9, + pub module: audit_context__bindgen_ty_2__bindgen_ty_10, + pub time: audit_context__bindgen_ty_2__bindgen_ty_11, } -impl bpf_cgroup_storage_map { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct audit_context__bindgen_ty_2__bindgen_ty_1 { + pub nargs: ::aya_ebpf::cty::c_int, + pub args: [::aya_ebpf::cty::c_long; 6usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct audit_aux_data { - pub next: *mut audit_aux_data, - pub type_: ::aya_bpf::cty::c_int, +pub struct audit_context__bindgen_ty_2__bindgen_ty_2 { + pub uid: kuid_t, + pub gid: kgid_t, + pub mode: umode_t, + pub osid: u32_, + pub has_perm: ::aya_ebpf::cty::c_int, + pub perm_uid: uid_t, + pub perm_gid: gid_t, + pub perm_mode: umode_t, + pub qbytes: ::aya_ebpf::cty::c_ulong, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct audit_tree_refs { - pub next: *mut audit_tree_refs, - pub c: [*mut audit_chunk; 31usize], +pub struct audit_context__bindgen_ty_2__bindgen_ty_3 { + pub mqdes: mqd_t, + pub mqstat: mq_attr, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct fscrypt_direct_key { - pub dk_sb: *mut super_block, - pub dk_node: hlist_node, - pub dk_refcount: refcount_t, - pub dk_mode: *const fscrypt_mode, - pub dk_key: fscrypt_prepared_key, - pub dk_descriptor: [u8_; 8usize], - pub dk_raw: [u8_; 64usize], +pub struct audit_context__bindgen_ty_2__bindgen_ty_4 { + pub mqdes: mqd_t, + pub sigev_signo: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_crypto_ll_ops { - pub keyslot_program: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_crypto_profile, - arg2: *const blk_crypto_key, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, - pub keyslot_evict: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut blk_crypto_profile, - arg2: *const blk_crypto_key, - arg3: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct audit_context__bindgen_ty_2__bindgen_ty_5 { + pub mqdes: mqd_t, + pub msg_len: usize, + pub msg_prio: ::aya_ebpf::cty::c_uint, + pub abs_timeout: timespec64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct audit_context__bindgen_ty_2__bindgen_ty_6 { + pub oflag: ::aya_ebpf::cty::c_int, + pub mode: umode_t, + pub attr: mq_attr, } #[repr(C)] #[derive(Copy, Clone)] -pub struct blk_crypto_profile { - pub ll_ops: blk_crypto_ll_ops, - pub max_dun_bytes_supported: ::aya_bpf::cty::c_uint, - pub modes_supported: [::aya_bpf::cty::c_uint; 5usize], - pub dev: *mut device, - pub num_slots: ::aya_bpf::cty::c_uint, - pub lock: rw_semaphore, - pub lockdep_key: lock_class_key, - pub idle_slots_wait_queue: wait_queue_head_t, - pub idle_slots: list_head, - pub idle_slots_lock: spinlock_t, - pub slot_hashtable: *mut hlist_head, - pub log_slot_ht_size: ::aya_bpf::cty::c_uint, - pub slots: *mut blk_crypto_keyslot, +pub struct audit_context__bindgen_ty_2__bindgen_ty_7 { + pub pid: pid_t, + pub cap: audit_cap_data, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct blk_crypto_keyslot { - pub slot_refs: atomic_t, - pub idle_slot_node: list_head, - pub hash_node: hlist_node, - pub key: *const blk_crypto_key, - pub profile: *mut blk_crypto_profile, +pub struct audit_context__bindgen_ty_2__bindgen_ty_8 { + pub fd: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct dst_cache_pcpu { - pub refresh_ts: ::aya_bpf::cty::c_ulong, - pub dst: *mut dst_entry, - pub cookie: u32_, - pub __bindgen_anon_1: dst_cache_pcpu__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct audit_context__bindgen_ty_2__bindgen_ty_9 { + pub argc: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub union dst_cache_pcpu__bindgen_ty_1 { - pub in_saddr: in_addr, - pub in6_saddr: in6_addr, +#[derive(Debug, Copy, Clone)] +pub struct audit_context__bindgen_ty_2__bindgen_ty_10 { + pub name: *mut ::aya_ebpf::cty::c_char, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct nf_loginfo { - pub type_: u_int8_t, - pub u: nf_loginfo__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct audit_context__bindgen_ty_2__bindgen_ty_11 { + pub ntp_data: audit_ntp_data, + pub tk_injoffset: timespec64, } #[repr(C)] -#[derive(Copy, Clone)] -pub union nf_loginfo__bindgen_ty_1 { - pub ulog: nf_loginfo__bindgen_ty_1__bindgen_ty_1, - pub log: nf_loginfo__bindgen_ty_1__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct audit_aux_data { + pub next: *mut audit_aux_data, + pub type_: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_loginfo__bindgen_ty_1__bindgen_ty_1 { - pub copy_len: u_int32_t, - pub group: u_int16_t, - pub qthreshold: u_int16_t, - pub flags: u_int16_t, +pub struct audit_tree_refs { + pub next: *mut audit_tree_refs, + pub c: [*mut audit_chunk; 31usize], +} +pub mod macsec_validation_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const MACSEC_VALIDATE_DISABLED: Type = 0; + pub const MACSEC_VALIDATE_CHECK: Type = 1; + pub const MACSEC_VALIDATE_STRICT: Type = 2; + pub const __MACSEC_VALIDATE_END: Type = 3; + pub const MACSEC_VALIDATE_MAX: Type = 2; +} +pub mod macsec_offload { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const MACSEC_OFFLOAD_OFF: Type = 0; + pub const MACSEC_OFFLOAD_PHY: Type = 1; + pub const MACSEC_OFFLOAD_MAC: Type = 2; + pub const __MACSEC_OFFLOAD_END: Type = 3; + pub const MACSEC_OFFLOAD_MAX: Type = 2; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_loginfo__bindgen_ty_1__bindgen_ty_2 { - pub level: u_int8_t, - pub logflags: u_int8_t, +pub struct bpf_xdp_link { + pub link: bpf_link, + pub dev: *mut net_device, + pub flags: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Copy, Clone)] -pub struct raw_hashinfo { - pub lock: spinlock_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub ht: [hlist_head; 256usize], +pub struct ip_tunnel_parm { + pub name: [::aya_ebpf::cty::c_char; 16usize], + pub link: ::aya_ebpf::cty::c_int, + pub i_flags: __be16, + pub o_flags: __be16, + pub i_key: __be32, + pub o_key: __be32, + pub iph: iphdr, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct userfaultfd_ctx { - pub fault_pending_wqh: wait_queue_head_t, - pub fault_wqh: wait_queue_head_t, - pub fd_wqh: wait_queue_head_t, - pub event_wqh: wait_queue_head_t, - pub refile_seq: seqcount_spinlock_t, - pub refcount: refcount_t, - pub flags: ::aya_bpf::cty::c_uint, - pub features: ::aya_bpf::cty::c_uint, - pub released: bool_, - pub mmap_changing: atomic_t, - pub mm: *mut mm_struct, +#[derive(Debug)] +pub struct cpu_rmap { + pub refcount: kref, + pub size: u16_, + pub obj: *mut *mut ::aya_ebpf::cty::c_void, + pub near: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cpu_rmap__bindgen_ty_1 { + pub index: u16_, + pub dist: u16_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct kernfs_root { - pub kn: *mut kernfs_node, - pub flags: ::aya_bpf::cty::c_uint, - pub ino_idr: idr, - pub last_id_lowbits: u32_, - pub id_highbits: u32_, - pub syscall_ops: *mut kernfs_syscall_ops, - pub supers: list_head, - pub deactivate_waitq: wait_queue_head_t, - pub kernfs_rwsem: rw_semaphore, - pub kernfs_iattr_rwsem: rw_semaphore, - pub kernfs_supers_rwsem: rw_semaphore, +pub struct ip_tunnel_key { + pub tun_id: __be64, + pub u: ip_tunnel_key__bindgen_ty_1, + pub tun_flags: __be16, + pub tos: u8_, + pub ttl: u8_, + pub label: __be32, + pub nhid: u32_, + pub tp_src: __be16, + pub tp_dst: __be16, + pub flow_flags: __u8, } #[repr(C)] #[derive(Copy, Clone)] -pub struct kernfs_iattrs { - pub ia_uid: kuid_t, - pub ia_gid: kgid_t, - pub ia_atime: timespec64, - pub ia_mtime: timespec64, - pub ia_ctime: timespec64, - pub xattrs: simple_xattrs, - pub nr_user_xattrs: atomic_t, - pub user_xattr_size: atomic_t, +pub union ip_tunnel_key__bindgen_ty_1 { + pub ipv4: ip_tunnel_key__bindgen_ty_1__bindgen_ty_1, + pub ipv6: ip_tunnel_key__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct pinctrl { - pub node: list_head, - pub dev: *mut device, - pub states: list_head, - pub state: *mut pinctrl_state, - pub dt_maps: list_head, - pub users: kref, +pub struct ip_tunnel_key__bindgen_ty_1__bindgen_ty_1 { + pub src: __be32, + pub dst: __be32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pinctrl_state { - pub node: list_head, - pub name: *const ::aya_bpf::cty::c_char, - pub settings: list_head, +#[derive(Copy, Clone)] +pub struct ip_tunnel_key__bindgen_ty_1__bindgen_ty_2 { + pub src: in6_addr, + pub dst: in6_addr, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xsk_queue { - pub ring_mask: u32_, - pub nentries: u32_, - pub cached_prod: u32_, - pub cached_cons: u32_, - pub ring: *mut xdp_ring, - pub invalid_descs: u64_, - pub queue_empty_descs: u64_, - pub ring_vmalloc_size: usize, +pub struct ip_tunnel_encap { + pub type_: u16_, + pub flags: u16_, + pub sport: __be16, + pub dport: __be16, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ip_tunnel_info { + pub key: ip_tunnel_key, + pub encap: ip_tunnel_encap, + pub dst_cache: dst_cache, + pub options_len: u8_, + pub mode: u8_, } +pub type sci_t = u64_; +pub type ssci_t = u32_; #[repr(C)] +#[derive(Copy, Clone)] +pub union salt { + pub __bindgen_anon_1: salt__bindgen_ty_1, + pub bytes: [u8_; 12usize], +} +#[repr(C, packed)] #[derive(Debug, Copy, Clone)] -pub struct xdp_ring { - pub producer: u32_, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_0: u32, - pub pad1: u32_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_1: u32, - pub consumer: u32_, - pub _bitfield_align_3: [u8; 0], - pub _bitfield_3: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_2: u32, - pub pad2: u32_, - pub flags: u32_, - pub _bitfield_align_4: [u8; 0], - pub _bitfield_4: __BindgenBitfieldUnit<[u8; 56usize]>, - pub pad3: u32_, - pub _bitfield_align_5: [u8; 0], - pub _bitfield_5: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_3: u32, +pub struct salt__bindgen_ty_1 { + pub ssci: u32_, + pub pn: u64_, } +pub type salt_t = salt; #[repr(C)] #[derive(Copy, Clone)] -pub struct sem_undo_list { - pub refcnt: refcount_t, - pub lock: spinlock_t, - pub list_proc: list_head, +pub union pn { + pub __bindgen_anon_1: pn__bindgen_ty_1, + pub full64: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct disk_stats { - pub nsecs: [u64_; 4usize], - pub sectors: [::aya_bpf::cty::c_ulong; 4usize], - pub ios: [::aya_bpf::cty::c_ulong; 4usize], - pub merges: [::aya_bpf::cty::c_ulong; 4usize], - pub io_ticks: ::aya_bpf::cty::c_ulong, - pub in_flight: [local_t; 2usize], +pub struct pn__bindgen_ty_1 { + pub lower: u32_, + pub upper: u32_, +} +pub type pn_t = pn; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct macsec_key { + pub id: [u8_; 16usize], + pub tfm: *mut crypto_aead, + pub salt: salt_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct psample_group { - pub list: list_head, - pub net: *mut net, - pub group_num: u32_, - pub refcount: u32_, - pub seq: u32_, - pub rcu: callback_head, +pub struct macsec_rx_sc_stats { + pub InOctetsValidated: __u64, + pub InOctetsDecrypted: __u64, + pub InPktsUnchecked: __u64, + pub InPktsDelayed: __u64, + pub InPktsOK: __u64, + pub InPktsInvalid: __u64, + pub InPktsLate: __u64, + pub InPktsNotValid: __u64, + pub InPktsNotUsingSA: __u64, + pub InPktsUnusedSA: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct action_gate_entry { - pub gate_state: u8_, - pub interval: u32_, - pub ipv: s32, - pub maxoctets: s32, +pub struct macsec_rx_sa_stats { + pub InPktsOK: __u32, + pub InPktsInvalid: __u32, + pub InPktsNotValid: __u32, + pub InPktsNotUsingSA: __u32, + pub InPktsUnusedSA: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcf_exts_miss_cookie_node { - pub chain: *const tcf_chain, - pub tp: *const tcf_proto, - pub exts: *const tcf_exts, - pub chain_index: u32_, - pub tp_prio: u32_, - pub handle: u32_, - pub miss_cookie_base: u32_, - pub rcu: callback_head, +pub struct macsec_tx_sa_stats { + pub OutPktsProtected: __u32, + pub OutPktsEncrypted: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct coredump_params { - pub siginfo: *const kernel_siginfo_t, - pub file: *mut file, - pub limit: ::aya_bpf::cty::c_ulong, - pub mm_flags: ::aya_bpf::cty::c_ulong, - pub cpu: ::aya_bpf::cty::c_int, - pub written: loff_t, - pub pos: loff_t, - pub to_skip: loff_t, - pub vma_count: ::aya_bpf::cty::c_int, - pub vma_data_size: usize, - pub vma_meta: *mut core_vma_metadata, +pub struct macsec_tx_sc_stats { + pub OutPktsProtected: __u64, + pub OutPktsEncrypted: __u64, + pub OutOctetsProtected: __u64, + pub OutOctetsEncrypted: __u64, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct core_vma_metadata { - pub start: ::aya_bpf::cty::c_ulong, - pub end: ::aya_bpf::cty::c_ulong, - pub flags: ::aya_bpf::cty::c_ulong, - pub dump_size: ::aya_bpf::cty::c_ulong, - pub pgoff: ::aya_bpf::cty::c_ulong, - pub file: *mut file, +pub struct macsec_dev_stats { + pub OutPktsUntagged: __u64, + pub InPktsUntagged: __u64, + pub OutPktsTooLong: __u64, + pub InPktsNoTag: __u64, + pub InPktsBadTag: __u64, + pub InPktsUnknownSCI: __u64, + pub InPktsNoSCI: __u64, + pub InPktsOverrun: __u64, } -pub mod dax_access_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DAX_ACCESS: Type = 0; - pub const DAX_RECOVERY_WRITE: Type = 1; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct macsec_rx_sa { + pub key: macsec_key, + pub ssci: ssci_t, + pub lock: spinlock_t, + pub __bindgen_anon_1: macsec_rx_sa__bindgen_ty_1, + pub refcnt: refcount_t, + pub active: bool_, + pub stats: *mut macsec_rx_sa_stats, + pub sc: *mut macsec_rx_sc, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union macsec_rx_sa__bindgen_ty_1 { + pub next_pn_halves: pn_t, + pub next_pn: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct dax_operations { - pub direct_access: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dax_device, - arg2: ::aya_bpf::cty::c_ulong, - arg3: ::aya_bpf::cty::c_long, - arg4: dax_access_mode::Type, - arg5: *mut *mut ::aya_bpf::cty::c_void, - arg6: *mut pfn_t, - ) -> ::aya_bpf::cty::c_long, - >, - pub dax_supported: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dax_device, - arg2: *mut block_device, - arg3: ::aya_bpf::cty::c_int, - arg4: sector_t, - arg5: sector_t, - ) -> bool_, - >, - pub zero_page_range: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dax_device, - arg2: ::aya_bpf::cty::c_ulong, - arg3: usize, - ) -> ::aya_bpf::cty::c_int, - >, - pub recovery_write: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dax_device, - arg2: ::aya_bpf::cty::c_ulong, - arg3: *mut ::aya_bpf::cty::c_void, - arg4: usize, - arg5: *mut iov_iter, - ) -> usize, - >, +pub struct macsec_rx_sc { + pub next: *mut macsec_rx_sc, + pub sci: sci_t, + pub active: bool_, + pub sa: [*mut macsec_rx_sa; 4usize], + pub stats: *mut pcpu_rx_sc_stats, + pub refcnt: refcount_t, + pub callback_head: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iopf_device_param { - pub dev: *mut device, - pub queue: *mut iopf_queue, - pub queue_list: list_head, - pub partial: list_head, +pub struct pcpu_rx_sc_stats { + pub stats: macsec_rx_sc_stats, + pub syncp: u64_stats_sync, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct iopf_queue { - pub wq: *mut workqueue_struct, - pub devices: list_head, - pub lock: mutex, +#[derive(Debug, Copy, Clone)] +pub struct pcpu_tx_sc_stats { + pub stats: macsec_tx_sc_stats, + pub syncp: u64_stats_sync, } #[repr(C)] -#[derive(Debug)] -pub struct kioctx_table { +#[derive(Copy, Clone)] +pub struct macsec_tx_sa { + pub key: macsec_key, + pub ssci: ssci_t, + pub lock: spinlock_t, + pub __bindgen_anon_1: macsec_tx_sa__bindgen_ty_1, + pub refcnt: refcount_t, + pub active: bool_, + pub stats: *mut macsec_tx_sa_stats, pub rcu: callback_head, - pub nr: ::aya_bpf::cty::c_uint, - pub table: __IncompleteArrayField<*mut kioctx>, } #[repr(C)] #[derive(Copy, Clone)] -pub struct kioctx { - pub users: percpu_ref, - pub dead: atomic_t, - pub reqs: percpu_ref, - pub user_id: ::aya_bpf::cty::c_ulong, - pub cpu: *mut kioctx_cpu, - pub req_batch: ::aya_bpf::cty::c_uint, - pub max_reqs: ::aya_bpf::cty::c_uint, - pub nr_events: ::aya_bpf::cty::c_uint, - pub mmap_base: ::aya_bpf::cty::c_ulong, - pub mmap_size: ::aya_bpf::cty::c_ulong, - pub ring_pages: *mut *mut page, - pub nr_pages: ::aya_bpf::cty::c_long, - pub free_rwork: rcu_work, - pub rq_wait: *mut ctx_rq_wait, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, - pub __bindgen_anon_1: kioctx__bindgen_ty_1, - pub __bindgen_anon_2: kioctx__bindgen_ty_2, - pub __bindgen_anon_3: kioctx__bindgen_ty_3, - pub __bindgen_anon_4: kioctx__bindgen_ty_4, - pub internal_pages: [*mut page; 8usize], - pub aio_ring_file: *mut file, - pub id: ::aya_bpf::cty::c_uint, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, - pub __bindgen_padding_0: u32, +pub union macsec_tx_sa__bindgen_ty_1 { + pub next_pn_halves: pn_t, + pub next_pn: u64_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kioctx__bindgen_ty_1 { - pub reqs_available: atomic_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, - pub __bindgen_padding_0: u32, +pub struct macsec_tx_sc { + pub active: bool_, + pub encoding_sa: u8_, + pub encrypt: bool_, + pub send_sci: bool_, + pub end_station: bool_, + pub scb: bool_, + pub sa: [*mut macsec_tx_sa; 4usize], + pub stats: *mut pcpu_tx_sc_stats, + pub md_dst: *mut metadata_dst, +} +pub mod metadata_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const METADATA_IP_TUNNEL: Type = 0; + pub const METADATA_HW_PORT_MUX: Type = 1; + pub const METADATA_MACSEC: Type = 2; + pub const METADATA_XFRM: Type = 3; } #[repr(C)] -#[derive(Copy, Clone)] -pub struct kioctx__bindgen_ty_2 { - pub ctx_lock: spinlock_t, - pub active_reqs: list_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, +#[derive(Debug, Copy, Clone)] +pub struct hw_port_info { + pub lower_dev: *mut net_device, + pub port_id: u32_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct kioctx__bindgen_ty_3 { - pub ring_lock: mutex, - pub wait: wait_queue_head_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +#[derive(Debug, Copy, Clone)] +pub struct macsec_info { + pub sci: sci_t, } -impl kioctx__bindgen_ty_3 { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xfrm_md_info { + pub if_id: u32_, + pub link: ::aya_ebpf::cty::c_int, + pub dst_orig: *mut dst_entry, } #[repr(C)] #[derive(Copy, Clone)] -pub struct kioctx__bindgen_ty_4 { - pub tail: ::aya_bpf::cty::c_uint, - pub completed_events: ::aya_bpf::cty::c_uint, - pub completion_lock: spinlock_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, - pub __bindgen_padding_0: u32, +pub struct metadata_dst { + pub dst: dst_entry, + pub type_: metadata_type::Type, + pub u: metadata_dst__bindgen_ty_1, } -impl kioctx { - #[inline] - pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Copy, Clone)] +pub union metadata_dst__bindgen_ty_1 { + pub tun_info: ip_tunnel_info, + pub port_info: hw_port_info, + pub macsec_info: macsec_info, + pub xfrm_info: xfrm_md_info, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct kioctx_cpu { - pub reqs_available: ::aya_bpf::cty::c_uint, +pub struct macsec_secy { + pub netdev: *mut net_device, + pub n_rx_sc: ::aya_ebpf::cty::c_uint, + pub sci: sci_t, + pub key_len: u16_, + pub icv_len: u16_, + pub validate_frames: macsec_validation_type::Type, + pub xpn: bool_, + pub operational: bool_, + pub protect_frames: bool_, + pub replay_protect: bool_, + pub replay_window: u32_, + pub tx_sc: macsec_tx_sc, + pub rx_sc: *mut macsec_rx_sc, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ctx_rq_wait { - pub comp: completion, - pub count: atomic_t, +pub struct macsec_context { + pub __bindgen_anon_1: macsec_context__bindgen_ty_1, + pub offload: macsec_offload::Type, + pub secy: *mut macsec_secy, + pub rx_sc: *mut macsec_rx_sc, + pub sa: macsec_context__bindgen_ty_2, + pub stats: macsec_context__bindgen_ty_3, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct throtl_service_queue { - pub parent_sq: *mut throtl_service_queue, - pub queued: [list_head; 2usize], - pub nr_queued: [::aya_bpf::cty::c_uint; 2usize], - pub pending_tree: rb_root_cached, - pub nr_pending: ::aya_bpf::cty::c_uint, - pub first_pending_disptime: ::aya_bpf::cty::c_ulong, - pub pending_timer: timer_list, +#[derive(Copy, Clone)] +pub union macsec_context__bindgen_ty_1 { + pub netdev: *mut net_device, + pub phydev: *mut phy_device, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ioam6_pernet_data { - pub lock: mutex, - pub namespaces: rhashtable, - pub schemas: rhashtable, +pub struct macsec_context__bindgen_ty_2 { + pub update_pn: bool_, + pub assoc_num: ::aya_ebpf::cty::c_uchar, + pub key: [u8_; 128usize], + pub __bindgen_anon_1: macsec_context__bindgen_ty_2__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xdp_dev_bulk_queue { - pub q: [*mut xdp_frame; 16usize], - pub flush_node: list_head, - pub dev: *mut net_device, - pub dev_rx: *mut net_device, - pub xdp_prog: *mut bpf_prog, - pub count: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union macsec_context__bindgen_ty_2__bindgen_ty_1 { + pub rx_sa: *mut macsec_rx_sa, + pub tx_sa: *mut macsec_tx_sa, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcpvegas_info { - pub tcpv_enabled: __u32, - pub tcpv_rttcnt: __u32, - pub tcpv_rtt: __u32, - pub tcpv_minrtt: __u32, +#[derive(Copy, Clone)] +pub union macsec_context__bindgen_ty_3 { + pub tx_sc_stats: *mut macsec_tx_sc_stats, + pub tx_sa_stats: *mut macsec_tx_sa_stats, + pub rx_sc_stats: *mut macsec_rx_sc_stats, + pub rx_sa_stats: *mut macsec_rx_sa_stats, + pub dev_stats: *mut macsec_dev_stats, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcp_dctcp_info { - pub dctcp_enabled: __u16, - pub dctcp_ce_state: __u16, - pub dctcp_alpha: __u32, - pub dctcp_ab_ecn: __u32, - pub dctcp_ab_tot: __u32, +pub struct udp_tunnel_info { + pub type_: ::aya_ebpf::cty::c_ushort, + pub sa_family: sa_family_t, + pub port: __be16, + pub hw_priv: u8_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct tcp_bbr_info { - pub bbr_bw_lo: __u32, - pub bbr_bw_hi: __u32, - pub bbr_min_rtt: __u32, - pub bbr_pacing_gain: __u32, - pub bbr_cwnd_gain: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union tcp_cc_info { - pub vegas: tcpvegas_info, - pub dctcp: tcp_dctcp_info, - pub bbr: tcp_bbr_info, +pub struct udp_tunnel_nic_shared { + pub udp_tunnel_nic_info: *mut udp_tunnel_nic, + pub devices: list_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct swap_iocb { - pub iocb: kiocb, - pub bvec: [bio_vec; 32usize], - pub pages: ::aya_bpf::cty::c_int, - pub len: ::aya_bpf::cty::c_int, +pub struct unicode_map { + pub version: ::aya_ebpf::cty::c_uint, + pub ntab: [*const utf8data; 2usize], + pub tables: *const utf8data_table, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct action_cache { - pub allow_native: [::aya_bpf::cty::c_ulong; 8usize], - pub allow_compat: [::aya_bpf::cty::c_ulong; 8usize], +pub struct utf8data { + pub maxage: ::aya_ebpf::cty::c_uint, + pub offset: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct seccomp_filter { - pub refs: refcount_t, - pub users: refcount_t, - pub log: bool_, - pub wait_killable_recv: bool_, - pub cache: action_cache, - pub prev: *mut seccomp_filter, - pub prog: *mut bpf_prog, - pub notif: *mut notification, - pub notify_lock: mutex, - pub wqh: wait_queue_head_t, +#[derive(Debug, Copy, Clone)] +pub struct utf8data_table { + pub utf8agetab: *const ::aya_ebpf::cty::c_uint, + pub utf8agetab_size: ::aya_ebpf::cty::c_int, + pub utf8nfdicfdata: *const utf8data, + pub utf8nfdicfdata_size: ::aya_ebpf::cty::c_int, + pub utf8nfdidata: *const utf8data, + pub utf8nfdidata_size: ::aya_ebpf::cty::c_int, + pub utf8data: *const ::aya_ebpf::cty::c_uchar, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct notification { - pub request: semaphore, - pub next_id: u64_, - pub notifications: list_head, +#[derive(Debug, Copy, Clone)] +pub struct tnum { + pub value: u64_, + pub mask: u64_, } +pub type bpfptr_t = sockptr_t; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct reset_control { - pub rcdev: *mut reset_controller_dev, - pub list: list_head, - pub id: ::aya_bpf::cty::c_uint, - pub refcnt: kref, - pub acquired: bool_, - pub shared: bool_, - pub array: bool_, - pub deassert_count: atomic_t, - pub triggered_count: atomic_t, +pub struct btf_struct_meta { + pub btf_id: u32_, + pub record: *mut btf_record, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct reset_control_ops { - pub reset: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut reset_controller_dev, - arg2: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub assert: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut reset_controller_dev, - arg2: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub deassert: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut reset_controller_dev, - arg2: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub status: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut reset_controller_dev, - arg2: ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct bpf_verifier_log { + pub start_pos: u64_, + pub end_pos: u64_, + pub ubuf: *mut ::aya_ebpf::cty::c_char, + pub level: u32_, + pub len_total: u32_, + pub len_max: u32_, + pub kbuf: [::aya_ebpf::cty::c_char; 1024usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct reset_controller_dev { - pub ops: *const reset_control_ops, - pub owner: *mut module, - pub list: list_head, - pub reset_control_head: list_head, - pub dev: *mut device, - pub of_node: *mut device_node, - pub of_reset_n_cells: ::aya_bpf::cty::c_int, - pub of_xlate: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut reset_controller_dev, - arg2: *const of_phandle_args, - ) -> ::aya_bpf::cty::c_int, - >, - pub nr_resets: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub struct bpf_subprog_arg_info { + pub arg_type: bpf_arg_type::Type, + pub __bindgen_anon_1: bpf_subprog_arg_info__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct cpuidle_state_kobj { - pub state: *mut cpuidle_state, - pub state_usage: *mut cpuidle_state_usage, - pub kobj_unregister: completion, - pub kobj: kobject, - pub device: *mut cpuidle_device, +pub union bpf_subprog_arg_info__bindgen_ty_1 { + pub mem_size: u32_, } #[repr(C)] #[derive(Copy, Clone)] -pub struct cpuidle_device_kobj { - pub dev: *mut cpuidle_device, - pub kobj_unregister: completion, - pub kobj: kobject, +pub struct bpf_subprog_info { + pub start: u32_, + pub linfo_idx: u32_, + pub stack_depth: u16_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub arg_cnt: u8_, + pub args: [bpf_subprog_arg_info; 5usize], } -pub mod nl80211_iftype { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_IFTYPE_UNSPECIFIED: Type = 0; - pub const NL80211_IFTYPE_ADHOC: Type = 1; - pub const NL80211_IFTYPE_STATION: Type = 2; - pub const NL80211_IFTYPE_AP: Type = 3; - pub const NL80211_IFTYPE_AP_VLAN: Type = 4; - pub const NL80211_IFTYPE_WDS: Type = 5; - pub const NL80211_IFTYPE_MONITOR: Type = 6; - pub const NL80211_IFTYPE_MESH_POINT: Type = 7; - pub const NL80211_IFTYPE_P2P_CLIENT: Type = 8; - pub const NL80211_IFTYPE_P2P_GO: Type = 9; - pub const NL80211_IFTYPE_P2P_DEVICE: Type = 10; - pub const NL80211_IFTYPE_OCB: Type = 11; - pub const NL80211_IFTYPE_NAN: Type = 12; - pub const NUM_NL80211_IFTYPES: Type = 13; - pub const NL80211_IFTYPE_MAX: Type = 12; +impl bpf_subprog_info { + #[inline] + pub fn has_tail_call(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_has_tail_call(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn tail_call_reachable(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_tail_call_reachable(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn has_ld_abs(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_has_ld_abs(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_cb(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_cb(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_async_cb(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_async_cb(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn is_exception_cb(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } + } + #[inline] + pub fn set_is_exception_cb(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn args_cached(&self) -> bool_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + } + #[inline] + pub fn set_args_cached(&mut self, val: bool_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + has_tail_call: bool_, + tail_call_reachable: bool_, + has_ld_abs: bool_, + is_cb: bool_, + is_async_cb: bool_, + is_exception_cb: bool_, + args_cached: bool_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let has_tail_call: u8 = unsafe { ::core::mem::transmute(has_tail_call) }; + has_tail_call as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let tail_call_reachable: u8 = unsafe { ::core::mem::transmute(tail_call_reachable) }; + tail_call_reachable as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let has_ld_abs: u8 = unsafe { ::core::mem::transmute(has_ld_abs) }; + has_ld_abs as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let is_cb: u8 = unsafe { ::core::mem::transmute(is_cb) }; + is_cb as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let is_async_cb: u8 = unsafe { ::core::mem::transmute(is_async_cb) }; + is_async_cb as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let is_exception_cb: u8 = unsafe { ::core::mem::transmute(is_exception_cb) }; + is_exception_cb as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let args_cached: u8 = unsafe { ::core::mem::transmute(args_cached) }; + args_cached as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_conn { - _unused: [u8; 0], +pub struct bpf_id_pair { + pub old: u32_, + pub cur: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_cached_keys { - _unused: [u8; 0], -} -pub mod ieee80211_bss_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IEEE80211_BSS_TYPE_ESS: Type = 0; - pub const IEEE80211_BSS_TYPE_PBSS: Type = 1; - pub const IEEE80211_BSS_TYPE_IBSS: Type = 2; - pub const IEEE80211_BSS_TYPE_MBSS: Type = 3; - pub const IEEE80211_BSS_TYPE_ANY: Type = 4; -} -pub mod nl80211_chan_width { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_CHAN_WIDTH_20_NOHT: Type = 0; - pub const NL80211_CHAN_WIDTH_20: Type = 1; - pub const NL80211_CHAN_WIDTH_40: Type = 2; - pub const NL80211_CHAN_WIDTH_80: Type = 3; - pub const NL80211_CHAN_WIDTH_80P80: Type = 4; - pub const NL80211_CHAN_WIDTH_160: Type = 5; - pub const NL80211_CHAN_WIDTH_5: Type = 6; - pub const NL80211_CHAN_WIDTH_10: Type = 7; - pub const NL80211_CHAN_WIDTH_1: Type = 8; - pub const NL80211_CHAN_WIDTH_2: Type = 9; - pub const NL80211_CHAN_WIDTH_4: Type = 10; - pub const NL80211_CHAN_WIDTH_8: Type = 11; - pub const NL80211_CHAN_WIDTH_16: Type = 12; - pub const NL80211_CHAN_WIDTH_320: Type = 13; -} -pub mod ieee80211_edmg_bw_config { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IEEE80211_EDMG_BW_CONFIG_4: Type = 4; - pub const IEEE80211_EDMG_BW_CONFIG_5: Type = 5; - pub const IEEE80211_EDMG_BW_CONFIG_6: Type = 6; - pub const IEEE80211_EDMG_BW_CONFIG_7: Type = 7; - pub const IEEE80211_EDMG_BW_CONFIG_8: Type = 8; - pub const IEEE80211_EDMG_BW_CONFIG_9: Type = 9; - pub const IEEE80211_EDMG_BW_CONFIG_10: Type = 10; - pub const IEEE80211_EDMG_BW_CONFIG_11: Type = 11; - pub const IEEE80211_EDMG_BW_CONFIG_12: Type = 12; - pub const IEEE80211_EDMG_BW_CONFIG_13: Type = 13; - pub const IEEE80211_EDMG_BW_CONFIG_14: Type = 14; - pub const IEEE80211_EDMG_BW_CONFIG_15: Type = 15; +pub struct bpf_idmap { + pub tmp_id_gen: u32_, + pub map: [bpf_id_pair; 600usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_edmg { - pub channels: u8_, - pub bw_config: ieee80211_edmg_bw_config::Type, +pub struct bpf_idset { + pub count: u32_, + pub ids: [u32_; 600usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_chan_def { - pub chan: *mut ieee80211_channel, - pub width: nl80211_chan_width::Type, - pub center_freq1: u32_, - pub center_freq2: u32_, - pub edmg: ieee80211_edmg, - pub freq1_offset: u16_, +pub struct backtrack_state { + pub env: *mut bpf_verifier_env, + pub frame: u32_, + pub reg_masks: [u32_; 8usize], + pub stack_masks: [u64_; 8usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_mcs_info { - pub rx_mask: [u8_; 10usize], - pub rx_highest: __le16, - pub tx_params: u8_, - pub reserved: [u8_; 3usize], +#[derive(Copy, Clone)] +pub struct bpf_verifier_env { + pub insn_idx: u32_, + pub prev_insn_idx: u32_, + pub prog: *mut bpf_prog, + pub ops: *const bpf_verifier_ops, + pub head: *mut bpf_verifier_stack_elem, + pub stack_size: ::aya_ebpf::cty::c_int, + pub strict_alignment: bool_, + pub test_state_freq: bool_, + pub test_reg_invariants: bool_, + pub cur_state: *mut bpf_verifier_state, + pub explored_states: *mut *mut bpf_verifier_state_list, + pub free_list: *mut bpf_verifier_state_list, + pub used_maps: [*mut bpf_map; 64usize], + pub used_btfs: [btf_mod_pair; 64usize], + pub used_map_cnt: u32_, + pub used_btf_cnt: u32_, + pub id_gen: u32_, + pub hidden_subprog_cnt: u32_, + pub exception_callback_subprog: ::aya_ebpf::cty::c_int, + pub explore_alu_limits: bool_, + pub allow_ptr_leaks: bool_, + pub allow_uninit_stack: bool_, + pub bpf_capable: bool_, + pub bypass_spec_v1: bool_, + pub bypass_spec_v4: bool_, + pub seen_direct_write: bool_, + pub seen_exception: bool_, + pub insn_aux_data: *mut bpf_insn_aux_data, + pub prev_linfo: *const bpf_line_info, + pub log: bpf_verifier_log, + pub subprog_info: [bpf_subprog_info; 258usize], + pub __bindgen_anon_1: bpf_verifier_env__bindgen_ty_1, + pub cfg: bpf_verifier_env__bindgen_ty_2, + pub bt: backtrack_state, + pub cur_hist_ent: *mut bpf_jmp_history_entry, + pub pass_cnt: u32_, + pub subprog_cnt: u32_, + pub prev_insn_processed: u32_, + pub insn_processed: u32_, + pub prev_jmps_processed: u32_, + pub jmps_processed: u32_, + pub verification_time: u64_, + pub max_states_per_insn: u32_, + pub total_states: u32_, + pub peak_states: u32_, + pub longest_mark_read_walk: u32_, + pub fd_array: bpfptr_t, + pub scratched_regs: u32_, + pub scratched_stack_slots: u64_, + pub prev_log_pos: u64_, + pub prev_insn_print_pos: u64_, + pub tmp_str_buf: [::aya_ebpf::cty::c_char; 320usize], } -#[repr(C, packed)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_ht_cap { - pub cap_info: __le16, - pub ampdu_params_info: u8_, - pub mcs: ieee80211_mcs_info, - pub extended_ht_cap_info: __le16, - pub tx_BF_cap_info: __le32, - pub antenna_selection_info: u8_, +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_verifier_env__bindgen_ty_1 { + pub idmap_scratch: bpf_idmap, + pub idset_scratch: bpf_idset, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_ibss_params { - pub ssid: *const u8_, - pub bssid: *const u8_, - pub chandef: cfg80211_chan_def, - pub ie: *const u8_, - pub ssid_len: u8_, - pub ie_len: u8_, - pub beacon_interval: u16_, - pub basic_rates: u32_, - pub channel_fixed: bool_, - pub privacy: bool_, - pub control_port: bool_, - pub control_port_over_nl80211: bool_, - pub userspace_handles_dfs: bool_, - pub mcast_rate: [::aya_bpf::cty::c_int; 6usize], - pub ht_capa: ieee80211_ht_cap, - pub ht_capa_mask: ieee80211_ht_cap, - pub wep_keys: *mut key_params, - pub wep_tx_key: ::aya_bpf::cty::c_int, +pub struct bpf_verifier_env__bindgen_ty_2 { + pub insn_state: *mut ::aya_ebpf::cty::c_int, + pub insn_stack: *mut ::aya_ebpf::cty::c_int, + pub cur_stack: ::aya_ebpf::cty::c_int, } -pub mod nl80211_auth_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_AUTHTYPE_OPEN_SYSTEM: Type = 0; - pub const NL80211_AUTHTYPE_SHARED_KEY: Type = 1; - pub const NL80211_AUTHTYPE_FT: Type = 2; - pub const NL80211_AUTHTYPE_NETWORK_EAP: Type = 3; - pub const NL80211_AUTHTYPE_SAE: Type = 4; - pub const NL80211_AUTHTYPE_FILS_SK: Type = 5; - pub const NL80211_AUTHTYPE_FILS_SK_PFS: Type = 6; - pub const NL80211_AUTHTYPE_FILS_PK: Type = 7; - pub const __NL80211_AUTHTYPE_NUM: Type = 8; - pub const NL80211_AUTHTYPE_MAX: Type = 7; - pub const NL80211_AUTHTYPE_AUTOMATIC: Type = 8; +pub mod bpf_dynptr_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_DYNPTR_TYPE_INVALID: Type = 0; + pub const BPF_DYNPTR_TYPE_LOCAL: Type = 1; + pub const BPF_DYNPTR_TYPE_RINGBUF: Type = 2; + pub const BPF_DYNPTR_TYPE_SKB: Type = 3; + pub const BPF_DYNPTR_TYPE_XDP: Type = 4; } -pub mod nl80211_mfp { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_MFP_NO: Type = 0; - pub const NL80211_MFP_REQUIRED: Type = 1; - pub const NL80211_MFP_OPTIONAL: Type = 2; +pub mod bpf_iter_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_ITER_STATE_INVALID: Type = 0; + pub const BPF_ITER_STATE_ACTIVE: Type = 1; + pub const BPF_ITER_STATE_DRAINED: Type = 2; } -pub mod nl80211_sae_pwe_mechanism { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_SAE_PWE_UNSPECIFIED: Type = 0; - pub const NL80211_SAE_PWE_HUNT_AND_PECK: Type = 1; - pub const NL80211_SAE_PWE_HASH_TO_ELEMENT: Type = 2; - pub const NL80211_SAE_PWE_BOTH: Type = 3; +pub mod bpf_reg_liveness { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const REG_LIVE_NONE: Type = 0; + pub const REG_LIVE_READ32: Type = 1; + pub const REG_LIVE_READ64: Type = 2; + pub const REG_LIVE_READ: Type = 3; + pub const REG_LIVE_WRITTEN: Type = 4; + pub const REG_LIVE_DONE: Type = 8; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_reg_state { + pub type_: bpf_reg_type::Type, + pub off: s32, + pub __bindgen_anon_1: bpf_reg_state__bindgen_ty_1, + pub var_off: tnum, + pub smin_value: s64, + pub smax_value: s64, + pub umin_value: u64_, + pub umax_value: u64_, + pub s32_min_value: s32, + pub s32_max_value: s32, + pub u32_min_value: u32_, + pub u32_max_value: u32_, + pub id: u32_, + pub ref_obj_id: u32_, + pub parent: *mut bpf_reg_state, + pub frameno: u32_, + pub subreg_def: s32, + pub live: bpf_reg_liveness::Type, + pub precise: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union bpf_reg_state__bindgen_ty_1 { + pub range: ::aya_ebpf::cty::c_int, + pub __bindgen_anon_1: bpf_reg_state__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: bpf_reg_state__bindgen_ty_1__bindgen_ty_2, + pub __bindgen_anon_3: bpf_reg_state__bindgen_ty_1__bindgen_ty_3, + pub dynptr: bpf_reg_state__bindgen_ty_1__bindgen_ty_4, + pub iter: bpf_reg_state__bindgen_ty_1__bindgen_ty_5, + pub raw: bpf_reg_state__bindgen_ty_1__bindgen_ty_6, + pub subprogno: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_crypto_settings { - pub wpa_versions: u32_, - pub cipher_group: u32_, - pub n_ciphers_pairwise: ::aya_bpf::cty::c_int, - pub ciphers_pairwise: [u32_; 5usize], - pub n_akm_suites: ::aya_bpf::cty::c_int, - pub akm_suites: [u32_; 10usize], - pub control_port: bool_, - pub control_port_ethertype: __be16, - pub control_port_no_encrypt: bool_, - pub control_port_over_nl80211: bool_, - pub control_port_no_preauth: bool_, - pub psk: *const u8_, - pub sae_pwd: *const u8_, - pub sae_pwd_len: u8_, - pub sae_pwe: nl80211_sae_pwe_mechanism::Type, +pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_1 { + pub map_ptr: *mut bpf_map, + pub map_uid: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_vht_mcs_info { - pub rx_mcs_map: __le16, - pub rx_highest: __le16, - pub tx_mcs_map: __le16, - pub tx_highest: __le16, +pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_2 { + pub btf: *mut btf, + pub btf_id: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_vht_cap { - pub vht_cap_info: __le32, - pub supp_mcs: ieee80211_vht_mcs_info, +pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_3 { + pub mem_size: u32_, + pub dynptr_id: u32_, } -pub mod nl80211_bss_select_attr { - pub type Type = ::aya_bpf::cty::c_uint; - pub const __NL80211_BSS_SELECT_ATTR_INVALID: Type = 0; - pub const NL80211_BSS_SELECT_ATTR_RSSI: Type = 1; - pub const NL80211_BSS_SELECT_ATTR_BAND_PREF: Type = 2; - pub const NL80211_BSS_SELECT_ATTR_RSSI_ADJUST: Type = 3; - pub const __NL80211_BSS_SELECT_ATTR_AFTER_LAST: Type = 4; - pub const NL80211_BSS_SELECT_ATTR_MAX: Type = 3; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_4 { + pub type_: bpf_dynptr_type::Type, + pub first_slot: bool_, } -pub mod nl80211_band { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_BAND_2GHZ: Type = 0; - pub const NL80211_BAND_5GHZ: Type = 1; - pub const NL80211_BAND_60GHZ: Type = 2; - pub const NL80211_BAND_6GHZ: Type = 3; - pub const NL80211_BAND_S1GHZ: Type = 4; - pub const NL80211_BAND_LC: Type = 5; - pub const NUM_NL80211_BANDS: Type = 6; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_5 { + pub btf: *mut btf, + pub btf_id: u32_, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, +} +impl bpf_reg_state__bindgen_ty_1__bindgen_ty_5 { + #[inline] + pub fn state(&self) -> bpf_iter_state::Type { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u32) } + } + #[inline] + pub fn set_state(&mut self, val: bpf_iter_state::Type) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 2u8, val as u64) + } + } + #[inline] + pub fn depth(&self) -> ::aya_ebpf::cty::c_int { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 30u8) as u32) } + } + #[inline] + pub fn set_depth(&mut self, val: ::aya_ebpf::cty::c_int) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 30u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + state: bpf_iter_state::Type, + depth: ::aya_ebpf::cty::c_int, + ) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 2u8, { + let state: u32 = unsafe { ::core::mem::transmute(state) }; + state as u64 + }); + __bindgen_bitfield_unit.set(2usize, 30u8, { + let depth: u32 = unsafe { ::core::mem::transmute(depth) }; + depth as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_bss_select_adjust { - pub band: nl80211_band::Type, - pub delta: s8, +pub struct bpf_reg_state__bindgen_ty_1__bindgen_ty_6 { + pub raw1: ::aya_ebpf::cty::c_ulong, + pub raw2: ::aya_ebpf::cty::c_ulong, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct cfg80211_bss_selection { - pub behaviour: nl80211_bss_select_attr::Type, - pub param: cfg80211_bss_selection__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct bpf_retval_range { + pub minval: s32, + pub maxval: s32, } #[repr(C)] #[derive(Copy, Clone)] -pub union cfg80211_bss_selection__bindgen_ty_1 { - pub band_pref: nl80211_band::Type, - pub adjust: cfg80211_bss_select_adjust, +pub struct bpf_func_state { + pub regs: [bpf_reg_state; 11usize], + pub callsite: ::aya_ebpf::cty::c_int, + pub frameno: u32_, + pub subprogno: u32_, + pub async_entry_cnt: u32_, + pub callback_ret_range: bpf_retval_range, + pub in_callback_fn: bool_, + pub in_async_callback_fn: bool_, + pub in_exception_callback_fn: bool_, + pub callback_depth: u32_, + pub acquired_refs: ::aya_ebpf::cty::c_int, + pub refs: *mut bpf_reference_state, + pub stack: *mut bpf_stack_state, + pub allocated_stack: ::aya_ebpf::cty::c_int, +} +pub mod bpf_access_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const BPF_READ: Type = 1; + pub const BPF_WRITE: Type = 2; } #[repr(C)] #[derive(Copy, Clone)] -pub struct cfg80211_connect_params { - pub channel: *mut ieee80211_channel, - pub channel_hint: *mut ieee80211_channel, - pub bssid: *const u8_, - pub bssid_hint: *const u8_, - pub ssid: *const u8_, - pub ssid_len: usize, - pub auth_type: nl80211_auth_type::Type, - pub ie: *const u8_, - pub ie_len: usize, - pub privacy: bool_, - pub mfp: nl80211_mfp::Type, - pub crypto: cfg80211_crypto_settings, - pub key: *const u8_, - pub key_len: u8_, - pub key_idx: u8_, - pub flags: u32_, - pub bg_scan_period: ::aya_bpf::cty::c_int, - pub ht_capa: ieee80211_ht_cap, - pub ht_capa_mask: ieee80211_ht_cap, - pub vht_capa: ieee80211_vht_cap, - pub vht_capa_mask: ieee80211_vht_cap, - pub pbss: bool_, - pub bss_select: cfg80211_bss_selection, - pub prev_bssid: *const u8_, - pub fils_erp_username: *const u8_, - pub fils_erp_username_len: usize, - pub fils_erp_realm: *const u8_, - pub fils_erp_realm_len: usize, - pub fils_erp_next_seq_num: u16_, - pub fils_erp_rrk: *const u8_, - pub fils_erp_rrk_len: usize, - pub want_1x: bool_, - pub edmg: ieee80211_edmg, +pub struct bpf_insn_access_aux { + pub reg_type: bpf_reg_type::Type, + pub __bindgen_anon_1: bpf_insn_access_aux__bindgen_ty_1, + pub log: *mut bpf_verifier_log, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cfg80211_cqm_config { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub union bpf_insn_access_aux__bindgen_ty_1 { + pub ctx_field_size: ::aya_ebpf::cty::c_int, + pub __bindgen_anon_1: bpf_insn_access_aux__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_internal_bss { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct wireless_dev { - pub wiphy: *mut wiphy, - pub iftype: nl80211_iftype::Type, - pub list: list_head, - pub netdev: *mut net_device, - pub identifier: u32_, - pub mgmt_registrations: list_head, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub mtx: mutex, - pub use_4addr: bool_, - pub is_running: bool_, - pub registered: bool_, - pub registering: bool_, - pub address: [u8_; 6usize], - pub conn: *mut cfg80211_conn, - pub connect_keys: *mut cfg80211_cached_keys, - pub conn_bss_type: ieee80211_bss_type::Type, - pub conn_owner_nlportid: u32_, - pub disconnect_wk: work_struct, - pub disconnect_bssid: [u8_; 6usize], - pub event_list: list_head, - pub event_lock: spinlock_t, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, - pub ps: bool_, - pub ps_timeout: ::aya_bpf::cty::c_int, - pub ap_unexpected_nlportid: u32_, - pub owner_nlportid: u32_, - pub nl_owner_dead: bool_, - pub cac_started: bool_, - pub cac_start_time: ::aya_bpf::cty::c_ulong, - pub cac_time_ms: ::aya_bpf::cty::c_uint, - pub wext: wireless_dev__bindgen_ty_1, - pub cqm_config: *mut cfg80211_cqm_config, - pub pmsr_list: list_head, - pub pmsr_lock: spinlock_t, - pub pmsr_free_wk: work_struct, - pub unprot_beacon_reported: ::aya_bpf::cty::c_ulong, - pub u: wireless_dev__bindgen_ty_2, - pub links: [wireless_dev__bindgen_ty_3; 15usize], - pub valid_links: u16_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct wireless_dev__bindgen_ty_1 { - pub ibss: cfg80211_ibss_params, - pub connect: cfg80211_connect_params, - pub keys: *mut cfg80211_cached_keys, - pub ie: *const u8_, - pub ie_len: usize, - pub bssid: [u8_; 6usize], - pub prev_bssid: [u8_; 6usize], - pub ssid: [u8_; 32usize], - pub default_key: s8, - pub default_mgmt_key: s8, - pub prev_bssid_valid: bool_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union wireless_dev__bindgen_ty_2 { - pub client: wireless_dev__bindgen_ty_2__bindgen_ty_1, - pub mesh: wireless_dev__bindgen_ty_2__bindgen_ty_2, - pub ap: wireless_dev__bindgen_ty_2__bindgen_ty_3, - pub ibss: wireless_dev__bindgen_ty_2__bindgen_ty_4, - pub ocb: wireless_dev__bindgen_ty_2__bindgen_ty_5, +pub struct bpf_insn_access_aux__bindgen_ty_1__bindgen_ty_1 { + pub btf: *mut btf, + pub btf_id: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_2__bindgen_ty_1 { - pub connected_addr: [u8_; 6usize], - pub ssid: [u8_; 32usize], - pub ssid_len: u8_, - pub __bindgen_padding_0: u8, +pub struct bpf_verifier_ops { + pub get_func_proto: ::core::option::Option< + unsafe extern "C" fn( + arg1: bpf_func_id::Type, + arg2: *const bpf_prog, + ) -> *const bpf_func_proto, + >, + pub is_valid_access: ::core::option::Option< + unsafe extern "C" fn( + arg1: ::aya_ebpf::cty::c_int, + arg2: ::aya_ebpf::cty::c_int, + arg3: bpf_access_type::Type, + arg4: *const bpf_prog, + arg5: *mut bpf_insn_access_aux, + ) -> bool_, + >, + pub gen_prologue: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_insn, + arg2: bool_, + arg3: *const bpf_prog, + ) -> ::aya_ebpf::cty::c_int, + >, + pub gen_ld_abs: ::core::option::Option< + unsafe extern "C" fn(arg1: *const bpf_insn, arg2: *mut bpf_insn) -> ::aya_ebpf::cty::c_int, + >, + pub convert_ctx_access: ::core::option::Option< + unsafe extern "C" fn( + arg1: bpf_access_type::Type, + arg2: *const bpf_insn, + arg3: *mut bpf_insn, + arg4: *mut bpf_prog, + arg5: *mut u32_, + ) -> u32_, + >, + pub btf_struct_access: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_verifier_log, + arg2: *const bpf_reg_state, + arg3: ::aya_ebpf::cty::c_int, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_2__bindgen_ty_2 { - pub beacon_interval: ::aya_bpf::cty::c_int, - pub preset_chandef: cfg80211_chan_def, - pub chandef: cfg80211_chan_def, - pub id: [u8_; 32usize], - pub id_len: u8_, - pub id_up_len: u8_, +pub struct bpf_active_lock { + pub ptr: *mut ::aya_ebpf::cty::c_void, + pub id: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_2__bindgen_ty_3 { - pub preset_chandef: cfg80211_chan_def, - pub ssid: [u8_; 32usize], - pub ssid_len: u8_, +#[derive(Copy, Clone)] +pub struct bpf_stack_state { + pub spilled_ptr: bpf_reg_state, + pub slot_type: [u8_; 8usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_2__bindgen_ty_4 { - pub current_bss: *mut cfg80211_internal_bss, - pub chandef: cfg80211_chan_def, - pub beacon_interval: ::aya_bpf::cty::c_int, - pub ssid: [u8_; 32usize], - pub ssid_len: u8_, +pub struct bpf_reference_state { + pub id: ::aya_ebpf::cty::c_int, + pub insn_idx: ::aya_ebpf::cty::c_int, + pub callback_ref: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_2__bindgen_ty_5 { - pub chandef: cfg80211_chan_def, +pub struct bpf_jmp_history_entry { + pub idx: u32_, + pub _bitfield_align_1: [u32; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 4usize]>, } -#[repr(C)] -#[derive(Copy, Clone)] -pub struct wireless_dev__bindgen_ty_3 { - pub addr: [u8_; 6usize], - pub __bindgen_anon_1: wireless_dev__bindgen_ty_3__bindgen_ty_1, +impl bpf_jmp_history_entry { + #[inline] + pub fn prev_idx(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 22u8) as u32) } + } + #[inline] + pub fn set_prev_idx(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 22u8, val as u64) + } + } + #[inline] + pub fn flags(&self) -> u32_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(22usize, 10u8) as u32) } + } + #[inline] + pub fn set_flags(&mut self, val: u32_) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(22usize, 10u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1(prev_idx: u32_, flags: u32_) -> __BindgenBitfieldUnit<[u8; 4usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 4usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 22u8, { + let prev_idx: u32 = unsafe { ::core::mem::transmute(prev_idx) }; + prev_idx as u64 + }); + __bindgen_bitfield_unit.set(22usize, 10u8, { + let flags: u32 = unsafe { ::core::mem::transmute(flags) }; + flags as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Copy, Clone)] -pub union wireless_dev__bindgen_ty_3__bindgen_ty_1 { - pub ap: wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1, - pub client: wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_2, +#[derive(Debug, Copy, Clone)] +pub struct bpf_verifier_state { + pub frame: [*mut bpf_func_state; 8usize], + pub parent: *mut bpf_verifier_state, + pub branches: u32_, + pub insn_idx: u32_, + pub curframe: u32_, + pub active_lock: bpf_active_lock, + pub speculative: bool_, + pub active_rcu_lock: bool_, + pub used_as_loop_entry: bool_, + pub first_insn_idx: u32_, + pub last_insn_idx: u32_, + pub loop_entry: *mut bpf_verifier_state, + pub jmp_history: *mut bpf_jmp_history_entry, + pub jmp_history_cnt: u32_, + pub dfs_depth: u32_, + pub callback_unroll_depth: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { - pub beacon_interval: ::aya_bpf::cty::c_uint, - pub chandef: cfg80211_chan_def, +pub struct bpf_verifier_state_list { + pub state: bpf_verifier_state, + pub next: *mut bpf_verifier_state_list, + pub miss_cnt: ::aya_ebpf::cty::c_int, + pub hit_cnt: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_2 { - pub current_bss: *mut cfg80211_internal_bss, +pub struct bpf_loop_inline_state { + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub callback_subprogno: u32_, } -impl wireless_dev { +impl bpf_loop_inline_state { #[inline] - pub fn mgmt_registrations_need_update(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + pub fn initialized(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] - pub fn set_mgmt_registrations_need_update(&mut self, val: u8_) { + pub fn set_initialized(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); + let val: u32 = ::core::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_1( - mgmt_registrations_need_update: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let mgmt_registrations_need_update: u8 = - unsafe { ::core::mem::transmute(mgmt_registrations_need_update) }; - mgmt_registrations_need_update as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn connected(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u8) } + pub fn fit_for_inline(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] - pub fn set_connected(&mut self, val: u8_) { + pub fn set_fit_for_inline(&mut self, val: ::aya_ebpf::cty::c_uint) { unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_2.set(0usize, 1u8, val as u64) + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] - pub fn new_bitfield_2(connected: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + pub fn new_bitfield_1( + initialized: ::aya_ebpf::cty::c_uint, + fit_for_inline: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let connected: u8 = unsafe { ::core::mem::transmute(connected) }; - connected as u64 + let initialized: u32 = unsafe { ::core::mem::transmute(initialized) }; + initialized as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let fit_for_inline: u32 = unsafe { ::core::mem::transmute(fit_for_inline) }; + fit_for_inline as u64 }); __bindgen_bitfield_unit } } -pub mod nl80211_reg_initiator { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_REGDOM_SET_BY_CORE: Type = 0; - pub const NL80211_REGDOM_SET_BY_USER: Type = 1; - pub const NL80211_REGDOM_SET_BY_DRIVER: Type = 2; - pub const NL80211_REGDOM_SET_BY_COUNTRY_IE: Type = 3; -} -pub mod nl80211_dfs_regions { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_DFS_UNSET: Type = 0; - pub const NL80211_DFS_FCC: Type = 1; - pub const NL80211_DFS_ETSI: Type = 2; - pub const NL80211_DFS_JP: Type = 3; -} -pub mod nl80211_user_reg_hint_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_USER_REG_HINT_USER: Type = 0; - pub const NL80211_USER_REG_HINT_CELL_BASE: Type = 1; - pub const NL80211_USER_REG_HINT_INDOOR: Type = 2; -} -pub mod nl80211_key_mode { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_KEY_RX_TX: Type = 0; - pub const NL80211_KEY_NO_TX: Type = 1; - pub const NL80211_KEY_SET_TX: Type = 2; -} -pub mod nl80211_bss_scan_width { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_BSS_CHAN_WIDTH_20: Type = 0; - pub const NL80211_BSS_CHAN_WIDTH_10: Type = 1; - pub const NL80211_BSS_CHAN_WIDTH_5: Type = 2; - pub const NL80211_BSS_CHAN_WIDTH_1: Type = 3; - pub const NL80211_BSS_CHAN_WIDTH_2: Type = 4; -} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nl80211_wowlan_tcp_data_seq { - pub start: __u32, - pub offset: __u32, - pub len: __u32, +#[derive(Copy, Clone)] +pub struct bpf_insn_aux_data { + pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1, + pub __bindgen_anon_2: bpf_insn_aux_data__bindgen_ty_2, + pub kptr_struct_meta: *mut btf_struct_meta, + pub map_key_state: u64_, + pub ctx_field_size: ::aya_ebpf::cty::c_int, + pub seen: u32_, + pub sanitize_stack_spill: bool_, + pub zext_dst: bool_, + pub storage_get_func_atomic: bool_, + pub is_iter_next: bool_, + pub call_with_percpu_alloc_ptr: bool_, + pub alu_state: u8_, + pub orig_idx: ::aya_ebpf::cty::c_uint, + pub jmp_point: bool_, + pub prune_point: bool_, + pub force_checkpoint: bool_, + pub calls_callback: bool_, } #[repr(C)] -#[derive(Debug)] -pub struct nl80211_wowlan_tcp_data_token { - pub offset: __u32, - pub len: __u32, - pub token_stream: __IncompleteArrayField<__u8>, +#[derive(Copy, Clone)] +pub union bpf_insn_aux_data__bindgen_ty_1 { + pub ptr_type: bpf_reg_type::Type, + pub map_ptr_state: ::aya_ebpf::cty::c_ulong, + pub call_imm: s32, + pub alu_limit: u32_, + pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_1, + pub btf_var: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2, + pub loop_inline_state: bpf_loop_inline_state, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nl80211_wowlan_tcp_data_token_feature { - pub min_len: __u32, - pub max_len: __u32, - pub bufsize: __u32, -} -pub mod nl80211_dfs_state { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_DFS_USABLE: Type = 0; - pub const NL80211_DFS_UNAVAILABLE: Type = 1; - pub const NL80211_DFS_AVAILABLE: Type = 2; +pub struct bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_1 { + pub map_index: u32_, + pub map_off: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nl80211_vendor_cmd_info { - pub vendor_id: __u32, - pub subcmd: __u32, -} -pub mod nl80211_sar_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL80211_SAR_TYPE_POWER: Type = 0; - pub const NUM_NL80211_SAR_TYPE: Type = 1; +#[derive(Copy, Clone)] +pub struct bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2 { + pub reg_type: bpf_reg_type::Type, + pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_he_cap_elem { - pub mac_cap_info: [u8_; 6usize], - pub phy_cap_info: [u8_; 11usize], +#[derive(Copy, Clone)] +pub union bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 { + pub __bindgen_anon_1: bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, + pub mem_size: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_he_mcs_nss_supp { - pub rx_mcs_80: __le16, - pub tx_mcs_80: __le16, - pub rx_mcs_160: __le16, - pub tx_mcs_160: __le16, - pub rx_mcs_80p80: __le16, - pub tx_mcs_80p80: __le16, +pub struct bpf_insn_aux_data__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 { + pub btf: *mut btf, + pub btf_id: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_eht_mcs_nss_supp_20mhz_only { - pub rx_tx_mcs7_max_nss: u8_, - pub rx_tx_mcs9_max_nss: u8_, - pub rx_tx_mcs11_max_nss: u8_, - pub rx_tx_mcs13_max_nss: u8_, +#[derive(Copy, Clone)] +pub union bpf_insn_aux_data__bindgen_ty_2 { + pub obj_new_size: u64_, + pub insert_off: u64_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_eht_mcs_nss_supp_bw { - pub rx_tx_mcs9_max_nss: u8_, - pub rx_tx_mcs11_max_nss: u8_, - pub rx_tx_mcs13_max_nss: u8_, +#[derive(Copy, Clone)] +pub struct cpu_stop_done { + pub nr_todo: atomic_t, + pub ret: ::aya_ebpf::cty::c_int, + pub completion: completion, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_eht_cap_elem_fixed { - pub mac_cap_info: [u8_; 2usize], - pub phy_cap_info: [u8_; 9usize], +pub struct xdp_dev_bulk_queue { + pub q: [*mut xdp_frame; 16usize], + pub flush_node: list_head, + pub dev: *mut net_device, + pub dev_rx: *mut net_device, + pub xdp_prog: *mut bpf_prog, + pub count: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_he_6ghz_capa { - pub capa: __le16, +#[derive(Copy, Clone)] +pub struct kernfs_open_node { + pub callback_head: callback_head, + pub event: atomic_t, + pub poll: wait_queue_head_t, + pub files: list_head, + pub nr_mmapped: ::aya_ebpf::cty::c_uint, + pub nr_to_release: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct rfkill { - _unused: [u8; 0], -} -pub mod environment_cap { - pub type Type = ::aya_bpf::cty::c_uint; - pub const ENVIRON_ANY: Type = 0; - pub const ENVIRON_INDOOR: Type = 1; - pub const ENVIRON_OUTDOOR: Type = 2; +pub struct io_uring_buf { + pub addr: __u64, + pub len: __u32, + pub bid: __u16, + pub resv: __u16, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct regulatory_request { - pub callback_head: callback_head, - pub wiphy_idx: ::aya_bpf::cty::c_int, - pub initiator: nl80211_reg_initiator::Type, - pub user_reg_hint_type: nl80211_user_reg_hint_type::Type, - pub alpha2: [::aya_bpf::cty::c_char; 3usize], - pub dfs_region: nl80211_dfs_regions::Type, - pub intersect: bool_, - pub processed: bool_, - pub country_ie_env: environment_cap::Type, - pub list: list_head, +pub struct io_uring_buf_ring { + pub __bindgen_anon_1: io_uring_buf_ring__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_freq_range { - pub start_freq_khz: u32_, - pub end_freq_khz: u32_, - pub max_bandwidth_khz: u32_, +pub struct io_uring_buf_ring__bindgen_ty_1 { + pub __bindgen_anon_1: __BindgenUnionField, + pub __bindgen_anon_2: __BindgenUnionField, + pub bindgen_union_field: [u64; 2usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_power_rule { - pub max_antenna_gain: u32_, - pub max_eirp: u32_, +pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_1 { + pub resv1: __u64, + pub resv2: __u32, + pub resv3: __u16, + pub tail: __u16, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_wmm_ac { - pub cw_min: u16_, - pub cw_max: u16_, - pub cot: u16_, - pub aifsn: u8_, +#[derive(Debug)] +pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2 { + pub __empty_bufs: io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, + pub bufs: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_wmm_rule { - pub client: [ieee80211_wmm_ac; 4usize], - pub ap: [ieee80211_wmm_ac; 4usize], -} +pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_reg_rule { - pub freq_range: ieee80211_freq_range, - pub power_rule: ieee80211_power_rule, - pub wmm_rule: ieee80211_wmm_rule, - pub flags: u32_, - pub dfs_cac_ms: u32_, - pub has_wmm: bool_, +#[derive(Copy, Clone)] +pub struct io_buffer_list { + pub __bindgen_anon_1: io_buffer_list__bindgen_ty_1, + pub bgid: __u16, + pub buf_nr_pages: __u16, + pub nr_entries: __u16, + pub head: __u16, + pub mask: __u16, + pub is_mapped: __u8, + pub is_mmap: __u8, + pub is_ready: __u8, } #[repr(C)] -#[derive(Debug)] -pub struct ieee80211_regdomain { - pub callback_head: callback_head, - pub n_reg_rules: u32_, - pub alpha2: [::aya_bpf::cty::c_char; 3usize], - pub dfs_region: nl80211_dfs_regions::Type, - pub reg_rules: __IncompleteArrayField, +#[derive(Copy, Clone)] +pub union io_buffer_list__bindgen_ty_1 { + pub buf_list: list_head, + pub __bindgen_anon_1: io_buffer_list__bindgen_ty_1__bindgen_ty_1, + pub rcu: callback_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_channel { - pub band: nl80211_band::Type, - pub center_freq: u32_, - pub freq_offset: u16_, - pub hw_value: u16_, - pub flags: u32_, - pub max_antenna_gain: ::aya_bpf::cty::c_int, - pub max_power: ::aya_bpf::cty::c_int, - pub max_reg_power: ::aya_bpf::cty::c_int, - pub beacon_found: bool_, - pub orig_flags: u32_, - pub orig_mag: ::aya_bpf::cty::c_int, - pub orig_mpwr: ::aya_bpf::cty::c_int, - pub dfs_state: nl80211_dfs_state::Type, - pub dfs_state_entered: ::aya_bpf::cty::c_ulong, - pub dfs_cac_ms: ::aya_bpf::cty::c_uint, +pub struct io_buffer_list__bindgen_ty_1__bindgen_ty_1 { + pub buf_pages: *mut *mut page, + pub buf_ring: *mut io_uring_buf_ring, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_rate { - pub flags: u32_, - pub bitrate: u16_, - pub hw_value: u16_, - pub hw_value_short: u16_, -} -#[repr(C, packed)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_sta_ht_cap { - pub cap: u16_, - pub ht_supported: bool_, - pub ampdu_factor: u8_, - pub ampdu_density: u8_, - pub mcs: ieee80211_mcs_info, - pub __bindgen_padding_0: u8, +pub struct io_buffer { + pub list: list_head, + pub addr: __u64, + pub len: __u32, + pub bid: __u16, + pub bgid: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_sta_vht_cap { - pub vht_supported: bool_, - pub cap: u32_, - pub vht_mcs: ieee80211_vht_mcs_info, +pub struct bpf_prog_offload_ops { + pub insn_hook: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_verifier_env, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub finalize: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut bpf_verifier_env) -> ::aya_ebpf::cty::c_int, + >, + pub replace_insn: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_verifier_env, + arg2: u32_, + arg3: *mut bpf_insn, + ) -> ::aya_ebpf::cty::c_int, + >, + pub remove_insns: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut bpf_verifier_env, + arg2: u32_, + arg3: u32_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub prepare: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub translate: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub destroy: ::core::option::Option, } -#[repr(C, packed)] +#[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_sta_he_cap { - pub has_he: bool_, - pub he_cap_elem: ieee80211_he_cap_elem, - pub he_mcs_nss_supp: ieee80211_he_mcs_nss_supp, - pub ppe_thres: [u8_; 25usize], +pub struct bpf_offload_dev { + pub ops: *const bpf_prog_offload_ops, + pub netdevs: list_head, + pub priv_: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ieee80211_eht_mcs_nss_supp { - pub __bindgen_anon_1: ieee80211_eht_mcs_nss_supp__bindgen_ty_1, +#[derive(Debug)] +pub struct kioctx_table { + pub rcu: callback_head, + pub nr: ::aya_ebpf::cty::c_uint, + pub table: __IncompleteArrayField<*mut kioctx>, } #[repr(C)] #[derive(Copy, Clone)] -pub union ieee80211_eht_mcs_nss_supp__bindgen_ty_1 { - pub only_20mhz: ieee80211_eht_mcs_nss_supp_20mhz_only, - pub bw: ieee80211_eht_mcs_nss_supp__bindgen_ty_1__bindgen_ty_1, -} +pub struct kioctx { + pub users: percpu_ref, + pub dead: atomic_t, + pub reqs: percpu_ref, + pub user_id: ::aya_ebpf::cty::c_ulong, + pub cpu: *mut kioctx_cpu, + pub req_batch: ::aya_ebpf::cty::c_uint, + pub max_reqs: ::aya_ebpf::cty::c_uint, + pub nr_events: ::aya_ebpf::cty::c_uint, + pub mmap_base: ::aya_ebpf::cty::c_ulong, + pub mmap_size: ::aya_ebpf::cty::c_ulong, + pub ring_pages: *mut *mut page, + pub nr_pages: ::aya_ebpf::cty::c_long, + pub free_rwork: rcu_work, + pub rq_wait: *mut ctx_rq_wait, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 24usize]>, + pub __bindgen_anon_1: kioctx__bindgen_ty_1, + pub __bindgen_anon_2: kioctx__bindgen_ty_2, + pub __bindgen_anon_3: kioctx__bindgen_ty_3, + pub __bindgen_anon_4: kioctx__bindgen_ty_4, + pub internal_pages: [*mut page; 8usize], + pub aio_ring_file: *mut file, + pub id: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 48usize]>, + pub __bindgen_padding_0: u32, +} #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_eht_mcs_nss_supp__bindgen_ty_1__bindgen_ty_1 { - pub _80: ieee80211_eht_mcs_nss_supp_bw, - pub _160: ieee80211_eht_mcs_nss_supp_bw, - pub _320: ieee80211_eht_mcs_nss_supp_bw, +pub struct kioctx__bindgen_ty_1 { + pub reqs_available: atomic_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, + pub __bindgen_padding_0: u32, } #[repr(C)] #[derive(Copy, Clone)] -pub struct ieee80211_sta_eht_cap { - pub has_eht: bool_, - pub eht_cap_elem: ieee80211_eht_cap_elem_fixed, - pub eht_mcs_nss_supp: ieee80211_eht_mcs_nss_supp, - pub eht_ppe_thres: [u8_; 32usize], +pub struct kioctx__bindgen_ty_2 { + pub ctx_lock: spinlock_t, + pub active_reqs: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, } -#[repr(C, packed)] +#[repr(C)] #[derive(Copy, Clone)] -pub struct ieee80211_sband_iftype_data { - pub types_mask: u16_, - pub he_cap: ieee80211_sta_he_cap, - pub he_6ghz_capa: ieee80211_he_6ghz_capa, - pub eht_cap: ieee80211_sta_eht_cap, - pub vendor_elems: ieee80211_sband_iftype_data__bindgen_ty_1, +pub struct kioctx__bindgen_ty_3 { + pub ring_lock: mutex, + pub wait: wait_queue_head_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize]>, +} +impl kioctx__bindgen_ty_3 { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_sband_iftype_data__bindgen_ty_1 { - pub data: *const u8_, - pub len: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub struct kioctx__bindgen_ty_4 { + pub tail: ::aya_ebpf::cty::c_uint, + pub completed_events: ::aya_ebpf::cty::c_uint, + pub completion_lock: spinlock_t, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 48usize]>, + pub __bindgen_padding_0: u32, +} +impl kioctx { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 24usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 24usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ieee80211_sta_s1g_cap { - pub s1g: bool_, - pub cap: [u8_; 10usize], - pub nss_mcs: [u8_; 5usize], +pub struct kioctx_cpu { + pub reqs_available: ::aya_ebpf::cty::c_uint, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_supported_band { - pub channels: *mut ieee80211_channel, - pub bitrates: *mut ieee80211_rate, - pub band: nl80211_band::Type, - pub n_channels: ::aya_bpf::cty::c_int, - pub n_bitrates: ::aya_bpf::cty::c_int, - pub ht_cap: ieee80211_sta_ht_cap, - pub vht_cap: ieee80211_sta_vht_cap, - pub s1g_cap: ieee80211_sta_s1g_cap, - pub edmg_cap: ieee80211_edmg, - pub n_iftype_data: u16_, - pub iftype_data: *const ieee80211_sband_iftype_data, +#[derive(Copy, Clone)] +pub struct ctx_rq_wait { + pub comp: completion, + pub count: atomic_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct key_params { - pub key: *const u8_, - pub seq: *const u8_, - pub key_len: ::aya_bpf::cty::c_int, - pub seq_len: ::aya_bpf::cty::c_int, - pub vlan_id: u16_, - pub cipher: u32_, - pub mode: nl80211_key_mode::Type, +pub struct hd_geometry { + pub heads: ::aya_ebpf::cty::c_uchar, + pub sectors: ::aya_ebpf::cty::c_uchar, + pub cylinders: ::aya_ebpf::cty::c_ushort, + pub start: ::aya_ebpf::cty::c_ulong, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mac_address { - pub addr: [u8_; 6usize], +#[derive(Debug)] +pub struct pr_keys { + pub generation: u32_, + pub num_keys: u32_, + pub keys: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_sar_freq_ranges { - pub start_freq: u32_, - pub end_freq: u32_, +pub struct pr_held_reservation { + pub key: u64_, + pub generation: u32_, + pub type_: pr_type::Type, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct sem_undo_list { + pub refcnt: refcount_t, + pub lock: spinlock_t, + pub list_proc: list_head, +} +pub mod ethtool_podl_pse_admin_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN: Type = 1; + pub const ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED: Type = 2; + pub const ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED: Type = 3; +} +pub mod ethtool_podl_pse_pw_d_status { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN: Type = 1; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED: Type = 2; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING: Type = 3; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING: Type = 4; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP: Type = 5; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE: Type = 6; + pub const ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR: Type = 7; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_sar_capa { - pub type_: nl80211_sar_type::Type, - pub num_freq_ranges: u32_, - pub freq_ranges: *const cfg80211_sar_freq_ranges, +pub struct pse_control_config { + pub admin_cotrol: ethtool_podl_pse_admin_state::Type, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_ssid { - pub ssid: [u8_; 32usize], - pub ssid_len: u8_, +pub struct pse_control_status { + pub podl_admin_state: ethtool_podl_pse_admin_state::Type, + pub podl_pw_status: ethtool_podl_pse_pw_d_status::Type, } -pub mod cfg80211_signal_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const CFG80211_SIGNAL_TYPE_NONE: Type = 0; - pub const CFG80211_SIGNAL_TYPE_MBM: Type = 1; - pub const CFG80211_SIGNAL_TYPE_UNSPEC: Type = 2; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ip_mc_list { + pub interface: *mut in_device, + pub multiaddr: __be32, + pub sfmode: ::aya_ebpf::cty::c_uint, + pub sources: *mut ip_sf_list, + pub tomb: *mut ip_sf_list, + pub sfcount: [::aya_ebpf::cty::c_ulong; 2usize], + pub __bindgen_anon_1: ip_mc_list__bindgen_ty_1, + pub next_hash: *mut ip_mc_list, + pub timer: timer_list, + pub users: ::aya_ebpf::cty::c_int, + pub refcnt: refcount_t, + pub lock: spinlock_t, + pub tm_running: ::aya_ebpf::cty::c_char, + pub reporter: ::aya_ebpf::cty::c_char, + pub unsolicit_count: ::aya_ebpf::cty::c_char, + pub loaded: ::aya_ebpf::cty::c_char, + pub gsquery: ::aya_ebpf::cty::c_uchar, + pub crcount: ::aya_ebpf::cty::c_uchar, + pub rcu: callback_head, } #[repr(C)] -pub struct wiphy { - pub mtx: mutex, - pub perm_addr: [u8_; 6usize], - pub addr_mask: [u8_; 6usize], - pub addresses: *mut mac_address, - pub mgmt_stypes: *const ieee80211_txrx_stypes, - pub iface_combinations: *const ieee80211_iface_combination, - pub n_iface_combinations: ::aya_bpf::cty::c_int, - pub software_iftypes: u16_, - pub n_addresses: u16_, - pub interface_modes: u16_, - pub max_acl_mac_addrs: u16_, - pub flags: u32_, - pub regulatory_flags: u32_, - pub features: u32_, - pub ext_features: [u8_; 9usize], - pub ap_sme_capa: u32_, - pub signal_type: cfg80211_signal_type::Type, - pub bss_priv_size: ::aya_bpf::cty::c_int, - pub max_scan_ssids: u8_, - pub max_sched_scan_reqs: u8_, - pub max_sched_scan_ssids: u8_, - pub max_match_sets: u8_, - pub max_scan_ie_len: u16_, - pub max_sched_scan_ie_len: u16_, - pub max_sched_scan_plans: u32_, - pub max_sched_scan_plan_interval: u32_, - pub max_sched_scan_plan_iterations: u32_, - pub n_cipher_suites: ::aya_bpf::cty::c_int, - pub cipher_suites: *const u32_, - pub n_akm_suites: ::aya_bpf::cty::c_int, - pub akm_suites: *const u32_, - pub iftype_akm_suites: *const wiphy_iftype_akm_suites, - pub num_iftype_akm_suites: ::aya_bpf::cty::c_uint, - pub retry_short: u8_, - pub retry_long: u8_, - pub frag_threshold: u32_, - pub rts_threshold: u32_, - pub coverage_class: u8_, - pub fw_version: [::aya_bpf::cty::c_char; 32usize], - pub hw_version: u32_, - pub wowlan: *const wiphy_wowlan_support, - pub wowlan_config: *mut cfg80211_wowlan, - pub max_remain_on_channel_duration: u16_, - pub max_num_pmkids: u8_, - pub available_antennas_tx: u32_, - pub available_antennas_rx: u32_, - pub probe_resp_offload: u32_, - pub extended_capabilities: *const u8_, - pub extended_capabilities_mask: *const u8_, - pub extended_capabilities_len: u8_, - pub iftype_ext_capab: *const wiphy_iftype_ext_capab, - pub num_iftype_ext_capab: ::aya_bpf::cty::c_uint, - pub privid: *const ::aya_bpf::cty::c_void, - pub bands: [*mut ieee80211_supported_band; 6usize], - pub reg_notifier: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut wiphy, arg2: *mut regulatory_request), - >, - pub regd: *const ieee80211_regdomain, - pub dev: device, - pub registered: bool_, - pub debugfsdir: *mut dentry, - pub ht_capa_mod_mask: *const ieee80211_ht_cap, - pub vht_capa_mod_mask: *const ieee80211_vht_cap, - pub wdev_list: list_head, - pub _net: possible_net_t, - pub wext: *const iw_handler_def, - pub coalesce: *const wiphy_coalesce_support, - pub vendor_commands: *const wiphy_vendor_command, - pub vendor_events: *const nl80211_vendor_cmd_info, - pub n_vendor_commands: ::aya_bpf::cty::c_int, - pub n_vendor_events: ::aya_bpf::cty::c_int, - pub max_ap_assoc_sta: u16_, - pub max_num_csa_counters: u8_, - pub bss_select_support: u32_, - pub nan_supported_bands: u8_, - pub txq_limit: u32_, - pub txq_memory_limit: u32_, - pub txq_quantum: u32_, - pub tx_queue_len: ::aya_bpf::cty::c_ulong, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub pmsr_capa: *const cfg80211_pmsr_capabilities, - pub tid_config_support: wiphy__bindgen_ty_1, - pub max_data_retry_count: u8_, - pub sar_capa: *const cfg80211_sar_capa, - pub rfkill: *mut rfkill, - pub mbssid_max_interfaces: u8_, - pub ema_max_profile_periodicity: u8_, - pub max_num_akm_suites: u16_, - pub hw_timestamp_max_peers: u16_, - pub _bitfield_align_2: [u8; 0], - pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, - pub __bindgen_padding_0: [u8; 2usize], - pub priv_: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Copy, Clone)] +pub union ip_mc_list__bindgen_ty_1 { + pub next: *mut ip_mc_list, + pub next_rcu: *mut ip_mc_list, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wiphy__bindgen_ty_1 { - pub peer: u64_, - pub vif: u64_, - pub max_retry: u8_, +pub struct ip_sf_list { + pub sf_next: *mut ip_sf_list, + pub sf_count: [::aya_ebpf::cty::c_ulong; 2usize], + pub sf_inaddr: __be32, + pub sf_gsresp: ::aya_ebpf::cty::c_uchar, + pub sf_oldin: ::aya_ebpf::cty::c_uchar, + pub sf_crcount: ::aya_ebpf::cty::c_uchar, } -impl wiphy { - #[inline] - pub fn support_mbssid(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_support_mbssid(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn support_only_he_mbssid(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_support_only_he_mbssid(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1( - support_mbssid: u8_, - support_only_he_mbssid: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let support_mbssid: u8 = unsafe { ::core::mem::transmute(support_mbssid) }; - support_mbssid as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let support_only_he_mbssid: u8 = - unsafe { ::core::mem::transmute(support_only_he_mbssid) }; - support_only_he_mbssid as u64 - }); - __bindgen_bitfield_unit - } - #[inline] - pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); - __bindgen_bitfield_unit - } +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mnt_idmap { + pub uid_map: uid_gid_map, + pub gid_map: uid_gid_map, + pub count: refcount_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_match_set { - pub ssid: cfg80211_ssid, - pub bssid: [u8_; 6usize], - pub rssi_thold: s32, - pub per_band_rssi_thold: [s32; 6usize], +pub struct static_key_mod { + pub next: *mut static_key_mod, + pub entries: *mut jump_entry, + pub mod_: *mut module, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct mmu_notifier_subscriptions { + pub list: hlist_head, + pub has_itree: bool_, + pub lock: spinlock_t, + pub invalidate_seq: ::aya_ebpf::cty::c_ulong, + pub active_invalidate_ranges: ::aya_ebpf::cty::c_ulong, + pub itree: rb_root_cached, + pub wq: wait_queue_head_t, + pub deferred_list: hlist_head, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_sched_scan_plan { - pub interval: u32_, - pub iterations: u32_, +pub struct pm_domain_data { + pub list_node: list_head, + pub dev: *mut device, } #[repr(C)] -#[derive(Debug)] -pub struct cfg80211_sched_scan_request { - pub reqid: u64_, - pub ssids: *mut cfg80211_ssid, - pub n_ssids: ::aya_bpf::cty::c_int, - pub n_channels: u32_, - pub scan_width: nl80211_bss_scan_width::Type, - pub ie: *const u8_, - pub ie_len: usize, - pub flags: u32_, - pub match_sets: *mut cfg80211_match_set, - pub n_match_sets: ::aya_bpf::cty::c_int, - pub min_rssi_thold: s32, - pub delay: u32_, - pub scan_plans: *mut cfg80211_sched_scan_plan, - pub n_scan_plans: ::aya_bpf::cty::c_int, - pub mac_addr: [u8_; 6usize], - pub mac_addr_mask: [u8_; 6usize], - pub relative_rssi_set: bool_, - pub relative_rssi: s8, - pub rssi_adjust: cfg80211_bss_select_adjust, - pub wiphy: *mut wiphy, - pub dev: *mut net_device, - pub scan_start: ::aya_bpf::cty::c_ulong, - pub report_results: bool_, - pub callback_head: callback_head, - pub owner_nlportid: u32_, - pub nl_owner_dead: bool_, - pub list: list_head, - pub channels: __IncompleteArrayField<*mut ieee80211_channel>, +#[derive(Debug, Copy, Clone)] +pub struct cgroup_taskset { + pub src_csets: list_head, + pub dst_csets: list_head, + pub nr_tasks: ::aya_ebpf::cty::c_int, + pub ssid: ::aya_ebpf::cty::c_int, + pub csets: *mut list_head, + pub cur_cset: *mut css_set, + pub cur_task: *mut task_struct, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_pkt_pattern { - pub mask: *const u8_, - pub pattern: *const u8_, - pub pattern_len: ::aya_bpf::cty::c_int, - pub pkt_offset: ::aya_bpf::cty::c_int, +pub struct pfn_t { + pub val: u64_, } #[repr(C)] -#[derive(Debug)] -pub struct cfg80211_wowlan_tcp { - pub sock: *mut socket, - pub src: __be32, - pub dst: __be32, - pub src_port: u16_, - pub dst_port: u16_, - pub dst_mac: [u8_; 6usize], - pub payload_len: ::aya_bpf::cty::c_int, - pub payload: *const u8_, - pub payload_seq: nl80211_wowlan_tcp_data_seq, - pub data_interval: u32_, - pub wake_len: u32_, - pub wake_data: *const u8_, - pub wake_mask: *const u8_, - pub tokens_size: u32_, - pub payload_tok: nl80211_wowlan_tcp_data_token, +#[derive(Copy, Clone)] +pub struct bpf_local_storage { + pub cache: [*mut bpf_local_storage_data; 16usize], + pub smap: *mut bpf_local_storage_map, + pub list: hlist_head, + pub owner: *mut ::aya_ebpf::cty::c_void, + pub rcu: callback_head, + pub lock: raw_spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_wowlan { - pub any: bool_, - pub disconnect: bool_, - pub magic_pkt: bool_, - pub gtk_rekey_failure: bool_, - pub eap_identity_req: bool_, - pub four_way_handshake: bool_, - pub rfkill_release: bool_, - pub patterns: *mut cfg80211_pkt_pattern, - pub tcp: *mut cfg80211_wowlan_tcp, - pub n_patterns: ::aya_bpf::cty::c_int, - pub nd_config: *mut cfg80211_sched_scan_request, +pub struct bpf_mem_alloc { + pub caches: *mut bpf_mem_caches, + pub cache: *mut bpf_mem_cache, + pub objcg: *mut obj_cgroup, + pub percpu: bool_, + pub work: work_struct, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_iface_limit { - pub max: u16_, - pub types: u16_, +#[derive(Copy, Clone)] +pub struct bpf_local_storage_map { + pub map: bpf_map, + pub buckets: *mut bpf_local_storage_map_bucket, + pub bucket_log: u32_, + pub elem_size: u16_, + pub cache_idx: u16_, + pub selem_ma: bpf_mem_alloc, + pub storage_ma: bpf_mem_alloc, + pub bpf_ma: bool_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 40usize]>, + pub __bindgen_padding_0: [u8; 7usize], } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_iface_combination { - pub limits: *const ieee80211_iface_limit, - pub num_different_channels: u32_, - pub max_interfaces: u16_, - pub n_limits: u8_, - pub beacon_int_infra_match: bool_, - pub radar_detect_widths: u8_, - pub radar_detect_regions: u8_, - pub beacon_int_min_gcd: u32_, +#[derive(Copy, Clone)] +pub struct bpf_local_storage_map_bucket { + pub list: hlist_head, + pub lock: raw_spinlock_t, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ieee80211_txrx_stypes { - pub tx: u16_, - pub rx: u16_, +#[derive(Debug)] +pub struct bpf_local_storage_data { + pub smap: *mut bpf_local_storage_map, + pub data: __IncompleteArrayField, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wiphy_wowlan_tcp_support { - pub tok: *const nl80211_wowlan_tcp_data_token_feature, - pub data_payload_max: u32_, - pub data_interval_max: u32_, - pub wake_payload_max: u32_, - pub seq: bool_, +pub struct btf_id_dtor_kfunc { + pub btf_id: u32_, + pub kfunc_btf_id: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wiphy_wowlan_support { - pub flags: u32_, - pub n_patterns: ::aya_bpf::cty::c_int, - pub pattern_max_len: ::aya_bpf::cty::c_int, - pub pattern_min_len: ::aya_bpf::cty::c_int, - pub max_pkt_offset: ::aya_bpf::cty::c_int, - pub max_nd_match_sets: ::aya_bpf::cty::c_int, - pub tcp: *const wiphy_wowlan_tcp_support, +pub struct io_poll { + pub file: *mut file, + pub head: *mut wait_queue_head, + pub events: __poll_t, + pub retries: ::aya_ebpf::cty::c_int, + pub wait: wait_queue_entry, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wiphy_coalesce_support { - pub n_rules: ::aya_bpf::cty::c_int, - pub max_delay: ::aya_bpf::cty::c_int, - pub n_patterns: ::aya_bpf::cty::c_int, - pub pattern_max_len: ::aya_bpf::cty::c_int, - pub pattern_min_len: ::aya_bpf::cty::c_int, - pub max_pkt_offset: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub struct async_poll { + pub __bindgen_anon_1: async_poll__bindgen_ty_1, + pub double_poll: *mut io_poll, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wiphy_vendor_command { - pub info: nl80211_vendor_cmd_info, - pub flags: u32_, - pub doit: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut wiphy, - arg2: *mut wireless_dev, - arg3: *const ::aya_bpf::cty::c_void, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, - pub dumpit: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut wiphy, - arg2: *mut wireless_dev, - arg3: *mut sk_buff, - arg4: *const ::aya_bpf::cty::c_void, - arg5: ::aya_bpf::cty::c_int, - arg6: *mut ::aya_bpf::cty::c_ulong, - ) -> ::aya_bpf::cty::c_int, - >, - pub policy: *const nla_policy, - pub maxattr: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union async_poll__bindgen_ty_1 { + pub poll: io_poll, + pub cache: io_cache_entry, +} +#[repr(C)] +#[derive(Debug)] +pub struct crypto_aead { + pub authsize: ::aya_ebpf::cty::c_uint, + pub reqsize: ::aya_ebpf::cty::c_uint, + pub base: crypto_tfm, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wiphy_iftype_ext_capab { - pub iftype: nl80211_iftype::Type, - pub extended_capabilities: *const u8_, - pub extended_capabilities_mask: *const u8_, - pub extended_capabilities_len: u8_, - pub eml_capabilities: u16_, - pub mld_capa_and_ops: u16_, +pub struct tls_crypto_info { + pub version: __u16, + pub cipher_type: __u16, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_pmsr_capabilities { - pub max_peers: ::aya_bpf::cty::c_uint, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub ftm: cfg80211_pmsr_capabilities__bindgen_ty_1, +pub struct tls12_crypto_info_aes_gcm_128 { + pub info: tls_crypto_info, + pub iv: [::aya_ebpf::cty::c_uchar; 8usize], + pub key: [::aya_ebpf::cty::c_uchar; 16usize], + pub salt: [::aya_ebpf::cty::c_uchar; 4usize], + pub rec_seq: [::aya_ebpf::cty::c_uchar; 8usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct cfg80211_pmsr_capabilities__bindgen_ty_1 { - pub preambles: u32_, - pub bandwidths: u32_, - pub max_bursts_exponent: s8, - pub max_ftms_per_burst: u8_, +pub struct tls12_crypto_info_aes_gcm_256 { + pub info: tls_crypto_info, + pub iv: [::aya_ebpf::cty::c_uchar; 8usize], + pub key: [::aya_ebpf::cty::c_uchar; 32usize], + pub salt: [::aya_ebpf::cty::c_uchar; 4usize], + pub rec_seq: [::aya_ebpf::cty::c_uchar; 8usize], +} +#[repr(C)] +#[derive(Debug)] +pub struct tls12_crypto_info_chacha20_poly1305 { + pub info: tls_crypto_info, + pub iv: [::aya_ebpf::cty::c_uchar; 12usize], + pub key: [::aya_ebpf::cty::c_uchar; 32usize], + pub salt: __IncompleteArrayField<::aya_ebpf::cty::c_uchar>, + pub rec_seq: [::aya_ebpf::cty::c_uchar; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tls12_crypto_info_sm4_gcm { + pub info: tls_crypto_info, + pub iv: [::aya_ebpf::cty::c_uchar; 8usize], + pub key: [::aya_ebpf::cty::c_uchar; 16usize], + pub salt: [::aya_ebpf::cty::c_uchar; 4usize], + pub rec_seq: [::aya_ebpf::cty::c_uchar; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tls12_crypto_info_sm4_ccm { + pub info: tls_crypto_info, + pub iv: [::aya_ebpf::cty::c_uchar; 8usize], + pub key: [::aya_ebpf::cty::c_uchar; 16usize], + pub salt: [::aya_ebpf::cty::c_uchar; 4usize], + pub rec_seq: [::aya_ebpf::cty::c_uchar; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tls_prot_info { + pub version: u16_, + pub cipher_type: u16_, + pub prepend_size: u16_, + pub tag_size: u16_, + pub overhead_size: u16_, + pub iv_size: u16_, + pub salt_size: u16_, + pub rec_seq_size: u16_, + pub aad_size: u16_, + pub tail_size: u16_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cipher_context { + pub iv: [::aya_ebpf::cty::c_char; 20usize], + pub rec_seq: [::aya_ebpf::cty::c_char; 8usize], +} +#[repr(C)] +pub struct tls_crypto_context { + pub info: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, + pub bindgen_union_field: [u16; 28usize], +} +#[repr(C)] +pub struct tls_crypto_context__bindgen_ty_1 { + pub aes_gcm_128: __BindgenUnionField, + pub aes_gcm_256: __BindgenUnionField, + pub chacha20_poly1305: __BindgenUnionField, + pub sm4_gcm: __BindgenUnionField, + pub sm4_ccm: __BindgenUnionField, + pub bindgen_union_field: [u16; 28usize], +} +#[repr(C)] +pub struct tls_context { + pub prot_info: tls_prot_info, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub __bindgen_padding_0: u8, + pub push_pending_record: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sock, + arg2: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub sk_write_space: ::core::option::Option, + pub priv_ctx_tx: *mut ::aya_ebpf::cty::c_void, + pub priv_ctx_rx: *mut ::aya_ebpf::cty::c_void, + pub netdev: *mut net_device, + pub tx: cipher_context, + pub rx: cipher_context, + pub partially_sent_record: *mut scatterlist, + pub partially_sent_offset: u16_, + pub splicing_pages: bool_, + pub pending_open_record_frags: bool_, + pub tx_lock: mutex, + pub flags: ::aya_ebpf::cty::c_ulong, + pub sk_proto: *mut proto, + pub sk: *mut sock, + pub sk_destruct: ::core::option::Option, + pub crypto_send: tls_crypto_context, + pub crypto_recv: tls_crypto_context, + pub list: list_head, + pub refcount: refcount_t, + pub rcu: callback_head, } -impl cfg80211_pmsr_capabilities__bindgen_ty_1 { - #[inline] - pub fn supported(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_supported(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn asap(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_asap(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } - #[inline] - pub fn non_asap(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } - } - #[inline] - pub fn set_non_asap(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(2usize, 1u8, val as u64) - } - } +impl tls_context { #[inline] - pub fn request_lci(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + pub fn tx_conf(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 3u8) as u8) } } #[inline] - pub fn set_request_lci(&mut self, val: u8_) { + pub fn set_tx_conf(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(3usize, 1u8, val as u64) + self._bitfield_1.set(0usize, 3u8, val as u64) } } #[inline] - pub fn request_civicloc(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } + pub fn rx_conf(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 3u8) as u8) } } #[inline] - pub fn set_request_civicloc(&mut self, val: u8_) { + pub fn set_rx_conf(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(4usize, 1u8, val as u64) + self._bitfield_1.set(3usize, 3u8, val as u64) } } #[inline] - pub fn trigger_based(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } + pub fn zerocopy_sendfile(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } } #[inline] - pub fn set_trigger_based(&mut self, val: u8_) { + pub fn set_zerocopy_sendfile(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(5usize, 1u8, val as u64) + self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] - pub fn non_trigger_based(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + pub fn rx_no_pad(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u8) } } #[inline] - pub fn set_non_trigger_based(&mut self, val: u8_) { + pub fn set_rx_no_pad(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(6usize, 1u8, val as u64) + self._bitfield_1.set(7usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - supported: u8_, - asap: u8_, - non_asap: u8_, - request_lci: u8_, - request_civicloc: u8_, - trigger_based: u8_, - non_trigger_based: u8_, + tx_conf: u8_, + rx_conf: u8_, + zerocopy_sendfile: u8_, + rx_no_pad: u8_, ) -> __BindgenBitfieldUnit<[u8; 1usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let supported: u8 = unsafe { ::core::mem::transmute(supported) }; - supported as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let asap: u8 = unsafe { ::core::mem::transmute(asap) }; - asap as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let non_asap: u8 = unsafe { ::core::mem::transmute(non_asap) }; - non_asap as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let request_lci: u8 = unsafe { ::core::mem::transmute(request_lci) }; - request_lci as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let request_civicloc: u8 = unsafe { ::core::mem::transmute(request_civicloc) }; - request_civicloc as u64 + __bindgen_bitfield_unit.set(0usize, 3u8, { + let tx_conf: u8 = unsafe { ::core::mem::transmute(tx_conf) }; + tx_conf as u64 }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let trigger_based: u8 = unsafe { ::core::mem::transmute(trigger_based) }; - trigger_based as u64 + __bindgen_bitfield_unit.set(3usize, 3u8, { + let rx_conf: u8 = unsafe { ::core::mem::transmute(rx_conf) }; + rx_conf as u64 }); __bindgen_bitfield_unit.set(6usize, 1u8, { - let non_trigger_based: u8 = unsafe { ::core::mem::transmute(non_trigger_based) }; - non_trigger_based as u64 + let zerocopy_sendfile: u8 = unsafe { ::core::mem::transmute(zerocopy_sendfile) }; + zerocopy_sendfile as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let rx_no_pad: u8 = unsafe { ::core::mem::transmute(rx_no_pad) }; + rx_no_pad as u64 }); __bindgen_bitfield_unit } } -impl cfg80211_pmsr_capabilities { - #[inline] - pub fn report_ap_tsf(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } - } - #[inline] - pub fn set_report_ap_tsf(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn randomize_mac_addr(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } - } - #[inline] - pub fn set_randomize_mac_addr(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(1usize, 1u8, val as u64) - } - } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bio_alloc_cache { + pub free_list: *mut bio, + pub free_list_irq: *mut bio, + pub nr: ::aya_ebpf::cty::c_uint, + pub nr_irq: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct bpf_cgroup_storage_map { + pub map: bpf_map, + pub lock: spinlock_t, + pub root: rb_root, + pub list: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl bpf_cgroup_storage_map { #[inline] - pub fn new_bitfield_1( - report_ap_tsf: u8_, - randomize_mac_addr: u8_, - ) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let report_ap_tsf: u8 = unsafe { ::core::mem::transmute(report_ap_tsf) }; - report_ap_tsf as u64 - }); - __bindgen_bitfield_unit.set(1usize, 1u8, { - let randomize_mac_addr: u8 = unsafe { ::core::mem::transmute(randomize_mac_addr) }; - randomize_mac_addr as u64 - }); + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); __bindgen_bitfield_unit } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wiphy_iftype_akm_suites { - pub iftypes_mask: u16_, - pub akm_suites: *const u32_, - pub n_akm_suites: ::aya_bpf::cty::c_int, +#[derive(Copy, Clone)] +pub struct badblocks { + pub dev: *mut device, + pub count: ::aya_ebpf::cty::c_int, + pub unacked_exist: ::aya_ebpf::cty::c_int, + pub shift: ::aya_ebpf::cty::c_int, + pub page: *mut u64_, + pub changed: ::aya_ebpf::cty::c_int, + pub lock: seqlock_t, + pub sector: sector_t, + pub size: sector_t, } +pub type devlink_rel_notify_cb_t = + ::core::option::Option; +pub type devlink_rel_cleanup_cb_t = + ::core::option::Option; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct module_sect_attr { - pub battr: bin_attribute, - pub address: ::aya_bpf::cty::c_ulong, +pub struct devlink_rel { + pub index: u32_, + pub refcount: refcount_t, + pub devlink_index: u32_, + pub nested_in: devlink_rel__bindgen_ty_1, } #[repr(C)] -#[derive(Debug)] -pub struct module_sect_attrs { - pub grp: attribute_group, - pub nsections: ::aya_bpf::cty::c_uint, - pub attrs: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct devlink_rel__bindgen_ty_1 { + pub devlink_index: u32_, + pub obj_index: u32_, + pub notify_cb: devlink_rel_notify_cb_t, + pub cleanup_cb: devlink_rel_cleanup_cb_t, + pub notify_work: delayed_work, } #[repr(C)] -#[derive(Debug)] -pub struct module_notes_attrs { - pub dir: *mut kobject, - pub notes: ::aya_bpf::cty::c_uint, - pub attrs: __IncompleteArrayField, +#[derive(Copy, Clone)] +pub struct ioam6_pernet_data { + pub lock: mutex, + pub namespaces: rhashtable, + pub schemas: rhashtable, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -44909,7 +42069,7 @@ pub struct sfp_bus { pub sfp: *mut sfp, pub sfp_quirk: *const sfp_quirk, pub upstream_ops: *const sfp_upstream_ops, - pub upstream: *mut ::aya_bpf::cty::c_void, + pub upstream: *mut ::aya_ebpf::cty::c_void, pub phydev: *mut phy_device, pub registered: bool_, pub started: bool_, @@ -44926,11 +42086,11 @@ pub struct sfp_eeprom_base { pub br_nominal: u8_, pub rate_id: u8_, pub link_len: [u8_; 6usize], - pub vendor_name: [::aya_bpf::cty::c_char; 16usize], + pub vendor_name: [::aya_ebpf::cty::c_char; 16usize], pub extended_cc: u8_, - pub vendor_oui: [::aya_bpf::cty::c_char; 3usize], - pub vendor_pn: [::aya_bpf::cty::c_char; 16usize], - pub vendor_rev: [::aya_bpf::cty::c_char; 4usize], + pub vendor_oui: [::aya_ebpf::cty::c_char; 3usize], + pub vendor_pn: [::aya_ebpf::cty::c_char; 16usize], + pub vendor_rev: [::aya_ebpf::cty::c_char; 4usize], pub __bindgen_anon_1: sfp_eeprom_base__bindgen_ty_1, pub reserved62: u8_, pub cc_base: u8_, @@ -44943,7 +42103,7 @@ pub union sfp_eeprom_base__bindgen_ty_1 { pub passive: sfp_eeprom_base__bindgen_ty_1__bindgen_ty_1, pub active: sfp_eeprom_base__bindgen_ty_1__bindgen_ty_2, } -#[repr(C, packed)] +#[repr(C)] #[derive(Debug, Copy, Clone)] pub struct sfp_eeprom_base__bindgen_ty_1__bindgen_ty_1 { pub _bitfield_align_1: [u8; 0], @@ -45021,7 +42181,7 @@ impl sfp_eeprom_base__bindgen_ty_1__bindgen_ty_1 { __bindgen_bitfield_unit } } -#[repr(C, packed)] +#[repr(C)] #[derive(Debug, Copy, Clone)] pub struct sfp_eeprom_base__bindgen_ty_1__bindgen_ty_2 { pub _bitfield_align_1: [u8; 0], @@ -45771,821 +42931,5685 @@ impl sfp_eeprom_base { } } #[inline] - pub fn fc_speed_200(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(58usize, 1u8) as u8) } + pub fn fc_speed_200(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(58usize, 1u8) as u8) } + } + #[inline] + pub fn set_fc_speed_200(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(58usize, 1u8, val as u64) + } + } + #[inline] + pub fn fc_speed_3200(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(59usize, 1u8) as u8) } + } + #[inline] + pub fn set_fc_speed_3200(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(59usize, 1u8, val as u64) + } + } + #[inline] + pub fn fc_speed_400(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(60usize, 1u8) as u8) } + } + #[inline] + pub fn set_fc_speed_400(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(60usize, 1u8, val as u64) + } + } + #[inline] + pub fn fc_speed_1600(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(61usize, 1u8) as u8) } + } + #[inline] + pub fn set_fc_speed_1600(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(61usize, 1u8, val as u64) + } + } + #[inline] + pub fn fc_speed_800(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(62usize, 1u8) as u8) } + } + #[inline] + pub fn set_fc_speed_800(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(62usize, 1u8, val as u64) + } + } + #[inline] + pub fn fc_speed_1200(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(63usize, 1u8) as u8) } + } + #[inline] + pub fn set_fc_speed_1200(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(63usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + if_1x_copper_passive: u8_, + if_1x_copper_active: u8_, + if_1x_lx: u8_, + if_1x_sx: u8_, + e10g_base_sr: u8_, + e10g_base_lr: u8_, + e10g_base_lrm: u8_, + e10g_base_er: u8_, + sonet_oc3_short_reach: u8_, + sonet_oc3_smf_intermediate_reach: u8_, + sonet_oc3_smf_long_reach: u8_, + unallocated_5_3: u8_, + sonet_oc12_short_reach: u8_, + sonet_oc12_smf_intermediate_reach: u8_, + sonet_oc12_smf_long_reach: u8_, + unallocated_5_7: u8_, + sonet_oc48_short_reach: u8_, + sonet_oc48_intermediate_reach: u8_, + sonet_oc48_long_reach: u8_, + sonet_reach_bit2: u8_, + sonet_reach_bit1: u8_, + sonet_oc192_short_reach: u8_, + escon_smf_1310_laser: u8_, + escon_mmf_1310_led: u8_, + e1000_base_sx: u8_, + e1000_base_lx: u8_, + e1000_base_cx: u8_, + e1000_base_t: u8_, + e100_base_lx: u8_, + e100_base_fx: u8_, + e_base_bx10: u8_, + e_base_px: u8_, + fc_tech_electrical_inter_enclosure: u8_, + fc_tech_lc: u8_, + fc_tech_sa: u8_, + fc_ll_m: u8_, + fc_ll_l: u8_, + fc_ll_i: u8_, + fc_ll_s: u8_, + fc_ll_v: u8_, + unallocated_8_0: u8_, + unallocated_8_1: u8_, + sfp_ct_passive: u8_, + sfp_ct_active: u8_, + fc_tech_ll: u8_, + fc_tech_sl: u8_, + fc_tech_sn: u8_, + fc_tech_electrical_intra_enclosure: u8_, + fc_media_sm: u8_, + unallocated_9_1: u8_, + fc_media_m5: u8_, + fc_media_m6: u8_, + fc_media_tv: u8_, + fc_media_mi: u8_, + fc_media_tp: u8_, + fc_media_tw: u8_, + fc_speed_100: u8_, + unallocated_10_1: u8_, + fc_speed_200: u8_, + fc_speed_3200: u8_, + fc_speed_400: u8_, + fc_speed_1600: u8_, + fc_speed_800: u8_, + fc_speed_1200: u8_, + ) -> __BindgenBitfieldUnit<[u8; 8usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let if_1x_copper_passive: u8 = unsafe { ::core::mem::transmute(if_1x_copper_passive) }; + if_1x_copper_passive as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let if_1x_copper_active: u8 = unsafe { ::core::mem::transmute(if_1x_copper_active) }; + if_1x_copper_active as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let if_1x_lx: u8 = unsafe { ::core::mem::transmute(if_1x_lx) }; + if_1x_lx as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let if_1x_sx: u8 = unsafe { ::core::mem::transmute(if_1x_sx) }; + if_1x_sx as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let e10g_base_sr: u8 = unsafe { ::core::mem::transmute(e10g_base_sr) }; + e10g_base_sr as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let e10g_base_lr: u8 = unsafe { ::core::mem::transmute(e10g_base_lr) }; + e10g_base_lr as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let e10g_base_lrm: u8 = unsafe { ::core::mem::transmute(e10g_base_lrm) }; + e10g_base_lrm as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let e10g_base_er: u8 = unsafe { ::core::mem::transmute(e10g_base_er) }; + e10g_base_er as u64 + }); + __bindgen_bitfield_unit.set(8usize, 1u8, { + let sonet_oc3_short_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc3_short_reach) }; + sonet_oc3_short_reach as u64 + }); + __bindgen_bitfield_unit.set(9usize, 1u8, { + let sonet_oc3_smf_intermediate_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc3_smf_intermediate_reach) }; + sonet_oc3_smf_intermediate_reach as u64 + }); + __bindgen_bitfield_unit.set(10usize, 1u8, { + let sonet_oc3_smf_long_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc3_smf_long_reach) }; + sonet_oc3_smf_long_reach as u64 + }); + __bindgen_bitfield_unit.set(11usize, 1u8, { + let unallocated_5_3: u8 = unsafe { ::core::mem::transmute(unallocated_5_3) }; + unallocated_5_3 as u64 + }); + __bindgen_bitfield_unit.set(12usize, 1u8, { + let sonet_oc12_short_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc12_short_reach) }; + sonet_oc12_short_reach as u64 + }); + __bindgen_bitfield_unit.set(13usize, 1u8, { + let sonet_oc12_smf_intermediate_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc12_smf_intermediate_reach) }; + sonet_oc12_smf_intermediate_reach as u64 + }); + __bindgen_bitfield_unit.set(14usize, 1u8, { + let sonet_oc12_smf_long_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc12_smf_long_reach) }; + sonet_oc12_smf_long_reach as u64 + }); + __bindgen_bitfield_unit.set(15usize, 1u8, { + let unallocated_5_7: u8 = unsafe { ::core::mem::transmute(unallocated_5_7) }; + unallocated_5_7 as u64 + }); + __bindgen_bitfield_unit.set(16usize, 1u8, { + let sonet_oc48_short_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc48_short_reach) }; + sonet_oc48_short_reach as u64 + }); + __bindgen_bitfield_unit.set(17usize, 1u8, { + let sonet_oc48_intermediate_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc48_intermediate_reach) }; + sonet_oc48_intermediate_reach as u64 + }); + __bindgen_bitfield_unit.set(18usize, 1u8, { + let sonet_oc48_long_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc48_long_reach) }; + sonet_oc48_long_reach as u64 + }); + __bindgen_bitfield_unit.set(19usize, 1u8, { + let sonet_reach_bit2: u8 = unsafe { ::core::mem::transmute(sonet_reach_bit2) }; + sonet_reach_bit2 as u64 + }); + __bindgen_bitfield_unit.set(20usize, 1u8, { + let sonet_reach_bit1: u8 = unsafe { ::core::mem::transmute(sonet_reach_bit1) }; + sonet_reach_bit1 as u64 + }); + __bindgen_bitfield_unit.set(21usize, 1u8, { + let sonet_oc192_short_reach: u8 = + unsafe { ::core::mem::transmute(sonet_oc192_short_reach) }; + sonet_oc192_short_reach as u64 + }); + __bindgen_bitfield_unit.set(22usize, 1u8, { + let escon_smf_1310_laser: u8 = unsafe { ::core::mem::transmute(escon_smf_1310_laser) }; + escon_smf_1310_laser as u64 + }); + __bindgen_bitfield_unit.set(23usize, 1u8, { + let escon_mmf_1310_led: u8 = unsafe { ::core::mem::transmute(escon_mmf_1310_led) }; + escon_mmf_1310_led as u64 + }); + __bindgen_bitfield_unit.set(24usize, 1u8, { + let e1000_base_sx: u8 = unsafe { ::core::mem::transmute(e1000_base_sx) }; + e1000_base_sx as u64 + }); + __bindgen_bitfield_unit.set(25usize, 1u8, { + let e1000_base_lx: u8 = unsafe { ::core::mem::transmute(e1000_base_lx) }; + e1000_base_lx as u64 + }); + __bindgen_bitfield_unit.set(26usize, 1u8, { + let e1000_base_cx: u8 = unsafe { ::core::mem::transmute(e1000_base_cx) }; + e1000_base_cx as u64 + }); + __bindgen_bitfield_unit.set(27usize, 1u8, { + let e1000_base_t: u8 = unsafe { ::core::mem::transmute(e1000_base_t) }; + e1000_base_t as u64 + }); + __bindgen_bitfield_unit.set(28usize, 1u8, { + let e100_base_lx: u8 = unsafe { ::core::mem::transmute(e100_base_lx) }; + e100_base_lx as u64 + }); + __bindgen_bitfield_unit.set(29usize, 1u8, { + let e100_base_fx: u8 = unsafe { ::core::mem::transmute(e100_base_fx) }; + e100_base_fx as u64 + }); + __bindgen_bitfield_unit.set(30usize, 1u8, { + let e_base_bx10: u8 = unsafe { ::core::mem::transmute(e_base_bx10) }; + e_base_bx10 as u64 + }); + __bindgen_bitfield_unit.set(31usize, 1u8, { + let e_base_px: u8 = unsafe { ::core::mem::transmute(e_base_px) }; + e_base_px as u64 + }); + __bindgen_bitfield_unit.set(32usize, 1u8, { + let fc_tech_electrical_inter_enclosure: u8 = + unsafe { ::core::mem::transmute(fc_tech_electrical_inter_enclosure) }; + fc_tech_electrical_inter_enclosure as u64 + }); + __bindgen_bitfield_unit.set(33usize, 1u8, { + let fc_tech_lc: u8 = unsafe { ::core::mem::transmute(fc_tech_lc) }; + fc_tech_lc as u64 + }); + __bindgen_bitfield_unit.set(34usize, 1u8, { + let fc_tech_sa: u8 = unsafe { ::core::mem::transmute(fc_tech_sa) }; + fc_tech_sa as u64 + }); + __bindgen_bitfield_unit.set(35usize, 1u8, { + let fc_ll_m: u8 = unsafe { ::core::mem::transmute(fc_ll_m) }; + fc_ll_m as u64 + }); + __bindgen_bitfield_unit.set(36usize, 1u8, { + let fc_ll_l: u8 = unsafe { ::core::mem::transmute(fc_ll_l) }; + fc_ll_l as u64 + }); + __bindgen_bitfield_unit.set(37usize, 1u8, { + let fc_ll_i: u8 = unsafe { ::core::mem::transmute(fc_ll_i) }; + fc_ll_i as u64 + }); + __bindgen_bitfield_unit.set(38usize, 1u8, { + let fc_ll_s: u8 = unsafe { ::core::mem::transmute(fc_ll_s) }; + fc_ll_s as u64 + }); + __bindgen_bitfield_unit.set(39usize, 1u8, { + let fc_ll_v: u8 = unsafe { ::core::mem::transmute(fc_ll_v) }; + fc_ll_v as u64 + }); + __bindgen_bitfield_unit.set(40usize, 1u8, { + let unallocated_8_0: u8 = unsafe { ::core::mem::transmute(unallocated_8_0) }; + unallocated_8_0 as u64 + }); + __bindgen_bitfield_unit.set(41usize, 1u8, { + let unallocated_8_1: u8 = unsafe { ::core::mem::transmute(unallocated_8_1) }; + unallocated_8_1 as u64 + }); + __bindgen_bitfield_unit.set(42usize, 1u8, { + let sfp_ct_passive: u8 = unsafe { ::core::mem::transmute(sfp_ct_passive) }; + sfp_ct_passive as u64 + }); + __bindgen_bitfield_unit.set(43usize, 1u8, { + let sfp_ct_active: u8 = unsafe { ::core::mem::transmute(sfp_ct_active) }; + sfp_ct_active as u64 + }); + __bindgen_bitfield_unit.set(44usize, 1u8, { + let fc_tech_ll: u8 = unsafe { ::core::mem::transmute(fc_tech_ll) }; + fc_tech_ll as u64 + }); + __bindgen_bitfield_unit.set(45usize, 1u8, { + let fc_tech_sl: u8 = unsafe { ::core::mem::transmute(fc_tech_sl) }; + fc_tech_sl as u64 + }); + __bindgen_bitfield_unit.set(46usize, 1u8, { + let fc_tech_sn: u8 = unsafe { ::core::mem::transmute(fc_tech_sn) }; + fc_tech_sn as u64 + }); + __bindgen_bitfield_unit.set(47usize, 1u8, { + let fc_tech_electrical_intra_enclosure: u8 = + unsafe { ::core::mem::transmute(fc_tech_electrical_intra_enclosure) }; + fc_tech_electrical_intra_enclosure as u64 + }); + __bindgen_bitfield_unit.set(48usize, 1u8, { + let fc_media_sm: u8 = unsafe { ::core::mem::transmute(fc_media_sm) }; + fc_media_sm as u64 + }); + __bindgen_bitfield_unit.set(49usize, 1u8, { + let unallocated_9_1: u8 = unsafe { ::core::mem::transmute(unallocated_9_1) }; + unallocated_9_1 as u64 + }); + __bindgen_bitfield_unit.set(50usize, 1u8, { + let fc_media_m5: u8 = unsafe { ::core::mem::transmute(fc_media_m5) }; + fc_media_m5 as u64 + }); + __bindgen_bitfield_unit.set(51usize, 1u8, { + let fc_media_m6: u8 = unsafe { ::core::mem::transmute(fc_media_m6) }; + fc_media_m6 as u64 + }); + __bindgen_bitfield_unit.set(52usize, 1u8, { + let fc_media_tv: u8 = unsafe { ::core::mem::transmute(fc_media_tv) }; + fc_media_tv as u64 + }); + __bindgen_bitfield_unit.set(53usize, 1u8, { + let fc_media_mi: u8 = unsafe { ::core::mem::transmute(fc_media_mi) }; + fc_media_mi as u64 + }); + __bindgen_bitfield_unit.set(54usize, 1u8, { + let fc_media_tp: u8 = unsafe { ::core::mem::transmute(fc_media_tp) }; + fc_media_tp as u64 + }); + __bindgen_bitfield_unit.set(55usize, 1u8, { + let fc_media_tw: u8 = unsafe { ::core::mem::transmute(fc_media_tw) }; + fc_media_tw as u64 + }); + __bindgen_bitfield_unit.set(56usize, 1u8, { + let fc_speed_100: u8 = unsafe { ::core::mem::transmute(fc_speed_100) }; + fc_speed_100 as u64 + }); + __bindgen_bitfield_unit.set(57usize, 1u8, { + let unallocated_10_1: u8 = unsafe { ::core::mem::transmute(unallocated_10_1) }; + unallocated_10_1 as u64 + }); + __bindgen_bitfield_unit.set(58usize, 1u8, { + let fc_speed_200: u8 = unsafe { ::core::mem::transmute(fc_speed_200) }; + fc_speed_200 as u64 + }); + __bindgen_bitfield_unit.set(59usize, 1u8, { + let fc_speed_3200: u8 = unsafe { ::core::mem::transmute(fc_speed_3200) }; + fc_speed_3200 as u64 + }); + __bindgen_bitfield_unit.set(60usize, 1u8, { + let fc_speed_400: u8 = unsafe { ::core::mem::transmute(fc_speed_400) }; + fc_speed_400 as u64 + }); + __bindgen_bitfield_unit.set(61usize, 1u8, { + let fc_speed_1600: u8 = unsafe { ::core::mem::transmute(fc_speed_1600) }; + fc_speed_1600 as u64 + }); + __bindgen_bitfield_unit.set(62usize, 1u8, { + let fc_speed_800: u8 = unsafe { ::core::mem::transmute(fc_speed_800) }; + fc_speed_800 as u64 + }); + __bindgen_bitfield_unit.set(63usize, 1u8, { + let fc_speed_1200: u8 = unsafe { ::core::mem::transmute(fc_speed_1200) }; + fc_speed_1200 as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sfp_eeprom_ext { + pub options: __be16, + pub br_max: u8_, + pub br_min: u8_, + pub vendor_sn: [::aya_ebpf::cty::c_char; 16usize], + pub datecode: [::aya_ebpf::cty::c_char; 8usize], + pub diagmon: u8_, + pub enhopts: u8_, + pub sff8472_compliance: u8_, + pub cc_ext: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct sfp_eeprom_id { + pub base: sfp_eeprom_base, + pub ext: sfp_eeprom_ext, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sfp_upstream_ops { + pub attach: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void, arg2: *mut sfp_bus), + >, + pub detach: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void, arg2: *mut sfp_bus), + >, + pub module_insert: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: *const sfp_eeprom_id, + ) -> ::aya_ebpf::cty::c_int, + >, + pub module_remove: + ::core::option::Option, + pub module_start: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void) -> ::aya_ebpf::cty::c_int, + >, + pub module_stop: + ::core::option::Option, + pub link_down: ::core::option::Option, + pub link_up: ::core::option::Option, + pub connect_phy: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_void, + arg2: *mut phy_device, + ) -> ::aya_ebpf::cty::c_int, + >, + pub disconnect_phy: + ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sfp_quirk { + pub vendor: *const ::aya_ebpf::cty::c_char, + pub part: *const ::aya_ebpf::cty::c_char, + pub modes: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const sfp_eeprom_id, + arg2: *mut ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_ulong, + ), + >, + pub fixup: ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sfp_socket_ops { + pub attach: ::core::option::Option, + pub detach: ::core::option::Option, + pub start: ::core::option::Option, + pub stop: ::core::option::Option, + pub set_signal_rate: + ::core::option::Option, + pub module_info: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut sfp, arg2: *mut ethtool_modinfo) -> ::aya_ebpf::cty::c_int, + >, + pub module_eeprom: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sfp, + arg2: *mut ethtool_eeprom, + arg3: *mut u8_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub module_eeprom_by_page: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sfp, + arg2: *const ethtool_module_eeprom, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct coredump_params { + pub siginfo: *const kernel_siginfo_t, + pub file: *mut file, + pub limit: ::aya_ebpf::cty::c_ulong, + pub mm_flags: ::aya_ebpf::cty::c_ulong, + pub cpu: ::aya_ebpf::cty::c_int, + pub written: loff_t, + pub pos: loff_t, + pub to_skip: loff_t, + pub vma_count: ::aya_ebpf::cty::c_int, + pub vma_data_size: usize, + pub vma_meta: *mut core_vma_metadata, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct core_vma_metadata { + pub start: ::aya_ebpf::cty::c_ulong, + pub end: ::aya_ebpf::cty::c_ulong, + pub flags: ::aya_ebpf::cty::c_ulong, + pub dump_size: ::aya_ebpf::cty::c_ulong, + pub pgoff: ::aya_ebpf::cty::c_ulong, + pub file: *mut file, +} +pub mod dax_access_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DAX_ACCESS: Type = 0; + pub const DAX_RECOVERY_WRITE: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct blk_crypto_keyslot { + pub slot_refs: atomic_t, + pub idle_slot_node: list_head, + pub hash_node: hlist_node, + pub key: *const blk_crypto_key, + pub profile: *mut blk_crypto_profile, +} +pub type irq_write_msi_msg_t = + ::core::option::Option; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct platform_msi_priv_data { + pub dev: *mut device, + pub host_data: *mut ::aya_ebpf::cty::c_void, + pub arg: msi_alloc_info_t, + pub write_msg: irq_write_msi_msg_t, + pub devid: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct latency_bucket { + pub total_latency: ::aya_ebpf::cty::c_ulong, + pub samples: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct avg_latency_bucket { + pub latency: ::aya_ebpf::cty::c_ulong, + pub valid: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct throtl_data { + pub service_queue: throtl_service_queue, + pub queue: *mut request_queue, + pub nr_queued: [::aya_ebpf::cty::c_uint; 2usize], + pub throtl_slice: ::aya_ebpf::cty::c_uint, + pub dispatch_work: work_struct, + pub limit_index: ::aya_ebpf::cty::c_uint, + pub limit_valid: [bool_; 2usize], + pub low_upgrade_time: ::aya_ebpf::cty::c_ulong, + pub low_downgrade_time: ::aya_ebpf::cty::c_ulong, + pub scale: ::aya_ebpf::cty::c_uint, + pub tmp_buckets: [latency_bucket; 18usize], + pub avg_buckets: [avg_latency_bucket; 18usize], + pub latency_buckets: [*mut latency_bucket; 2usize], + pub last_calculate_time: ::aya_ebpf::cty::c_ulong, + pub filtered_latency: ::aya_ebpf::cty::c_ulong, + pub track_bio_latency: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct io_sq_data { + pub refs: refcount_t, + pub park_pending: atomic_t, + pub lock: mutex, + pub ctx_list: list_head, + pub thread: *mut task_struct, + pub wait: wait_queue_head, + pub sq_thread_idle: ::aya_ebpf::cty::c_uint, + pub sq_cpu: ::aya_ebpf::cty::c_int, + pub task_pid: pid_t, + pub task_tgid: pid_t, + pub state: ::aya_ebpf::cty::c_ulong, + pub exited: completion, +} +#[repr(C)] +#[derive(Debug)] +pub struct audit_tree { + pub count: refcount_t, + pub goner: ::aya_ebpf::cty::c_int, + pub root: *mut audit_chunk, + pub chunks: list_head, + pub rules: list_head, + pub list: list_head, + pub same_root: list_head, + pub head: callback_head, + pub pathname: __IncompleteArrayField<::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct audit_node { + pub list: list_head, + pub owner: *mut audit_tree, + pub index: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug)] +pub struct audit_chunk { + pub hash: list_head, + pub key: ::aya_ebpf::cty::c_ulong, + pub mark: *mut fsnotify_mark, + pub trees: list_head, + pub count: ::aya_ebpf::cty::c_int, + pub refs: atomic_long_t, + pub head: callback_head, + pub owners: __IncompleteArrayField, +} +pub type u_int64_t = u64_; +#[repr(C)] +#[derive(Copy, Clone)] +pub union nf_inet_addr { + pub all: [__u32; 4usize], + pub ip: __be32, + pub ip6: [__be32; 4usize], + pub in_: in_addr, + pub in6: in6_addr, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ip_ct_tcp_state { + pub td_end: u_int32_t, + pub td_maxend: u_int32_t, + pub td_maxwin: u_int32_t, + pub td_maxack: u_int32_t, + pub td_scale: u_int8_t, + pub flags: u_int8_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ip_ct_tcp { + pub seen: [ip_ct_tcp_state; 2usize], + pub state: u_int8_t, + pub last_dir: u_int8_t, + pub retrans: u_int8_t, + pub last_index: u_int8_t, + pub last_seq: u_int32_t, + pub last_ack: u_int32_t, + pub last_end: u_int32_t, + pub last_win: u_int16_t, + pub last_wscale: u_int8_t, + pub last_flags: u_int8_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nf_conntrack_man_proto { + pub all: __be16, + pub tcp: nf_conntrack_man_proto__bindgen_ty_1, + pub udp: nf_conntrack_man_proto__bindgen_ty_2, + pub icmp: nf_conntrack_man_proto__bindgen_ty_3, + pub dccp: nf_conntrack_man_proto__bindgen_ty_4, + pub sctp: nf_conntrack_man_proto__bindgen_ty_5, + pub gre: nf_conntrack_man_proto__bindgen_ty_6, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_man_proto__bindgen_ty_1 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_man_proto__bindgen_ty_2 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_man_proto__bindgen_ty_3 { + pub id: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_man_proto__bindgen_ty_4 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_man_proto__bindgen_ty_5 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_man_proto__bindgen_ty_6 { + pub key: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_ct_dccp { + pub role: [u_int8_t; 2usize], + pub state: u_int8_t, + pub last_pkt: u_int8_t, + pub last_dir: u_int8_t, + pub handshake_seq: u_int64_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ip_ct_sctp { + pub state: sctp_conntrack::Type, + pub vtag: [__be32; 2usize], + pub init: [u8_; 2usize], + pub last_dir: u8_, + pub flags: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_ct_event_notifier { + pub ct_event: ::core::option::Option< + unsafe extern "C" fn( + arg1: ::aya_ebpf::cty::c_uint, + arg2: *const nf_ct_event, + ) -> ::aya_ebpf::cty::c_int, + >, + pub exp_event: ::core::option::Option< + unsafe extern "C" fn( + arg1: ::aya_ebpf::cty::c_uint, + arg2: *const nf_exp_event, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_zone { + pub id: u16_, + pub flags: u8_, + pub dir: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_man { + pub u3: nf_inet_addr, + pub u: nf_conntrack_man_proto, + pub l3num: u_int16_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_tuple { + pub src: nf_conntrack_man, + pub dst: nf_conntrack_tuple__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1 { + pub u3: nf_inet_addr, + pub u: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1, + pub protonum: u_int8_t, + pub __nfct_hash_offsetend: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_2, + pub dir: u_int8_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1 { + pub all: __be16, + pub tcp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub udp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2, + pub icmp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_3, + pub dccp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_4, + pub sctp: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_5, + pub gre: nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_6, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_2 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_3 { + pub type_: u_int8_t, + pub code: u_int8_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_4 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_5 { + pub port: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_1__bindgen_ty_6 { + pub key: __be16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_tuple__bindgen_ty_1__bindgen_ty_2 {} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_tuple_hash { + pub hnnode: hlist_nulls_node, + pub tuple: nf_conntrack_tuple, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_ct_udp { + pub stream_ts: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_ct_gre { + pub stream_timeout: ::aya_ebpf::cty::c_uint, + pub timeout: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nf_conntrack_proto { + pub dccp: nf_ct_dccp, + pub sctp: ip_ct_sctp, + pub tcp: ip_ct_tcp, + pub udp: nf_ct_udp, + pub gre: nf_ct_gre, + pub tmpl_padto: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conn { + pub ct_general: nf_conntrack, + pub lock: spinlock_t, + pub timeout: u32_, + pub zone: nf_conntrack_zone, + pub tuplehash: [nf_conntrack_tuple_hash; 2usize], + pub status: ::aya_ebpf::cty::c_ulong, + pub ct_net: possible_net_t, + pub nat_bysource: hlist_node, + pub __nfct_init_offset: nf_conn__bindgen_ty_1, + pub master: *mut nf_conn, + pub mark: u_int32_t, + pub secmark: u_int32_t, + pub ext: *mut nf_ct_ext, + pub proto: nf_conntrack_proto, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conn__bindgen_ty_1 {} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_tuple_mask { + pub src: nf_conntrack_tuple_mask__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_tuple_mask__bindgen_ty_1 { + pub u3: nf_inet_addr, + pub u: nf_conntrack_man_proto, +} +#[repr(C)] +#[derive(Debug)] +pub struct nf_ct_ext { + pub offset: [u8_; 10usize], + pub len: u8_, + pub gen_id: ::aya_ebpf::cty::c_uint, + pub data: __IncompleteArrayField<::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_conntrack_helper { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nf_conntrack_expect { + pub lnode: hlist_node, + pub hnode: hlist_node, + pub tuple: nf_conntrack_tuple, + pub mask: nf_conntrack_tuple_mask, + pub use_: refcount_t, + pub flags: ::aya_ebpf::cty::c_uint, + pub class: ::aya_ebpf::cty::c_uint, + pub expectfn: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nf_conn, arg2: *mut nf_conntrack_expect), + >, + pub helper: *mut nf_conntrack_helper, + pub master: *mut nf_conn, + pub timeout: timer_list, + pub saved_addr: nf_inet_addr, + pub saved_proto: nf_conntrack_man_proto, + pub dir: ip_conntrack_dir::Type, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_ct_event { + pub ct: *mut nf_conn, + pub portid: u32_, + pub report: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nf_exp_event { + pub exp: *mut nf_conntrack_expect, + pub portid: u32_, + pub report: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct memcg_vmstats { + pub state: [::aya_ebpf::cty::c_long; 53usize], + pub events: [::aya_ebpf::cty::c_ulong; 22usize], + pub state_local: [::aya_ebpf::cty::c_long; 53usize], + pub events_local: [::aya_ebpf::cty::c_ulong; 22usize], + pub state_pending: [::aya_ebpf::cty::c_long; 53usize], + pub events_pending: [::aya_ebpf::cty::c_ulong; 22usize], + pub stats_updates: atomic64_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct memcg_vmstats_percpu { + pub stats_updates: ::aya_ebpf::cty::c_uint, + pub parent: *mut memcg_vmstats_percpu, + pub vmstats: *mut memcg_vmstats, + pub state: [::aya_ebpf::cty::c_long; 53usize], + pub events: [::aya_ebpf::cty::c_ulong; 22usize], + pub state_prev: [::aya_ebpf::cty::c_long; 53usize], + pub events_prev: [::aya_ebpf::cty::c_ulong; 22usize], + pub nr_page_events: ::aya_ebpf::cty::c_ulong, + pub targets: [::aya_ebpf::cty::c_ulong; 2usize], + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 32usize]>, +} +impl memcg_vmstats_percpu { + #[inline] + pub fn new_bitfield_1() -> __BindgenBitfieldUnit<[u8; 32usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 32usize]> = Default::default(); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug)] +pub struct btf_struct_metas { + pub cnt: u32_, + pub types: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct btf_kfunc_hook_filter { + pub filters: [btf_kfunc_filter_t; 16usize], + pub nr_filters: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct btf_kfunc_set_tab { + pub sets: [*mut btf_id_set8; 13usize], + pub hook_filters: [btf_kfunc_hook_filter; 13usize], +} +#[repr(C)] +#[derive(Debug)] +pub struct btf_id_dtor_kfunc_tab { + pub cnt: u32_, + pub dtors: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iova_bitmap_map { + pub iova: ::aya_ebpf::cty::c_ulong, + pub pgshift: ::aya_ebpf::cty::c_ulong, + pub pgoff: ::aya_ebpf::cty::c_ulong, + pub npages: ::aya_ebpf::cty::c_ulong, + pub pages: *mut *mut page, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iova_bitmap { + pub mapped: iova_bitmap_map, + pub bitmap: *mut u8_, + pub mapped_base_index: ::aya_ebpf::cty::c_ulong, + pub mapped_total_index: ::aya_ebpf::cty::c_ulong, + pub iova: ::aya_ebpf::cty::c_ulong, + pub length: usize, + pub set_ahead_length: ::aya_ebpf::cty::c_ulong, +} +pub mod devlink_info_version_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_INFO_VERSION_TYPE_NONE: Type = 0; + pub const DEVLINK_INFO_VERSION_TYPE_COMPONENT: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct devlink_info_req { + pub msg: *mut sk_buff, + pub version_cb: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_char, + arg2: devlink_info_version_type::Type, + arg3: *mut ::aya_ebpf::cty::c_void, + ), + >, + pub version_cb_priv: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct param_attribute { + pub mattr: module_attribute, + pub param: *const kernel_param, +} +#[repr(C)] +#[derive(Debug)] +pub struct module_param_attrs { + pub num: ::aya_ebpf::cty::c_uint, + pub grp: attribute_group, + pub attrs: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_kfunc_desc { + pub func_model: btf_func_model, + pub func_id: u32_, + pub imm: s32, + pub offset: u16_, + pub addr: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_kfunc_desc_tab { + pub descs: [bpf_kfunc_desc; 256usize], + pub nr_descs: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_kfunc_btf { + pub btf: *mut btf, + pub module: *mut module, + pub offset: u16_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_kfunc_btf_tab { + pub descs: [bpf_kfunc_btf; 256usize], + pub nr_descs: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct bpf_verifier_stack_elem { + pub st: bpf_verifier_state, + pub insn_idx: ::aya_ebpf::cty::c_int, + pub prev_insn_idx: ::aya_ebpf::cty::c_int, + pub next: *mut bpf_verifier_stack_elem, + pub log_pos: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct wpan_dev { + pub wpan_phy: *mut wpan_phy, + pub iftype: ::aya_ebpf::cty::c_int, + pub list: list_head, + pub netdev: *mut net_device, + pub header_ops: *const wpan_dev_header_ops, + pub lowpan_dev: *mut net_device, + pub identifier: u32_, + pub pan_id: __le16, + pub short_addr: __le16, + pub extended_addr: __le64, + pub bsn: atomic_t, + pub dsn: atomic_t, + pub min_be: u8_, + pub max_be: u8_, + pub csma_retries: u8_, + pub frame_retries: s8, + pub lbt: bool_, + pub ackreq: bool_, + pub association_lock: mutex, + pub parent: *mut ieee802154_pan_device, + pub children: list_head, + pub max_associations: ::aya_ebpf::cty::c_uint, + pub nchildren: ::aya_ebpf::cty::c_uint, +} +pub mod ieee802154_filtering_level { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IEEE802154_FILTERING_NONE: Type = 0; + pub const IEEE802154_FILTERING_1_FCS: Type = 1; + pub const IEEE802154_FILTERING_2_PROMISCUOUS: Type = 2; + pub const IEEE802154_FILTERING_3_SCAN: Type = 3; + pub const IEEE802154_FILTERING_4_FRAME_FIELDS: Type = 4; +} +pub mod nl802154_cca_modes { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const __NL802154_CCA_INVALID: Type = 0; + pub const NL802154_CCA_ENERGY: Type = 1; + pub const NL802154_CCA_CARRIER: Type = 2; + pub const NL802154_CCA_ENERGY_CARRIER: Type = 3; + pub const NL802154_CCA_ALOHA: Type = 4; + pub const NL802154_CCA_UWB_SHR: Type = 5; + pub const NL802154_CCA_UWB_MULTIPLEXED: Type = 6; + pub const __NL802154_CCA_ATTR_AFTER_LAST: Type = 7; + pub const NL802154_CCA_ATTR_MAX: Type = 6; +} +pub mod nl802154_cca_opts { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL802154_CCA_OPT_ENERGY_CARRIER_AND: Type = 0; + pub const NL802154_CCA_OPT_ENERGY_CARRIER_OR: Type = 1; + pub const __NL802154_CCA_OPT_ATTR_AFTER_LAST: Type = 2; + pub const NL802154_CCA_OPT_ATTR_MAX: Type = 1; +} +pub mod nl802154_supported_bool_states { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL802154_SUPPORTED_BOOL_FALSE: Type = 0; + pub const NL802154_SUPPORTED_BOOL_TRUE: Type = 1; + pub const __NL802154_SUPPORTED_BOOL_INVALD: Type = 2; + pub const NL802154_SUPPORTED_BOOL_BOTH: Type = 3; + pub const __NL802154_SUPPORTED_BOOL_AFTER_LAST: Type = 4; + pub const NL802154_SUPPORTED_BOOL_MAX: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wpan_phy_supported { + pub channels: [u32_; 32usize], + pub cca_modes: u32_, + pub cca_opts: u32_, + pub iftypes: u32_, + pub lbt: nl802154_supported_bool_states::Type, + pub min_minbe: u8_, + pub max_minbe: u8_, + pub min_maxbe: u8_, + pub max_maxbe: u8_, + pub min_csma_backoffs: u8_, + pub max_csma_backoffs: u8_, + pub min_frame_retries: s8, + pub max_frame_retries: s8, + pub tx_powers_size: usize, + pub cca_ed_levels_size: usize, + pub tx_powers: *const s32, + pub cca_ed_levels: *const s32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wpan_phy_cca { + pub mode: nl802154_cca_modes::Type, + pub opt: nl802154_cca_opts::Type, +} +#[repr(C)] +pub struct wpan_phy { + pub privid: *const ::aya_ebpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_ulong, + pub current_channel: u8_, + pub current_page: u8_, + pub supported: wpan_phy_supported, + pub transmit_power: s32, + pub cca: wpan_phy_cca, + pub perm_extended_addr: __le64, + pub cca_ed_level: s32, + pub symbol_duration: u32_, + pub lifs_period: u16_, + pub sifs_period: u16_, + pub dev: device, + pub _net: possible_net_t, + pub queue_lock: spinlock_t, + pub ongoing_txs: atomic_t, + pub hold_txs: atomic_t, + pub sync_txq: wait_queue_head_t, + pub filtering: ieee802154_filtering_level::Type, + pub __bindgen_padding_0: [u8; 4usize], + pub priv_: __IncompleteArrayField<::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ieee802154_addr { + pub mode: u8_, + pub pan_id: __le16, + pub __bindgen_anon_1: ieee802154_addr__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ieee802154_addr__bindgen_ty_1 { + pub short_addr: __le16, + pub extended_addr: __le64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee802154_pan_device { + pub pan_id: __le16, + pub mode: u8_, + pub short_addr: __le16, + pub extended_addr: __le64, + pub node: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wpan_dev_header_ops { + pub create: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut sk_buff, + arg2: *mut net_device, + arg3: *const ieee802154_addr, + arg4: *const ieee802154_addr, + arg5: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +pub struct numa_group { + pub refcount: refcount_t, + pub lock: spinlock_t, + pub nr_tasks: ::aya_ebpf::cty::c_int, + pub gid: pid_t, + pub active_nodes: ::aya_ebpf::cty::c_int, + pub rcu: callback_head, + pub total_faults: ::aya_ebpf::cty::c_ulong, + pub max_faults_cpu: ::aya_ebpf::cty::c_ulong, + pub faults: __IncompleteArrayField<::aya_ebpf::cty::c_ulong>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct fscrypt_keyring { + pub lock: spinlock_t, + pub key_hashtable: [hlist_head; 128usize], +} +pub mod devlink_linecard_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const DEVLINK_LINECARD_STATE_UNSPEC: Type = 0; + pub const DEVLINK_LINECARD_STATE_UNPROVISIONED: Type = 1; + pub const DEVLINK_LINECARD_STATE_UNPROVISIONING: Type = 2; + pub const DEVLINK_LINECARD_STATE_PROVISIONING: Type = 3; + pub const DEVLINK_LINECARD_STATE_PROVISIONING_FAILED: Type = 4; + pub const DEVLINK_LINECARD_STATE_PROVISIONED: Type = 5; + pub const DEVLINK_LINECARD_STATE_ACTIVE: Type = 6; + pub const __DEVLINK_LINECARD_STATE_MAX: Type = 7; + pub const DEVLINK_LINECARD_STATE_MAX: Type = 6; +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct devlink_linecard { + pub list: list_head, + pub devlink: *mut devlink, + pub index: ::aya_ebpf::cty::c_uint, + pub ops: *const devlink_linecard_ops, + pub priv_: *mut ::aya_ebpf::cty::c_void, + pub state: devlink_linecard_state::Type, + pub state_lock: mutex, + pub type_: *const ::aya_ebpf::cty::c_char, + pub types: *mut devlink_linecard_type, + pub types_count: ::aya_ebpf::cty::c_uint, + pub rel_index: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct devlink_linecard_ops { + pub provision: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_linecard, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *const ::aya_ebpf::cty::c_char, + arg4: *const ::aya_ebpf::cty::c_void, + arg5: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub unprovision: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_linecard, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *mut netlink_ext_ack, + ) -> ::aya_ebpf::cty::c_int, + >, + pub same_provision: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_linecard, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: *const ::aya_ebpf::cty::c_char, + arg4: *const ::aya_ebpf::cty::c_void, + ) -> bool_, + >, + pub types_count: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_linecard, + arg2: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_uint, + >, + pub types_get: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut devlink_linecard, + arg2: *mut ::aya_ebpf::cty::c_void, + arg3: ::aya_ebpf::cty::c_uint, + arg4: *mut *const ::aya_ebpf::cty::c_char, + arg5: *mut *const ::aya_ebpf::cty::c_void, + ), + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct devlink_linecard_type { + pub type_: *const ::aya_ebpf::cty::c_char, + pub priv_: *const ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rtattr { + pub rta_len: ::aya_ebpf::cty::c_ushort, + pub rta_type: ::aya_ebpf::cty::c_ushort, +} +pub mod iommu_dma_cookie_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IOMMU_DMA_IOVA_COOKIE: Type = 0; + pub const IOMMU_DMA_MSI_COOKIE: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iova { + pub node: rb_node, + pub pfn_hi: ::aya_ebpf::cty::c_ulong, + pub pfn_lo: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct iova_domain { + pub iova_rbtree_lock: spinlock_t, + pub rbroot: rb_root, + pub cached_node: *mut rb_node, + pub cached32_node: *mut rb_node, + pub granule: ::aya_ebpf::cty::c_ulong, + pub start_pfn: ::aya_ebpf::cty::c_ulong, + pub dma_32bit_pfn: ::aya_ebpf::cty::c_ulong, + pub max32_alloc_size: ::aya_ebpf::cty::c_ulong, + pub anchor: iova, + pub rcaches: *mut iova_rcache, + pub cpuhp_dead: hlist_node, +} +pub mod iommu_dma_queue_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IOMMU_DMA_OPTS_PER_CPU_QUEUE: Type = 0; + pub const IOMMU_DMA_OPTS_SINGLE_QUEUE: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iommu_dma_options { + pub qt: iommu_dma_queue_type::Type, + pub fq_size: usize, + pub fq_timeout: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct iommu_dma_cookie { + pub type_: iommu_dma_cookie_type::Type, + pub __bindgen_anon_1: iommu_dma_cookie__bindgen_ty_1, + pub msi_page_list: list_head, + pub fq_domain: *mut iommu_domain, + pub options: iommu_dma_options, + pub mutex: mutex, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union iommu_dma_cookie__bindgen_ty_1 { + pub __bindgen_anon_1: iommu_dma_cookie__bindgen_ty_1__bindgen_ty_1, + pub msi_iova: dma_addr_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct iommu_dma_cookie__bindgen_ty_1__bindgen_ty_1 { + pub iovad: iova_domain, + pub __bindgen_anon_1: iommu_dma_cookie__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, + pub fq_flush_start_cnt: atomic64_t, + pub fq_flush_finish_cnt: atomic64_t, + pub fq_timer: timer_list, + pub fq_timer_on: atomic_t, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union iommu_dma_cookie__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub single_fq: *mut iova_fq, + pub percpu_fq: *mut iova_fq, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct iova_fq_entry { + pub iova_pfn: ::aya_ebpf::cty::c_ulong, + pub pages: ::aya_ebpf::cty::c_ulong, + pub freelist: list_head, + pub counter: u64_, +} +#[repr(C)] +pub struct iova_fq { + pub lock: spinlock_t, + pub head: ::aya_ebpf::cty::c_uint, + pub tail: ::aya_ebpf::cty::c_uint, + pub mod_mask: ::aya_ebpf::cty::c_uint, + pub entries: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cpuidle_state_kobj { + pub state: *mut cpuidle_state, + pub state_usage: *mut cpuidle_state_usage, + pub kobj_unregister: completion, + pub kobj: kobject, + pub device: *mut cpuidle_device, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cpuidle_device_kobj { + pub dev: *mut cpuidle_device, + pub kobj_unregister: completion, + pub kobj: kobject, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct disk_events { + pub node: list_head, + pub disk: *mut gendisk, + pub lock: spinlock_t, + pub block_mutex: mutex, + pub block: ::aya_ebpf::cty::c_int, + pub pending: ::aya_ebpf::cty::c_uint, + pub clearing: ::aya_ebpf::cty::c_uint, + pub poll_msecs: ::aya_ebpf::cty::c_long, + pub dwork: delayed_work, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct module_sect_attr { + pub battr: bin_attribute, + pub address: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug)] +pub struct module_sect_attrs { + pub grp: attribute_group, + pub nsections: ::aya_ebpf::cty::c_uint, + pub attrs: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug)] +pub struct module_notes_attrs { + pub dir: *mut kobject, + pub notes: ::aya_ebpf::cty::c_uint, + pub attrs: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ring_buffer_iter { + pub cpu_buffer: *mut ring_buffer_per_cpu, + pub head: ::aya_ebpf::cty::c_ulong, + pub next_event: ::aya_ebpf::cty::c_ulong, + pub head_page: *mut buffer_page, + pub cache_reader_page: *mut buffer_page, + pub cache_read: ::aya_ebpf::cty::c_ulong, + pub cache_pages_removed: ::aya_ebpf::cty::c_ulong, + pub read_stamp: u64_, + pub page_stamp: u64_, + pub event: *mut ring_buffer_event, + pub event_size: usize, + pub missed_events: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rb_irq_work { + pub work: irq_work, + pub waiters: wait_queue_head_t, + pub full_waiters: wait_queue_head_t, + pub waiters_pending: bool_, + pub full_waiters_pending: bool_, + pub wakeup_full: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct trace_buffer { + pub flags: ::aya_ebpf::cty::c_uint, + pub cpus: ::aya_ebpf::cty::c_int, + pub record_disabled: atomic_t, + pub resizing: atomic_t, + pub cpumask: cpumask_var_t, + pub reader_lock_key: *mut lock_class_key, + pub mutex: mutex, + pub buffers: *mut *mut ring_buffer_per_cpu, + pub node: hlist_node, + pub clock: ::core::option::Option u64_>, + pub irq_work: rb_irq_work, + pub time_stamp_abs: bool_, + pub subbuf_size: ::aya_ebpf::cty::c_uint, + pub subbuf_order: ::aya_ebpf::cty::c_uint, + pub max_data_size: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug)] +pub struct buffer_data_page { + pub time_stamp: u64_, + pub commit: local_t, + pub data: __IncompleteArrayField<::aya_ebpf::cty::c_uchar>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct buffer_page { + pub list: list_head, + pub write: local_t, + pub read: ::aya_ebpf::cty::c_uint, + pub entries: local_t, + pub real_end: ::aya_ebpf::cty::c_ulong, + pub order: ::aya_ebpf::cty::c_uint, + pub page: *mut buffer_data_page, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rb_time_struct { + pub time: local64_t, +} +pub type rb_time_t = rb_time_struct; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ring_buffer_per_cpu { + pub cpu: ::aya_ebpf::cty::c_int, + pub record_disabled: atomic_t, + pub resize_disabled: atomic_t, + pub buffer: *mut trace_buffer, + pub reader_lock: raw_spinlock_t, + pub lock: arch_spinlock_t, + pub lock_key: lock_class_key, + pub free_page: *mut buffer_data_page, + pub nr_pages: ::aya_ebpf::cty::c_ulong, + pub current_context: ::aya_ebpf::cty::c_uint, + pub pages: *mut list_head, + pub head_page: *mut buffer_page, + pub tail_page: *mut buffer_page, + pub commit_page: *mut buffer_page, + pub reader_page: *mut buffer_page, + pub lost_events: ::aya_ebpf::cty::c_ulong, + pub last_overrun: ::aya_ebpf::cty::c_ulong, + pub nest: ::aya_ebpf::cty::c_ulong, + pub entries_bytes: local_t, + pub entries: local_t, + pub overrun: local_t, + pub commit_overrun: local_t, + pub dropped_events: local_t, + pub committing: local_t, + pub commits: local_t, + pub pages_touched: local_t, + pub pages_lost: local_t, + pub pages_read: local_t, + pub last_pages_touch: ::aya_ebpf::cty::c_long, + pub shortest_full: usize, + pub read: ::aya_ebpf::cty::c_ulong, + pub read_bytes: ::aya_ebpf::cty::c_ulong, + pub write_stamp: rb_time_t, + pub before_stamp: rb_time_t, + pub event_stamp: [u64_; 5usize], + pub read_stamp: u64_, + pub pages_removed: ::aya_ebpf::cty::c_ulong, + pub nr_pages_to_update: ::aya_ebpf::cty::c_long, + pub new_pages: list_head, + pub update_pages_work: work_struct, + pub update_done: completion, + pub irq_work: rb_irq_work, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct uncached_list { + pub lock: spinlock_t, + pub head: list_head, + pub quarantine: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct psample_group { + pub list: list_head, + pub net: *mut net, + pub group_num: u32_, + pub refcount: u32_, + pub seq: u32_, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct action_gate_entry { + pub gate_state: u8_, + pub interval: u32_, + pub ipv: s32, + pub maxoctets: s32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct tcf_exts_miss_cookie_node { + pub chain: *const tcf_chain, + pub tp: *const tcf_proto, + pub exts: *const tcf_exts, + pub chain_index: u32_, + pub tp_prio: u32_, + pub handle: u32_, + pub miss_cookie_base: u32_, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct timer_rand_state { + pub last_time: ::aya_ebpf::cty::c_ulong, + pub last_delta: ::aya_ebpf::cty::c_long, + pub last_delta2: ::aya_ebpf::cty::c_long, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdr_netobj { + pub len: ::aya_ebpf::cty::c_uint, + pub data: *mut u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdr_buf { + pub head: [kvec; 1usize], + pub tail: [kvec; 1usize], + pub bvec: *mut bio_vec, + pub pages: *mut *mut page, + pub page_base: ::aya_ebpf::cty::c_uint, + pub page_len: ::aya_ebpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, + pub buflen: ::aya_ebpf::cty::c_uint, + pub len: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xdr_stream { + pub p: *mut __be32, + pub buf: *mut xdr_buf, + pub end: *mut __be32, + pub iov: *mut kvec, + pub scratch: kvec, + pub page_ptr: *mut *mut page, + pub page_kaddr: *mut ::aya_ebpf::cty::c_void, + pub nwords: ::aya_ebpf::cty::c_uint, + pub rqst: *mut rpc_rqst, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct lwq_node { + pub node: llist_node, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rpc_rqst { + pub rq_xprt: *mut rpc_xprt, + pub rq_snd_buf: xdr_buf, + pub rq_rcv_buf: xdr_buf, + pub rq_task: *mut rpc_task, + pub rq_cred: *mut rpc_cred, + pub rq_xid: __be32, + pub rq_cong: ::aya_ebpf::cty::c_int, + pub rq_seqno: u32_, + pub rq_enc_pages_num: ::aya_ebpf::cty::c_int, + pub rq_enc_pages: *mut *mut page, + pub rq_release_snd_buf: ::core::option::Option, + pub __bindgen_anon_1: rpc_rqst__bindgen_ty_1, + pub rq_xmit: list_head, + pub rq_xmit2: list_head, + pub rq_buffer: *mut ::aya_ebpf::cty::c_void, + pub rq_callsize: usize, + pub rq_rbuffer: *mut ::aya_ebpf::cty::c_void, + pub rq_rcvsize: usize, + pub rq_xmit_bytes_sent: usize, + pub rq_reply_bytes_recvd: usize, + pub rq_private_buf: xdr_buf, + pub rq_majortimeo: ::aya_ebpf::cty::c_ulong, + pub rq_minortimeo: ::aya_ebpf::cty::c_ulong, + pub rq_timeout: ::aya_ebpf::cty::c_ulong, + pub rq_rtt: ktime_t, + pub rq_retries: ::aya_ebpf::cty::c_uint, + pub rq_connect_cookie: ::aya_ebpf::cty::c_uint, + pub rq_pin: atomic_t, + pub rq_bytes_sent: u32_, + pub rq_xtime: ktime_t, + pub rq_ntrans: ::aya_ebpf::cty::c_int, + pub rq_bc_list: lwq_node, + pub rq_bc_pa_state: ::aya_ebpf::cty::c_ulong, + pub rq_bc_pa_list: list_head, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union rpc_rqst__bindgen_ty_1 { + pub rq_list: list_head, + pub rq_recv: rb_node, +} +pub type kxdreproc_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_rqst, + arg2: *mut xdr_stream, + arg3: *const ::aya_ebpf::cty::c_void, + ), +>; +pub type kxdrdproc_t = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_rqst, + arg2: *mut xdr_stream, + arg3: *mut ::aya_ebpf::cty::c_void, + ) -> ::aya_ebpf::cty::c_int, +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_message { + pub rpc_proc: *const rpc_procinfo, + pub rpc_argp: *mut ::aya_ebpf::cty::c_void, + pub rpc_resp: *mut ::aya_ebpf::cty::c_void, + pub rpc_cred: *const cred, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_procinfo { + pub p_proc: u32_, + pub p_encode: kxdreproc_t, + pub p_decode: kxdrdproc_t, + pub p_arglen: ::aya_ebpf::cty::c_uint, + pub p_replen: ::aya_ebpf::cty::c_uint, + pub p_timer: ::aya_ebpf::cty::c_uint, + pub p_statidx: u32_, + pub p_name: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_wait { + pub list: list_head, + pub links: list_head, + pub timer_list: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_timeout { + pub to_initval: ::aya_ebpf::cty::c_ulong, + pub to_maxval: ::aya_ebpf::cty::c_ulong, + pub to_increment: ::aya_ebpf::cty::c_ulong, + pub to_retries: ::aya_ebpf::cty::c_uint, + pub to_exponential: ::aya_ebpf::cty::c_uchar, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rpc_task { + pub tk_count: atomic_t, + pub tk_status: ::aya_ebpf::cty::c_int, + pub tk_task: list_head, + pub tk_callback: ::core::option::Option, + pub tk_action: ::core::option::Option, + pub tk_timeout: ::aya_ebpf::cty::c_ulong, + pub tk_runstate: ::aya_ebpf::cty::c_ulong, + pub tk_waitqueue: *mut rpc_wait_queue, + pub u: rpc_task__bindgen_ty_1, + pub tk_msg: rpc_message, + pub tk_calldata: *mut ::aya_ebpf::cty::c_void, + pub tk_ops: *const rpc_call_ops, + pub tk_client: *mut rpc_clnt, + pub tk_xprt: *mut rpc_xprt, + pub tk_op_cred: *mut rpc_cred, + pub tk_rqstp: *mut rpc_rqst, + pub tk_workqueue: *mut workqueue_struct, + pub tk_start: ktime_t, + pub tk_owner: pid_t, + pub tk_rpc_status: ::aya_ebpf::cty::c_int, + pub tk_flags: ::aya_ebpf::cty::c_ushort, + pub tk_timeouts: ::aya_ebpf::cty::c_ushort, + pub tk_pid: ::aya_ebpf::cty::c_ushort, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: u8, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union rpc_task__bindgen_ty_1 { + pub tk_work: work_struct, + pub tk_wait: rpc_wait, +} +impl rpc_task { + #[inline] + pub fn tk_priority(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 2u8) as u8) } + } + #[inline] + pub fn set_tk_priority(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 2u8, val as u64) + } + } + #[inline] + pub fn tk_garb_retry(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 2u8) as u8) } + } + #[inline] + pub fn set_tk_garb_retry(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 2u8, val as u64) + } + } + #[inline] + pub fn tk_cred_retry(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 2u8) as u8) } + } + #[inline] + pub fn set_tk_cred_retry(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 2u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + tk_priority: ::aya_ebpf::cty::c_uchar, + tk_garb_retry: ::aya_ebpf::cty::c_uchar, + tk_cred_retry: ::aya_ebpf::cty::c_uchar, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 2u8, { + let tk_priority: u8 = unsafe { ::core::mem::transmute(tk_priority) }; + tk_priority as u64 + }); + __bindgen_bitfield_unit.set(2usize, 2u8, { + let tk_garb_retry: u8 = unsafe { ::core::mem::transmute(tk_garb_retry) }; + tk_garb_retry as u64 + }); + __bindgen_bitfield_unit.set(4usize, 2u8, { + let tk_cred_retry: u8 = unsafe { ::core::mem::transmute(tk_cred_retry) }; + tk_cred_retry as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_timer { + pub list: list_head, + pub expires: ::aya_ebpf::cty::c_ulong, + pub dwork: delayed_work, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rpc_wait_queue { + pub lock: spinlock_t, + pub tasks: [list_head; 4usize], + pub maxpriority: ::aya_ebpf::cty::c_uchar, + pub priority: ::aya_ebpf::cty::c_uchar, + pub nr: ::aya_ebpf::cty::c_uchar, + pub qlen: ::aya_ebpf::cty::c_ushort, + pub timer_list: rpc_timer, + pub name: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_call_ops { + pub rpc_call_prepare: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub rpc_call_done: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub rpc_count_stats: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut ::aya_ebpf::cty::c_void), + >, + pub rpc_release: + ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_iostats { + _unused: [u8; 0], +} +pub mod xprtsec_policies { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const RPC_XPRTSEC_NONE: Type = 0; + pub const RPC_XPRTSEC_TLS_ANON: Type = 1; + pub const RPC_XPRTSEC_TLS_X509: Type = 2; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xprtsec_parms { + pub policy: xprtsec_policies::Type, + pub cert_serial: key_serial_t, + pub privkey_serial: key_serial_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_pipe_dir_head { + pub pdh_entries: list_head, + pub pdh_dentry: *mut dentry, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_rtt { + pub timeo: ::aya_ebpf::cty::c_ulong, + pub srtt: [::aya_ebpf::cty::c_ulong; 5usize], + pub sdrtt: [::aya_ebpf::cty::c_ulong; 5usize], + pub ntimeouts: [::aya_ebpf::cty::c_int; 5usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_xprt_iter { + pub xpi_xpswitch: *mut rpc_xprt_switch, + pub xpi_cursor: *mut rpc_xprt, + pub xpi_ops: *const rpc_xprt_iter_ops, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rpc_clnt { + pub cl_count: refcount_t, + pub cl_clid: ::aya_ebpf::cty::c_uint, + pub cl_clients: list_head, + pub cl_tasks: list_head, + pub cl_pid: atomic_t, + pub cl_lock: spinlock_t, + pub cl_xprt: *mut rpc_xprt, + pub cl_procinfo: *const rpc_procinfo, + pub cl_prog: u32_, + pub cl_vers: u32_, + pub cl_maxproc: u32_, + pub cl_auth: *mut rpc_auth, + pub cl_stats: *mut rpc_stat, + pub cl_metrics: *mut rpc_iostats, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub cl_xprtsec: xprtsec_parms, + pub cl_rtt: *mut rpc_rtt, + pub cl_timeout: *const rpc_timeout, + pub cl_swapper: atomic_t, + pub cl_nodelen: ::aya_ebpf::cty::c_int, + pub cl_nodename: [::aya_ebpf::cty::c_char; 65usize], + pub cl_pipedir_objects: rpc_pipe_dir_head, + pub cl_parent: *mut rpc_clnt, + pub cl_rtt_default: rpc_rtt, + pub cl_timeout_default: rpc_timeout, + pub cl_program: *const rpc_program, + pub cl_principal: *const ::aya_ebpf::cty::c_char, + pub cl_debugfs: *mut dentry, + pub cl_sysfs: *mut rpc_sysfs_client, + pub __bindgen_anon_1: rpc_clnt__bindgen_ty_1, + pub cl_cred: *const cred, + pub cl_max_connect: ::aya_ebpf::cty::c_uint, + pub pipefs_sb: *mut super_block, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union rpc_clnt__bindgen_ty_1 { + pub cl_xpi: rpc_xprt_iter, + pub cl_work: work_struct, +} +impl rpc_clnt { + #[inline] + pub fn cl_softrtry(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_softrtry(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn cl_softerr(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_softerr(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn cl_discrtry(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_discrtry(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn cl_noretranstimeo(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_noretranstimeo(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn cl_autobind(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_autobind(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn cl_chatty(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_chatty(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn cl_shutdown(&self) -> ::aya_ebpf::cty::c_uint { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } + } + #[inline] + pub fn set_cl_shutdown(&mut self, val: ::aya_ebpf::cty::c_uint) { + unsafe { + let val: u32 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + cl_softrtry: ::aya_ebpf::cty::c_uint, + cl_softerr: ::aya_ebpf::cty::c_uint, + cl_discrtry: ::aya_ebpf::cty::c_uint, + cl_noretranstimeo: ::aya_ebpf::cty::c_uint, + cl_autobind: ::aya_ebpf::cty::c_uint, + cl_chatty: ::aya_ebpf::cty::c_uint, + cl_shutdown: ::aya_ebpf::cty::c_uint, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let cl_softrtry: u32 = unsafe { ::core::mem::transmute(cl_softrtry) }; + cl_softrtry as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let cl_softerr: u32 = unsafe { ::core::mem::transmute(cl_softerr) }; + cl_softerr as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let cl_discrtry: u32 = unsafe { ::core::mem::transmute(cl_discrtry) }; + cl_discrtry as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let cl_noretranstimeo: u32 = unsafe { ::core::mem::transmute(cl_noretranstimeo) }; + cl_noretranstimeo as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let cl_autobind: u32 = unsafe { ::core::mem::transmute(cl_autobind) }; + cl_autobind as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let cl_chatty: u32 = unsafe { ::core::mem::transmute(cl_chatty) }; + cl_chatty as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let cl_shutdown: u32 = unsafe { ::core::mem::transmute(cl_shutdown) }; + cl_shutdown as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_xprt { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_sysfs_xprt { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rpc_xprt { + pub kref: kref, + pub ops: *const rpc_xprt_ops, + pub id: ::aya_ebpf::cty::c_uint, + pub timeout: *const rpc_timeout, + pub addr: __kernel_sockaddr_storage, + pub addrlen: usize, + pub prot: ::aya_ebpf::cty::c_int, + pub cong: ::aya_ebpf::cty::c_ulong, + pub cwnd: ::aya_ebpf::cty::c_ulong, + pub max_payload: usize, + pub binding: rpc_wait_queue, + pub sending: rpc_wait_queue, + pub pending: rpc_wait_queue, + pub backlog: rpc_wait_queue, + pub free: list_head, + pub max_reqs: ::aya_ebpf::cty::c_uint, + pub min_reqs: ::aya_ebpf::cty::c_uint, + pub num_reqs: ::aya_ebpf::cty::c_uint, + pub state: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub swapper: atomic_t, + pub bind_index: ::aya_ebpf::cty::c_uint, + pub xprt_switch: list_head, + pub bind_timeout: ::aya_ebpf::cty::c_ulong, + pub reestablish_timeout: ::aya_ebpf::cty::c_ulong, + pub xprtsec: xprtsec_parms, + pub connect_cookie: ::aya_ebpf::cty::c_uint, + pub task_cleanup: work_struct, + pub timer: timer_list, + pub last_used: ::aya_ebpf::cty::c_ulong, + pub idle_timeout: ::aya_ebpf::cty::c_ulong, + pub connect_timeout: ::aya_ebpf::cty::c_ulong, + pub max_reconnect_timeout: ::aya_ebpf::cty::c_ulong, + pub queuelen: atomic_long_t, + pub transport_lock: spinlock_t, + pub reserve_lock: spinlock_t, + pub queue_lock: spinlock_t, + pub xid: u32_, + pub snd_task: *mut rpc_task, + pub xmit_queue: list_head, + pub xmit_queuelen: atomic_long_t, + pub bc_xprt: *mut svc_xprt, + pub bc_serv: *mut svc_serv, + pub bc_alloc_max: ::aya_ebpf::cty::c_uint, + pub bc_alloc_count: ::aya_ebpf::cty::c_uint, + pub bc_slot_count: atomic_t, + pub bc_pa_lock: spinlock_t, + pub bc_pa_list: list_head, + pub recv_queue: rb_root, + pub stat: rpc_xprt__bindgen_ty_1, + pub xprt_net: *mut net, + pub ns_tracker: netns_tracker, + pub servername: *const ::aya_ebpf::cty::c_char, + pub address_strings: [*const ::aya_ebpf::cty::c_char; 6usize], + pub debugfs: *mut dentry, + pub rcu: callback_head, + pub xprt_class: *const xprt_class, + pub xprt_sysfs: *mut rpc_sysfs_xprt, + pub main: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_xprt__bindgen_ty_1 { + pub bind_count: ::aya_ebpf::cty::c_ulong, + pub connect_count: ::aya_ebpf::cty::c_ulong, + pub connect_start: ::aya_ebpf::cty::c_ulong, + pub connect_time: ::aya_ebpf::cty::c_ulong, + pub sends: ::aya_ebpf::cty::c_ulong, + pub recvs: ::aya_ebpf::cty::c_ulong, + pub bad_xids: ::aya_ebpf::cty::c_ulong, + pub max_slots: ::aya_ebpf::cty::c_ulong, + pub req_u: ::aya_ebpf::cty::c_ulonglong, + pub bklog_u: ::aya_ebpf::cty::c_ulonglong, + pub sending_u: ::aya_ebpf::cty::c_ulonglong, + pub pending_u: ::aya_ebpf::cty::c_ulonglong, +} +impl rpc_xprt { + #[inline] + pub fn resvport(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_resvport(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn reuseport(&self) -> ::aya_ebpf::cty::c_uchar { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_reuseport(&mut self, val: ::aya_ebpf::cty::c_uchar) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + resvport: ::aya_ebpf::cty::c_uchar, + reuseport: ::aya_ebpf::cty::c_uchar, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let resvport: u8 = unsafe { ::core::mem::transmute(resvport) }; + resvport as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let reuseport: u8 = unsafe { ::core::mem::transmute(reuseport) }; + reuseport as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_cred { + pub cr_hash: hlist_node, + pub cr_lru: list_head, + pub cr_rcu: callback_head, + pub cr_auth: *mut rpc_auth, + pub cr_ops: *const rpc_credops, + pub cr_expire: ::aya_ebpf::cty::c_ulong, + pub cr_flags: ::aya_ebpf::cty::c_ulong, + pub cr_count: refcount_t, + pub cr_cred: *const cred, +} +pub type rpc_authflavor_t = u32_; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct auth_cred { + pub cred: *const cred, + pub principal: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_cred_cache { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_auth { + pub au_cslack: ::aya_ebpf::cty::c_uint, + pub au_rslack: ::aya_ebpf::cty::c_uint, + pub au_verfsize: ::aya_ebpf::cty::c_uint, + pub au_ralign: ::aya_ebpf::cty::c_uint, + pub au_flags: ::aya_ebpf::cty::c_ulong, + pub au_ops: *const rpc_authops, + pub au_flavor: rpc_authflavor_t, + pub au_count: refcount_t, + pub au_credcache: *mut rpc_cred_cache, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_credops { + pub cr_name: *const ::aya_ebpf::cty::c_char, + pub cr_init: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_auth, arg2: *mut rpc_cred) -> ::aya_ebpf::cty::c_int, + >, + pub crdestroy: ::core::option::Option, + pub crmatch: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut auth_cred, + arg2: *mut rpc_cred, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub crmarshal: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_ebpf::cty::c_int, + >, + pub crrefresh: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub crvalidate: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_ebpf::cty::c_int, + >, + pub crwrap_req: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_ebpf::cty::c_int, + >, + pub crunwrap_resp: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut xdr_stream) -> ::aya_ebpf::cty::c_int, + >, + pub crkey_timeout: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub crstringify_acceptor: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_cred) -> *mut ::aya_ebpf::cty::c_char, + >, + pub crneed_reencode: ::core::option::Option bool_>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_authops { + pub owner: *mut module, + pub au_flavor: rpc_authflavor_t, + pub au_name: *mut ::aya_ebpf::cty::c_char, + pub create: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const rpc_auth_create_args, + arg2: *mut rpc_clnt, + ) -> *mut rpc_auth, + >, + pub destroy: ::core::option::Option, + pub hash_cred: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut auth_cred, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lookup_cred: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_auth, + arg2: *mut auth_cred, + arg3: ::aya_ebpf::cty::c_int, + ) -> *mut rpc_cred, + >, + pub crcreate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_auth, + arg2: *mut auth_cred, + arg3: ::aya_ebpf::cty::c_int, + arg4: gfp_t, + ) -> *mut rpc_cred, + >, + pub info2flavor: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpcsec_gss_info) -> rpc_authflavor_t, + >, + pub flavor2info: ::core::option::Option< + unsafe extern "C" fn( + arg1: rpc_authflavor_t, + arg2: *mut rpcsec_gss_info, + ) -> ::aya_ebpf::cty::c_int, + >, + pub key_timeout: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_auth, arg2: *mut rpc_cred) -> ::aya_ebpf::cty::c_int, + >, + pub ping: + ::core::option::Option ::aya_ebpf::cty::c_int>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_auth_create_args { + pub pseudoflavor: rpc_authflavor_t, + pub target_name: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpcsec_gss_oid { + pub len: ::aya_ebpf::cty::c_uint, + pub data: [u8_; 32usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpcsec_gss_info { + pub oid: rpcsec_gss_oid, + pub qop: u32_, + pub service: u32_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct lwq { + pub lock: spinlock_t, + pub ready: *mut llist_node, + pub new: llist_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_xprt_ops { + pub set_buffer_size: + ::core::option::Option, + pub reserve_xprt: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_xprt, arg2: *mut rpc_task) -> ::aya_ebpf::cty::c_int, + >, + pub release_xprt: + ::core::option::Option, + pub alloc_slot: + ::core::option::Option, + pub free_slot: + ::core::option::Option, + pub rpcbind: ::core::option::Option, + pub set_port: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_xprt, arg2: ::aya_ebpf::cty::c_ushort), + >, + pub connect: + ::core::option::Option, + pub get_srcaddr: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_xprt, + arg2: *mut ::aya_ebpf::cty::c_char, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_srcport: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_xprt) -> ::aya_ebpf::cty::c_ushort, + >, + pub buf_alloc: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub buf_free: ::core::option::Option, + pub prepare_request: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_rqst, arg2: *mut xdr_buf) -> ::aya_ebpf::cty::c_int, + >, + pub send_request: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub wait_for_reply_request: ::core::option::Option, + pub timer: + ::core::option::Option, + pub release_request: ::core::option::Option, + pub close: ::core::option::Option, + pub destroy: ::core::option::Option, + pub set_connect_timeout: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_xprt, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_ulong, + ), + >, + pub print_stats: + ::core::option::Option, + pub enable_swap: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub disable_swap: ::core::option::Option, + pub inject_disconnect: ::core::option::Option, + pub bc_setup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_xprt, + arg2: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub bc_maxpayload: ::core::option::Option usize>, + pub bc_num_slots: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_xprt) -> ::aya_ebpf::cty::c_uint, + >, + pub bc_free_rqst: ::core::option::Option, + pub bc_destroy: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_xprt, arg2: ::aya_ebpf::cty::c_uint), + >, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct svc_serv { + pub sv_program: *mut svc_program, + pub sv_stats: *mut svc_stat, + pub sv_lock: spinlock_t, + pub sv_nrthreads: ::aya_ebpf::cty::c_uint, + pub sv_maxconn: ::aya_ebpf::cty::c_uint, + pub sv_max_payload: ::aya_ebpf::cty::c_uint, + pub sv_max_mesg: ::aya_ebpf::cty::c_uint, + pub sv_xdrsize: ::aya_ebpf::cty::c_uint, + pub sv_permsocks: list_head, + pub sv_tempsocks: list_head, + pub sv_tmpcnt: ::aya_ebpf::cty::c_int, + pub sv_temptimer: timer_list, + pub sv_name: *mut ::aya_ebpf::cty::c_char, + pub sv_nrpools: ::aya_ebpf::cty::c_uint, + pub sv_pools: *mut svc_pool, + pub sv_threadfn: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut ::aya_ebpf::cty::c_void) -> ::aya_ebpf::cty::c_int, + >, + pub sv_cb_list: lwq, + pub sv_bc_enabled: bool_, +} +#[repr(C)] +#[derive(Debug)] +pub struct xprt_class { + pub list: list_head, + pub ident: ::aya_ebpf::cty::c_int, + pub setup: + ::core::option::Option *mut rpc_xprt>, + pub owner: *mut module, + pub name: [::aya_ebpf::cty::c_char; 32usize], + pub netid: __IncompleteArrayField<*const ::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct xprt_create { + pub ident: ::aya_ebpf::cty::c_int, + pub net: *mut net, + pub srcaddr: *mut sockaddr, + pub dstaddr: *mut sockaddr, + pub addrlen: usize, + pub servername: *const ::aya_ebpf::cty::c_char, + pub bc_xprt: *mut svc_xprt, + pub bc_xps: *mut rpc_xprt_switch, + pub flags: ::aya_ebpf::cty::c_uint, + pub xprtsec: xprtsec_parms, + pub connect_timeout: ::aya_ebpf::cty::c_ulong, + pub reconnect_timeout: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_sysfs_xprt_switch { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct rpc_xprt_switch { + pub xps_lock: spinlock_t, + pub xps_kref: kref, + pub xps_id: ::aya_ebpf::cty::c_uint, + pub xps_nxprts: ::aya_ebpf::cty::c_uint, + pub xps_nactive: ::aya_ebpf::cty::c_uint, + pub xps_nunique_destaddr_xprts: ::aya_ebpf::cty::c_uint, + pub xps_queuelen: atomic_long_t, + pub xps_xprt_list: list_head, + pub xps_net: *mut net, + pub xps_iter_ops: *const rpc_xprt_iter_ops, + pub xps_sysfs: *mut rpc_sysfs_xprt_switch, + pub xps_rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_stat { + pub program: *const rpc_program, + pub netcnt: ::aya_ebpf::cty::c_uint, + pub netudpcnt: ::aya_ebpf::cty::c_uint, + pub nettcpcnt: ::aya_ebpf::cty::c_uint, + pub nettcpconn: ::aya_ebpf::cty::c_uint, + pub netreconn: ::aya_ebpf::cty::c_uint, + pub rpccnt: ::aya_ebpf::cty::c_uint, + pub rpcretrans: ::aya_ebpf::cty::c_uint, + pub rpcauthrefresh: ::aya_ebpf::cty::c_uint, + pub rpcgarbage: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_program { + pub name: *const ::aya_ebpf::cty::c_char, + pub number: u32_, + pub nrvers: ::aya_ebpf::cty::c_uint, + pub version: *mut *const rpc_version, + pub stats: *mut rpc_stat, + pub pipe_dir_name: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_stat { + pub program: *mut svc_program, + pub netcnt: ::aya_ebpf::cty::c_uint, + pub netudpcnt: ::aya_ebpf::cty::c_uint, + pub nettcpcnt: ::aya_ebpf::cty::c_uint, + pub nettcpconn: ::aya_ebpf::cty::c_uint, + pub rpccnt: ::aya_ebpf::cty::c_uint, + pub rpcbadfmt: ::aya_ebpf::cty::c_uint, + pub rpcbadauth: ::aya_ebpf::cty::c_uint, + pub rpcbadclnt: ::aya_ebpf::cty::c_uint, +} +pub mod svc_auth_status { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const SVC_GARBAGE: Type = 1; + pub const SVC_SYSERR: Type = 2; + pub const SVC_VALID: Type = 3; + pub const SVC_NEGATIVE: Type = 4; + pub const SVC_OK: Type = 5; + pub const SVC_DROP: Type = 6; + pub const SVC_CLOSE: Type = 7; + pub const SVC_DENIED: Type = 8; + pub const SVC_PENDING: Type = 9; + pub const SVC_COMPLETE: Type = 10; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_program { + pub pg_next: *mut svc_program, + pub pg_prog: u32_, + pub pg_lovers: ::aya_ebpf::cty::c_uint, + pub pg_hivers: ::aya_ebpf::cty::c_uint, + pub pg_nvers: ::aya_ebpf::cty::c_uint, + pub pg_vers: *mut *const svc_version, + pub pg_name: *mut ::aya_ebpf::cty::c_char, + pub pg_class: *mut ::aya_ebpf::cty::c_char, + pub pg_stats: *mut svc_stat, + pub pg_authenticate: + ::core::option::Option svc_auth_status::Type>, + pub pg_init_request: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut svc_rqst, + arg2: *const svc_program, + arg3: *mut svc_process_info, + ) -> __be32, + >, + pub pg_rpcbind_set: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut net, + arg2: *const svc_program, + arg3: u32_, + arg4: ::aya_ebpf::cty::c_int, + arg5: ::aya_ebpf::cty::c_ushort, + arg6: ::aya_ebpf::cty::c_ushort, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_xprt_iter_ops { + pub xpi_rewind: ::core::option::Option, + pub xpi_xprt: + ::core::option::Option *mut rpc_xprt>, + pub xpi_next: + ::core::option::Option *mut rpc_xprt>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_sysfs_client { + pub kobject: kobject, + pub net: *mut net, + pub clnt: *mut rpc_clnt, + pub xprt_switch: *mut rpc_xprt_switch, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rpc_version { + pub number: u32_, + pub nrprocs: ::aya_ebpf::cty::c_uint, + pub procs: *const rpc_procinfo, + pub counts: *mut ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_fh { + pub size: ::aya_ebpf::cty::c_ushort, + pub data: [::aya_ebpf::cty::c_uchar; 128usize], +} +pub mod nfs3_stable_how { + pub type Type = ::aya_ebpf::cty::c_int; + pub const NFS_UNSTABLE: Type = 0; + pub const NFS_DATA_SYNC: Type = 1; + pub const NFS_FILE_SYNC: Type = 2; + pub const NFS_INVALID_STABLE_HOW: Type = -1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_label { + pub lfs: u32, + pub pi: u32, + pub len: u32_, + pub label: *mut ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_verifier { + pub data: [::aya_ebpf::cty::c_char; 8usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs4_stateid_struct { + pub __bindgen_anon_1: nfs4_stateid_struct__bindgen_ty_1, + pub type_: nfs4_stateid_struct__bindgen_ty_2::Type, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nfs4_stateid_struct__bindgen_ty_1 { + pub data: [::aya_ebpf::cty::c_char; 16usize], + pub __bindgen_anon_1: nfs4_stateid_struct__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_stateid_struct__bindgen_ty_1__bindgen_ty_1 { + pub seqid: __be32, + pub other: [::aya_ebpf::cty::c_char; 12usize], +} +pub mod nfs4_stateid_struct__bindgen_ty_2 { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NFS4_INVALID_STATEID_TYPE: Type = 0; + pub const NFS4_SPECIAL_STATEID_TYPE: Type = 1; + pub const NFS4_OPEN_STATEID_TYPE: Type = 2; + pub const NFS4_LOCK_STATEID_TYPE: Type = 3; + pub const NFS4_DELEGATION_STATEID_TYPE: Type = 4; + pub const NFS4_LAYOUT_STATEID_TYPE: Type = 5; + pub const NFS4_PNFS_DS_STATEID_TYPE: Type = 6; + pub const NFS4_REVOKED_STATEID_TYPE: Type = 7; +} +pub type nfs4_stateid = nfs4_stateid_struct; +pub mod nfs4_change_attr_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR: Type = 0; + pub const NFS4_CHANGE_TYPE_IS_VERSION_COUNTER: Type = 1; + pub const NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS: Type = 2; + pub const NFS4_CHANGE_TYPE_IS_TIME_METADATA: Type = 3; + pub const NFS4_CHANGE_TYPE_IS_UNDEFINED: Type = 4; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct gss_ctx { + pub mech_type: *mut gss_api_mech, + pub internal_ctx_id: *mut ::aya_ebpf::cty::c_void, + pub slack: ::aya_ebpf::cty::c_uint, + pub align: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct gss_api_mech { + pub gm_list: list_head, + pub gm_owner: *mut module, + pub gm_oid: rpcsec_gss_oid, + pub gm_name: *mut ::aya_ebpf::cty::c_char, + pub gm_ops: *const gss_api_ops, + pub gm_pf_num: ::aya_ebpf::cty::c_int, + pub gm_pfs: *mut pf_desc, + pub gm_upcall_enctypes: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pf_desc { + pub pseudoflavor: u32_, + pub qop: u32_, + pub service: u32_, + pub name: *mut ::aya_ebpf::cty::c_char, + pub auth_domain_name: *mut ::aya_ebpf::cty::c_char, + pub domain: *mut auth_domain, + pub datatouch: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct auth_domain { + pub ref_: kref, + pub hash: hlist_node, + pub name: *mut ::aya_ebpf::cty::c_char, + pub flavour: *mut auth_ops, + pub callback_head: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct gss_api_ops { + pub gss_import_sec_context: ::core::option::Option< + unsafe extern "C" fn( + arg1: *const ::aya_ebpf::cty::c_void, + arg2: usize, + arg3: *mut gss_ctx, + arg4: *mut time64_t, + arg5: gfp_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub gss_get_mic: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gss_ctx, arg2: *mut xdr_buf, arg3: *mut xdr_netobj) -> u32_, + >, + pub gss_verify_mic: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut gss_ctx, arg2: *mut xdr_buf, arg3: *mut xdr_netobj) -> u32_, + >, + pub gss_wrap: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gss_ctx, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut xdr_buf, + arg4: *mut *mut page, + ) -> u32_, + >, + pub gss_unwrap: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut gss_ctx, + arg2: ::aya_ebpf::cty::c_int, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut xdr_buf, + ) -> u32_, + >, + pub gss_delete_sec_context: + ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_string { + pub len: ::aya_ebpf::cty::c_uint, + pub data: *mut ::aya_ebpf::cty::c_char, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_fsid { + pub major: u64, + pub minor: u64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_threshold { + pub bm: __u32, + pub l_type: __u32, + pub rd_sz: __u64, + pub wr_sz: __u64, + pub rd_io_sz: __u64, + pub wr_io_sz: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_fattr { + pub valid: ::aya_ebpf::cty::c_uint, + pub mode: umode_t, + pub nlink: __u32, + pub uid: kuid_t, + pub gid: kgid_t, + pub rdev: dev_t, + pub size: __u64, + pub du: nfs_fattr__bindgen_ty_1, + pub fsid: nfs_fsid, + pub fileid: __u64, + pub mounted_on_fileid: __u64, + pub atime: timespec64, + pub mtime: timespec64, + pub ctime: timespec64, + pub change_attr: __u64, + pub pre_change_attr: __u64, + pub pre_size: __u64, + pub pre_mtime: timespec64, + pub pre_ctime: timespec64, + pub time_start: ::aya_ebpf::cty::c_ulong, + pub gencount: ::aya_ebpf::cty::c_ulong, + pub owner_name: *mut nfs4_string, + pub group_name: *mut nfs4_string, + pub mdsthreshold: *mut nfs4_threshold, + pub label: *mut nfs4_label, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nfs_fattr__bindgen_ty_1 { + pub nfs2: nfs_fattr__bindgen_ty_1__bindgen_ty_1, + pub nfs3: nfs_fattr__bindgen_ty_1__bindgen_ty_2, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_fattr__bindgen_ty_1__bindgen_ty_1 { + pub blocksize: __u32, + pub blocks: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_fattr__bindgen_ty_1__bindgen_ty_2 { + pub used: __u64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_fsinfo { + pub fattr: *mut nfs_fattr, + pub rtmax: __u32, + pub rtpref: __u32, + pub rtmult: __u32, + pub wtmax: __u32, + pub wtpref: __u32, + pub wtmult: __u32, + pub dtpref: __u32, + pub maxfilesize: __u64, + pub time_delta: timespec64, + pub lease_time: __u32, + pub nlayouttypes: __u32, + pub layouttype: [__u32; 8usize], + pub blksize: __u32, + pub clone_blksize: __u32, + pub change_attr_type: nfs4_change_attr_type::Type, + pub xattr_support: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_fsstat { + pub fattr: *mut nfs_fattr, + pub tbytes: __u64, + pub fbytes: __u64, + pub abytes: __u64, + pub tfiles: __u64, + pub ffiles: __u64, + pub afiles: __u64, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_pathconf { + pub fattr: *mut nfs_fattr, + pub max_link: __u32, + pub max_namelen: __u32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_change_info { + pub atomic: u32_, + pub before: u64_, + pub after: u64_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_slot { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_sequence_args { + pub sa_slot: *mut nfs4_slot, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: [u8; 7usize], +} +impl nfs4_sequence_args { + #[inline] + pub fn sa_cache_this(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_sa_cache_this(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn sa_privileged(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_sa_privileged(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + sa_cache_this: u8_, + sa_privileged: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let sa_cache_this: u8 = unsafe { ::core::mem::transmute(sa_cache_this) }; + sa_cache_this as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let sa_privileged: u8 = unsafe { ::core::mem::transmute(sa_privileged) }; + sa_privileged as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_sequence_res { + pub sr_slot: *mut nfs4_slot, + pub sr_timestamp: ::aya_ebpf::cty::c_ulong, + pub sr_status: ::aya_ebpf::cty::c_int, + pub sr_status_flags: u32_, + pub sr_highest_slotid: u32_, + pub sr_target_highest_slotid: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_lock_context { + pub count: refcount_t, + pub list: list_head, + pub open_context: *mut nfs_open_context, + pub lockowner: fl_owner_t, + pub io_count: atomic_t, + pub callback_head: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_open_context { + pub lock_context: nfs_lock_context, + pub flock_owner: fl_owner_t, + pub dentry: *mut dentry, + pub cred: *const cred, + pub ll_cred: *mut rpc_cred, + pub state: *mut nfs4_state, + pub mode: fmode_t, + pub flags: ::aya_ebpf::cty::c_ulong, + pub error: ::aya_ebpf::cty::c_int, + pub list: list_head, + pub mdsthreshold: *mut nfs4_threshold, + pub callback_head: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nlm_host { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_iostats { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_auth_info { + pub flavor_len: ::aya_ebpf::cty::c_uint, + pub flavors: [rpc_authflavor_t; 12usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct fscache_volume { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pnfs_layoutdriver_type { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_server { + pub nfs_client: *mut nfs_client, + pub client_link: list_head, + pub master_link: list_head, + pub client: *mut rpc_clnt, + pub client_acl: *mut rpc_clnt, + pub nlm_host: *mut nlm_host, + pub io_stats: *mut nfs_iostats, + pub writeback: atomic_long_t, + pub write_congested: ::aya_ebpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_uint, + pub fattr_valid: ::aya_ebpf::cty::c_uint, + pub caps: ::aya_ebpf::cty::c_uint, + pub rsize: ::aya_ebpf::cty::c_uint, + pub rpages: ::aya_ebpf::cty::c_uint, + pub wsize: ::aya_ebpf::cty::c_uint, + pub wpages: ::aya_ebpf::cty::c_uint, + pub wtmult: ::aya_ebpf::cty::c_uint, + pub dtsize: ::aya_ebpf::cty::c_uint, + pub port: ::aya_ebpf::cty::c_ushort, + pub bsize: ::aya_ebpf::cty::c_uint, + pub gxasize: ::aya_ebpf::cty::c_uint, + pub sxasize: ::aya_ebpf::cty::c_uint, + pub lxasize: ::aya_ebpf::cty::c_uint, + pub acregmin: ::aya_ebpf::cty::c_uint, + pub acregmax: ::aya_ebpf::cty::c_uint, + pub acdirmin: ::aya_ebpf::cty::c_uint, + pub acdirmax: ::aya_ebpf::cty::c_uint, + pub namelen: ::aya_ebpf::cty::c_uint, + pub options: ::aya_ebpf::cty::c_uint, + pub clone_blksize: ::aya_ebpf::cty::c_uint, + pub change_attr_type: nfs4_change_attr_type::Type, + pub fsid: nfs_fsid, + pub s_sysfs_id: ::aya_ebpf::cty::c_int, + pub maxfilesize: __u64, + pub time_delta: timespec64, + pub mount_time: ::aya_ebpf::cty::c_ulong, + pub super_: *mut super_block, + pub s_dev: dev_t, + pub auth_info: nfs_auth_info, + pub fscache: *mut fscache_volume, + pub fscache_uniq: *mut ::aya_ebpf::cty::c_char, + pub pnfs_blksize: u32_, + pub attr_bitmask: [u32_; 3usize], + pub attr_bitmask_nl: [u32_; 3usize], + pub exclcreat_bitmask: [u32_; 3usize], + pub cache_consistency_bitmask: [u32_; 3usize], + pub acl_bitmask: u32_, + pub fh_expire_type: u32_, + pub pnfs_curr_ld: *mut pnfs_layoutdriver_type, + pub roc_rpcwaitq: rpc_wait_queue, + pub pnfs_ld_data: *mut ::aya_ebpf::cty::c_void, + pub state_owners: rb_root, + pub openowner_id: ida, + pub lockowner_id: ida, + pub state_owners_lru: list_head, + pub layouts: list_head, + pub delegations: list_head, + pub ss_copies: list_head, + pub delegation_gen: ::aya_ebpf::cty::c_ulong, + pub mig_gen: ::aya_ebpf::cty::c_ulong, + pub mig_status: ::aya_ebpf::cty::c_ulong, + pub destroy: ::core::option::Option, + pub active: atomic_t, + pub mountd_address: __kernel_sockaddr_storage, + pub mountd_addrlen: usize, + pub mountd_version: u32_, + pub mountd_port: ::aya_ebpf::cty::c_ushort, + pub mountd_protocol: ::aya_ebpf::cty::c_ushort, + pub uoc_rpcwaitq: rpc_wait_queue, + pub read_hdrsize: ::aya_ebpf::cty::c_uint, + pub cred: *const cred, + pub has_sec_mnt_opts: bool_, + pub kobj: kobject, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_subversion { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct idmap { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_slot_table { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_session { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_client { + pub cl_count: refcount_t, + pub cl_mds_count: atomic_t, + pub cl_cons_state: ::aya_ebpf::cty::c_int, + pub cl_res_state: ::aya_ebpf::cty::c_ulong, + pub cl_flags: ::aya_ebpf::cty::c_ulong, + pub cl_addr: __kernel_sockaddr_storage, + pub cl_addrlen: usize, + pub cl_hostname: *mut ::aya_ebpf::cty::c_char, + pub cl_acceptor: *mut ::aya_ebpf::cty::c_char, + pub cl_share_link: list_head, + pub cl_superblocks: list_head, + pub cl_rpcclient: *mut rpc_clnt, + pub rpc_ops: *const nfs_rpc_ops, + pub cl_proto: ::aya_ebpf::cty::c_int, + pub cl_nfs_mod: *mut nfs_subversion, + pub cl_minorversion: u32_, + pub cl_nconnect: ::aya_ebpf::cty::c_uint, + pub cl_max_connect: ::aya_ebpf::cty::c_uint, + pub cl_principal: *const ::aya_ebpf::cty::c_char, + pub cl_xprtsec: xprtsec_parms, + pub cl_ds_clients: list_head, + pub cl_clientid: u64_, + pub cl_confirm: nfs4_verifier, + pub cl_state: ::aya_ebpf::cty::c_ulong, + pub cl_lock: spinlock_t, + pub cl_lease_time: ::aya_ebpf::cty::c_ulong, + pub cl_last_renewal: ::aya_ebpf::cty::c_ulong, + pub cl_renewd: delayed_work, + pub cl_rpcwaitq: rpc_wait_queue, + pub cl_idmap: *mut idmap, + pub cl_owner_id: *const ::aya_ebpf::cty::c_char, + pub cl_cb_ident: u32_, + pub cl_mvops: *const nfs4_minor_version_ops, + pub cl_mig_gen: ::aya_ebpf::cty::c_ulong, + pub cl_slot_tbl: *mut nfs4_slot_table, + pub cl_seqid: u32_, + pub cl_exchange_flags: u32_, + pub cl_session: *mut nfs4_session, + pub cl_preserve_clid: bool_, + pub cl_serverowner: *mut nfs41_server_owner, + pub cl_serverscope: *mut nfs41_server_scope, + pub cl_implid: *mut nfs41_impl_id, + pub cl_sp4_flags: ::aya_ebpf::cty::c_ulong, + pub cl_lock_waitq: wait_queue_head_t, + pub cl_ipaddr: [::aya_ebpf::cty::c_char; 48usize], + pub cl_net: *mut net, + pub pending_cb_stateids: list_head, + pub rcu: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pnfs_layout_segment { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_seqid { + pub sequence: *mut nfs_seqid_counter, + pub list: list_head, + pub task: *mut rpc_task, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_write_verifier { + pub data: [::aya_ebpf::cty::c_char; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_writeverf { + pub verifier: nfs_write_verifier, + pub committed: nfs3_stable_how::Type, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_pgio_args { + pub seq_args: nfs4_sequence_args, + pub fh: *mut nfs_fh, + pub context: *mut nfs_open_context, + pub lock_context: *mut nfs_lock_context, + pub stateid: nfs4_stateid, + pub offset: __u64, + pub count: __u32, + pub pgbase: ::aya_ebpf::cty::c_uint, + pub pages: *mut *mut page, + pub __bindgen_anon_1: nfs_pgio_args__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nfs_pgio_args__bindgen_ty_1 { + pub replen: ::aya_ebpf::cty::c_uint, + pub __bindgen_anon_1: nfs_pgio_args__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_pgio_args__bindgen_ty_1__bindgen_ty_1 { + pub bitmask: *const u32_, + pub bitmask_store: [u32_; 3usize], + pub stable: nfs3_stable_how::Type, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_pgio_res { + pub seq_res: nfs4_sequence_res, + pub fattr: *mut nfs_fattr, + pub count: __u64, + pub op_status: __u32, + pub __bindgen_anon_1: nfs_pgio_res__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union nfs_pgio_res__bindgen_ty_1 { + pub __bindgen_anon_1: nfs_pgio_res__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: nfs_pgio_res__bindgen_ty_1__bindgen_ty_2, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_pgio_res__bindgen_ty_1__bindgen_ty_1 { + pub replen: ::aya_ebpf::cty::c_uint, + pub eof: ::aya_ebpf::cty::c_int, + pub scratch: *mut ::aya_ebpf::cty::c_void, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_pgio_res__bindgen_ty_1__bindgen_ty_2 { + pub verf: *mut nfs_writeverf, + pub server: *const nfs_server, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_commitargs { + pub seq_args: nfs4_sequence_args, + pub fh: *mut nfs_fh, + pub offset: __u64, + pub count: __u32, + pub bitmask: *const u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_commitres { + pub seq_res: nfs4_sequence_res, + pub op_status: __u32, + pub fattr: *mut nfs_fattr, + pub verf: *mut nfs_writeverf, + pub server: *const nfs_server, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_removeargs { + pub seq_args: nfs4_sequence_args, + pub fh: *const nfs_fh, + pub name: qstr, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_removeres { + pub seq_res: nfs4_sequence_res, + pub server: *mut nfs_server, + pub dir_attr: *mut nfs_fattr, + pub cinfo: nfs4_change_info, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_renameargs { + pub seq_args: nfs4_sequence_args, + pub old_dir: *const nfs_fh, + pub new_dir: *const nfs_fh, + pub old_name: *const qstr, + pub new_name: *const qstr, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_renameres { + pub seq_res: nfs4_sequence_res, + pub server: *mut nfs_server, + pub old_cinfo: nfs4_change_info, + pub old_fattr: *mut nfs_fattr, + pub new_cinfo: nfs4_change_info, + pub new_fattr: *mut nfs_fattr, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_entry { + pub ino: __u64, + pub cookie: __u64, + pub name: *const ::aya_ebpf::cty::c_char, + pub len: ::aya_ebpf::cty::c_uint, + pub eof: ::aya_ebpf::cty::c_int, + pub fh: *mut nfs_fh, + pub fattr: *mut nfs_fattr, + pub d_type: ::aya_ebpf::cty::c_uchar, + pub server: *mut nfs_server, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_readdir_arg { + pub dentry: *mut dentry, + pub cred: *const cred, + pub verf: *mut __be32, + pub cookie: u64_, + pub pages: *mut *mut page, + pub page_len: ::aya_ebpf::cty::c_uint, + pub plus: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_readdir_res { + pub verf: *mut __be32, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_pathname { + pub ncomponents: ::aya_ebpf::cty::c_uint, + pub components: [nfs4_string; 512usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_fs_location { + pub nservers: ::aya_ebpf::cty::c_uint, + pub servers: [nfs4_string; 10usize], + pub rootpath: nfs4_pathname, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_fs_locations { + pub fattr: *mut nfs_fattr, + pub server: *const nfs_server, + pub fs_path: nfs4_pathname, + pub nlocations: ::aya_ebpf::cty::c_int, + pub locations: [nfs4_fs_location; 10usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfstime4 { + pub seconds: u64_, + pub nseconds: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pnfs_commit_ops { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct pnfs_ds_commit_info { + pub commits: list_head, + pub nwritten: ::aya_ebpf::cty::c_uint, + pub ncommitting: ::aya_ebpf::cty::c_uint, + pub ops: *const pnfs_commit_ops, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs41_server_owner { + pub minor_id: u64, + pub major_id_sz: u32, + pub major_id: [::aya_ebpf::cty::c_char; 1024usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs41_server_scope { + pub server_scope_sz: u32, + pub server_scope: [::aya_ebpf::cty::c_char; 1024usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs41_impl_id { + pub domain: [::aya_ebpf::cty::c_char; 1025usize], + pub name: [::aya_ebpf::cty::c_char; 1025usize], + pub date: nfstime4, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_page_array { + pub pagevec: *mut *mut page, + pub npages: ::aya_ebpf::cty::c_uint, + pub page_array: [*mut page; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_page { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_rw_ops { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_io_completion { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_direct_req { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_pgio_header { + pub inode: *mut inode, + pub cred: *const cred, + pub pages: list_head, + pub req: *mut nfs_page, + pub verf: nfs_writeverf, + pub rw_mode: fmode_t, + pub lseg: *mut pnfs_layout_segment, + pub io_start: loff_t, + pub mds_ops: *const rpc_call_ops, + pub release: ::core::option::Option, + pub completion_ops: *const nfs_pgio_completion_ops, + pub rw_ops: *const nfs_rw_ops, + pub io_completion: *mut nfs_io_completion, + pub dreq: *mut nfs_direct_req, + pub netfs: *mut ::aya_ebpf::cty::c_void, + pub pnfs_error: ::aya_ebpf::cty::c_int, + pub error: ::aya_ebpf::cty::c_int, + pub good_bytes: ::aya_ebpf::cty::c_uint, + pub flags: ::aya_ebpf::cty::c_ulong, + pub task: rpc_task, + pub fattr: nfs_fattr, + pub args: nfs_pgio_args, + pub res: nfs_pgio_res, + pub timestamp: ::aya_ebpf::cty::c_ulong, + pub pgio_done_cb: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut nfs_pgio_header, + ) -> ::aya_ebpf::cty::c_int, + >, + pub mds_offset: __u64, + pub page_array: nfs_page_array, + pub ds_clp: *mut nfs_client, + pub ds_commit_idx: u32_, + pub pgio_mirror_idx: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_pgio_completion_ops { + pub error_cleanup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut list_head, arg2: ::aya_ebpf::cty::c_int), + >, + pub init_hdr: ::core::option::Option, + pub completion: ::core::option::Option, + pub reschedule_io: ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_mds_commit_info { + pub rpcs_out: atomic_t, + pub ncommit: atomic_long_t, + pub list: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_commit_completion_ops { + pub completion: ::core::option::Option, + pub resched_write: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_commit_info, arg2: *mut nfs_page), + >, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_commit_data { + pub task: rpc_task, + pub inode: *mut inode, + pub cred: *const cred, + pub fattr: nfs_fattr, + pub verf: nfs_writeverf, + pub pages: list_head, + pub list: list_head, + pub dreq: *mut nfs_direct_req, + pub args: nfs_commitargs, + pub res: nfs_commitres, + pub context: *mut nfs_open_context, + pub lseg: *mut pnfs_layout_segment, + pub ds_clp: *mut nfs_client, + pub ds_commit_index: ::aya_ebpf::cty::c_int, + pub lwb: loff_t, + pub mds_ops: *const rpc_call_ops, + pub completion_ops: *const nfs_commit_completion_ops, + pub commit_done_cb: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut nfs_commit_data, + ) -> ::aya_ebpf::cty::c_int, + >, + pub flags: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_commit_info { + pub inode: *mut inode, + pub mds: *mut nfs_mds_commit_info, + pub ds: *mut pnfs_ds_commit_info, + pub dreq: *mut nfs_direct_req, + pub completion_ops: *const nfs_commit_completion_ops, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_unlinkdata { + pub args: nfs_removeargs, + pub res: nfs_removeres, + pub dentry: *mut dentry, + pub wq: wait_queue_head_t, + pub cred: *const cred, + pub dir_attr: nfs_fattr, + pub timeout: ::aya_ebpf::cty::c_long, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_renamedata { + pub args: nfs_renameargs, + pub res: nfs_renameres, + pub task: rpc_task, + pub cred: *const cred, + pub old_dir: *mut inode, + pub old_dentry: *mut dentry, + pub old_fattr: nfs_fattr, + pub new_dir: *mut inode, + pub new_dentry: *mut dentry, + pub new_fattr: nfs_fattr, + pub complete: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_renamedata), + >, + pub timeout: ::aya_ebpf::cty::c_long, + pub cancelled: bool_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nlmclnt_operations { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_client_initdata { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_rpc_ops { + pub version: u32_, + pub dentry_ops: *const dentry_operations, + pub dir_inode_ops: *const inode_operations, + pub file_inode_ops: *const inode_operations, + pub file_ops: *const file_operations, + pub nlmclnt_ops: *const nlmclnt_operations, + pub getroot: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_fsinfo, + ) -> ::aya_ebpf::cty::c_int, + >, + pub submount: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut fs_context, + arg2: *mut nfs_server, + ) -> ::aya_ebpf::cty::c_int, + >, + pub try_get_tree: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut fs_context) -> ::aya_ebpf::cty::c_int, + >, + pub getattr: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_fattr, + arg4: *mut inode, + ) -> ::aya_ebpf::cty::c_int, + >, + pub setattr: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dentry, + arg2: *mut nfs_fattr, + arg3: *mut iattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lookup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut dentry, + arg3: *mut nfs_fh, + arg4: *mut nfs_fattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lookupp: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut nfs_fh, + arg3: *mut nfs_fattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub access: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut nfs_access_entry, + arg3: *const cred, + ) -> ::aya_ebpf::cty::c_int, + >, + pub readlink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut page, + arg3: ::aya_ebpf::cty::c_uint, + arg4: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub create: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut dentry, + arg3: *mut iattr, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub remove: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *mut dentry) -> ::aya_ebpf::cty::c_int, + >, + pub unlink_setup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_message, arg2: *mut dentry, arg3: *mut inode), + >, + pub unlink_rpc_prepare: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_unlinkdata), + >, + pub unlink_done: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut inode) -> ::aya_ebpf::cty::c_int, + >, + pub rename_setup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_message, arg2: *mut dentry, arg3: *mut dentry), + >, + pub rename_rpc_prepare: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_renamedata), + >, + pub rename_done: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut inode, + arg3: *mut inode, + ) -> ::aya_ebpf::cty::c_int, + >, + pub link: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut inode, + arg3: *const qstr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub symlink: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut dentry, + arg3: *mut folio, + arg4: ::aya_ebpf::cty::c_uint, + arg5: *mut iattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub mkdir: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut dentry, + arg3: *mut iattr, + ) -> ::aya_ebpf::cty::c_int, + >, + pub rmdir: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *const qstr) -> ::aya_ebpf::cty::c_int, + >, + pub readdir: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_readdir_arg, + arg2: *mut nfs_readdir_res, + ) -> ::aya_ebpf::cty::c_int, + >, + pub mknod: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut dentry, + arg3: *mut iattr, + arg4: dev_t, + ) -> ::aya_ebpf::cty::c_int, + >, + pub statfs: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_fsstat, + ) -> ::aya_ebpf::cty::c_int, + >, + pub fsinfo: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_fsinfo, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pathconf: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_pathconf, + ) -> ::aya_ebpf::cty::c_int, + >, + pub set_capabilities: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_server, arg2: *mut nfs_fh) -> ::aya_ebpf::cty::c_int, + >, + pub decode_dirent: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut xdr_stream, + arg2: *mut nfs_entry, + arg3: bool_, + ) -> ::aya_ebpf::cty::c_int, + >, + pub pgio_rpc_prepare: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut nfs_pgio_header, + ) -> ::aya_ebpf::cty::c_int, + >, + pub read_setup: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_pgio_header, arg2: *mut rpc_message), + >, + pub read_done: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut nfs_pgio_header, + ) -> ::aya_ebpf::cty::c_int, + >, + pub write_setup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_pgio_header, + arg2: *mut rpc_message, + arg3: *mut *mut rpc_clnt, + ), + >, + pub write_done: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut nfs_pgio_header, + ) -> ::aya_ebpf::cty::c_int, + >, + pub commit_setup: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_commit_data, + arg2: *mut rpc_message, + arg3: *mut *mut rpc_clnt, + ), + >, + pub commit_rpc_prepare: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut rpc_task, arg2: *mut nfs_commit_data), + >, + pub commit_done: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_task, + arg2: *mut nfs_commit_data, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lock: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut file, + arg2: ::aya_ebpf::cty::c_int, + arg3: *mut file_lock, + ) -> ::aya_ebpf::cty::c_int, + >, + pub lock_check_bounds: ::core::option::Option< + unsafe extern "C" fn(arg1: *const file_lock) -> ::aya_ebpf::cty::c_int, + >, + pub clear_acl_cache: ::core::option::Option, + pub close_context: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_open_context, arg2: ::aya_ebpf::cty::c_int), + >, + pub open_context: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut inode, + arg2: *mut nfs_open_context, + arg3: ::aya_ebpf::cty::c_int, + arg4: *mut iattr, + arg5: *mut ::aya_ebpf::cty::c_int, + ) -> *mut inode, + >, + pub have_delegation: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: fmode_t) -> ::aya_ebpf::cty::c_int, + >, + pub alloc_client: ::core::option::Option< + unsafe extern "C" fn(arg1: *const nfs_client_initdata) -> *mut nfs_client, + >, + pub init_client: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_client, + arg2: *const nfs_client_initdata, + ) -> *mut nfs_client, + >, + pub free_client: ::core::option::Option, + pub create_server: + ::core::option::Option *mut nfs_server>, + pub clone_server: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_fattr, + arg4: rpc_authflavor_t, + ) -> *mut nfs_server, + >, + pub discover_trunking: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_server, arg2: *mut nfs_fh) -> ::aya_ebpf::cty::c_int, + >, + pub enable_swap: ::core::option::Option, + pub disable_swap: ::core::option::Option, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs_access_entry { + pub rb_node: rb_node, + pub lru: list_head, + pub fsuid: kuid_t, + pub fsgid: kgid_t, + pub group_info: *mut group_info, + pub timestamp: u64_, + pub mask: __u32, + pub callback_head: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_minor_version_ops { + pub minor_version: u32_, + pub init_caps: ::aya_ebpf::cty::c_uint, + pub init_client: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_client) -> ::aya_ebpf::cty::c_int, + >, + pub shutdown_client: ::core::option::Option, + pub match_stateid: ::core::option::Option< + unsafe extern "C" fn(arg1: *const nfs4_stateid, arg2: *const nfs4_stateid) -> bool_, + >, + pub find_root_sec: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs_fsinfo, + ) -> ::aya_ebpf::cty::c_int, + >, + pub free_lock_state: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_server, arg2: *mut nfs4_lock_state), + >, + pub test_and_free_expired: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs4_stateid, + arg3: *const cred, + ) -> ::aya_ebpf::cty::c_int, + >, + pub alloc_seqid: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_seqid_counter, arg2: gfp_t) -> *mut nfs_seqid, + >, + pub session_trunk: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut rpc_clnt, + arg2: *mut rpc_xprt, + arg3: *mut ::aya_ebpf::cty::c_void, + ), + >, + pub call_sync_ops: *const rpc_call_ops, + pub reboot_recovery_ops: *const nfs4_state_recovery_ops, + pub nograce_recovery_ops: *const nfs4_state_recovery_ops, + pub state_renewal_ops: *const nfs4_state_maintenance_ops, + pub mig_recovery_ops: *const nfs4_mig_recovery_ops, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs4_state { + pub open_states: list_head, + pub inode_states: list_head, + pub lock_states: list_head, + pub owner: *mut nfs4_state_owner, + pub inode: *mut inode, + pub flags: ::aya_ebpf::cty::c_ulong, + pub state_lock: spinlock_t, + pub seqlock: seqlock_t, + pub stateid: nfs4_stateid, + pub open_stateid: nfs4_stateid, + pub n_rdonly: ::aya_ebpf::cty::c_uint, + pub n_wronly: ::aya_ebpf::cty::c_uint, + pub n_rdwr: ::aya_ebpf::cty::c_uint, + pub state: fmode_t, + pub count: refcount_t, + pub waitq: wait_queue_head_t, + pub callback_head: callback_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cache_head { + pub cache_list: hlist_node, + pub expiry_time: time64_t, + pub last_refresh: time64_t, + pub ref_: kref, + pub flags: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cache_req { + pub defer: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cache_req) -> *mut cache_deferred_req, + >, + pub thread_wait: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cache_deferred_req { + pub hash: hlist_node, + pub recent: list_head, + pub item: *mut cache_head, + pub owner: *mut ::aya_ebpf::cty::c_void, + pub revisit: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut cache_deferred_req, arg2: ::aya_ebpf::cty::c_int), + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_cred { + pub cr_uid: kuid_t, + pub cr_gid: kgid_t, + pub cr_group_info: *mut group_info, + pub cr_flavor: u32_, + pub cr_raw_principal: *mut ::aya_ebpf::cty::c_char, + pub cr_principal: *mut ::aya_ebpf::cty::c_char, + pub cr_targ_princ: *mut ::aya_ebpf::cty::c_char, + pub cr_gss_mech: *mut gss_api_mech, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct auth_ops { + pub name: *mut ::aya_ebpf::cty::c_char, + pub owner: *mut module, + pub flavour: ::aya_ebpf::cty::c_int, + pub accept: + ::core::option::Option svc_auth_status::Type>, + pub release: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub domain_release: ::core::option::Option, + pub set_client: + ::core::option::Option svc_auth_status::Type>, + pub pseudoflavor: + ::core::option::Option rpc_authflavor_t>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct svc_rqst { + pub rq_all: list_head, + pub rq_idle: llist_node, + pub rq_rcu_head: callback_head, + pub rq_xprt: *mut svc_xprt, + pub rq_addr: __kernel_sockaddr_storage, + pub rq_addrlen: usize, + pub rq_daddr: __kernel_sockaddr_storage, + pub rq_daddrlen: usize, + pub rq_server: *mut svc_serv, + pub rq_pool: *mut svc_pool, + pub rq_procinfo: *const svc_procedure, + pub rq_authop: *mut auth_ops, + pub rq_cred: svc_cred, + pub rq_xprt_ctxt: *mut ::aya_ebpf::cty::c_void, + pub rq_deferred: *mut svc_deferred_req, + pub rq_arg: xdr_buf, + pub rq_arg_stream: xdr_stream, + pub rq_res_stream: xdr_stream, + pub rq_scratch_page: *mut page, + pub rq_res: xdr_buf, + pub rq_pages: [*mut page; 260usize], + pub rq_respages: *mut *mut page, + pub rq_next_page: *mut *mut page, + pub rq_page_end: *mut *mut page, + pub rq_fbatch: folio_batch, + pub rq_vec: [kvec; 259usize], + pub rq_bvec: [bio_vec; 259usize], + pub rq_xid: __be32, + pub rq_prog: u32_, + pub rq_vers: u32_, + pub rq_proc: u32_, + pub rq_prot: u32_, + pub rq_cachetype: ::aya_ebpf::cty::c_int, + pub rq_flags: ::aya_ebpf::cty::c_ulong, + pub rq_qtime: ktime_t, + pub rq_argp: *mut ::aya_ebpf::cty::c_void, + pub rq_resp: *mut ::aya_ebpf::cty::c_void, + pub rq_accept_statp: *mut __be32, + pub rq_auth_data: *mut ::aya_ebpf::cty::c_void, + pub rq_auth_stat: __be32, + pub rq_auth_slack: ::aya_ebpf::cty::c_int, + pub rq_reserved: ::aya_ebpf::cty::c_int, + pub rq_stime: ktime_t, + pub rq_chandle: cache_req, + pub rq_client: *mut auth_domain, + pub rq_gssclient: *mut auth_domain, + pub rq_task: *mut task_struct, + pub rq_bc_net: *mut net, + pub bc_to_initval: ::aya_ebpf::cty::c_ulong, + pub bc_to_retries: ::aya_ebpf::cty::c_uint, + pub rq_lease_breaker: *mut *mut ::aya_ebpf::cty::c_void, + pub rq_status_counter: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct svc_pool { + pub sp_id: ::aya_ebpf::cty::c_uint, + pub sp_xprts: lwq, + pub sp_nrthreads: atomic_t, + pub sp_all_threads: list_head, + pub sp_idle_threads: llist_head, + pub sp_messages_arrived: percpu_counter, + pub sp_sockets_queued: percpu_counter, + pub sp_threads_woken: percpu_counter, + pub sp_flags: ::aya_ebpf::cty::c_ulong, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_procedure { + pub pc_func: ::core::option::Option __be32>, + pub pc_decode: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut svc_rqst, arg2: *mut xdr_stream) -> bool_, + >, + pub pc_encode: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut svc_rqst, arg2: *mut xdr_stream) -> bool_, + >, + pub pc_release: ::core::option::Option, + pub pc_argsize: ::aya_ebpf::cty::c_uint, + pub pc_argzero: ::aya_ebpf::cty::c_uint, + pub pc_ressize: ::aya_ebpf::cty::c_uint, + pub pc_cachetype: ::aya_ebpf::cty::c_uint, + pub pc_xdrressize: ::aya_ebpf::cty::c_uint, + pub pc_name: *const ::aya_ebpf::cty::c_char, +} +#[repr(C)] +pub struct svc_deferred_req { + pub prot: u32_, + pub xprt: *mut svc_xprt, + pub addr: __kernel_sockaddr_storage, + pub addrlen: usize, + pub daddr: __kernel_sockaddr_storage, + pub daddrlen: usize, + pub xprt_ctxt: *mut ::aya_ebpf::cty::c_void, + pub handle: cache_deferred_req, + pub argslen: ::aya_ebpf::cty::c_int, + pub args: __IncompleteArrayField<__be32>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct svc_process_info { + pub __bindgen_anon_1: svc_process_info__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union svc_process_info__bindgen_ty_1 { + pub dispatch: + ::core::option::Option ::aya_ebpf::cty::c_int>, + pub mismatch: svc_process_info__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_process_info__bindgen_ty_1__bindgen_ty_1 { + pub lovers: ::aya_ebpf::cty::c_uint, + pub hivers: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct svc_version { + pub vs_vers: u32_, + pub vs_nproc: u32_, + pub vs_proc: *const svc_procedure, + pub vs_count: *mut ::aya_ebpf::cty::c_ulong, + pub vs_xdrsize: u32_, + pub vs_hidden: bool_, + pub vs_rpcb_optnl: bool_, + pub vs_need_cong_ctrl: bool_, + pub vs_dispatch: + ::core::option::Option ::aya_ebpf::cty::c_int>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs_seqid_counter { + pub create_time: ktime_t, + pub owner_id: ::aya_ebpf::cty::c_int, + pub flags: ::aya_ebpf::cty::c_int, + pub counter: u32_, + pub lock: spinlock_t, + pub list: list_head, + pub wait: rpc_wait_queue, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs4_lock_state { + pub ls_locks: list_head, + pub ls_state: *mut nfs4_state, + pub ls_flags: ::aya_ebpf::cty::c_ulong, + pub ls_seqid: nfs_seqid_counter, + pub ls_stateid: nfs4_stateid, + pub ls_count: refcount_t, + pub ls_owner: fl_owner_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_state_recovery_ops { + pub owner_flag_bit: ::aya_ebpf::cty::c_int, + pub state_flag_bit: ::aya_ebpf::cty::c_int, + pub recover_open: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs4_state_owner, + arg2: *mut nfs4_state, + ) -> ::aya_ebpf::cty::c_int, + >, + pub recover_lock: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs4_state, arg2: *mut file_lock) -> ::aya_ebpf::cty::c_int, + >, + pub establish_clid: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_client, arg2: *const cred) -> ::aya_ebpf::cty::c_int, + >, + pub reclaim_complete: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_client, arg2: *const cred) -> ::aya_ebpf::cty::c_int, + >, + pub detect_trunking: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_client, + arg2: *mut *mut nfs_client, + arg3: *const cred, + ) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_state_maintenance_ops { + pub sched_state_renewal: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_client, + arg2: *const cred, + arg3: ::aya_ebpf::cty::c_uint, + ) -> ::aya_ebpf::cty::c_int, + >, + pub get_state_renewal_cred: + ::core::option::Option *const cred>, + pub renew_lease: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut nfs_client, arg2: *const cred) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nfs4_mig_recovery_ops { + pub get_locations: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut nfs_server, + arg2: *mut nfs_fh, + arg3: *mut nfs4_fs_locations, + arg4: *mut page, + arg5: *const cred, + ) -> ::aya_ebpf::cty::c_int, + >, + pub fsid_present: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut inode, arg2: *const cred) -> ::aya_ebpf::cty::c_int, + >, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct nfs4_state_owner { + pub so_server: *mut nfs_server, + pub so_lru: list_head, + pub so_expires: ::aya_ebpf::cty::c_ulong, + pub so_server_node: rb_node, + pub so_cred: *const cred, + pub so_lock: spinlock_t, + pub so_count: atomic_t, + pub so_flags: ::aya_ebpf::cty::c_ulong, + pub so_states: list_head, + pub so_seqid: nfs_seqid_counter, + pub so_reclaim_seqcount: seqcount_spinlock_t, + pub so_delegreturn_mutex: mutex, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct prog_entry { + pub target: ::aya_ebpf::cty::c_int, + pub when_to_branch: ::aya_ebpf::cty::c_int, + pub pred: *mut filter_pred, +} +pub type regex_match_func = ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut ::aya_ebpf::cty::c_char, + arg2: *mut regex, + arg3: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct regex { + pub pattern: [::aya_ebpf::cty::c_char; 256usize], + pub len: ::aya_ebpf::cty::c_int, + pub field_len: ::aya_ebpf::cty::c_int, + pub match_: regex_match_func, +} +pub mod filter_pred_fn { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const FILTER_PRED_FN_NOP: Type = 0; + pub const FILTER_PRED_FN_64: Type = 1; + pub const FILTER_PRED_FN_64_CPUMASK: Type = 2; + pub const FILTER_PRED_FN_S64: Type = 3; + pub const FILTER_PRED_FN_U64: Type = 4; + pub const FILTER_PRED_FN_32: Type = 5; + pub const FILTER_PRED_FN_32_CPUMASK: Type = 6; + pub const FILTER_PRED_FN_S32: Type = 7; + pub const FILTER_PRED_FN_U32: Type = 8; + pub const FILTER_PRED_FN_16: Type = 9; + pub const FILTER_PRED_FN_16_CPUMASK: Type = 10; + pub const FILTER_PRED_FN_S16: Type = 11; + pub const FILTER_PRED_FN_U16: Type = 12; + pub const FILTER_PRED_FN_8: Type = 13; + pub const FILTER_PRED_FN_8_CPUMASK: Type = 14; + pub const FILTER_PRED_FN_S8: Type = 15; + pub const FILTER_PRED_FN_U8: Type = 16; + pub const FILTER_PRED_FN_COMM: Type = 17; + pub const FILTER_PRED_FN_STRING: Type = 18; + pub const FILTER_PRED_FN_STRLOC: Type = 19; + pub const FILTER_PRED_FN_STRRELLOC: Type = 20; + pub const FILTER_PRED_FN_PCHAR_USER: Type = 21; + pub const FILTER_PRED_FN_PCHAR: Type = 22; + pub const FILTER_PRED_FN_CPU: Type = 23; + pub const FILTER_PRED_FN_CPU_CPUMASK: Type = 24; + pub const FILTER_PRED_FN_CPUMASK: Type = 25; + pub const FILTER_PRED_FN_CPUMASK_CPU: Type = 26; + pub const FILTER_PRED_FN_FUNCTION: Type = 27; + pub const FILTER_PRED_FN_: Type = 28; + pub const FILTER_PRED_TEST_VISITED: Type = 29; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct filter_pred { + pub regex: *mut regex, + pub mask: *mut cpumask, + pub ops: *mut ::aya_ebpf::cty::c_ushort, + pub field: *mut ftrace_event_field, + pub val: u64_, + pub val2: u64_, + pub fn_num: filter_pred_fn::Type, + pub offset: ::aya_ebpf::cty::c_int, + pub not: ::aya_ebpf::cty::c_int, + pub op: ::aya_ebpf::cty::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct action_cache { + pub allow_native: [::aya_ebpf::cty::c_ulong; 8usize], + pub allow_compat: [::aya_ebpf::cty::c_ulong; 8usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct seccomp_filter { + pub refs: refcount_t, + pub users: refcount_t, + pub log: bool_, + pub wait_killable_recv: bool_, + pub cache: action_cache, + pub prev: *mut seccomp_filter, + pub prog: *mut bpf_prog, + pub notif: *mut notification, + pub notify_lock: mutex, + pub wqh: wait_queue_head_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct notification { + pub requests: atomic_t, + pub flags: u32_, + pub next_id: u64_, + pub notifications: list_head, +} +pub mod nl80211_iftype { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_IFTYPE_UNSPECIFIED: Type = 0; + pub const NL80211_IFTYPE_ADHOC: Type = 1; + pub const NL80211_IFTYPE_STATION: Type = 2; + pub const NL80211_IFTYPE_AP: Type = 3; + pub const NL80211_IFTYPE_AP_VLAN: Type = 4; + pub const NL80211_IFTYPE_WDS: Type = 5; + pub const NL80211_IFTYPE_MONITOR: Type = 6; + pub const NL80211_IFTYPE_MESH_POINT: Type = 7; + pub const NL80211_IFTYPE_P2P_CLIENT: Type = 8; + pub const NL80211_IFTYPE_P2P_GO: Type = 9; + pub const NL80211_IFTYPE_P2P_DEVICE: Type = 10; + pub const NL80211_IFTYPE_OCB: Type = 11; + pub const NL80211_IFTYPE_NAN: Type = 12; + pub const NUM_NL80211_IFTYPES: Type = 13; + pub const NL80211_IFTYPE_MAX: Type = 12; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_conn { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_cached_keys { + _unused: [u8; 0], +} +pub mod ieee80211_bss_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IEEE80211_BSS_TYPE_ESS: Type = 0; + pub const IEEE80211_BSS_TYPE_PBSS: Type = 1; + pub const IEEE80211_BSS_TYPE_IBSS: Type = 2; + pub const IEEE80211_BSS_TYPE_MBSS: Type = 3; + pub const IEEE80211_BSS_TYPE_ANY: Type = 4; +} +pub mod nl80211_chan_width { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_CHAN_WIDTH_20_NOHT: Type = 0; + pub const NL80211_CHAN_WIDTH_20: Type = 1; + pub const NL80211_CHAN_WIDTH_40: Type = 2; + pub const NL80211_CHAN_WIDTH_80: Type = 3; + pub const NL80211_CHAN_WIDTH_80P80: Type = 4; + pub const NL80211_CHAN_WIDTH_160: Type = 5; + pub const NL80211_CHAN_WIDTH_5: Type = 6; + pub const NL80211_CHAN_WIDTH_10: Type = 7; + pub const NL80211_CHAN_WIDTH_1: Type = 8; + pub const NL80211_CHAN_WIDTH_2: Type = 9; + pub const NL80211_CHAN_WIDTH_4: Type = 10; + pub const NL80211_CHAN_WIDTH_8: Type = 11; + pub const NL80211_CHAN_WIDTH_16: Type = 12; + pub const NL80211_CHAN_WIDTH_320: Type = 13; +} +pub mod ieee80211_edmg_bw_config { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const IEEE80211_EDMG_BW_CONFIG_4: Type = 4; + pub const IEEE80211_EDMG_BW_CONFIG_5: Type = 5; + pub const IEEE80211_EDMG_BW_CONFIG_6: Type = 6; + pub const IEEE80211_EDMG_BW_CONFIG_7: Type = 7; + pub const IEEE80211_EDMG_BW_CONFIG_8: Type = 8; + pub const IEEE80211_EDMG_BW_CONFIG_9: Type = 9; + pub const IEEE80211_EDMG_BW_CONFIG_10: Type = 10; + pub const IEEE80211_EDMG_BW_CONFIG_11: Type = 11; + pub const IEEE80211_EDMG_BW_CONFIG_12: Type = 12; + pub const IEEE80211_EDMG_BW_CONFIG_13: Type = 13; + pub const IEEE80211_EDMG_BW_CONFIG_14: Type = 14; + pub const IEEE80211_EDMG_BW_CONFIG_15: Type = 15; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_edmg { + pub channels: u8_, + pub bw_config: ieee80211_edmg_bw_config::Type, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_chan_def { + pub chan: *mut ieee80211_channel, + pub width: nl80211_chan_width::Type, + pub center_freq1: u32_, + pub center_freq2: u32_, + pub edmg: ieee80211_edmg, + pub freq1_offset: u16_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_mcs_info { + pub rx_mask: [u8_; 10usize], + pub rx_highest: __le16, + pub tx_params: u8_, + pub reserved: [u8_; 3usize], +} +#[repr(C, packed)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_ht_cap { + pub cap_info: __le16, + pub ampdu_params_info: u8_, + pub mcs: ieee80211_mcs_info, + pub extended_ht_cap_info: __le16, + pub tx_BF_cap_info: __le32, + pub antenna_selection_info: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_ibss_params { + pub ssid: *const u8_, + pub bssid: *const u8_, + pub chandef: cfg80211_chan_def, + pub ie: *const u8_, + pub ssid_len: u8_, + pub ie_len: u8_, + pub beacon_interval: u16_, + pub basic_rates: u32_, + pub channel_fixed: bool_, + pub privacy: bool_, + pub control_port: bool_, + pub control_port_over_nl80211: bool_, + pub userspace_handles_dfs: bool_, + pub mcast_rate: [::aya_ebpf::cty::c_int; 6usize], + pub ht_capa: ieee80211_ht_cap, + pub ht_capa_mask: ieee80211_ht_cap, + pub wep_keys: *mut key_params, + pub wep_tx_key: ::aya_ebpf::cty::c_int, +} +pub mod nl80211_auth_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_AUTHTYPE_OPEN_SYSTEM: Type = 0; + pub const NL80211_AUTHTYPE_SHARED_KEY: Type = 1; + pub const NL80211_AUTHTYPE_FT: Type = 2; + pub const NL80211_AUTHTYPE_NETWORK_EAP: Type = 3; + pub const NL80211_AUTHTYPE_SAE: Type = 4; + pub const NL80211_AUTHTYPE_FILS_SK: Type = 5; + pub const NL80211_AUTHTYPE_FILS_SK_PFS: Type = 6; + pub const NL80211_AUTHTYPE_FILS_PK: Type = 7; + pub const __NL80211_AUTHTYPE_NUM: Type = 8; + pub const NL80211_AUTHTYPE_MAX: Type = 7; + pub const NL80211_AUTHTYPE_AUTOMATIC: Type = 8; +} +pub mod nl80211_mfp { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_MFP_NO: Type = 0; + pub const NL80211_MFP_REQUIRED: Type = 1; + pub const NL80211_MFP_OPTIONAL: Type = 2; +} +pub mod nl80211_sae_pwe_mechanism { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_SAE_PWE_UNSPECIFIED: Type = 0; + pub const NL80211_SAE_PWE_HUNT_AND_PECK: Type = 1; + pub const NL80211_SAE_PWE_HASH_TO_ELEMENT: Type = 2; + pub const NL80211_SAE_PWE_BOTH: Type = 3; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_crypto_settings { + pub wpa_versions: u32_, + pub cipher_group: u32_, + pub n_ciphers_pairwise: ::aya_ebpf::cty::c_int, + pub ciphers_pairwise: [u32_; 5usize], + pub n_akm_suites: ::aya_ebpf::cty::c_int, + pub akm_suites: [u32_; 10usize], + pub control_port: bool_, + pub control_port_ethertype: __be16, + pub control_port_no_encrypt: bool_, + pub control_port_over_nl80211: bool_, + pub control_port_no_preauth: bool_, + pub psk: *const u8_, + pub sae_pwd: *const u8_, + pub sae_pwd_len: u8_, + pub sae_pwe: nl80211_sae_pwe_mechanism::Type, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_vht_mcs_info { + pub rx_mcs_map: __le16, + pub rx_highest: __le16, + pub tx_mcs_map: __le16, + pub tx_highest: __le16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_vht_cap { + pub vht_cap_info: __le32, + pub supp_mcs: ieee80211_vht_mcs_info, +} +pub mod nl80211_bss_select_attr { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const __NL80211_BSS_SELECT_ATTR_INVALID: Type = 0; + pub const NL80211_BSS_SELECT_ATTR_RSSI: Type = 1; + pub const NL80211_BSS_SELECT_ATTR_BAND_PREF: Type = 2; + pub const NL80211_BSS_SELECT_ATTR_RSSI_ADJUST: Type = 3; + pub const __NL80211_BSS_SELECT_ATTR_AFTER_LAST: Type = 4; + pub const NL80211_BSS_SELECT_ATTR_MAX: Type = 3; +} +pub mod nl80211_band { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_BAND_2GHZ: Type = 0; + pub const NL80211_BAND_5GHZ: Type = 1; + pub const NL80211_BAND_60GHZ: Type = 2; + pub const NL80211_BAND_6GHZ: Type = 3; + pub const NL80211_BAND_S1GHZ: Type = 4; + pub const NL80211_BAND_LC: Type = 5; + pub const NUM_NL80211_BANDS: Type = 6; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_bss_select_adjust { + pub band: nl80211_band::Type, + pub delta: s8, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cfg80211_bss_selection { + pub behaviour: nl80211_bss_select_attr::Type, + pub param: cfg80211_bss_selection__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union cfg80211_bss_selection__bindgen_ty_1 { + pub band_pref: nl80211_band::Type, + pub adjust: cfg80211_bss_select_adjust, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct cfg80211_connect_params { + pub channel: *mut ieee80211_channel, + pub channel_hint: *mut ieee80211_channel, + pub bssid: *const u8_, + pub bssid_hint: *const u8_, + pub ssid: *const u8_, + pub ssid_len: usize, + pub auth_type: nl80211_auth_type::Type, + pub ie: *const u8_, + pub ie_len: usize, + pub privacy: bool_, + pub mfp: nl80211_mfp::Type, + pub crypto: cfg80211_crypto_settings, + pub key: *const u8_, + pub key_len: u8_, + pub key_idx: u8_, + pub flags: u32_, + pub bg_scan_period: ::aya_ebpf::cty::c_int, + pub ht_capa: ieee80211_ht_cap, + pub ht_capa_mask: ieee80211_ht_cap, + pub vht_capa: ieee80211_vht_cap, + pub vht_capa_mask: ieee80211_vht_cap, + pub pbss: bool_, + pub bss_select: cfg80211_bss_selection, + pub prev_bssid: *const u8_, + pub fils_erp_username: *const u8_, + pub fils_erp_username_len: usize, + pub fils_erp_realm: *const u8_, + pub fils_erp_realm_len: usize, + pub fils_erp_next_seq_num: u16_, + pub fils_erp_rrk: *const u8_, + pub fils_erp_rrk_len: usize, + pub want_1x: bool_, + pub edmg: ieee80211_edmg, +} +pub type wiphy_work_func_t = + ::core::option::Option; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wiphy_work { + pub entry: list_head, + pub func: wiphy_work_func_t, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_cqm_config { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_internal_bss { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct wireless_dev { + pub wiphy: *mut wiphy, + pub iftype: nl80211_iftype::Type, + pub list: list_head, + pub netdev: *mut net_device, + pub identifier: u32_, + pub mgmt_registrations: list_head, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub use_4addr: bool_, + pub is_running: bool_, + pub registered: bool_, + pub registering: bool_, + pub __bindgen_padding_0: u8, + pub address: [u8_; 6usize], + pub conn: *mut cfg80211_conn, + pub connect_keys: *mut cfg80211_cached_keys, + pub conn_bss_type: ieee80211_bss_type::Type, + pub conn_owner_nlportid: u32_, + pub disconnect_wk: work_struct, + pub disconnect_bssid: [u8_; 6usize], + pub event_list: list_head, + pub event_lock: spinlock_t, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 1usize]>, + pub ps: bool_, + pub ps_timeout: ::aya_ebpf::cty::c_int, + pub ap_unexpected_nlportid: u32_, + pub owner_nlportid: u32_, + pub nl_owner_dead: bool_, + pub cac_started: bool_, + pub cac_start_time: ::aya_ebpf::cty::c_ulong, + pub cac_time_ms: ::aya_ebpf::cty::c_uint, + pub wext: wireless_dev__bindgen_ty_1, + pub cqm_rssi_work: wiphy_work, + pub cqm_config: *mut cfg80211_cqm_config, + pub pmsr_list: list_head, + pub pmsr_lock: spinlock_t, + pub pmsr_free_wk: work_struct, + pub unprot_beacon_reported: ::aya_ebpf::cty::c_ulong, + pub u: wireless_dev__bindgen_ty_2, + pub links: [wireless_dev__bindgen_ty_3; 15usize], + pub valid_links: u16_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct wireless_dev__bindgen_ty_1 { + pub ibss: cfg80211_ibss_params, + pub connect: cfg80211_connect_params, + pub keys: *mut cfg80211_cached_keys, + pub ie: *const u8_, + pub ie_len: usize, + pub bssid: [u8_; 6usize], + pub prev_bssid: [u8_; 6usize], + pub ssid: [u8_; 32usize], + pub default_key: s8, + pub default_mgmt_key: s8, + pub prev_bssid_valid: bool_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union wireless_dev__bindgen_ty_2 { + pub client: wireless_dev__bindgen_ty_2__bindgen_ty_1, + pub mesh: wireless_dev__bindgen_ty_2__bindgen_ty_2, + pub ap: wireless_dev__bindgen_ty_2__bindgen_ty_3, + pub ibss: wireless_dev__bindgen_ty_2__bindgen_ty_4, + pub ocb: wireless_dev__bindgen_ty_2__bindgen_ty_5, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_2__bindgen_ty_1 { + pub connected_addr: [u8_; 6usize], + pub ssid: [u8_; 32usize], + pub ssid_len: u8_, + pub __bindgen_padding_0: u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_2__bindgen_ty_2 { + pub beacon_interval: ::aya_ebpf::cty::c_int, + pub preset_chandef: cfg80211_chan_def, + pub chandef: cfg80211_chan_def, + pub id: [u8_; 32usize], + pub id_len: u8_, + pub id_up_len: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_2__bindgen_ty_3 { + pub preset_chandef: cfg80211_chan_def, + pub ssid: [u8_; 32usize], + pub ssid_len: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_2__bindgen_ty_4 { + pub current_bss: *mut cfg80211_internal_bss, + pub chandef: cfg80211_chan_def, + pub beacon_interval: ::aya_ebpf::cty::c_int, + pub ssid: [u8_; 32usize], + pub ssid_len: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_2__bindgen_ty_5 { + pub chandef: cfg80211_chan_def, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct wireless_dev__bindgen_ty_3 { + pub addr: [u8_; 6usize], + pub __bindgen_anon_1: wireless_dev__bindgen_ty_3__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union wireless_dev__bindgen_ty_3__bindgen_ty_1 { + pub ap: wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1, + pub client: wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_2, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { + pub beacon_interval: ::aya_ebpf::cty::c_uint, + pub chandef: cfg80211_chan_def, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wireless_dev__bindgen_ty_3__bindgen_ty_1__bindgen_ty_2 { + pub current_bss: *mut cfg80211_internal_bss, +} +impl wireless_dev { + #[inline] + pub fn mgmt_registrations_need_update(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_fc_speed_200(&mut self, val: u8_) { + pub fn set_mgmt_registrations_need_update(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(58usize, 1u8, val as u64) + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn fc_speed_3200(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(59usize, 1u8) as u8) } - } - #[inline] - pub fn set_fc_speed_3200(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(59usize, 1u8, val as u64) - } + pub fn new_bitfield_1( + mgmt_registrations_need_update: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let mgmt_registrations_need_update: u8 = + unsafe { ::core::mem::transmute(mgmt_registrations_need_update) }; + mgmt_registrations_need_update as u64 + }); + __bindgen_bitfield_unit } #[inline] - pub fn fc_speed_400(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(60usize, 1u8) as u8) } + pub fn connected(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_2.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_fc_speed_400(&mut self, val: u8_) { + pub fn set_connected(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(60usize, 1u8, val as u64) + self._bitfield_2.set(0usize, 1u8, val as u64) } } #[inline] - pub fn fc_speed_1600(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(61usize, 1u8) as u8) } - } - #[inline] - pub fn set_fc_speed_1600(&mut self, val: u8_) { - unsafe { - let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(61usize, 1u8, val as u64) - } + pub fn new_bitfield_2(connected: u8_) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let connected: u8 = unsafe { ::core::mem::transmute(connected) }; + connected as u64 + }); + __bindgen_bitfield_unit } +} +pub mod nl80211_reg_initiator { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_REGDOM_SET_BY_CORE: Type = 0; + pub const NL80211_REGDOM_SET_BY_USER: Type = 1; + pub const NL80211_REGDOM_SET_BY_DRIVER: Type = 2; + pub const NL80211_REGDOM_SET_BY_COUNTRY_IE: Type = 3; +} +pub mod nl80211_dfs_regions { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_DFS_UNSET: Type = 0; + pub const NL80211_DFS_FCC: Type = 1; + pub const NL80211_DFS_ETSI: Type = 2; + pub const NL80211_DFS_JP: Type = 3; +} +pub mod nl80211_user_reg_hint_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_USER_REG_HINT_USER: Type = 0; + pub const NL80211_USER_REG_HINT_CELL_BASE: Type = 1; + pub const NL80211_USER_REG_HINT_INDOOR: Type = 2; +} +pub mod nl80211_key_mode { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_KEY_RX_TX: Type = 0; + pub const NL80211_KEY_NO_TX: Type = 1; + pub const NL80211_KEY_SET_TX: Type = 2; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nl80211_wowlan_tcp_data_seq { + pub start: __u32, + pub offset: __u32, + pub len: __u32, +} +#[repr(C)] +#[derive(Debug)] +pub struct nl80211_wowlan_tcp_data_token { + pub offset: __u32, + pub len: __u32, + pub token_stream: __IncompleteArrayField<__u8>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nl80211_wowlan_tcp_data_token_feature { + pub min_len: __u32, + pub max_len: __u32, + pub bufsize: __u32, +} +pub mod nl80211_dfs_state { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_DFS_USABLE: Type = 0; + pub const NL80211_DFS_UNAVAILABLE: Type = 1; + pub const NL80211_DFS_AVAILABLE: Type = 2; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nl80211_vendor_cmd_info { + pub vendor_id: __u32, + pub subcmd: __u32, +} +pub mod nl80211_sar_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const NL80211_SAR_TYPE_POWER: Type = 0; + pub const NUM_NL80211_SAR_TYPE: Type = 1; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_he_cap_elem { + pub mac_cap_info: [u8_; 6usize], + pub phy_cap_info: [u8_; 11usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_he_mcs_nss_supp { + pub rx_mcs_80: __le16, + pub tx_mcs_80: __le16, + pub rx_mcs_160: __le16, + pub tx_mcs_160: __le16, + pub rx_mcs_80p80: __le16, + pub tx_mcs_80p80: __le16, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ieee80211_eht_mcs_nss_supp_20mhz_only { + pub __bindgen_anon_1: ieee80211_eht_mcs_nss_supp_20mhz_only__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ieee80211_eht_mcs_nss_supp_20mhz_only__bindgen_ty_1 { + pub __bindgen_anon_1: ieee80211_eht_mcs_nss_supp_20mhz_only__bindgen_ty_1__bindgen_ty_1, + pub rx_tx_max_nss: [u8_; 4usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_eht_mcs_nss_supp_20mhz_only__bindgen_ty_1__bindgen_ty_1 { + pub rx_tx_mcs7_max_nss: u8_, + pub rx_tx_mcs9_max_nss: u8_, + pub rx_tx_mcs11_max_nss: u8_, + pub rx_tx_mcs13_max_nss: u8_, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ieee80211_eht_mcs_nss_supp_bw { + pub __bindgen_anon_1: ieee80211_eht_mcs_nss_supp_bw__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ieee80211_eht_mcs_nss_supp_bw__bindgen_ty_1 { + pub __bindgen_anon_1: ieee80211_eht_mcs_nss_supp_bw__bindgen_ty_1__bindgen_ty_1, + pub rx_tx_max_nss: [u8_; 3usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_eht_mcs_nss_supp_bw__bindgen_ty_1__bindgen_ty_1 { + pub rx_tx_mcs9_max_nss: u8_, + pub rx_tx_mcs11_max_nss: u8_, + pub rx_tx_mcs13_max_nss: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_eht_cap_elem_fixed { + pub mac_cap_info: [u8_; 2usize], + pub phy_cap_info: [u8_; 9usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_he_6ghz_capa { + pub capa: __le16, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rfkill { + _unused: [u8; 0], +} +pub mod environment_cap { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const ENVIRON_ANY: Type = 0; + pub const ENVIRON_INDOOR: Type = 1; + pub const ENVIRON_OUTDOOR: Type = 2; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct regulatory_request { + pub callback_head: callback_head, + pub wiphy_idx: ::aya_ebpf::cty::c_int, + pub initiator: nl80211_reg_initiator::Type, + pub user_reg_hint_type: nl80211_user_reg_hint_type::Type, + pub alpha2: [::aya_ebpf::cty::c_char; 3usize], + pub dfs_region: nl80211_dfs_regions::Type, + pub intersect: bool_, + pub processed: bool_, + pub country_ie_env: environment_cap::Type, + pub list: list_head, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_freq_range { + pub start_freq_khz: u32_, + pub end_freq_khz: u32_, + pub max_bandwidth_khz: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_power_rule { + pub max_antenna_gain: u32_, + pub max_eirp: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_wmm_ac { + pub cw_min: u16_, + pub cw_max: u16_, + pub cot: u16_, + pub aifsn: u8_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_wmm_rule { + pub client: [ieee80211_wmm_ac; 4usize], + pub ap: [ieee80211_wmm_ac; 4usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_reg_rule { + pub freq_range: ieee80211_freq_range, + pub power_rule: ieee80211_power_rule, + pub wmm_rule: ieee80211_wmm_rule, + pub flags: u32_, + pub dfs_cac_ms: u32_, + pub has_wmm: bool_, + pub psd: s8, +} +#[repr(C)] +#[derive(Debug)] +pub struct ieee80211_regdomain { + pub callback_head: callback_head, + pub n_reg_rules: u32_, + pub alpha2: [::aya_ebpf::cty::c_char; 3usize], + pub dfs_region: nl80211_dfs_regions::Type, + pub reg_rules: __IncompleteArrayField, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_channel { + pub band: nl80211_band::Type, + pub center_freq: u32_, + pub freq_offset: u16_, + pub hw_value: u16_, + pub flags: u32_, + pub max_antenna_gain: ::aya_ebpf::cty::c_int, + pub max_power: ::aya_ebpf::cty::c_int, + pub max_reg_power: ::aya_ebpf::cty::c_int, + pub beacon_found: bool_, + pub orig_flags: u32_, + pub orig_mag: ::aya_ebpf::cty::c_int, + pub orig_mpwr: ::aya_ebpf::cty::c_int, + pub dfs_state: nl80211_dfs_state::Type, + pub dfs_state_entered: ::aya_ebpf::cty::c_ulong, + pub dfs_cac_ms: ::aya_ebpf::cty::c_uint, + pub psd: s8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_rate { + pub flags: u32_, + pub bitrate: u16_, + pub hw_value: u16_, + pub hw_value_short: u16_, +} +#[repr(C, packed)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_sta_ht_cap { + pub cap: u16_, + pub ht_supported: bool_, + pub ampdu_factor: u8_, + pub ampdu_density: u8_, + pub mcs: ieee80211_mcs_info, + pub __bindgen_padding_0: u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_sta_vht_cap { + pub vht_supported: bool_, + pub cap: u32_, + pub vht_mcs: ieee80211_vht_mcs_info, +} +#[repr(C, packed)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_sta_he_cap { + pub has_he: bool_, + pub he_cap_elem: ieee80211_he_cap_elem, + pub he_mcs_nss_supp: ieee80211_he_mcs_nss_supp, + pub ppe_thres: [u8_; 25usize], +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ieee80211_eht_mcs_nss_supp { + pub __bindgen_anon_1: ieee80211_eht_mcs_nss_supp__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ieee80211_eht_mcs_nss_supp__bindgen_ty_1 { + pub only_20mhz: ieee80211_eht_mcs_nss_supp_20mhz_only, + pub bw: ieee80211_eht_mcs_nss_supp__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ieee80211_eht_mcs_nss_supp__bindgen_ty_1__bindgen_ty_1 { + pub _80: ieee80211_eht_mcs_nss_supp_bw, + pub _160: ieee80211_eht_mcs_nss_supp_bw, + pub _320: ieee80211_eht_mcs_nss_supp_bw, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ieee80211_sta_eht_cap { + pub has_eht: bool_, + pub eht_cap_elem: ieee80211_eht_cap_elem_fixed, + pub eht_mcs_nss_supp: ieee80211_eht_mcs_nss_supp, + pub eht_ppe_thres: [u8_; 32usize], +} +#[repr(C, packed)] +#[derive(Copy, Clone)] +pub struct ieee80211_sband_iftype_data { + pub types_mask: u16_, + pub he_cap: ieee80211_sta_he_cap, + pub he_6ghz_capa: ieee80211_he_6ghz_capa, + pub eht_cap: ieee80211_sta_eht_cap, + pub vendor_elems: ieee80211_sband_iftype_data__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_sband_iftype_data__bindgen_ty_1 { + pub data: *const u8_, + pub len: ::aya_ebpf::cty::c_uint, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_sta_s1g_cap { + pub s1g: bool_, + pub cap: [u8_; 10usize], + pub nss_mcs: [u8_; 5usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_supported_band { + pub channels: *mut ieee80211_channel, + pub bitrates: *mut ieee80211_rate, + pub band: nl80211_band::Type, + pub n_channels: ::aya_ebpf::cty::c_int, + pub n_bitrates: ::aya_ebpf::cty::c_int, + pub ht_cap: ieee80211_sta_ht_cap, + pub vht_cap: ieee80211_sta_vht_cap, + pub s1g_cap: ieee80211_sta_s1g_cap, + pub edmg_cap: ieee80211_edmg, + pub n_iftype_data: u16_, + pub iftype_data: *const ieee80211_sband_iftype_data, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct key_params { + pub key: *const u8_, + pub seq: *const u8_, + pub key_len: ::aya_ebpf::cty::c_int, + pub seq_len: ::aya_ebpf::cty::c_int, + pub vlan_id: u16_, + pub cipher: u32_, + pub mode: nl80211_key_mode::Type, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mac_address { + pub addr: [u8_; 6usize], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_sar_freq_ranges { + pub start_freq: u32_, + pub end_freq: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_sar_capa { + pub type_: nl80211_sar_type::Type, + pub num_freq_ranges: u32_, + pub freq_ranges: *const cfg80211_sar_freq_ranges, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_ssid { + pub ssid: [u8_; 32usize], + pub ssid_len: u8_, +} +pub mod cfg80211_signal_type { + pub type Type = ::aya_ebpf::cty::c_uint; + pub const CFG80211_SIGNAL_TYPE_NONE: Type = 0; + pub const CFG80211_SIGNAL_TYPE_MBM: Type = 1; + pub const CFG80211_SIGNAL_TYPE_UNSPEC: Type = 2; +} +#[repr(C)] +pub struct wiphy { + pub mtx: mutex, + pub perm_addr: [u8_; 6usize], + pub addr_mask: [u8_; 6usize], + pub addresses: *mut mac_address, + pub mgmt_stypes: *const ieee80211_txrx_stypes, + pub iface_combinations: *const ieee80211_iface_combination, + pub n_iface_combinations: ::aya_ebpf::cty::c_int, + pub software_iftypes: u16_, + pub n_addresses: u16_, + pub interface_modes: u16_, + pub max_acl_mac_addrs: u16_, + pub flags: u32_, + pub regulatory_flags: u32_, + pub features: u32_, + pub ext_features: [u8_; 9usize], + pub ap_sme_capa: u32_, + pub signal_type: cfg80211_signal_type::Type, + pub bss_priv_size: ::aya_ebpf::cty::c_int, + pub max_scan_ssids: u8_, + pub max_sched_scan_reqs: u8_, + pub max_sched_scan_ssids: u8_, + pub max_match_sets: u8_, + pub max_scan_ie_len: u16_, + pub max_sched_scan_ie_len: u16_, + pub max_sched_scan_plans: u32_, + pub max_sched_scan_plan_interval: u32_, + pub max_sched_scan_plan_iterations: u32_, + pub n_cipher_suites: ::aya_ebpf::cty::c_int, + pub cipher_suites: *const u32_, + pub n_akm_suites: ::aya_ebpf::cty::c_int, + pub akm_suites: *const u32_, + pub iftype_akm_suites: *const wiphy_iftype_akm_suites, + pub num_iftype_akm_suites: ::aya_ebpf::cty::c_uint, + pub retry_short: u8_, + pub retry_long: u8_, + pub frag_threshold: u32_, + pub rts_threshold: u32_, + pub coverage_class: u8_, + pub fw_version: [::aya_ebpf::cty::c_char; 32usize], + pub hw_version: u32_, + pub wowlan: *const wiphy_wowlan_support, + pub wowlan_config: *mut cfg80211_wowlan, + pub max_remain_on_channel_duration: u16_, + pub max_num_pmkids: u8_, + pub available_antennas_tx: u32_, + pub available_antennas_rx: u32_, + pub probe_resp_offload: u32_, + pub extended_capabilities: *const u8_, + pub extended_capabilities_mask: *const u8_, + pub extended_capabilities_len: u8_, + pub iftype_ext_capab: *const wiphy_iftype_ext_capab, + pub num_iftype_ext_capab: ::aya_ebpf::cty::c_uint, + pub privid: *const ::aya_ebpf::cty::c_void, + pub bands: [*mut ieee80211_supported_band; 6usize], + pub reg_notifier: ::core::option::Option< + unsafe extern "C" fn(arg1: *mut wiphy, arg2: *mut regulatory_request), + >, + pub regd: *const ieee80211_regdomain, + pub dev: device, + pub registered: bool_, + pub debugfsdir: *mut dentry, + pub ht_capa_mod_mask: *const ieee80211_ht_cap, + pub vht_capa_mod_mask: *const ieee80211_vht_cap, + pub wdev_list: list_head, + pub _net: possible_net_t, + pub wext: *const iw_handler_def, + pub coalesce: *const wiphy_coalesce_support, + pub vendor_commands: *const wiphy_vendor_command, + pub vendor_events: *const nl80211_vendor_cmd_info, + pub n_vendor_commands: ::aya_ebpf::cty::c_int, + pub n_vendor_events: ::aya_ebpf::cty::c_int, + pub max_ap_assoc_sta: u16_, + pub max_num_csa_counters: u8_, + pub bss_select_support: u32_, + pub nan_supported_bands: u8_, + pub txq_limit: u32_, + pub txq_memory_limit: u32_, + pub txq_quantum: u32_, + pub tx_queue_len: ::aya_ebpf::cty::c_ulong, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub pmsr_capa: *const cfg80211_pmsr_capabilities, + pub tid_config_support: wiphy__bindgen_ty_1, + pub max_data_retry_count: u8_, + pub sar_capa: *const cfg80211_sar_capa, + pub rfkill: *mut rfkill, + pub mbssid_max_interfaces: u8_, + pub ema_max_profile_periodicity: u8_, + pub max_num_akm_suites: u16_, + pub hw_timestamp_max_peers: u16_, + pub _bitfield_align_2: [u8; 0], + pub _bitfield_2: __BindgenBitfieldUnit<[u8; 16usize]>, + pub __bindgen_padding_0: [u8; 2usize], + pub priv_: __IncompleteArrayField<::aya_ebpf::cty::c_char>, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct wiphy__bindgen_ty_1 { + pub peer: u64_, + pub vif: u64_, + pub max_retry: u8_, +} +impl wiphy { #[inline] - pub fn fc_speed_800(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(62usize, 1u8) as u8) } + pub fn support_mbssid(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } } #[inline] - pub fn set_fc_speed_800(&mut self, val: u8_) { + pub fn set_support_mbssid(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(62usize, 1u8, val as u64) + self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] - pub fn fc_speed_1200(&self) -> u8_ { - unsafe { ::core::mem::transmute(self._bitfield_1.get(63usize, 1u8) as u8) } + pub fn support_only_he_mbssid(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } } #[inline] - pub fn set_fc_speed_1200(&mut self, val: u8_) { + pub fn set_support_only_he_mbssid(&mut self, val: u8_) { unsafe { let val: u8 = ::core::mem::transmute(val); - self._bitfield_1.set(63usize, 1u8, val as u64) + self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] pub fn new_bitfield_1( - if_1x_copper_passive: u8_, - if_1x_copper_active: u8_, - if_1x_lx: u8_, - if_1x_sx: u8_, - e10g_base_sr: u8_, - e10g_base_lr: u8_, - e10g_base_lrm: u8_, - e10g_base_er: u8_, - sonet_oc3_short_reach: u8_, - sonet_oc3_smf_intermediate_reach: u8_, - sonet_oc3_smf_long_reach: u8_, - unallocated_5_3: u8_, - sonet_oc12_short_reach: u8_, - sonet_oc12_smf_intermediate_reach: u8_, - sonet_oc12_smf_long_reach: u8_, - unallocated_5_7: u8_, - sonet_oc48_short_reach: u8_, - sonet_oc48_intermediate_reach: u8_, - sonet_oc48_long_reach: u8_, - sonet_reach_bit2: u8_, - sonet_reach_bit1: u8_, - sonet_oc192_short_reach: u8_, - escon_smf_1310_laser: u8_, - escon_mmf_1310_led: u8_, - e1000_base_sx: u8_, - e1000_base_lx: u8_, - e1000_base_cx: u8_, - e1000_base_t: u8_, - e100_base_lx: u8_, - e100_base_fx: u8_, - e_base_bx10: u8_, - e_base_px: u8_, - fc_tech_electrical_inter_enclosure: u8_, - fc_tech_lc: u8_, - fc_tech_sa: u8_, - fc_ll_m: u8_, - fc_ll_l: u8_, - fc_ll_i: u8_, - fc_ll_s: u8_, - fc_ll_v: u8_, - unallocated_8_0: u8_, - unallocated_8_1: u8_, - sfp_ct_passive: u8_, - sfp_ct_active: u8_, - fc_tech_ll: u8_, - fc_tech_sl: u8_, - fc_tech_sn: u8_, - fc_tech_electrical_intra_enclosure: u8_, - fc_media_sm: u8_, - unallocated_9_1: u8_, - fc_media_m5: u8_, - fc_media_m6: u8_, - fc_media_tv: u8_, - fc_media_mi: u8_, - fc_media_tp: u8_, - fc_media_tw: u8_, - fc_speed_100: u8_, - unallocated_10_1: u8_, - fc_speed_200: u8_, - fc_speed_3200: u8_, - fc_speed_400: u8_, - fc_speed_1600: u8_, - fc_speed_800: u8_, - fc_speed_1200: u8_, - ) -> __BindgenBitfieldUnit<[u8; 8usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize]> = Default::default(); + support_mbssid: u8_, + support_only_he_mbssid: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { - let if_1x_copper_passive: u8 = unsafe { ::core::mem::transmute(if_1x_copper_passive) }; - if_1x_copper_passive as u64 + let support_mbssid: u8 = unsafe { ::core::mem::transmute(support_mbssid) }; + support_mbssid as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { - let if_1x_copper_active: u8 = unsafe { ::core::mem::transmute(if_1x_copper_active) }; - if_1x_copper_active as u64 - }); - __bindgen_bitfield_unit.set(2usize, 1u8, { - let if_1x_lx: u8 = unsafe { ::core::mem::transmute(if_1x_lx) }; - if_1x_lx as u64 - }); - __bindgen_bitfield_unit.set(3usize, 1u8, { - let if_1x_sx: u8 = unsafe { ::core::mem::transmute(if_1x_sx) }; - if_1x_sx as u64 - }); - __bindgen_bitfield_unit.set(4usize, 1u8, { - let e10g_base_sr: u8 = unsafe { ::core::mem::transmute(e10g_base_sr) }; - e10g_base_sr as u64 - }); - __bindgen_bitfield_unit.set(5usize, 1u8, { - let e10g_base_lr: u8 = unsafe { ::core::mem::transmute(e10g_base_lr) }; - e10g_base_lr as u64 - }); - __bindgen_bitfield_unit.set(6usize, 1u8, { - let e10g_base_lrm: u8 = unsafe { ::core::mem::transmute(e10g_base_lrm) }; - e10g_base_lrm as u64 - }); - __bindgen_bitfield_unit.set(7usize, 1u8, { - let e10g_base_er: u8 = unsafe { ::core::mem::transmute(e10g_base_er) }; - e10g_base_er as u64 - }); - __bindgen_bitfield_unit.set(8usize, 1u8, { - let sonet_oc3_short_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc3_short_reach) }; - sonet_oc3_short_reach as u64 - }); - __bindgen_bitfield_unit.set(9usize, 1u8, { - let sonet_oc3_smf_intermediate_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc3_smf_intermediate_reach) }; - sonet_oc3_smf_intermediate_reach as u64 - }); - __bindgen_bitfield_unit.set(10usize, 1u8, { - let sonet_oc3_smf_long_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc3_smf_long_reach) }; - sonet_oc3_smf_long_reach as u64 - }); - __bindgen_bitfield_unit.set(11usize, 1u8, { - let unallocated_5_3: u8 = unsafe { ::core::mem::transmute(unallocated_5_3) }; - unallocated_5_3 as u64 - }); - __bindgen_bitfield_unit.set(12usize, 1u8, { - let sonet_oc12_short_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc12_short_reach) }; - sonet_oc12_short_reach as u64 - }); - __bindgen_bitfield_unit.set(13usize, 1u8, { - let sonet_oc12_smf_intermediate_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc12_smf_intermediate_reach) }; - sonet_oc12_smf_intermediate_reach as u64 - }); - __bindgen_bitfield_unit.set(14usize, 1u8, { - let sonet_oc12_smf_long_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc12_smf_long_reach) }; - sonet_oc12_smf_long_reach as u64 - }); - __bindgen_bitfield_unit.set(15usize, 1u8, { - let unallocated_5_7: u8 = unsafe { ::core::mem::transmute(unallocated_5_7) }; - unallocated_5_7 as u64 - }); - __bindgen_bitfield_unit.set(16usize, 1u8, { - let sonet_oc48_short_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc48_short_reach) }; - sonet_oc48_short_reach as u64 - }); - __bindgen_bitfield_unit.set(17usize, 1u8, { - let sonet_oc48_intermediate_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc48_intermediate_reach) }; - sonet_oc48_intermediate_reach as u64 - }); - __bindgen_bitfield_unit.set(18usize, 1u8, { - let sonet_oc48_long_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc48_long_reach) }; - sonet_oc48_long_reach as u64 - }); - __bindgen_bitfield_unit.set(19usize, 1u8, { - let sonet_reach_bit2: u8 = unsafe { ::core::mem::transmute(sonet_reach_bit2) }; - sonet_reach_bit2 as u64 - }); - __bindgen_bitfield_unit.set(20usize, 1u8, { - let sonet_reach_bit1: u8 = unsafe { ::core::mem::transmute(sonet_reach_bit1) }; - sonet_reach_bit1 as u64 - }); - __bindgen_bitfield_unit.set(21usize, 1u8, { - let sonet_oc192_short_reach: u8 = - unsafe { ::core::mem::transmute(sonet_oc192_short_reach) }; - sonet_oc192_short_reach as u64 - }); - __bindgen_bitfield_unit.set(22usize, 1u8, { - let escon_smf_1310_laser: u8 = unsafe { ::core::mem::transmute(escon_smf_1310_laser) }; - escon_smf_1310_laser as u64 - }); - __bindgen_bitfield_unit.set(23usize, 1u8, { - let escon_mmf_1310_led: u8 = unsafe { ::core::mem::transmute(escon_mmf_1310_led) }; - escon_mmf_1310_led as u64 - }); - __bindgen_bitfield_unit.set(24usize, 1u8, { - let e1000_base_sx: u8 = unsafe { ::core::mem::transmute(e1000_base_sx) }; - e1000_base_sx as u64 - }); - __bindgen_bitfield_unit.set(25usize, 1u8, { - let e1000_base_lx: u8 = unsafe { ::core::mem::transmute(e1000_base_lx) }; - e1000_base_lx as u64 - }); - __bindgen_bitfield_unit.set(26usize, 1u8, { - let e1000_base_cx: u8 = unsafe { ::core::mem::transmute(e1000_base_cx) }; - e1000_base_cx as u64 - }); - __bindgen_bitfield_unit.set(27usize, 1u8, { - let e1000_base_t: u8 = unsafe { ::core::mem::transmute(e1000_base_t) }; - e1000_base_t as u64 - }); - __bindgen_bitfield_unit.set(28usize, 1u8, { - let e100_base_lx: u8 = unsafe { ::core::mem::transmute(e100_base_lx) }; - e100_base_lx as u64 - }); - __bindgen_bitfield_unit.set(29usize, 1u8, { - let e100_base_fx: u8 = unsafe { ::core::mem::transmute(e100_base_fx) }; - e100_base_fx as u64 - }); - __bindgen_bitfield_unit.set(30usize, 1u8, { - let e_base_bx10: u8 = unsafe { ::core::mem::transmute(e_base_bx10) }; - e_base_bx10 as u64 - }); - __bindgen_bitfield_unit.set(31usize, 1u8, { - let e_base_px: u8 = unsafe { ::core::mem::transmute(e_base_px) }; - e_base_px as u64 - }); - __bindgen_bitfield_unit.set(32usize, 1u8, { - let fc_tech_electrical_inter_enclosure: u8 = - unsafe { ::core::mem::transmute(fc_tech_electrical_inter_enclosure) }; - fc_tech_electrical_inter_enclosure as u64 - }); - __bindgen_bitfield_unit.set(33usize, 1u8, { - let fc_tech_lc: u8 = unsafe { ::core::mem::transmute(fc_tech_lc) }; - fc_tech_lc as u64 - }); - __bindgen_bitfield_unit.set(34usize, 1u8, { - let fc_tech_sa: u8 = unsafe { ::core::mem::transmute(fc_tech_sa) }; - fc_tech_sa as u64 - }); - __bindgen_bitfield_unit.set(35usize, 1u8, { - let fc_ll_m: u8 = unsafe { ::core::mem::transmute(fc_ll_m) }; - fc_ll_m as u64 - }); - __bindgen_bitfield_unit.set(36usize, 1u8, { - let fc_ll_l: u8 = unsafe { ::core::mem::transmute(fc_ll_l) }; - fc_ll_l as u64 - }); - __bindgen_bitfield_unit.set(37usize, 1u8, { - let fc_ll_i: u8 = unsafe { ::core::mem::transmute(fc_ll_i) }; - fc_ll_i as u64 - }); - __bindgen_bitfield_unit.set(38usize, 1u8, { - let fc_ll_s: u8 = unsafe { ::core::mem::transmute(fc_ll_s) }; - fc_ll_s as u64 - }); - __bindgen_bitfield_unit.set(39usize, 1u8, { - let fc_ll_v: u8 = unsafe { ::core::mem::transmute(fc_ll_v) }; - fc_ll_v as u64 - }); - __bindgen_bitfield_unit.set(40usize, 1u8, { - let unallocated_8_0: u8 = unsafe { ::core::mem::transmute(unallocated_8_0) }; - unallocated_8_0 as u64 - }); - __bindgen_bitfield_unit.set(41usize, 1u8, { - let unallocated_8_1: u8 = unsafe { ::core::mem::transmute(unallocated_8_1) }; - unallocated_8_1 as u64 - }); - __bindgen_bitfield_unit.set(42usize, 1u8, { - let sfp_ct_passive: u8 = unsafe { ::core::mem::transmute(sfp_ct_passive) }; - sfp_ct_passive as u64 - }); - __bindgen_bitfield_unit.set(43usize, 1u8, { - let sfp_ct_active: u8 = unsafe { ::core::mem::transmute(sfp_ct_active) }; - sfp_ct_active as u64 - }); - __bindgen_bitfield_unit.set(44usize, 1u8, { - let fc_tech_ll: u8 = unsafe { ::core::mem::transmute(fc_tech_ll) }; - fc_tech_ll as u64 - }); - __bindgen_bitfield_unit.set(45usize, 1u8, { - let fc_tech_sl: u8 = unsafe { ::core::mem::transmute(fc_tech_sl) }; - fc_tech_sl as u64 - }); - __bindgen_bitfield_unit.set(46usize, 1u8, { - let fc_tech_sn: u8 = unsafe { ::core::mem::transmute(fc_tech_sn) }; - fc_tech_sn as u64 - }); - __bindgen_bitfield_unit.set(47usize, 1u8, { - let fc_tech_electrical_intra_enclosure: u8 = - unsafe { ::core::mem::transmute(fc_tech_electrical_intra_enclosure) }; - fc_tech_electrical_intra_enclosure as u64 - }); - __bindgen_bitfield_unit.set(48usize, 1u8, { - let fc_media_sm: u8 = unsafe { ::core::mem::transmute(fc_media_sm) }; - fc_media_sm as u64 - }); - __bindgen_bitfield_unit.set(49usize, 1u8, { - let unallocated_9_1: u8 = unsafe { ::core::mem::transmute(unallocated_9_1) }; - unallocated_9_1 as u64 - }); - __bindgen_bitfield_unit.set(50usize, 1u8, { - let fc_media_m5: u8 = unsafe { ::core::mem::transmute(fc_media_m5) }; - fc_media_m5 as u64 - }); - __bindgen_bitfield_unit.set(51usize, 1u8, { - let fc_media_m6: u8 = unsafe { ::core::mem::transmute(fc_media_m6) }; - fc_media_m6 as u64 - }); - __bindgen_bitfield_unit.set(52usize, 1u8, { - let fc_media_tv: u8 = unsafe { ::core::mem::transmute(fc_media_tv) }; - fc_media_tv as u64 - }); - __bindgen_bitfield_unit.set(53usize, 1u8, { - let fc_media_mi: u8 = unsafe { ::core::mem::transmute(fc_media_mi) }; - fc_media_mi as u64 - }); - __bindgen_bitfield_unit.set(54usize, 1u8, { - let fc_media_tp: u8 = unsafe { ::core::mem::transmute(fc_media_tp) }; - fc_media_tp as u64 - }); - __bindgen_bitfield_unit.set(55usize, 1u8, { - let fc_media_tw: u8 = unsafe { ::core::mem::transmute(fc_media_tw) }; - fc_media_tw as u64 - }); - __bindgen_bitfield_unit.set(56usize, 1u8, { - let fc_speed_100: u8 = unsafe { ::core::mem::transmute(fc_speed_100) }; - fc_speed_100 as u64 - }); - __bindgen_bitfield_unit.set(57usize, 1u8, { - let unallocated_10_1: u8 = unsafe { ::core::mem::transmute(unallocated_10_1) }; - unallocated_10_1 as u64 - }); - __bindgen_bitfield_unit.set(58usize, 1u8, { - let fc_speed_200: u8 = unsafe { ::core::mem::transmute(fc_speed_200) }; - fc_speed_200 as u64 - }); - __bindgen_bitfield_unit.set(59usize, 1u8, { - let fc_speed_3200: u8 = unsafe { ::core::mem::transmute(fc_speed_3200) }; - fc_speed_3200 as u64 - }); - __bindgen_bitfield_unit.set(60usize, 1u8, { - let fc_speed_400: u8 = unsafe { ::core::mem::transmute(fc_speed_400) }; - fc_speed_400 as u64 - }); - __bindgen_bitfield_unit.set(61usize, 1u8, { - let fc_speed_1600: u8 = unsafe { ::core::mem::transmute(fc_speed_1600) }; - fc_speed_1600 as u64 - }); - __bindgen_bitfield_unit.set(62usize, 1u8, { - let fc_speed_800: u8 = unsafe { ::core::mem::transmute(fc_speed_800) }; - fc_speed_800 as u64 - }); - __bindgen_bitfield_unit.set(63usize, 1u8, { - let fc_speed_1200: u8 = unsafe { ::core::mem::transmute(fc_speed_1200) }; - fc_speed_1200 as u64 + let support_only_he_mbssid: u8 = + unsafe { ::core::mem::transmute(support_only_he_mbssid) }; + support_only_he_mbssid as u64 }); __bindgen_bitfield_unit } + #[inline] + pub fn new_bitfield_2() -> __BindgenBitfieldUnit<[u8; 16usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 16usize]> = Default::default(); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sfp_eeprom_ext { - pub options: __be16, - pub br_max: u8_, - pub br_min: u8_, - pub vendor_sn: [::aya_bpf::cty::c_char; 16usize], - pub datecode: [::aya_bpf::cty::c_char; 8usize], - pub diagmon: u8_, - pub enhopts: u8_, - pub sff8472_compliance: u8_, - pub cc_ext: u8_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct sfp_eeprom_id { - pub base: sfp_eeprom_base, - pub ext: sfp_eeprom_ext, +pub struct cfg80211_match_set { + pub ssid: cfg80211_ssid, + pub bssid: [u8_; 6usize], + pub rssi_thold: s32, + pub per_band_rssi_thold: [s32; 6usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sfp_upstream_ops { - pub attach: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void, arg2: *mut sfp_bus), - >, - pub detach: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void, arg2: *mut sfp_bus), - >, - pub module_insert: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: *const sfp_eeprom_id, - ) -> ::aya_bpf::cty::c_int, - >, - pub module_remove: - ::core::option::Option, - pub module_start: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut ::aya_bpf::cty::c_void) -> ::aya_bpf::cty::c_int, - >, - pub module_stop: - ::core::option::Option, - pub link_down: ::core::option::Option, - pub link_up: ::core::option::Option, - pub connect_phy: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_void, - arg2: *mut phy_device, - ) -> ::aya_bpf::cty::c_int, - >, - pub disconnect_phy: - ::core::option::Option, +pub struct cfg80211_sched_scan_plan { + pub interval: u32_, + pub iterations: u32_, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sfp_quirk { - pub vendor: *const ::aya_bpf::cty::c_char, - pub part: *const ::aya_bpf::cty::c_char, - pub modes: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const sfp_eeprom_id, - arg2: *mut ::aya_bpf::cty::c_ulong, - arg3: *mut ::aya_bpf::cty::c_ulong, - ), - >, - pub fixup: ::core::option::Option, +#[derive(Debug)] +pub struct cfg80211_sched_scan_request { + pub reqid: u64_, + pub ssids: *mut cfg80211_ssid, + pub n_ssids: ::aya_ebpf::cty::c_int, + pub n_channels: u32_, + pub ie: *const u8_, + pub ie_len: usize, + pub flags: u32_, + pub match_sets: *mut cfg80211_match_set, + pub n_match_sets: ::aya_ebpf::cty::c_int, + pub min_rssi_thold: s32, + pub delay: u32_, + pub scan_plans: *mut cfg80211_sched_scan_plan, + pub n_scan_plans: ::aya_ebpf::cty::c_int, + pub mac_addr: [u8_; 6usize], + pub mac_addr_mask: [u8_; 6usize], + pub relative_rssi_set: bool_, + pub relative_rssi: s8, + pub rssi_adjust: cfg80211_bss_select_adjust, + pub wiphy: *mut wiphy, + pub dev: *mut net_device, + pub scan_start: ::aya_ebpf::cty::c_ulong, + pub report_results: bool_, + pub callback_head: callback_head, + pub owner_nlportid: u32_, + pub nl_owner_dead: bool_, + pub list: list_head, + pub channels: __IncompleteArrayField<*mut ieee80211_channel>, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sfp_socket_ops { - pub attach: ::core::option::Option, - pub detach: ::core::option::Option, - pub start: ::core::option::Option, - pub stop: ::core::option::Option, - pub module_info: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut sfp, arg2: *mut ethtool_modinfo) -> ::aya_bpf::cty::c_int, - >, - pub module_eeprom: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sfp, - arg2: *mut ethtool_eeprom, - arg3: *mut u8_, - ) -> ::aya_bpf::cty::c_int, - >, - pub module_eeprom_by_page: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sfp, - arg2: *const ethtool_module_eeprom, - arg3: *mut netlink_ext_ack, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct cfg80211_pkt_pattern { + pub mask: *const u8_, + pub pattern: *const u8_, + pub pattern_len: ::aya_ebpf::cty::c_int, + pub pkt_offset: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_mem_cache { - pub free_llist: llist_head, - pub active: local_t, - pub free_llist_extra: llist_head, - pub refill_work: irq_work, - pub objcg: *mut obj_cgroup, - pub unit_size: ::aya_bpf::cty::c_int, - pub free_cnt: ::aya_bpf::cty::c_int, - pub low_watermark: ::aya_bpf::cty::c_int, - pub high_watermark: ::aya_bpf::cty::c_int, - pub batch: ::aya_bpf::cty::c_int, - pub percpu_size: ::aya_bpf::cty::c_int, - pub rcu: callback_head, - pub free_by_rcu: llist_head, - pub waiting_for_gp: llist_head, - pub call_rcu_in_progress: atomic_t, +#[derive(Debug)] +pub struct cfg80211_wowlan_tcp { + pub sock: *mut socket, + pub src: __be32, + pub dst: __be32, + pub src_port: u16_, + pub dst_port: u16_, + pub dst_mac: [u8_; 6usize], + pub payload_len: ::aya_ebpf::cty::c_int, + pub payload: *const u8_, + pub payload_seq: nl80211_wowlan_tcp_data_seq, + pub data_interval: u32_, + pub wake_len: u32_, + pub wake_data: *const u8_, + pub wake_mask: *const u8_, + pub tokens_size: u32_, + pub payload_tok: nl80211_wowlan_tcp_data_token, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct bpf_mem_caches { - pub cache: [bpf_mem_cache; 11usize], +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_wowlan { + pub any: bool_, + pub disconnect: bool_, + pub magic_pkt: bool_, + pub gtk_rekey_failure: bool_, + pub eap_identity_req: bool_, + pub four_way_handshake: bool_, + pub rfkill_release: bool_, + pub patterns: *mut cfg80211_pkt_pattern, + pub tcp: *mut cfg80211_wowlan_tcp, + pub n_patterns: ::aya_ebpf::cty::c_int, + pub nd_config: *mut cfg80211_sched_scan_request, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct memory_tier { - pub list: list_head, - pub memory_types: list_head, - pub adistance_start: ::aya_bpf::cty::c_int, - pub dev: device, - pub lower_tier_mask: nodemask_t, +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_iface_limit { + pub max: u16_, + pub types: u16_, } -pub mod iommu_dma_cookie_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IOMMU_DMA_IOVA_COOKIE: Type = 0; - pub const IOMMU_DMA_MSI_COOKIE: Type = 1; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ieee80211_iface_combination { + pub limits: *const ieee80211_iface_limit, + pub num_different_channels: u32_, + pub max_interfaces: u16_, + pub n_limits: u8_, + pub beacon_int_infra_match: bool_, + pub radar_detect_widths: u8_, + pub radar_detect_regions: u8_, + pub beacon_int_min_gcd: u32_, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iova { - pub node: rb_node, - pub pfn_hi: ::aya_bpf::cty::c_ulong, - pub pfn_lo: ::aya_bpf::cty::c_ulong, +pub struct ieee80211_txrx_stypes { + pub tx: u16_, + pub rx: u16_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct iova_domain { - pub iova_rbtree_lock: spinlock_t, - pub rbroot: rb_root, - pub cached_node: *mut rb_node, - pub cached32_node: *mut rb_node, - pub granule: ::aya_bpf::cty::c_ulong, - pub start_pfn: ::aya_bpf::cty::c_ulong, - pub dma_32bit_pfn: ::aya_bpf::cty::c_ulong, - pub max32_alloc_size: ::aya_bpf::cty::c_ulong, - pub anchor: iova, - pub rcaches: *mut iova_rcache, - pub cpuhp_dead: hlist_node, +#[derive(Debug, Copy, Clone)] +pub struct wiphy_wowlan_tcp_support { + pub tok: *const nl80211_wowlan_tcp_data_token_feature, + pub data_payload_max: u32_, + pub data_interval_max: u32_, + pub wake_payload_max: u32_, + pub seq: bool_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct iommu_dma_cookie { - pub type_: iommu_dma_cookie_type::Type, - pub __bindgen_anon_1: iommu_dma_cookie__bindgen_ty_1, - pub msi_page_list: list_head, - pub fq_domain: *mut iommu_domain, - pub mutex: mutex, +#[derive(Debug, Copy, Clone)] +pub struct wiphy_wowlan_support { + pub flags: u32_, + pub n_patterns: ::aya_ebpf::cty::c_int, + pub pattern_max_len: ::aya_ebpf::cty::c_int, + pub pattern_min_len: ::aya_ebpf::cty::c_int, + pub max_pkt_offset: ::aya_ebpf::cty::c_int, + pub max_nd_match_sets: ::aya_ebpf::cty::c_int, + pub tcp: *const wiphy_wowlan_tcp_support, } #[repr(C)] -#[derive(Copy, Clone)] -pub union iommu_dma_cookie__bindgen_ty_1 { - pub __bindgen_anon_1: iommu_dma_cookie__bindgen_ty_1__bindgen_ty_1, - pub msi_iova: dma_addr_t, +#[derive(Debug, Copy, Clone)] +pub struct wiphy_coalesce_support { + pub n_rules: ::aya_ebpf::cty::c_int, + pub max_delay: ::aya_ebpf::cty::c_int, + pub n_patterns: ::aya_ebpf::cty::c_int, + pub pattern_max_len: ::aya_ebpf::cty::c_int, + pub pattern_min_len: ::aya_ebpf::cty::c_int, + pub max_pkt_offset: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct iommu_dma_cookie__bindgen_ty_1__bindgen_ty_1 { - pub iovad: iova_domain, - pub fq: *mut iova_fq, - pub fq_flush_start_cnt: atomic64_t, - pub fq_flush_finish_cnt: atomic64_t, - pub fq_timer: timer_list, - pub fq_timer_on: atomic_t, +#[derive(Debug, Copy, Clone)] +pub struct wiphy_vendor_command { + pub info: nl80211_vendor_cmd_info, + pub flags: u32_, + pub doit: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut wiphy, + arg2: *mut wireless_dev, + arg3: *const ::aya_ebpf::cty::c_void, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, + pub dumpit: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut wiphy, + arg2: *mut wireless_dev, + arg3: *mut sk_buff, + arg4: *const ::aya_ebpf::cty::c_void, + arg5: ::aya_ebpf::cty::c_int, + arg6: *mut ::aya_ebpf::cty::c_ulong, + ) -> ::aya_ebpf::cty::c_int, + >, + pub policy: *const nla_policy, + pub maxattr: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct iova_fq_entry { - pub iova_pfn: ::aya_bpf::cty::c_ulong, - pub pages: ::aya_bpf::cty::c_ulong, - pub freelist: list_head, - pub counter: u64_, +pub struct wiphy_iftype_ext_capab { + pub iftype: nl80211_iftype::Type, + pub extended_capabilities: *const u8_, + pub extended_capabilities_mask: *const u8_, + pub extended_capabilities_len: u8_, + pub eml_capabilities: u16_, + pub mld_capa_and_ops: u16_, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct iova_fq { - pub entries: [iova_fq_entry; 256usize], - pub head: ::aya_bpf::cty::c_uint, - pub tail: ::aya_bpf::cty::c_uint, - pub lock: spinlock_t, +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_pmsr_capabilities { + pub max_peers: ::aya_ebpf::cty::c_uint, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub ftm: cfg80211_pmsr_capabilities__bindgen_ty_1, } #[repr(C)] -#[derive(Debug)] -pub struct audit_tree { - pub count: refcount_t, - pub goner: ::aya_bpf::cty::c_int, - pub root: *mut audit_chunk, - pub chunks: list_head, - pub rules: list_head, - pub list: list_head, - pub same_root: list_head, - pub head: callback_head, - pub pathname: __IncompleteArrayField<::aya_bpf::cty::c_char>, +#[derive(Debug, Copy, Clone)] +pub struct cfg80211_pmsr_capabilities__bindgen_ty_1 { + pub preambles: u32_, + pub bandwidths: u32_, + pub max_bursts_exponent: s8, + pub max_ftms_per_burst: u8_, + pub _bitfield_align_1: [u8; 0], + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, + pub __bindgen_padding_0: u8, +} +impl cfg80211_pmsr_capabilities__bindgen_ty_1 { + #[inline] + pub fn supported(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_supported(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn asap(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_asap(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn non_asap(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u8) } + } + #[inline] + pub fn set_non_asap(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn request_lci(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u8) } + } + #[inline] + pub fn set_request_lci(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn request_civicloc(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u8) } + } + #[inline] + pub fn set_request_civicloc(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn trigger_based(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u8) } + } + #[inline] + pub fn set_trigger_based(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn non_trigger_based(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u8) } + } + #[inline] + pub fn set_non_trigger_based(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + supported: u8_, + asap: u8_, + non_asap: u8_, + request_lci: u8_, + request_civicloc: u8_, + trigger_based: u8_, + non_trigger_based: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let supported: u8 = unsafe { ::core::mem::transmute(supported) }; + supported as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let asap: u8 = unsafe { ::core::mem::transmute(asap) }; + asap as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let non_asap: u8 = unsafe { ::core::mem::transmute(non_asap) }; + non_asap as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let request_lci: u8 = unsafe { ::core::mem::transmute(request_lci) }; + request_lci as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let request_civicloc: u8 = unsafe { ::core::mem::transmute(request_civicloc) }; + request_civicloc as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let trigger_based: u8 = unsafe { ::core::mem::transmute(trigger_based) }; + trigger_based as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let non_trigger_based: u8 = unsafe { ::core::mem::transmute(non_trigger_based) }; + non_trigger_based as u64 + }); + __bindgen_bitfield_unit + } +} +impl cfg80211_pmsr_capabilities { + #[inline] + pub fn report_ap_tsf(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u8) } + } + #[inline] + pub fn set_report_ap_tsf(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn randomize_mac_addr(&self) -> u8_ { + unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u8) } + } + #[inline] + pub fn set_randomize_mac_addr(&mut self, val: u8_) { + unsafe { + let val: u8 = ::core::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + report_ap_tsf: u8_, + randomize_mac_addr: u8_, + ) -> __BindgenBitfieldUnit<[u8; 1usize]> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let report_ap_tsf: u8 = unsafe { ::core::mem::transmute(report_ap_tsf) }; + report_ap_tsf as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let randomize_mac_addr: u8 = unsafe { ::core::mem::transmute(randomize_mac_addr) }; + randomize_mac_addr as u64 + }); + __bindgen_bitfield_unit + } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct audit_node { - pub list: list_head, - pub owner: *mut audit_tree, - pub index: ::aya_bpf::cty::c_uint, +pub struct wiphy_iftype_akm_suites { + pub iftypes_mask: u16_, + pub akm_suites: *const u32_, + pub n_akm_suites: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug)] -pub struct audit_chunk { - pub hash: list_head, - pub key: ::aya_bpf::cty::c_ulong, - pub mark: *mut fsnotify_mark, - pub trees: list_head, - pub count: ::aya_bpf::cty::c_int, - pub refs: atomic_long_t, - pub head: callback_head, - pub owners: __IncompleteArrayField, +#[derive(Debug, Copy, Clone)] +pub struct dm_hw_stat_delta { + pub last_rx: ::aya_ebpf::cty::c_ulong, + pub last_drop_val: ::aya_ebpf::cty::c_ulong, + pub rcu: callback_head, } #[repr(C)] #[derive(Copy, Clone)] -pub struct disk_events { - pub node: list_head, - pub disk: *mut gendisk, +pub struct iova_rcache { pub lock: spinlock_t, - pub block_mutex: mutex, - pub block: ::aya_bpf::cty::c_int, - pub pending: ::aya_bpf::cty::c_uint, - pub clearing: ::aya_bpf::cty::c_uint, - pub poll_msecs: ::aya_bpf::cty::c_long, - pub dwork: delayed_work, + pub depot_size: ::aya_ebpf::cty::c_uint, + pub depot: *mut iova_magazine, + pub cpu_rcaches: *mut iova_cpu_rcache, + pub iovad: *mut iova_domain, + pub work: delayed_work, } -pub type free_work_fn = - ::core::option::Option *mut io_wq_work>; -pub type io_wq_work_fn = ::core::option::Option; #[repr(C)] #[derive(Copy, Clone)] -pub struct kernfs_open_node { - pub callback_head: callback_head, - pub event: atomic_t, - pub poll: wait_queue_head_t, - pub files: list_head, - pub nr_mmapped: ::aya_bpf::cty::c_uint, - pub nr_to_release: ::aya_bpf::cty::c_uint, +pub struct iova_magazine { + pub __bindgen_anon_1: iova_magazine__bindgen_ty_1, + pub pfns: [::aya_ebpf::cty::c_ulong; 127usize], } #[repr(C)] #[derive(Copy, Clone)] -pub struct mctp_dev { - pub dev: *mut net_device, - pub refs: refcount_t, - pub net: ::aya_bpf::cty::c_uint, - pub ops: *const mctp_netdev_ops, - pub addrs: *mut u8_, - pub num_addrs: usize, - pub addrs_lock: spinlock_t, - pub rcu: callback_head, +pub union iova_magazine__bindgen_ty_1 { + pub size: ::aya_ebpf::cty::c_ulong, + pub next: *mut iova_magazine, } -pub type mctp_eid_t = __u8; #[repr(C)] #[derive(Copy, Clone)] -pub struct mctp_sk_key { - pub peer_addr: mctp_eid_t, - pub local_addr: mctp_eid_t, - pub tag: __u8, - pub sk: *mut sock, - pub hlist: hlist_node, - pub sklist: hlist_node, +pub struct iova_cpu_rcache { pub lock: spinlock_t, - pub refs: refcount_t, - pub reasm_head: *mut sk_buff, - pub reasm_tailp: *mut *mut sk_buff, - pub reasm_dead: bool_, - pub last_seq: u8_, - pub valid: bool_, - pub expiry: ::aya_bpf::cty::c_ulong, - pub dev_flow_state: ::aya_bpf::cty::c_ulong, - pub dev: *mut mctp_dev, - pub manual_alloc: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mctp_netdev_ops { - pub release_flow: - ::core::option::Option, + pub loaded: *mut iova_magazine, + pub prev: *mut iova_magazine, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_ct_event_notifier { - pub ct_event: ::core::option::Option< +pub struct pse_controller_ops { + pub ethtool_get_status: ::core::option::Option< unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_uint, - arg2: *const nf_ct_event, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut pse_controller_dev, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut netlink_ext_ack, + arg4: *mut pse_control_status, + ) -> ::aya_ebpf::cty::c_int, >, - pub exp_event: ::core::option::Option< + pub ethtool_set_config: ::core::option::Option< unsafe extern "C" fn( - arg1: ::aya_bpf::cty::c_uint, - arg2: *const nf_exp_event, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut pse_controller_dev, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut netlink_ext_ack, + arg4: *const pse_control_config, + ) -> ::aya_ebpf::cty::c_int, >, } #[repr(C)] #[derive(Copy, Clone)] -pub struct nf_conntrack_tuple_mask { - pub src: nf_conntrack_tuple_mask__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nf_conntrack_tuple_mask__bindgen_ty_1 { - pub u3: nf_inet_addr, - pub u: nf_conntrack_man_proto, -} -#[repr(C)] -#[derive(Debug)] -pub struct nf_ct_ext { - pub offset: [u8_; 10usize], - pub len: u8_, - pub gen_id: ::aya_bpf::cty::c_uint, - pub data: __IncompleteArrayField<::aya_bpf::cty::c_char>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_conntrack_helper { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct nf_conntrack_expect { - pub lnode: hlist_node, - pub hnode: hlist_node, - pub tuple: nf_conntrack_tuple, - pub mask: nf_conntrack_tuple_mask, - pub expectfn: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut nf_conn, arg2: *mut nf_conntrack_expect), +pub struct pse_controller_dev { + pub ops: *const pse_controller_ops, + pub owner: *mut module, + pub list: list_head, + pub pse_control_head: list_head, + pub dev: *mut device, + pub of_pse_n_cells: ::aya_ebpf::cty::c_int, + pub of_xlate: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut pse_controller_dev, + arg2: *const of_phandle_args, + ) -> ::aya_ebpf::cty::c_int, >, - pub helper: *mut nf_conntrack_helper, - pub master: *mut nf_conn, - pub timeout: timer_list, - pub use_: refcount_t, - pub flags: ::aya_bpf::cty::c_uint, - pub class: ::aya_bpf::cty::c_uint, - pub saved_addr: nf_inet_addr, - pub saved_proto: nf_conntrack_man_proto, - pub dir: ip_conntrack_dir::Type, - pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nf_ct_event { - pub ct: *mut nf_conn, - pub portid: u32_, - pub report: ::aya_bpf::cty::c_int, + pub nr_lines: ::aya_ebpf::cty::c_uint, + pub lock: mutex, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct nf_exp_event { - pub exp: *mut nf_conntrack_expect, - pub portid: u32_, - pub report: ::aya_bpf::cty::c_int, +pub struct pse_control { + pub pcdev: *mut pse_controller_dev, + pub list: list_head, + pub id: ::aya_ebpf::cty::c_uint, + pub refcnt: kref, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct bpf_prog_offload_ops { - pub insn_hook: ::core::option::Option< +pub struct dax_operations { + pub direct_access: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_verifier_env, - arg2: ::aya_bpf::cty::c_int, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dax_device, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: ::aya_ebpf::cty::c_long, + arg4: dax_access_mode::Type, + arg5: *mut *mut ::aya_ebpf::cty::c_void, + arg6: *mut pfn_t, + ) -> ::aya_ebpf::cty::c_long, >, - pub finalize: ::core::option::Option< - unsafe extern "C" fn(arg1: *mut bpf_verifier_env) -> ::aya_bpf::cty::c_int, + pub dax_supported: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dax_device, + arg2: *mut block_device, + arg3: ::aya_ebpf::cty::c_int, + arg4: sector_t, + arg5: sector_t, + ) -> bool_, >, - pub replace_insn: ::core::option::Option< + pub zero_page_range: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_verifier_env, - arg2: u32_, - arg3: *mut bpf_insn, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dax_device, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: usize, + ) -> ::aya_ebpf::cty::c_int, >, - pub remove_insns: ::core::option::Option< + pub recovery_write: ::core::option::Option< unsafe extern "C" fn( - arg1: *mut bpf_verifier_env, - arg2: u32_, - arg3: u32_, - ) -> ::aya_bpf::cty::c_int, + arg1: *mut dax_device, + arg2: ::aya_ebpf::cty::c_ulong, + arg3: *mut ::aya_ebpf::cty::c_void, + arg4: usize, + arg5: *mut iov_iter, + ) -> usize, >, - pub prepare: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub translate: - ::core::option::Option ::aya_bpf::cty::c_int>, - pub destroy: ::core::option::Option, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_offload_dev { - pub ops: *const bpf_prog_offload_ops, - pub netdevs: list_head, - pub priv_: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct blk_queue_stats { - pub callbacks: list_head, - pub lock: spinlock_t, - pub accounting: ::aya_bpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -46601,96 +48625,105 @@ pub struct net_rate_estimator { pub last_bytes: u64_, pub avpps: u64_, pub avbps: u64_, - pub next_jiffies: ::aya_bpf::cty::c_ulong, + pub next_jiffies: ::aya_ebpf::cty::c_ulong, pub timer: timer_list, pub rcu: callback_head, } #[repr(C)] -#[derive(Copy, Clone)] -pub struct io_tlb_area { - pub used: ::aya_bpf::cty::c_ulong, - pub index: ::aya_bpf::cty::c_uint, - pub lock: spinlock_t, +#[derive(Debug, Copy, Clone)] +pub struct tcpvegas_info { + pub tcpv_enabled: __u32, + pub tcpv_rttcnt: __u32, + pub tcpv_rtt: __u32, + pub tcpv_minrtt: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_tlb_slot { - pub orig_addr: phys_addr_t, - pub alloc_size: usize, - pub list: ::aya_bpf::cty::c_uint, +pub struct tcp_dctcp_info { + pub dctcp_enabled: __u16, + pub dctcp_ce_state: __u16, + pub dctcp_alpha: __u32, + pub dctcp_ab_ecn: __u32, + pub dctcp_ab_tot: __u32, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct unicode_map { - pub version: ::aya_bpf::cty::c_uint, - pub ntab: [*const utf8data; 2usize], - pub tables: *const utf8data_table, +pub struct tcp_bbr_info { + pub bbr_bw_lo: __u32, + pub bbr_bw_hi: __u32, + pub bbr_min_rtt: __u32, + pub bbr_pacing_gain: __u32, + pub bbr_cwnd_gain: __u32, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct utf8data { - pub maxage: ::aya_bpf::cty::c_uint, - pub offset: ::aya_bpf::cty::c_uint, +#[derive(Copy, Clone)] +pub union tcp_cc_info { + pub vegas: tcpvegas_info, + pub dctcp: tcp_dctcp_info, + pub bbr: tcp_bbr_info, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct utf8data_table { - pub utf8agetab: *const ::aya_bpf::cty::c_uint, - pub utf8agetab_size: ::aya_bpf::cty::c_int, - pub utf8nfdicfdata: *const utf8data, - pub utf8nfdicfdata_size: ::aya_bpf::cty::c_int, - pub utf8nfdidata: *const utf8data, - pub utf8nfdidata_size: ::aya_bpf::cty::c_int, - pub utf8data: *const ::aya_bpf::cty::c_uchar, +#[derive(Copy, Clone)] +pub struct iommu_group { + pub kobj: kobject, + pub devices_kobj: *mut kobject, + pub devices: list_head, + pub pasid_array: xarray, + pub mutex: mutex, + pub iommu_data: *mut ::aya_ebpf::cty::c_void, + pub iommu_data_release: + ::core::option::Option, + pub name: *mut ::aya_ebpf::cty::c_char, + pub id: ::aya_ebpf::cty::c_int, + pub default_domain: *mut iommu_domain, + pub blocking_domain: *mut iommu_domain, + pub domain: *mut iommu_domain, + pub entry: list_head, + pub owner_cnt: ::aya_ebpf::cty::c_uint, + pub owner: *mut ::aya_ebpf::cty::c_void, } #[repr(C)] #[derive(Copy, Clone)] -pub struct dax_device { - pub inode: inode, - pub cdev: cdev, - pub private: *mut ::aya_bpf::cty::c_void, - pub flags: ::aya_bpf::cty::c_ulong, - pub ops: *const dax_operations, - pub holder_data: *mut ::aya_bpf::cty::c_void, - pub holder_ops: *const dax_holder_operations, +pub struct swap_iocb { + pub iocb: kiocb, + pub bvec: [bio_vec; 32usize], + pub pages: ::aya_ebpf::cty::c_int, + pub len: ::aya_ebpf::cty::c_int, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dax_holder_operations { - pub notify_failure: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut dax_device, - arg2: u64_, - arg3: u64_, - arg4: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, - >, +#[derive(Copy, Clone)] +pub struct eventfd_ctx { + pub kref: kref, + pub wqh: wait_queue_head_t, + pub count: __u64, + pub flags: ::aya_ebpf::cty::c_uint, + pub id: ::aya_ebpf::cty::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct rcu_exp_work { - pub rew_s: ::aya_bpf::cty::c_ulong, + pub rew_s: ::aya_ebpf::cty::c_ulong, pub rew_work: work_struct, } #[repr(C)] #[derive(Copy, Clone)] pub struct rcu_node { pub lock: raw_spinlock_t, - pub gp_seq: ::aya_bpf::cty::c_ulong, - pub gp_seq_needed: ::aya_bpf::cty::c_ulong, - pub completedqs: ::aya_bpf::cty::c_ulong, - pub qsmask: ::aya_bpf::cty::c_ulong, - pub rcu_gp_init_mask: ::aya_bpf::cty::c_ulong, - pub qsmaskinit: ::aya_bpf::cty::c_ulong, - pub qsmaskinitnext: ::aya_bpf::cty::c_ulong, - pub expmask: ::aya_bpf::cty::c_ulong, - pub expmaskinit: ::aya_bpf::cty::c_ulong, - pub expmaskinitnext: ::aya_bpf::cty::c_ulong, - pub cbovldmask: ::aya_bpf::cty::c_ulong, - pub ffmask: ::aya_bpf::cty::c_ulong, - pub grpmask: ::aya_bpf::cty::c_ulong, - pub grplo: ::aya_bpf::cty::c_int, - pub grphi: ::aya_bpf::cty::c_int, + pub gp_seq: ::aya_ebpf::cty::c_ulong, + pub gp_seq_needed: ::aya_ebpf::cty::c_ulong, + pub completedqs: ::aya_ebpf::cty::c_ulong, + pub qsmask: ::aya_ebpf::cty::c_ulong, + pub rcu_gp_init_mask: ::aya_ebpf::cty::c_ulong, + pub qsmaskinit: ::aya_ebpf::cty::c_ulong, + pub qsmaskinitnext: ::aya_ebpf::cty::c_ulong, + pub expmask: ::aya_ebpf::cty::c_ulong, + pub expmaskinit: ::aya_ebpf::cty::c_ulong, + pub expmaskinitnext: ::aya_ebpf::cty::c_ulong, + pub cbovldmask: ::aya_ebpf::cty::c_ulong, + pub ffmask: ::aya_ebpf::cty::c_ulong, + pub grpmask: ::aya_ebpf::cty::c_ulong, + pub grplo: ::aya_ebpf::cty::c_int, + pub grphi: ::aya_ebpf::cty::c_int, pub grpnum: u8_, pub level: u8_, pub wait_blkd_tasks: bool_, @@ -46700,122 +48733,63 @@ pub struct rcu_node { pub exp_tasks: *mut list_head, pub boost_tasks: *mut list_head, pub boost_mtx: rt_mutex, - pub boost_time: ::aya_bpf::cty::c_ulong, + pub boost_time: ::aya_ebpf::cty::c_ulong, pub boost_kthread_mutex: mutex, pub boost_kthread_task: *mut task_struct, - pub boost_kthread_status: ::aya_bpf::cty::c_uint, - pub n_boosts: ::aya_bpf::cty::c_ulong, + pub boost_kthread_status: ::aya_ebpf::cty::c_uint, + pub n_boosts: ::aya_ebpf::cty::c_ulong, pub nocb_gp_wq: [swait_queue_head; 2usize], pub fqslock: raw_spinlock_t, pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 56usize]>, pub __bindgen_padding_0: u32, pub exp_lock: spinlock_t, - pub exp_seq_rq: ::aya_bpf::cty::c_ulong, + pub exp_seq_rq: ::aya_ebpf::cty::c_ulong, pub exp_wq: [wait_queue_head_t; 4usize], pub rew: rcu_exp_work, pub exp_need_flush: bool_, pub exp_poll_lock: raw_spinlock_t, - pub exp_seq_poll_rq: ::aya_bpf::cty::c_ulong, + pub exp_seq_poll_rq: ::aya_ebpf::cty::c_ulong, pub exp_poll_wq: work_struct, pub _bitfield_align_2: [u8; 0], pub _bitfield_2: __BindgenBitfieldUnit<[u8; 56usize]>, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct saved { - pub link: path, - pub done: delayed_call, - pub name: *const ::aya_bpf::cty::c_char, - pub seq: ::aya_bpf::cty::c_uint, -} -#[repr(C)] #[derive(Copy, Clone)] -pub struct nameidata { - pub path: path, - pub last: qstr, - pub root: path, - pub inode: *mut inode, - pub flags: ::aya_bpf::cty::c_uint, - pub state: ::aya_bpf::cty::c_uint, - pub seq: ::aya_bpf::cty::c_uint, - pub next_seq: ::aya_bpf::cty::c_uint, - pub m_seq: ::aya_bpf::cty::c_uint, - pub r_seq: ::aya_bpf::cty::c_uint, - pub last_type: ::aya_bpf::cty::c_int, - pub depth: ::aya_bpf::cty::c_uint, - pub total_link_count: ::aya_bpf::cty::c_int, - pub stack: *mut saved, - pub internal: [saved; 2usize], - pub name: *mut filename, - pub saved: *mut nameidata, - pub root_seq: ::aya_bpf::cty::c_uint, - pub dfd: ::aya_bpf::cty::c_int, - pub dir_vfsuid: vfsuid_t, - pub dir_mode: umode_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct dm_hw_stat_delta { - pub last_rx: ::aya_bpf::cty::c_ulong, - pub last_drop_val: ::aya_bpf::cty::c_ulong, - pub rcu: callback_head, +pub struct dax_device { + pub inode: inode, + pub cdev: cdev, + pub private: *mut ::aya_ebpf::cty::c_void, + pub flags: ::aya_ebpf::cty::c_ulong, + pub ops: *const dax_operations, + pub holder_data: *mut ::aya_ebpf::cty::c_void, + pub holder_ops: *const dax_holder_operations, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct static_key_mod { - pub next: *mut static_key_mod, - pub entries: *mut jump_entry, - pub mod_: *mut module, +pub struct dax_holder_operations { + pub notify_failure: ::core::option::Option< + unsafe extern "C" fn( + arg1: *mut dax_device, + arg2: u64_, + arg3: u64_, + arg4: ::aya_ebpf::cty::c_int, + ) -> ::aya_ebpf::cty::c_int, + >, } #[repr(C)] #[derive(Copy, Clone)] -pub struct tty_audit_buf { - pub mutex: mutex, - pub dev: dev_t, - pub _bitfield_align_1: [u8; 0], - pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, - pub valid: usize, - pub data: *mut ::aya_bpf::cty::c_uchar, -} -impl tty_audit_buf { - #[inline] - pub fn icanon(&self) -> ::aya_bpf::cty::c_uint { - unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } - } - #[inline] - pub fn set_icanon(&mut self, val: ::aya_bpf::cty::c_uint) { - unsafe { - let val: u32 = ::core::mem::transmute(val); - self._bitfield_1.set(0usize, 1u8, val as u64) - } - } - #[inline] - pub fn new_bitfield_1(icanon: ::aya_bpf::cty::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { - let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); - __bindgen_bitfield_unit.set(0usize, 1u8, { - let icanon: u32 = unsafe { ::core::mem::transmute(icanon) }; - icanon as u64 - }); - __bindgen_bitfield_unit - } -} -#[repr(C)] -#[derive(Debug)] -pub struct btf_struct_metas { - pub cnt: u32_, - pub types: __IncompleteArrayField, +pub struct io_tlb_area { + pub used: ::aya_ebpf::cty::c_ulong, + pub index: ::aya_ebpf::cty::c_uint, + pub lock: spinlock_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct btf_kfunc_set_tab { - pub sets: [*mut btf_id_set8; 13usize], -} -#[repr(C)] -#[derive(Debug)] -pub struct btf_id_dtor_kfunc_tab { - pub cnt: u32_, - pub dtors: __IncompleteArrayField, +pub struct io_tlb_slot { + pub orig_addr: phys_addr_t, + pub alloc_size: usize, + pub list: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -46825,426 +48799,68 @@ pub struct uevent_sock { } #[repr(C)] #[derive(Copy, Clone)] -pub struct eventfd_ctx { - pub kref: kref, - pub wqh: wait_queue_head_t, - pub count: __u64, - pub flags: ::aya_bpf::cty::c_uint, - pub id: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_wq_acct { - pub nr_workers: ::aya_bpf::cty::c_uint, - pub max_workers: ::aya_bpf::cty::c_uint, - pub index: ::aya_bpf::cty::c_int, - pub nr_running: atomic_t, - pub lock: raw_spinlock_t, - pub work_list: io_wq_work_list, - pub flags: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_wq { - pub state: ::aya_bpf::cty::c_ulong, - pub free_work: free_work_fn, - pub do_work: io_wq_work_fn, - pub hash: *mut io_wq_hash, - pub worker_refs: atomic_t, - pub worker_done: completion, - pub cpuhp_node: hlist_node, - pub task: *mut task_struct, - pub acct: [io_wq_acct; 2usize], - pub lock: raw_spinlock_t, - pub free_list: hlist_nulls_head, - pub all_list: list_head, - pub wait: wait_queue_entry, - pub hash_tail: [*mut io_wq_work; 64usize], - pub cpu_mask: cpumask_var_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bio_alloc_cache { - pub free_list: *mut bio, - pub free_list_irq: *mut bio, - pub nr: ::aya_bpf::cty::c_uint, - pub nr_irq: ::aya_bpf::cty::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct iommu_group { - pub kobj: kobject, - pub devices_kobj: *mut kobject, - pub devices: list_head, - pub pasid_array: xarray, - pub mutex: mutex, - pub iommu_data: *mut ::aya_bpf::cty::c_void, - pub iommu_data_release: - ::core::option::Option, - pub name: *mut ::aya_bpf::cty::c_char, - pub id: ::aya_bpf::cty::c_int, - pub default_domain: *mut iommu_domain, - pub blocking_domain: *mut iommu_domain, - pub domain: *mut iommu_domain, - pub entry: list_head, - pub owner_cnt: ::aya_bpf::cty::c_uint, - pub owner: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct latency_bucket { - pub total_latency: ::aya_bpf::cty::c_ulong, - pub samples: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct avg_latency_bucket { - pub latency: ::aya_bpf::cty::c_ulong, - pub valid: bool_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct throtl_data { - pub service_queue: throtl_service_queue, - pub queue: *mut request_queue, - pub nr_queued: [::aya_bpf::cty::c_uint; 2usize], - pub throtl_slice: ::aya_bpf::cty::c_uint, - pub dispatch_work: work_struct, - pub limit_index: ::aya_bpf::cty::c_uint, - pub limit_valid: [bool_; 2usize], - pub low_upgrade_time: ::aya_bpf::cty::c_ulong, - pub low_downgrade_time: ::aya_bpf::cty::c_ulong, - pub scale: ::aya_bpf::cty::c_uint, - pub tmp_buckets: [latency_bucket; 18usize], - pub avg_buckets: [avg_latency_bucket; 18usize], - pub latency_buckets: [*mut latency_bucket; 2usize], - pub last_calculate_time: ::aya_bpf::cty::c_ulong, - pub filtered_latency: ::aya_bpf::cty::c_ulong, - pub track_bio_latency: bool_, -} -pub mod devlink_info_version_type { - pub type Type = ::aya_bpf::cty::c_uint; - pub const DEVLINK_INFO_VERSION_TYPE_NONE: Type = 0; - pub const DEVLINK_INFO_VERSION_TYPE_COMPONENT: Type = 1; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct devlink_info_req { - pub msg: *mut sk_buff, - pub version_cb: ::core::option::Option< - unsafe extern "C" fn( - arg1: *const ::aya_bpf::cty::c_char, - arg2: devlink_info_version_type::Type, - arg3: *mut ::aya_bpf::cty::c_void, - ), - >, - pub version_cb_priv: *mut ::aya_bpf::cty::c_void, -} -#[repr(C)] -pub struct numa_group { - pub refcount: refcount_t, - pub lock: spinlock_t, - pub nr_tasks: ::aya_bpf::cty::c_int, - pub gid: pid_t, - pub active_nodes: ::aya_bpf::cty::c_int, - pub rcu: callback_head, - pub total_faults: ::aya_bpf::cty::c_ulong, - pub max_faults_cpu: ::aya_bpf::cty::c_ulong, - pub faults: __IncompleteArrayField<::aya_bpf::cty::c_ulong>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vlan_group { - pub nr_vlan_devs: ::aya_bpf::cty::c_uint, - pub hlist: hlist_node, - pub vlan_devices_arrays: [*mut *mut net_device; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vlan_info { - pub real_dev: *mut net_device, - pub grp: vlan_group, - pub vid_list: list_head, - pub nr_vids: ::aya_bpf::cty::c_uint, +pub struct bpf_mem_cache { + pub free_llist: llist_head, + pub active: local_t, + pub free_llist_extra: llist_head, + pub refill_work: irq_work, + pub objcg: *mut obj_cgroup, + pub unit_size: ::aya_ebpf::cty::c_int, + pub free_cnt: ::aya_ebpf::cty::c_int, + pub low_watermark: ::aya_ebpf::cty::c_int, + pub high_watermark: ::aya_ebpf::cty::c_int, + pub batch: ::aya_ebpf::cty::c_int, + pub percpu_size: ::aya_ebpf::cty::c_int, + pub draining: bool_, + pub tgt: *mut bpf_mem_cache, + pub free_by_rcu: llist_head, + pub free_by_rcu_tail: *mut llist_node, + pub waiting_for_gp: llist_head, + pub waiting_for_gp_tail: *mut llist_node, pub rcu: callback_head, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct prog_entry { - pub target: ::aya_bpf::cty::c_int, - pub when_to_branch: ::aya_bpf::cty::c_int, - pub pred: *mut filter_pred, -} -pub type regex_match_func = ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut ::aya_bpf::cty::c_char, - arg2: *mut regex, - arg3: ::aya_bpf::cty::c_int, - ) -> ::aya_bpf::cty::c_int, ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct regex { - pub pattern: [::aya_bpf::cty::c_char; 256usize], - pub len: ::aya_bpf::cty::c_int, - pub field_len: ::aya_bpf::cty::c_int, - pub match_: regex_match_func, -} -pub mod filter_pred_fn { - pub type Type = ::aya_bpf::cty::c_uint; - pub const FILTER_PRED_FN_NOP: Type = 0; - pub const FILTER_PRED_FN_64: Type = 1; - pub const FILTER_PRED_FN_S64: Type = 2; - pub const FILTER_PRED_FN_U64: Type = 3; - pub const FILTER_PRED_FN_32: Type = 4; - pub const FILTER_PRED_FN_S32: Type = 5; - pub const FILTER_PRED_FN_U32: Type = 6; - pub const FILTER_PRED_FN_16: Type = 7; - pub const FILTER_PRED_FN_S16: Type = 8; - pub const FILTER_PRED_FN_U16: Type = 9; - pub const FILTER_PRED_FN_8: Type = 10; - pub const FILTER_PRED_FN_S8: Type = 11; - pub const FILTER_PRED_FN_U8: Type = 12; - pub const FILTER_PRED_FN_COMM: Type = 13; - pub const FILTER_PRED_FN_STRING: Type = 14; - pub const FILTER_PRED_FN_STRLOC: Type = 15; - pub const FILTER_PRED_FN_STRRELLOC: Type = 16; - pub const FILTER_PRED_FN_PCHAR_USER: Type = 17; - pub const FILTER_PRED_FN_PCHAR: Type = 18; - pub const FILTER_PRED_FN_CPU: Type = 19; - pub const FILTER_PRED_FN_FUNCTION: Type = 20; - pub const FILTER_PRED_FN_: Type = 21; - pub const FILTER_PRED_TEST_VISITED: Type = 22; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct filter_pred { - pub fn_num: filter_pred_fn::Type, - pub val: u64_, - pub val2: u64_, - pub regex: regex, - pub ops: *mut ::aya_bpf::cty::c_ushort, - pub field: *mut ftrace_event_field, - pub offset: ::aya_bpf::cty::c_int, - pub not: ::aya_bpf::cty::c_int, - pub op: ::aya_bpf::cty::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_kfunc_desc { - pub func_model: btf_func_model, - pub func_id: u32_, - pub imm: s32, - pub offset: u16_, - pub addr: ::aya_bpf::cty::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_kfunc_desc_tab { - pub descs: [bpf_kfunc_desc; 256usize], - pub nr_descs: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_kfunc_btf { - pub btf: *mut btf, - pub module: *mut module, - pub offset: u16_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_kfunc_btf_tab { - pub descs: [bpf_kfunc_btf; 256usize], - pub nr_descs: u32_, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct bpf_verifier_stack_elem { - pub st: bpf_verifier_state, - pub insn_idx: ::aya_bpf::cty::c_int, - pub prev_insn_idx: ::aya_bpf::cty::c_int, - pub next: *mut bpf_verifier_stack_elem, - pub log_pos: u32_, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct cpu_stop_done { - pub nr_todo: atomic_t, - pub ret: ::aya_bpf::cty::c_int, - pub completion: completion, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct memcg_vmstats { - pub state: [::aya_bpf::cty::c_long; 50usize], - pub events: [::aya_bpf::cty::c_ulong; 19usize], - pub state_pending: [::aya_bpf::cty::c_long; 50usize], - pub events_pending: [::aya_bpf::cty::c_ulong; 19usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct memcg_vmstats_percpu { - pub state: [::aya_bpf::cty::c_long; 50usize], - pub events: [::aya_bpf::cty::c_ulong; 19usize], - pub state_prev: [::aya_bpf::cty::c_long; 50usize], - pub events_prev: [::aya_bpf::cty::c_ulong; 19usize], - pub nr_page_events: ::aya_bpf::cty::c_ulong, - pub targets: [::aya_bpf::cty::c_ulong; 2usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct iova_rcache { - pub lock: spinlock_t, - pub depot_size: ::aya_bpf::cty::c_ulong, - pub depot: [*mut iova_magazine; 32usize], - pub cpu_rcaches: *mut iova_cpu_rcache, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iova_magazine { - pub size: ::aya_bpf::cty::c_ulong, - pub pfns: [::aya_bpf::cty::c_ulong; 127usize], + pub call_rcu_in_progress: atomic_t, + pub free_llist_extra_rcu: llist_head, + pub free_by_rcu_ttrace: llist_head, + pub waiting_for_gp_ttrace: llist_head, + pub rcu_ttrace: callback_head, + pub call_rcu_ttrace_in_progress: atomic_t, } #[repr(C)] #[derive(Copy, Clone)] -pub struct iova_cpu_rcache { - pub lock: spinlock_t, - pub loaded: *mut iova_magazine, - pub prev: *mut iova_magazine, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wpan_dev { - pub wpan_phy: *mut wpan_phy, - pub iftype: ::aya_bpf::cty::c_int, - pub list: list_head, - pub netdev: *mut net_device, - pub header_ops: *const wpan_dev_header_ops, - pub lowpan_dev: *mut net_device, - pub identifier: u32_, - pub pan_id: __le16, - pub short_addr: __le16, - pub extended_addr: __le64, - pub bsn: atomic_t, - pub dsn: atomic_t, - pub min_be: u8_, - pub max_be: u8_, - pub csma_retries: u8_, - pub frame_retries: s8, - pub lbt: bool_, - pub ackreq: bool_, -} -pub mod ieee802154_filtering_level { - pub type Type = ::aya_bpf::cty::c_uint; - pub const IEEE802154_FILTERING_NONE: Type = 0; - pub const IEEE802154_FILTERING_1_FCS: Type = 1; - pub const IEEE802154_FILTERING_2_PROMISCUOUS: Type = 2; - pub const IEEE802154_FILTERING_3_SCAN: Type = 3; - pub const IEEE802154_FILTERING_4_FRAME_FIELDS: Type = 4; -} -pub mod nl802154_cca_modes { - pub type Type = ::aya_bpf::cty::c_uint; - pub const __NL802154_CCA_INVALID: Type = 0; - pub const NL802154_CCA_ENERGY: Type = 1; - pub const NL802154_CCA_CARRIER: Type = 2; - pub const NL802154_CCA_ENERGY_CARRIER: Type = 3; - pub const NL802154_CCA_ALOHA: Type = 4; - pub const NL802154_CCA_UWB_SHR: Type = 5; - pub const NL802154_CCA_UWB_MULTIPLEXED: Type = 6; - pub const __NL802154_CCA_ATTR_AFTER_LAST: Type = 7; - pub const NL802154_CCA_ATTR_MAX: Type = 6; -} -pub mod nl802154_cca_opts { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL802154_CCA_OPT_ENERGY_CARRIER_AND: Type = 0; - pub const NL802154_CCA_OPT_ENERGY_CARRIER_OR: Type = 1; - pub const __NL802154_CCA_OPT_ATTR_AFTER_LAST: Type = 2; - pub const NL802154_CCA_OPT_ATTR_MAX: Type = 1; -} -pub mod nl802154_supported_bool_states { - pub type Type = ::aya_bpf::cty::c_uint; - pub const NL802154_SUPPORTED_BOOL_FALSE: Type = 0; - pub const NL802154_SUPPORTED_BOOL_TRUE: Type = 1; - pub const __NL802154_SUPPORTED_BOOL_INVALD: Type = 2; - pub const NL802154_SUPPORTED_BOOL_BOTH: Type = 3; - pub const __NL802154_SUPPORTED_BOOL_AFTER_LAST: Type = 4; - pub const NL802154_SUPPORTED_BOOL_MAX: Type = 3; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wpan_phy_supported { - pub channels: [u32_; 32usize], - pub cca_modes: u32_, - pub cca_opts: u32_, - pub iftypes: u32_, - pub lbt: nl802154_supported_bool_states::Type, - pub min_minbe: u8_, - pub max_minbe: u8_, - pub min_maxbe: u8_, - pub max_maxbe: u8_, - pub min_csma_backoffs: u8_, - pub max_csma_backoffs: u8_, - pub min_frame_retries: s8, - pub max_frame_retries: s8, - pub tx_powers_size: usize, - pub cca_ed_levels_size: usize, - pub tx_powers: *const s32, - pub cca_ed_levels: *const s32, +pub struct bpf_mem_caches { + pub cache: [bpf_mem_cache; 11usize], } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct wpan_phy_cca { - pub mode: nl802154_cca_modes::Type, - pub opt: nl802154_cca_opts::Type, -} -#[repr(C)] -pub struct wpan_phy { - pub privid: *const ::aya_bpf::cty::c_void, - pub flags: ::aya_bpf::cty::c_ulong, - pub current_channel: u8_, - pub current_page: u8_, - pub supported: wpan_phy_supported, - pub transmit_power: s32, - pub cca: wpan_phy_cca, - pub perm_extended_addr: __le64, - pub cca_ed_level: s32, - pub symbol_duration: u32_, - pub lifs_period: u16_, - pub sifs_period: u16_, - pub dev: device, - pub _net: possible_net_t, - pub queue_lock: spinlock_t, - pub ongoing_txs: atomic_t, - pub hold_txs: atomic_t, - pub sync_txq: wait_queue_head_t, - pub filtering: ieee802154_filtering_level::Type, - pub __bindgen_padding_0: [u8; 4usize], - pub priv_: __IncompleteArrayField<::aya_bpf::cty::c_char>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ieee802154_addr { - pub mode: u8_, - pub pan_id: __le16, - pub __bindgen_anon_1: ieee802154_addr__bindgen_ty_1, +pub struct saved { + pub link: path, + pub done: delayed_call, + pub name: *const ::aya_ebpf::cty::c_char, + pub seq: ::aya_ebpf::cty::c_uint, } #[repr(C)] #[derive(Copy, Clone)] -pub union ieee802154_addr__bindgen_ty_1 { - pub short_addr: __le16, - pub extended_addr: __le64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct wpan_dev_header_ops { - pub create: ::core::option::Option< - unsafe extern "C" fn( - arg1: *mut sk_buff, - arg2: *mut net_device, - arg3: *const ieee802154_addr, - arg4: *const ieee802154_addr, - arg5: ::aya_bpf::cty::c_uint, - ) -> ::aya_bpf::cty::c_int, - >, +pub struct nameidata { + pub path: path, + pub last: qstr, + pub root: path, + pub inode: *mut inode, + pub flags: ::aya_ebpf::cty::c_uint, + pub state: ::aya_ebpf::cty::c_uint, + pub seq: ::aya_ebpf::cty::c_uint, + pub next_seq: ::aya_ebpf::cty::c_uint, + pub m_seq: ::aya_ebpf::cty::c_uint, + pub r_seq: ::aya_ebpf::cty::c_uint, + pub last_type: ::aya_ebpf::cty::c_int, + pub depth: ::aya_ebpf::cty::c_uint, + pub total_link_count: ::aya_ebpf::cty::c_int, + pub stack: *mut saved, + pub internal: [saved; 2usize], + pub name: *mut filename, + pub saved: *mut nameidata, + pub root_seq: ::aya_ebpf::cty::c_uint, + pub dfd: ::aya_ebpf::cty::c_int, + pub dir_vfsuid: vfsuid_t, + pub dir_mode: umode_t, } diff --git a/capable/src/main.rs b/capable/src/main.rs index 8768204b..bebc3a2b 100644 --- a/capable/src/main.rs +++ b/capable/src/main.rs @@ -11,8 +11,8 @@ use std::{env, thread}; use aya::maps::{HashMap, MapData}; use aya::programs::KProbe; -use aya::{include_bytes_aligned, Bpf}; -use aya_log::BpfLogger; +use aya::{include_bytes_aligned, Ebpf}; +use aya_log::EbpfLogger; use capctl::{Cap, CapSet}; use clap::Parser; use libc::fstatat; @@ -222,14 +222,14 @@ async fn main() -> Result<(), anyhow::Error> { // like to specify the eBPF program at runtime rather than at compile-time, you can // reach for `Bpf::load_file` instead. #[cfg(debug_assertions)] - let mut bpf = Bpf::load(include_bytes_aligned!( + let mut bpf = Ebpf::load(include_bytes_aligned!( "../../target/bpfel-unknown-none/debug/capable" ))?; #[cfg(not(debug_assertions))] - let mut bpf = Bpf::load(include_bytes_aligned!( + let mut bpf = Ebpf::load(include_bytes_aligned!( "../../target/bpfel-unknown-none/release/capable" ))?; - if let Err(e) = BpfLogger::init(&mut bpf) { + if let Err(e) = EbpfLogger::init(&mut bpf) { // This can happen if you remove all log statements from your eBPF program. warn!("failed to initialize eBPF {}", e); } diff --git a/resources/rootasrole.json b/resources/rootasrole.json index 5f8e20a2..77e2c4bb 100644 --- a/resources/rootasrole.json +++ b/resources/rootasrole.json @@ -1,10 +1,10 @@ { "version": "3.0.0-alpha.4", - "timeout": { - "type": "ppid", - "duration": "00:05:00" - }, "options": { + "timeout": { + "type": "ppid", + "duration": "00:05:00" + }, "path": { "default": "delete", "add": [ diff --git a/src/api.rs b/src/api.rs index d22fa3e3..f7630b6c 100644 --- a/src/api.rs +++ b/src/api.rs @@ -4,7 +4,7 @@ use capctl::CapSet; use serde_json::Value; use strum::EnumIs; -use crate::finder::{Cred, ExecSettings, TaskMatch, UserMin}; +use crate::common::database::finder::{Cred, ExecSettings, TaskMatch, UserMin}; use super::database::structs::{SActor, SConfig, SRole, STask}; use once_cell::sync::Lazy; diff --git a/src/chsr/checklist.rs b/src/chsr/checklist.rs deleted file mode 100644 index 014f1be0..00000000 --- a/src/chsr/checklist.rs +++ /dev/null @@ -1,1183 +0,0 @@ -use cursive::{ - align::{Align, HAlign, VAlign}, - direction, - event::{Callback, Event, EventResult, Key, MouseButton, MouseEvent}, - impl_enabled, menu, - theme::ColorStyle, - utils::{markup::StyledString, span::SpannedStr}, - view::{CannotFocus, Position, View}, - views::{LayerPosition, MenuPopup}, - Cursive, Printer, Rect, Vec2, With, XY, -}; -use std::cell::Cell; -use std::cmp::{min, Ordering}; -use std::rc::Rc; - -type SelectCallback = dyn Fn(&mut Cursive, bool, &T); - -/// View to select an item among a list. -/// -/// It contains a list of values of type T, with associated labels. -/// -/// # Examples -/// -/// ```rust -/// # use cursive_core::Cursive; -/// # use cursive_core::views::{CheckListView, Dialog, TextView}; -/// # use cursive_core::align::HAlign; -/// let mut time_select = CheckListView::new().h_align(HAlign::Center); -/// time_select.add_item("Short", 1); -/// time_select.add_item("Medium", 5); -/// time_select.add_item("Long", 10); -/// -/// time_select.set_on_submit(|s, time| { -/// s.pop_layer(); -/// let text = format!("You will wait for {} minutes...", time); -/// s.add_layer( -/// Dialog::around(TextView::new(text)).button("Quit", |s| s.quit()), -/// ); -/// }); -/// -/// let mut siv = Cursive::new(); -/// siv.add_layer(Dialog::around(time_select).title("How long is your wait?")); -/// ``` -pub struct CheckListView { - // The core of the view: we store a list of items - // `Item` is more or less a `(String, Rc)`. - items: Vec>, - - // When disabled, we cannot change selection. - enabled: bool, - - // Callbacks may need to manipulate focus, so give it some mutability. - focus: Rc>, - - // This callback is called when the selection is changed. - // TODO: add the previous selection? Indices? - on_select: Option>>, - - // This callback is called when the user presses `Enter`. - on_submit: Option>>, - - // If `true`, when a character is pressed, jump to the next item starting - // with this character. - autojump: bool, - - align: Align, - - // `true` if we show a one-line view, with popup on selection. - popup: bool, - - // We need the last offset to place the popup window - // We "cache" it during the draw, so we need interior mutability. - last_offset: Cell, - last_size: Vec2, - - // Cache of required_size. Set to None when it needs to be recomputed. - last_required_size: Option, -} - -impl Default for CheckListView { - fn default() -> Self { - Self::new() - } -} - -impl CheckListView { - impl_enabled!(self.enabled); - - /// Creates a new empty CheckListView. - pub fn new() -> Self { - CheckListView { - items: Vec::new(), - enabled: true, - focus: Rc::new(Cell::new(0)), - on_select: None, - on_submit: None, - align: Align::top_left(), - popup: false, - autojump: false, - last_offset: Cell::new(Vec2::zero()), - last_size: Vec2::zero(), - last_required_size: None, - } - } - - /// Sets the "auto-jump" property for this view. - /// - /// If enabled, when a key is pressed, the selection will jump to the next - /// item beginning with the pressed letter. - pub fn set_autojump(&mut self, autojump: bool) { - self.autojump = autojump; - } - - /// Sets the "auto-jump" property for this view. - /// - /// If enabled, when a key is pressed, the selection will jump to the next - /// item beginning with the pressed letter. - /// - /// Chainable variant. - #[must_use] - pub fn autojump(self) -> Self { - self.with(|s| s.set_autojump(true)) - } - - /// Turns `self` into a popup select view. - /// - /// Chainable variant. - #[must_use] - pub fn popup(self) -> Self { - self.with(|s| s.set_popup(true)) - } - - /// Turns `self` into a popup select view. - pub fn set_popup(&mut self, popup: bool) { - self.popup = popup; - self.last_required_size = None; - } - - /// Sets a callback to be used when an item is selected. - pub fn set_on_select(&mut self, cb: F) - where - F: Fn(&mut Cursive, bool, &T) + 'static, - { - self.on_select = Some(Rc::new(cb)); - } - - pub fn set_on_submit(&mut self, cb: F) - where - F: Fn(&mut Cursive, bool, &T) + 'static, - { - self.on_submit = Some(Rc::new(cb)); - } - - /// Sets a callback to be used when an item is selected. - /// - /// Chainable variant. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::traits::Nameable; - /// use cursive_core::views::{CheckListView, TextView}; - /// - /// let text_view = TextView::new("").with_name("text"); - /// - /// let select_view = CheckListView::new() - /// .item("One", 1) - /// .item("Two", 2) - /// .on_select(|s, item| { - /// let content = match *item { - /// 1 => "Content number one", - /// 2 => "Content number two! Much better!", - /// _ => unreachable!("no such item"), - /// }; - /// - /// // Update the textview with the currently selected item. - /// s.call_on_name("text", |v: &mut TextView| { - /// v.set_content(content); - /// }) - /// .unwrap(); - /// }); - /// ``` - #[must_use] - pub fn on_select(self, cb: F) -> Self - where - F: Fn(&mut Cursive, bool, &T) + 'static, - { - self.with(|s| s.set_on_select(cb)) - } - - #[must_use] - pub fn on_submit(self, cb: F) -> Self - where - F: Fn(&mut Cursive, bool, &T) + 'static, - { - self.with(|s| s.set_on_submit(cb)) - } - - /// Sets the alignment for this view. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::align; - /// use cursive_core::views::CheckListView; - /// - /// let select_view = CheckListView::new() - /// .item("One", 1) - /// .align(align::Align::top_center()); - /// ``` - #[must_use] - pub fn align(mut self, align: Align) -> Self { - self.align = align; - - self - } - - /// Sets the vertical alignment for this view. - /// (If the view is given too much space vertically.) - #[must_use] - pub fn v_align(mut self, v: VAlign) -> Self { - self.align.v = v; - - self - } - - /// Sets the horizontal alignment for this view. - #[must_use] - pub fn h_align(mut self, h: HAlign) -> Self { - self.align.h = h; - - self - } - - /// Returns the value of the currently selected item. - /// - /// Returns `None` if the list is empty. - pub fn selection(&self) -> Option<(bool, Rc)> { - let focus = self.focus(); - if self.len() <= focus { - None - } else { - let item = &self.items[focus]; - Some((item.checked, item.value.clone())) - } - } - - pub fn is_checked(&self) -> bool { - let focus = self.focus(); - if self.len() <= focus { - false - } else { - self.items[focus].checked - } - } - - /// Removes all items from this view. - pub fn clear(&mut self) { - self.items.clear(); - self.focus.set(0); - self.last_required_size = None; - } - - /// Adds a item to the list, with given label and value. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// let mut select_view = CheckListView::new(); - /// - /// select_view.add_item("Item 1", 1); - /// select_view.add_item("Item 2", 2); - /// ``` - pub fn add_item>(&mut self, label: S, checked: bool, value: T) { - self.items.push(Item::new(label.into(), checked, value)); - self.last_required_size = None; - } - - /// Gets an item at given idx or None. - /// - /// ``` - /// use cursive_core::views::{CheckListView, TextView}; - /// use cursive_core::Cursive; - /// let select = CheckListView::new().item("Short", 1); - /// assert_eq!(select.get_item(0), Some(("Short", &1))); - /// ``` - pub fn get_item(&self, i: usize) -> Option<(&str, &bool, &T)> { - self.iter().nth(i) - } - - /// Gets a mut item at given idx or None. - pub fn get_item_mut(&mut self, i: usize) -> Option<(&mut StyledString, &mut bool, &mut T)> { - if i >= self.items.len() { - None - } else { - self.last_required_size = None; - let item = &mut self.items[i]; - if let Some(t) = Rc::get_mut(&mut item.value) { - let label = &mut item.label; - Some((label, &mut item.checked, t)) - } else { - None - } - } - } - - pub fn get_selected_item_mut(&mut self) -> Option<(&mut StyledString, &mut bool, &mut T)> { - self.get_item_mut(self.focus()) - } - - pub fn get_checked_item_mut(&mut self) -> Vec<(&mut StyledString, &mut T)> { - self.items - .iter_mut() - .filter(|item| item.checked) - .map(|item| { - let label = &mut item.label; - let value = Rc::get_mut(&mut item.value).unwrap(); - (label, value) - }) - .collect() - } - - pub fn get_checked_item(&self) -> Vec<(StyledString, &T)> { - self.items - .iter() - .filter(|item| item.checked) - .map(|item| { - let label = item.label.to_owned(); - let value = &*item.value; - (label, value) - }) - .collect() - } - - /// Iterate mutably on the items in this view. - /// - /// Returns an iterator with each item and their labels. - /// - /// In some cases some items will need to be cloned (for example if a - /// `Rc` is still alive after calling `CheckListView::selection()`). - /// - /// If `T` does not implement `Clone`, check `CheckListView::try_iter_mut()`. - pub fn iter_mut(&mut self) -> impl Iterator - where - T: Clone, - { - self.last_required_size = None; - self.items.iter_mut().map(|item| { - ( - &mut item.label, - &mut item.checked, - Rc::make_mut(&mut item.value), - ) - }) - } - - /// Try to iterate mutably on the items in this view. - /// - /// Returns an iterator with each item and their labels. - /// - /// Some items may not be returned mutably, for example if a `Rc` is - /// still alive after calling `CheckListView::selection()`. - pub fn try_iter_mut( - &mut self, - ) -> impl Iterator)> { - self.last_required_size = None; - self.items.iter_mut().map(|item| { - ( - &mut item.label, - &mut item.checked, - Rc::get_mut(&mut item.value), - ) - }) - } - - /// Iterate on the items in this view. - /// - /// Returns an iterator with each item and their labels. - pub fn iter(&self) -> impl Iterator { - self.items - .iter() - .map(|item| (item.label.source(), &item.checked, &*item.value)) - } - - /// Iterate on the items in this view. - /// - /// Returns an iterator with each item and their labels. - pub fn iter_checked(&self) -> impl Iterator { - self.items.iter().filter_map(|item| { - if item.checked { - Some((item.label.source(), &*item.value)) - } else { - None - } - }) - } - - /// Removes an item from the list. - /// - /// Returns a callback in response to the selection change. - /// - /// You should run this callback with a `&mut Cursive`. - pub fn remove_item(&mut self, id: usize) -> Callback { - self.items.remove(id); - self.last_required_size = None; - let focus = self.focus(); - (focus >= id && focus > 0) - .then(|| { - self.focus.set(focus - 1); - self.make_select_cb() - }) - .flatten() - .unwrap_or_else(Callback::dummy) - } - - /// Inserts an item at position `index`, shifting all elements after it to - /// the right. - pub fn insert_item(&mut self, index: usize, label: S, checked: bool, value: T) - where - S: Into, - { - self.items - .insert(index, Item::new(label.into(), checked, value)); - let focus = self.focus(); - if focus >= index { - self.focus.set(focus + 1); - } - self.last_required_size = None; - } - - /// Chainable variant of add_item - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// let select_view = CheckListView::new() - /// .item("Item 1", 1) - /// .item("Item 2", 2) - /// .item("Surprise item", 42); - /// ``` - #[must_use] - pub fn item>(self, label: S, checked: bool, value: T) -> Self { - self.with(|s| s.add_item(label, checked, value)) - } - - /// Adds all items from from an iterator. - pub fn add_all(&mut self, iter: I) - where - S: Into, - I: IntoIterator, - { - for (s, c, t) in iter { - self.add_item(s, c, t); - } - } - - /// Adds all items from from an iterator. - /// - /// Chainable variant. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// // Create a CheckListView with 100 items - /// let select_view = CheckListView::new() - /// .with_all((1u8..100).into_iter().map(|i| (format!("Item {}", i), i))); - /// ``` - #[must_use] - pub fn with_all(self, iter: I) -> Self - where - S: Into, - I: IntoIterator, - { - self.with(|s| s.add_all(iter)) - } - - fn draw_item(&self, printer: &Printer, i: usize) { - let l = self.items[i].label.width() + 4; - let x = self.align.h.get_offset(l, printer.size.x); - printer.print_hline::>(XY::new(0, 0), x, " "); - printer.print(XY::new(0, 0), "[ ] "); - if self.items[i].checked { - printer.print(XY::new(1, 0), "X"); - } - printer.print_styled(XY::new(x + 4, 0), SpannedStr::from(&self.items[i].label)); - if l < printer.size.x { - assert!((l + x) <= printer.size.x); - printer.print_hline(XY::new(x + l, 0), printer.size.x - (l + x), " "); - } - } - - /// Returns the id of the item currently selected. - /// - /// Returns `None` if the list is empty. - pub fn selected_id(&self) -> Option { - if self.items.is_empty() { - None - } else { - Some(self.focus()) - } - } - - /// Returns the number of items in this list. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// let select_view = CheckListView::new() - /// .item("Item 1", 1) - /// .item("Item 2", 2) - /// .item("Item 3", 3); - /// - /// assert_eq!(select_view.len(), 3); - /// ``` - pub fn len(&self) -> usize { - self.items.len() - } - - /// Returns `true` if this list has no item. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// let mut select_view = CheckListView::new(); - /// assert!(select_view.is_empty()); - /// - /// select_view.add_item("Item 1", 1); - /// select_view.add_item("Item 2", 2); - /// assert!(!select_view.is_empty()); - /// - /// select_view.clear(); - /// assert!(select_view.is_empty()); - /// ``` - pub fn is_empty(&self) -> bool { - self.items.is_empty() - } - - fn focus(&self) -> usize { - self.focus.get() - } - - /// Sort the current items lexicographically by their label. - /// - /// Note that this does not change the current focus index, which means that the current - /// selection will likely be changed by the sorting. - /// - /// This sort is stable: items with identical label will not be reordered. - pub fn sort_by_label(&mut self) { - self.items - .sort_by(|a, b| a.label.source().cmp(b.label.source())); - } - - /// Sort the current items with the given comparator function. - /// - /// Note that this does not change the current focus index, which means that the current - /// selection will likely be changed by the sorting. - /// - /// The given comparator function must define a total order for the items. - /// - /// If the comparator function does not define a total order, then the order after the sort is - /// unspecified. - /// - /// This sort is stable: equal items will not be reordered. - pub fn sort_by(&mut self, mut compare: F) - where - F: FnMut(&T, &T) -> Ordering, - { - self.items.sort_by(|a, b| compare(&a.value, &b.value)); - } - - /// Sort the current items with the given key extraction function. - /// - /// Note that this does not change the current focus index, which means that the current - /// selection will likely be changed by the sorting. - /// - /// This sort is stable: items with equal keys will not be reordered. - pub fn sort_by_key(&mut self, mut key_of: F) - where - F: FnMut(&T) -> K, - K: Ord, - { - self.items.sort_by_key(|item| key_of(&item.value)); - } - - /// Moves the selection to the given position. - /// - /// Returns a callback in response to the selection change. - /// - /// You should run this callback with a `&mut Cursive`. - pub fn set_selection(&mut self, i: usize) -> Callback { - // TODO: Check if `i >= self.len()` ? - // assert!(i < self.len(), "CheckListView: trying to select out-of-bound"); - // Or just cap the ID? - let i = if self.is_empty() { - 0 - } else { - min(i, self.len() - 1) - }; - self.focus.set(i); - - self.make_select_cb().unwrap_or_else(Callback::dummy) - } - - /// Sets the selection to the given position. - /// - /// Chainable variant. - /// - /// Does not apply `on_select` callbacks. - #[must_use] - pub fn selected(self, i: usize) -> Self { - self.with(|s| { - s.set_selection(i); - }) - } - - /// Moves the selection up by the given number of rows. - /// - /// Returns a callback in response to the selection change. - /// - /// You should run this callback with a `&mut Cursive`: - /// - /// ```rust - /// # use cursive_core::Cursive; - /// # use cursive_core::views::CheckListView; - /// fn select_up(siv: &mut Cursive, view: &mut CheckListView<()>) { - /// let cb = view.select_up(1); - /// cb(siv); - /// } - /// ``` - pub fn select_up(&mut self, n: usize) -> Callback { - self.focus_up(n); - self.make_select_cb().unwrap_or_else(Callback::dummy) - } - - /// Moves the selection down by the given number of rows. - /// - /// Returns a callback in response to the selection change. - /// - /// You should run this callback with a `&mut Cursive`. - pub fn select_down(&mut self, n: usize) -> Callback { - self.focus_down(n); - self.make_select_cb().unwrap_or_else(Callback::dummy) - } - - fn focus_up(&mut self, n: usize) { - let focus = self.focus().saturating_sub(n); - self.focus.set(focus); - } - - fn focus_down(&mut self, n: usize) { - let focus = min(self.focus() + n, self.items.len().saturating_sub(1)); - self.focus.set(focus); - } - - fn submit(&mut self) -> EventResult { - let item = self.get_selected_item_mut(); - if let Some(item) = item { - *item.1 = !*item.1; - } - EventResult::Consumed(self.make_submit_cb()) - } - - fn toggleall(&mut self) -> EventResult { - for item in self.try_iter_mut() { - *item.1 = !*item.1; - } - EventResult::Consumed(self.make_submit_cb()) - } - - fn uncheckall(&mut self) -> EventResult { - for item in self.try_iter_mut() { - *item.1 = false; - } - EventResult::Consumed(self.make_submit_cb()) - } - - fn checkall(&mut self) -> EventResult { - // make event for each items - - for item in self.try_iter_mut() { - *item.1 = true; - } - EventResult::Consumed(self.make_submit_cb()) - } - - fn on_char_event(&mut self, c: char) -> EventResult { - let i = { - // * Starting from the current focus, find the first item that - // match the char. - // * Cycle back to the beginning of the list when we reach the end. - // * This is achieved by chaining twice the iterator. - let iter = self.iter().chain(self.iter()); - - // We'll do a lowercase check. - let lower_c: Vec = c.to_lowercase().collect(); - let lower_c: &[char] = &lower_c; - - if let Some((i, _)) = iter - .enumerate() - .skip(self.focus() + 1) - .find(|&(_, (label, _, _))| label.to_lowercase().starts_with(lower_c)) - { - i % self.len() - } else { - return EventResult::Ignored; - } - }; - - self.focus.set(i); - // Apply modulo in case we have a hit from the chained iterator - let cb = self.set_selection(i); - EventResult::Consumed(Some(cb)) - } - - fn on_event_regular(&mut self, event: Event) -> EventResult { - match event { - Event::Key(Key::Up) if self.focus() > 0 => self.focus_up(1), - Event::Key(Key::Down) if self.focus() + 1 < self.items.len() => self.focus_down(1), - Event::Key(Key::PageUp) => self.focus_up(10), - Event::Key(Key::PageDown) => self.focus_down(10), - Event::Key(Key::Home) => self.focus.set(0), - Event::Key(Key::End) => self.focus.set(self.items.len().saturating_sub(1)), - Event::Mouse { - event: MouseEvent::Press(_), - position, - offset, - } if position - .checked_sub(offset) - .map(|position| position < self.last_size && position.y < self.len()) - .unwrap_or(false) => - { - self.focus.set(position.y - offset.y) - } - Event::Mouse { - event: MouseEvent::Release(MouseButton::Left), - position, - offset, - } if position - .checked_sub(offset) - .map(|position| position < self.last_size && position.y == self.focus()) - .unwrap_or(false) => - { - return self.submit(); - } - Event::Char(' ') | Event::Key(Key::Enter) => return self.submit(), - Event::CtrlChar('a') => return self.checkall(), - Event::CtrlChar('u') => return self.uncheckall(), - Event::CtrlChar('d') => return self.toggleall(), - Event::Char(c) if self.autojump => return self.on_char_event(c), - _ => return EventResult::Ignored, - } - - EventResult::Consumed(self.make_select_cb()) - } - - /// Returns a callback from selection change. - fn make_select_cb(&self) -> Option { - self.on_select.to_owned().and_then(|cb| { - self.selection() - .map(|(b, v)| Callback::from_fn(move |s| cb(s, b, &v))) - }) - } - - /// Returns a callback from submit change. - fn make_submit_cb(&self) -> Option { - self.on_submit.to_owned().and_then(|cb| { - self.selection() - .map(|(b, v)| Callback::from_fn(move |s: &mut Cursive| cb(s, b, &v))) - }) - } - - fn open_popup(&mut self) -> EventResult { - // Build a shallow menu tree to mimick the items array. - // TODO: cache it? - let mut tree = menu::Tree::new(); - for (i, item) in self.items.iter().enumerate() { - let focus: Rc> = Rc::clone(&self.focus); - tree.add_leaf(item.label.source(), move |_| { - // TODO: What if an item was removed in the meantime? - focus.set(i); - }); - } - // Let's keep the tree around, - // the callback will want to use it. - let tree = Rc::new(tree); - - let focus = self.focus(); - // This is the offset for the label text. - // We'll want to show the popup so that the text matches. - // It'll be soo cool. - let item_length = self.items[focus].label.width(); - let text_offset = (self.last_size.x.saturating_sub(item_length)) / 2; - // The total offset for the window is: - // * the last absolute offset at which we drew this view - // * shifted to the right of the text offset - // * shifted to the top of the focus (so the line matches) - // * shifted top-left of the border+padding of the popup - let offset = self.last_offset.get(); - let offset = offset + (text_offset, 0); - let offset = offset.saturating_sub((0, focus)); - let offset = offset.saturating_sub::>(XY::new(2, 1)); - - // And now, we can return the callback that will create the popup. - EventResult::with_cb(move |s| { - // The callback will want to work with a fresh Rc - let tree = Rc::clone(&tree); - // We'll relativise the absolute position, - // So that we are locked to the parent view. - // A nice effect is that window resizes will keep both - // layers together. - let current_offset = s - .screen() - .layer_offset(LayerPosition::FromFront(0)) - .unwrap_or_else(Vec2::zero); - let offset = offset.signed() - current_offset; - // And finally, put the view in view! - s.screen_mut() - .add_layer_at(Position::parent(offset), MenuPopup::new(tree).focus(focus)); - }) - } - - // A popup view only does one thing: open the popup on Enter. - fn on_event_popup(&mut self, event: Event) -> EventResult { - match event { - // TODO: add Left/Right support for quick-switch? - Event::Key(Key::Enter) => self.open_popup(), - Event::Mouse { - event: MouseEvent::Release(MouseButton::Left), - position, - offset, - } if position.fits_in_rect(offset, self.last_size) => self.open_popup(), - _ => EventResult::Ignored, - } - } -} -#[allow(dead_code)] -impl CheckListView { - /// Convenient method to use the label as value. - pub fn add_item_str>(&mut self, label: S, checked: bool) { - let label = label.into(); - self.add_item(label.to_owned(), checked, label); - } - - /// Chainable variant of add_item_str - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// let select_view = CheckListView::new() - /// .item_str("Paris") - /// .item_str("New York") - /// .item_str("Tokyo"); - /// ``` - #[must_use] - pub fn item_str>(self, label: S) -> Self { - self.with(|s| s.add_item_str(label, false)) - } - - /// Convenient method to use the label as value. - pub fn insert_item_str(&mut self, index: usize, label: S) - where - S: Into, - { - let label = label.into(); - self.insert_item(index, label.to_owned(), false, label); - } - - /// Adds all strings from an iterator. - /// - /// # Examples - /// - /// ``` - /// # use cursive_core::views::CheckListView; - /// let mut select_view = CheckListView::new(); - /// select_view.add_all_str(vec!["a", "b", "c"]); - /// ``` - pub fn add_all_str(&mut self, iter: I) - where - S: Into, - I: IntoIterator, - { - for s in iter { - self.add_item_str(s, false); - } - } - - /// Adds all strings from an iterator. - /// - /// Chainable variant. - /// - /// # Examples - /// - /// ``` - /// use cursive_core::views::CheckListView; - /// - /// let text = "..."; // Maybe read some config file - /// - /// let select_view = CheckListView::new().with_all_str(text.lines()); - /// ``` - #[must_use] - pub fn with_all_str(self, iter: I) -> Self - where - S: Into, - I: IntoIterator, - { - self.with(|s| s.add_all_str(iter)) - } -} -#[allow(dead_code)] -impl CheckListView -where - T: Ord, -{ - /// Sort the current items by their natural ordering. - /// - /// Note that this does not change the current focus index, which means that the current - /// selection will likely be changed by the sorting. - /// - /// This sort is stable: items that are equal will not be reordered. - pub fn sort(&mut self) { - self.items.sort_by(|a, b| a.value.cmp(&b.value)); - } -} - -impl View for CheckListView { - fn draw(&self, printer: &Printer) { - self.last_offset.set(printer.offset); - - if self.popup { - // Popup-select only draw the active element. - // We'll draw the full list in a popup if needed. - let style = if !(self.enabled && printer.enabled) { - ColorStyle::secondary() - } else if printer.focused { - ColorStyle::highlight() - } else { - ColorStyle::primary() - }; - - let x = match printer.size.x.checked_sub(1) { - Some(x) => x, - None => return, - }; - - printer.with_color(style, |printer| { - // Prepare the entire background - printer.print_hline::>(XY::new(1, 0), x, " "); - // Draw the borders - printer.print::>(XY::new(0, 0), "<"); - printer.print::>(XY::new(x, 0), ">"); - - if let Some(label) = self.items.get(self.focus()).map(|item| &item.label) { - // And center the text? - let offset = HAlign::Center.get_offset(label.width(), x + 1); - - printer.print_styled(XY::new(offset, 0), SpannedStr::from(label)); - } - }); - } else { - // Non-popup mode: we always print the entire list. - let h = self.items.len(); - let offset = self.align.v.get_offset(h, printer.size.y); - let printer = &printer.offset((0, offset)); - - for i in 0..self.len() { - printer.offset::>((0, i).into()).with_selection( - i == self.focus(), - |printer| { - if i != self.focus() && !(self.enabled && printer.enabled) { - printer.with_color(ColorStyle::secondary(), |printer| { - self.draw_item(printer, i) - }); - } else { - self.draw_item(printer, i); - } - }, - ); - } - } - } - - fn required_size(&mut self, _: Vec2) -> Vec2 { - if let Some(s) = self.last_required_size { - return s; - } - // Items here are not compressible. - // So no matter what the horizontal requirements are, - // we'll still return our longest item. - let w = self - .items - .iter() - .map(|item| item.label.width() + 4) - .max() - .unwrap_or(1); - let size = if self.popup { - Vec2::new(w + 2, 1) - } else { - let h = self.items.len(); - - Vec2::new(w, h) - }; - self.last_required_size = Some(size); - size - } - - fn on_event(&mut self, event: Event) -> EventResult { - if !self.enabled { - return EventResult::Ignored; - } - - if self.popup { - self.on_event_popup(event) - } else { - self.on_event_regular(event) - } - } - - fn take_focus(&mut self, source: direction::Direction) -> Result { - (self.enabled && !self.items.is_empty()) - .then(|| { - if !self.popup { - match source { - direction::Direction::Abs(direction::Absolute::Up) => { - self.focus.set(0); - } - direction::Direction::Abs(direction::Absolute::Down) => { - self.focus.set(self.items.len().saturating_sub(1)); - } - _ => (), - } - } - EventResult::Consumed(None) - }) - .ok_or(CannotFocus) - } - - fn layout(&mut self, size: Vec2) { - self.last_size = size; - } - - fn important_area(&self, size: Vec2) -> Rect { - self.selected_id() - .map(|i| Rect::from_size((0, i), (size.x, 1))) - .unwrap_or_else(|| Rect::from_size(Vec2::zero(), size)) - } -} - -// We wrap each value in a `Rc` and add a label -struct Item { - label: StyledString, - checked: bool, - value: Rc, -} - -impl Item { - fn new(label: StyledString, checked: bool, value: T) -> Self { - let value = Rc::new(value); - Item { - label, - checked, - value, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn select_view_sorting() { - // We add items in no particular order, from going by their label. - let mut view = CheckListView::new(); - view.add_item_str("Y", false); - view.add_item_str("Z", false); - view.add_item_str("X", false); - - // Then sorting the list... - view.sort_by_label(); - - // ... should observe the items in sorted order. - // And focus is NOT changed by the sorting, so the first item is "X". - assert_eq!(view.selection(), Some((false, Rc::new(String::from("X"))))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((false, Rc::new(String::from("Y"))))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((false, Rc::new(String::from("Z"))))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((false, Rc::new(String::from("Z"))))); - } - - #[test] - fn select_view_sorting_with_comparator() { - // We add items in no particular order, from going by their value. - let mut view = CheckListView::new(); - view.add_item("Y", true, 2); - view.add_item("Z", true, 1); - view.add_item("X", true, 3); - - // Then sorting the list... - view.sort_by(|a, b| a.cmp(b)); - - // ... should observe the items in sorted order. - // And focus is NOT changed by the sorting, so the first item is "X". - assert_eq!(view.selection(), Some((true, Rc::new(1)))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((true, Rc::new(2)))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((true, Rc::new(3)))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((true, Rc::new(3)))); - } - - #[test] - fn select_view_sorting_by_key() { - // We add items in no particular order, from going by their key value. - #[derive(Eq, PartialEq, Debug)] - struct MyStruct { - key: i32, - } - - let mut view = CheckListView::new(); - view.add_item("Y", false, MyStruct { key: 2 }); - view.add_item("Z", true, MyStruct { key: 1 }); - view.add_item("X", false, MyStruct { key: 3 }); - - // Then sorting the list... - view.sort_by_key(|s| s.key); - - // ... should observe the items in sorted order. - // And focus is NOT changed by the sorting, so the first item is "X". - assert_eq!(view.selection(), Some((true, Rc::new(MyStruct { key: 1 })))); - view.on_event(Event::Key(Key::Down)); - assert_eq!( - view.selection(), - Some((false, Rc::new(MyStruct { key: 2 }))) - ); - view.on_event(Event::Key(Key::Down)); - assert_eq!( - view.selection(), - Some((false, Rc::new(MyStruct { key: 3 }))) - ); - view.on_event(Event::Key(Key::Down)); - assert_eq!( - view.selection(), - Some((false, Rc::new(MyStruct { key: 3 }))) - ); - } - - #[test] - fn select_view_sorting_orderable_items() { - // We add items in no particular order, from going by their value. - let mut view = CheckListView::new(); - view.add_item("Y", false, 2); - view.add_item("Z", false, 1); - view.add_item("X", false, 3); - - // Then sorting the list... - view.sort(); - - // ... should observe the items in sorted order. - // And focus is NOT changed by the sorting, so the first item is "X". - assert_eq!(view.selection(), Some((false, Rc::new(1)))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((false, Rc::new(2)))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((false, Rc::new(3)))); - view.on_event(Event::Key(Key::Down)); - assert_eq!(view.selection(), Some((false, Rc::new(3)))); - } -} diff --git a/src/chsr/cli.pest b/src/chsr/cli.pest new file mode 100644 index 00000000..9fa08d4d --- /dev/null +++ b/src/chsr/cli.pest @@ -0,0 +1,198 @@ +cli = { SOI ~ chsr ~ args ~ EOF } +args = { help | list | role | options_operations } + +chsr = _{ NOT_ESCAPE_QUOTE ~ name } +list = { ("show" | "list" | "l") } +set = { "set" | "s" } +add = { "add" | "create" } +del = { "del" | "delete" | "unset" | "d" | "rm"} +purge = { "purge" } +grant = { "grant" } +revoke = { "revoke" } +setpolicy = { "setpolicy" } +whitelist = { "whitelist" | "wl" } +blacklist = { "blacklist" | "bl" } +checklist = { "checklist" | "cl" } + +all = { "all" } + +name = @{ (!NOT_ESCAPE_QUOTE ~ ANY)+ } + + +// ======================== +// role +// ======================== + + +// chsr list (--all|--json) +// chsr r r1 create +// chsr r r1 delete +// chsr r r1 show (actors|tasks|all) +// chsr r r1 purge (actors|tasks|all) +// chsr r r1 grant -u user1 -g group1 group2&group3 +// chsr r r1 revoke -u user1 -g group1 group2&group3 + +role = { ("role" | "r") ~ roles_operations } +roles_operations = { purge | role_operations } + +role_operations = { role_id ~ ( add | del | role_show_purge | role_grant_revoke | tasks_operations | options_operations) } +role_id = @{ name } +role_grant_revoke = { (grant | revoke) ~ user_or_groups } +role_show_purge = { (list|purge) ~ role_type_arg? } +role_type_arg = @{ "actors" | "tasks" | all } + + +user_or_groups = { (user | group)+ } +user = ${ ("--user" ~ assignment? | "-u" ~ WHITESPACE) ~ actor_name } +group = ${ ("--group" ~ assignment? | "-g" ~ WHITESPACE) ~ name_combination } +name_combination = _{ actor_name ~ (("&" | ",") ~ name_combination) | actor_name } +actor_name = @{ (CASED_LETTER | "_") ~ ((CASED_LETTER | ASCII_DIGIT | "-" | "_"){,30} ~ "$" | (CASED_LETTER | ASCII_DIGIT | "-" | "_"){,31}) | ASCII_DIGIT+ } + +// ======================== +// task +// ======================== + +// chsr r r1 task t1 show (all|cmd|cred) +// chsr r r1 task t1 purge (all|cmd|cred) +// chsr r r1 t t1 add +// chsr r r1 t t1 del + +tasks_operations = { task_spec ~ (task_operations | options_operations) } +task_operations = { task_show_purge | add | del | command_operations | credentials_operations } +task_show_purge = { (list | purge) ~ task_type_arg? } +task_type_arg = { all | cmd_keyword | cred_keyword } + +task_spec = { task_keyword ~ task_id } +task_keyword = { ("task" | "t") } +task_id = @{ name } + +// ======================== +// command +// ======================== + +// chsr r r1 t t1 commands show +// chsr r r1 t t1 cmd setpolicy (deny-all|allow-all) +// chsr r r1 t t1 cmd (whitelist|blacklist) (add|del) c1 + +cmd_keyword = { ("command" | "cmd") } +command_operations = _{ cmd_keyword ~ ((cmd_setpolicy | cmd_checklisting) | list) } +cmd_setpolicy = { setpolicy ~ cmd_policy } +cmd_policy = { "allow-all" | "deny-all" } + +cmd_checklisting = { (whitelist | blacklist) ~ (add | del) ~ cmd } +cmd = @{ name } + +// ======================== +// credentials +// ======================== + +// chsr r r1 t t1 credentials show +// chsr r r1 t t1 cred (unset|set) --caps cap1,cap2,cap3 --setuid user1 --setgid group1,group2 + +cred_keyword = { ("credentials" | "cred") } +credentials_operations = _{ cred_keyword ~ (cred_set_operations | cred_caps_operations | list) } +cred_set_operations = _{ (set | del) ~ cred_set_args } +cred_set_args = _{ + (cred_c | cred_u | cred_g)+ + | help +} +cred_c = { ("--caps" ~ assignment? | "-c" ~ WHITESPACE) ~ capabilities? } +cred_u = { ("--setuid" ~ assignment? | "-u" ~ WHITESPACE) ~ actor_name } +cred_g = { ("--setgid" ~ assignment? | "-g" ~ WHITESPACE) ~ name_combination } + +capabilities = _{ capability ~ ("," | WHITESPACE) ~ capabilities | capability} +capability = { "CAP_"? ~ (LETTER | "_")+ } + + +// chsr r r1 t t1 cred caps setpolicy (deny-all|allow-all) +// chsr r r1 t t1 cred caps (whitelist|blacklist) (add|del) cap1 cap2 cap3 +cred_caps_operations = _{ "caps" ~ (caps_setpolicy | caps_listing) } +caps_setpolicy = _{ setpolicy ~ cmd_policy } +caps_policy = @{ cmd_policy } +caps_listing = { (whitelist | blacklist) ~ (add | del) ~ capabilities } + +// ======================== +// options +// ======================== + +// chsr (r r1) (t t1) options show (all|path|env|root|bounding|wildcard-denied) +// chsr o path set /usr/bin:/bin this regroups setpolicy delete and whitelist set +// chsr o path setpolicy (delete-all|keep-all|inherit) +// chsr o path (whitelist|blacklist) (add|del|set|purge) /usr/bin:/bin + +// chsr o env set MYVAR=1 VAR2=2 //this regroups setpolicy delete and whitelist set +// chsr o env setpolicy (delete-all|keep-all|inherit) +// chsr o env (whitelist|blacklist|checklist) (add|del|set|purge) MYVAR=1 + +// chsr o root (privileged|user|inherit) +// chsr o bounding (strict|ignore|inherit) +// chsr o wildcard-denied (set|add|del) * + +// chsr o timeout set --type tty --duration 5:00 --max_usage 1 +// chsr o t unset --type --duration --max_usage + +options_operations = _{ ("options" | "o") ~ opt_args } +opt_args = _{ opt_show | opt_path | opt_env | opt_root | opt_bounding | opt_wildcard | opt_timeout } + +opt_show = _{ list ~ opt_show_arg? } +opt_show_arg = { "all" | "cmd" | "cred" | "env" | "root" | "bounding" | "wildcard-denied" | "timeout" } + +opt_path = _{ "path" ~ (opt_path_args | help) } +opt_path_args = _{ opt_path_set | opt_path_setpolicy | opt_path_listing } +opt_path_set = _{ set ~ path } +opt_path_setpolicy = _{ setpolicy ~ path_policy } +path_policy = { "delete-all" | "keep-safe" | "keep-unsafe" | "inherit" } +opt_path_listing = { (whitelist | blacklist) ~ (((add | del | set) ~ path) | purge) } +path = @{ name } + +opt_env = _{ "env" ~ (opt_env_args | help) } +opt_env_args = _{ opt_env_set | opt_env_setpolicy | opt_env_listing } +opt_env_setpolicy = _{ setpolicy ~ env_policy } +env_policy = { "delete-all" | "keep-all" | "inherit" } +opt_env_listing = { (whitelist | blacklist | checklist) ~ (((add | del | set) ~ env) | purge) } +opt_env_set = _{ set ~ env_list } +env_list = _{ env ~ (("," | WHITESPACE) ~ env_list) | env } + +env = { env_key ~ assignment ~ env_value } +env_key = { (CASED_LETTER | "_") ~ (CASED_LETTER | ASCII_DIGIT | "-" | "_")+ } +env_value = @{ name } + +opt_root = _{ "root" ~ (opt_root_args | help) } +opt_root_args = _{ "privileged" | "user" | "inherit" } + +opt_bounding = _{ "bounding" ~ (opt_bounding_args | help) } +opt_bounding_args = _{ "strict" | "ignore" | "inherit" } + +opt_wildcard = _{ "wildcard-denied" ~ (opt_wildcard_args | help) } +opt_wildcard_args = _{ (add | del | set) ~ wildcard_value } +wildcard_value = { name } + + + +opt_timeout = { ("timeout" | "t") ~ opt_timeout_operations } +opt_timeout_operations = { (set | del) ~ opt_timeout_args } + +opt_timeout_args = _{ + opt_timeout_t_arg ~ (opt_timeout_d_arg ~ opt_timeout_m_arg? | opt_timeout_m_arg ~ opt_timeout_d_arg?)? + | opt_timeout_d_arg ~ (opt_timeout_t_arg ~ opt_timeout_m_arg? | opt_timeout_m_arg ~ opt_timeout_t_arg?)? + | opt_timeout_m_arg ~ (opt_timeout_t_arg ~ opt_timeout_d_arg? | opt_timeout_d_arg ~ opt_timeout_t_arg?)? +} +opt_timeout_t_arg = ${ ("--type" ~ assignment? | "-t" ~ WHITESPACE*) ~ opt_timeout_type? } +opt_timeout_type = { "tty" | "ppid" | "uid" } +opt_timeout_d_arg = { ("--duration" ~ assignment? | "-d" ~ WHITESPACE*) ~ time? } +time = _{ (hours~colon)? ~ minutes ~ colon ~ seconds | (minutes~colon)? ~ seconds } +colon = _{ ":"} +hours = { ASCII_DIGIT+ } +minutes = { ASCII_DIGIT+ } +seconds = { ASCII_DIGIT+ } +opt_timeout_m_arg = { ("--max-usage" ~ assignment? | "-m" ~ WHITESPACE*) ~ opt_timeout_max_usage? } +opt_timeout_max_usage = { ASCII_DIGIT+ } + + +assignment = _{ "=" | WHITESPACE } +help = { "-h" | "--help" } + +NOT_ESCAPE_QUOTE = @{ !"\\" ~ "\"" } + +WHITESPACE = _{ NOT_ESCAPE_QUOTE~SEPARATOR~NOT_ESCAPE_QUOTE } +EOF = @{ NOT_ESCAPE_QUOTE ~ EOI } diff --git a/src/chsr/cli.rs b/src/chsr/cli.rs index 990301fe..1c593de0 100644 --- a/src/chsr/cli.rs +++ b/src/chsr/cli.rs @@ -1,399 +1,770 @@ -use std::error::Error; -use clap::{Parser, Subcommand, ValueEnum}; +use std::{cell::RefCell, ops::Deref, process::ExitCode, rc::Rc, str::FromStr, time::Duration}; -use crate::rolemanager::RoleContext; +use capctl::{Cap, CapSet}; +use pest::{iterators::Pair, Parser}; +use pest_derive::Parser; +use tracing::{debug, error, warn}; -//chsr newrole "role1" --user "user1" --group "group1" "group2" -//chsr addtask "role1" --cmds "command1" --caps "cap_dac_override,cap_dac_read_search" -//chsr addtask "role1" --with-id "myid" --cmds "command2" --caps "cap_dac_override" - -//chsr deltask "role1" "myid" - -//chsr grant "role1" --user "user1" --group "group1,group2" -//chsr revoke "role1" --user "user1" - -//chsr delrole "role1" +use crate::common::{ + config::Storage, + database::{ + options::{ + EnvBehavior, Level, OptStack, OptType, PathBehavior, SBounding, SPrivileged, + TimestampType, + }, + structs::{ + IdTask, SActor, SActorType, SGroups, SetBehavior, + }, + }, +}; -//chsr config --role "role1" --task "myid" --path "/usr/bin:/bin" -//chsr config --role "role1" --env "MYVAR=1" -//chsr config --allow-bounding false +#[derive(Parser)] +#[grammar = "chsr/cli.pest"] +struct Cli; -#[derive(Parser, Debug)] -#[command( - about = "Configure Roles for RootAsRole", - long_about = "Role Manager is a tool to configure RBAC for RootAsRole. +const RAR_SHORT_DESC: &str = "Configure Roles for RootAsRole"; +const LONG_ABOUT: &str = "Role Manager is a tool to configure RBAC for RootAsRole. A role is a set of tasks that can be executed by a user or a group of users. These tasks are multiple commands associated with their permissions (capabilities). Like Sudo, you could manipulate environment variables, PATH, and other options. -But Sudo is not designed to use permissions for commands." -)] -struct Cli { - #[command(subcommand)] - command: Option, +But Sudo is not designed to use permissions for commands."; + +#[derive(Debug)] +enum RoleType { + All, + Actors, + Tasks, } -#[derive(ValueEnum, Debug, Clone, PartialEq, Eq)] // ArgEnum here -#[clap(rename_all = "kebab_case")] -enum Action { +#[derive(Debug)] +enum TaskType { + All, + Commands, + Credentials, +} + +#[derive(Debug)] +enum InputAction { + Help, + List, + Set, Add, Del, Purge, - Set, - List, } -#[derive(ValueEnum, Debug, Clone, PartialEq, Eq)] // ArgEnum here -#[clap(rename_all = "kebab_case")] -enum Manage { - Grant, - Revoke, - Purge, - Set, - List, +#[derive(Debug)] +enum SetListType { + WhiteList, + BlackList, + CheckList, } -#[derive(Subcommand, Debug, PartialEq, Eq)] -enum CCommand { - /// Manipulate role, you can add users, groups, tasks. You can assign tasks through the command "addtask" - #[command(name = "role")] - Role { - /// WARNING! Purge == remove all roles on the config - #[arg(value_enum)] - action: Action, - /// Always Confirm dangerous action if set - #[arg(short)] - yes: bool, - - /// Role name - role: String, - /// Add users to role, multiple users can be added by multiple -u - #[arg(short, long)] - user: Option>, - /// Add groups to role, multiple groups can be added by multiple -g, - /// Group combinaison can be done by separating groups with a comma, - /// Example: -g group1 -g group2,group3 - #[arg(short, long)] - group: Option>, - }, - - /// Manipulate users assigned to roles - #[command(name = "actors")] - Actors { - /// Purge == remove all users and groups from role - #[arg(value_enum)] - action: Manage, - /// Always Confirm dangerous action if set - #[arg(short)] - yes: bool, - - /// Role name - role: String, - /// Add users to role, multiple users can be added by multiple -u - #[arg(short, long)] - user: Option>, - /// Add groups to role, multiple groups can be added by multiple -g, - /// Group combinaison can be done by separating groups with a comma, - /// Example: -g group1 -g group2,group3 - #[arg(short, long)] - group: Option>, - }, - - /// Add a task to a role, you can add commands and capabilities - #[command(name = "task")] - Task { - /// WARNING! Purge == remove all tasks from role - #[arg(value_enum)] - action: Action, - /// Always Confirm dangerous action if set - #[arg(short)] - yes: bool, - - role: String, - #[arg(short = 't', long)] - id: Option, - }, - /// Perform action on command entries to a task - #[command(name = "cmd")] - Cmd { - /// WARNING! Purge == remove all commands from task, and set all_cmd to false - #[arg(value_enum)] - action: Action, - /// Always Confirm dangerous action if set - #[arg(short)] - yes: bool, - - role: String, - task_id: String, - /// If set, all commands are allowed. This option is exclusive with whitelist - #[arg(short, long)] - all_cmd: bool, - /// append whitelisted commands - #[arg(short, long)] - whitelist: Option>, - /// append blacklisted commands - #[arg(short, long)] - blacklist: Option>, - }, +#[derive(Debug)] +struct Inputs { + action: InputAction, + setlist_type: Option, + timeout_type: Option, + timeout_duration: Option, + timeout_max_usage: Option, + role_id: Option, + role_type: Option, + actors: Vec, + task_id: Option, + task_type: Option, + cmd_policy: Option, + cmd_id: Option, + cred_caps: Option, + cred_setuid: Option, + cred_setgid: Option, + cred_policy: Option, + options: bool, + options_type: Option, + options_path: Option, + options_path_policy: Option, + options_env: Option>, + options_env_policy: Option, + options_root: Option, + options_bounding: Option, + options_wildcard: Option, +} - #[command(name = "cred")] - Cred { - /// Purge == remove all credentials from task, the task will be executable as executor user without privileges. - #[arg(value_enum)] - action: Action, - /// Always Confirm dangerous action if set - #[arg(short)] - yes: bool, +impl Default for Inputs { + fn default() -> Self { + Inputs { + action: InputAction::Help, + setlist_type: None, + timeout_type: None, + timeout_duration: None, + timeout_max_usage: None, + role_id: None, + role_type: None, + actors: Vec::new(), + task_id: None, + task_type: None, + cmd_policy: None, + cmd_id: None, + cred_caps: None, + cred_setuid: None, + cred_setgid: None, + cred_policy: None, + options: false, + options_type: None, + options_path: None, + options_path_policy: None, + options_env: None, + options_env_policy: None, + options_root: None, + options_bounding: None, + options_wildcard: None, + } + } +} - role: String, - task_id: String, - /// Set capabilities to task - /// Format: cap1 cap2 cap3 - /// Or : all- cap1 cap2 - #[arg(short, long)] - caps: Option, - /// Setuid applied to task - #[arg(short, long)] - setuid: Option, - /// Setgid applied to task - #[arg(short, long)] - setgid: Option, - }, - #[command(name = "config")] - Config { - /// WARNING! Purge == purges global, role or task config considering the options you set - #[arg(value_enum)] - action: Action, - /// Always Confirm dangerous action if set - #[arg(short)] - yes: bool, - #[arg(short, long)] - /// Role name - role: Option, - #[arg(short, long)] - /// Task id or index in the list - task: Option, - /// Set PATH environment variable - #[arg(long)] - path: Option, - /// Keep environment variables without changing them - #[arg(long)] - env_keep: Option, - /// Keep environment variables if they are valid - #[arg(long)] - env_check: Option, - /// When false, capabilties are permanently dropped, when true, process can regain them (with sudo as example) - #[arg(long)] - allow_bounding: Option, - /// When false, root is disabled, when true, root is enabled - #[arg(long)] - allow_root: Option, - /// When you configure command with wildcard, you can except chars of wildcard match - #[arg(long)] - wildcard_denied: Option, - }, - /// NOT IMPLEMENTED: Import sudoers file - Import { - /// Import sudoers file as RootAsRole roles - file: String, - }, +fn recurse_pair(pair: Pair, inputs: &mut Inputs) { + for inner_pair in pair.into_inner() { + match_pair(&inner_pair, inputs); + recurse_pair(inner_pair, inputs); + } } -fn perform_option_command( - manager: &mut RoleContext, - action: Action, - opttype: OptType, - value: OptValue, -) { - match action { - Action::Add => { - let mut optvalue = manager.get_options().get_from_type(opttype); - match value { - OptValue::String(s) => { - optvalue.1.as_string().push_str(&s); - } - OptValue::VecString(v) => { - optvalue.1.as_vec_string().extend(v.0); - } - OptValue::Bool(b) => { - optvalue.1 = OptValue::Bool(value.as_bool()); - } +fn match_pair(pair: &Pair, inputs: &mut Inputs) { + match pair.as_rule() { + Rule::help => { + inputs.action = InputAction::Help; + } + Rule::list => { + inputs.action = InputAction::List; + } + Rule::set => { + inputs.action = InputAction::Set; + } + Rule::add => { + inputs.action = InputAction::Add; + } + Rule::del => { + inputs.action = InputAction::Del; + } + Rule::purge => { + inputs.action = InputAction::Purge; + } + Rule::whitelist => { + inputs.setlist_type = Some(SetListType::WhiteList); + } + Rule::blacklist => { + inputs.setlist_type = Some(SetListType::BlackList); + } + Rule::checklist => { + inputs.setlist_type = Some(SetListType::CheckList); + } + // === setpolicies === + Rule::cmd_policy => { + if pair.as_str() == "deny-all" { + inputs.cmd_policy = Some(SetBehavior::None); + } else if pair.as_str() == "allow-all" { + inputs.cmd_policy = Some(SetBehavior::All); + } else { + warn!("Unknown cmd policy: {}", pair.as_str()) } - manager.get_options().set_value(opttype, Some(optvalue.1)); } - Action::Del => { - let mut optvalue = manager.get_options().get_from_type(opttype); - match value { - OptValue::String(s) => { - optvalue.1 = OptValue::String(optvalue.1.as_string().replace(&s, "")); - } - OptValue::VecString(v) => { - optvalue.1.as_vec_string().retain(|x| !v.0.contains(x)); - } - OptValue::Bool(b) => { - manager.get_options().set_value(opttype, None); - return; - } + Rule::caps_policy => { + if pair.as_str() == "deny-all" { + inputs.cred_policy = Some(SetBehavior::None); + } else if pair.as_str() == "allow-all" { + inputs.cred_policy = Some(SetBehavior::All); + } else { + warn!("Unknown cmd policy: {}", pair.as_str()) } - manager.get_options().set_value(opttype, Some(optvalue.1)); } - Action::Purge => { - manager.get_options().unset_value(opttype); + Rule::path_policy => { + if pair.as_str() == "delete-all" { + inputs.options_path_policy = Some(PathBehavior::Delete); + } else if pair.as_str() == "keep-safe" { + inputs.options_path_policy = Some(PathBehavior::KeepSafe); + } else if pair.as_str() == "keep-unsafe" { + inputs.options_path_policy = Some(PathBehavior::KeepUnsafe); + } else if pair.as_str() == "inherit" { + inputs.options_path_policy = Some(PathBehavior::Inherit); + } else { + warn!("Unknown path policy: {}", pair.as_str()) + } } - Action::Set => { - manager.get_options().set_value(opttype, Some(value)); + Rule::env_policy => { + if pair.as_str() == "delete-all" { + inputs.options_env_policy = Some(EnvBehavior::Delete); + } else if pair.as_str() == "keep-all" { + inputs.options_env_policy = Some(EnvBehavior::Keep); + } else if pair.as_str() == "inherit" { + inputs.options_env_policy = Some(EnvBehavior::Inherit); + } else { + warn!("Unknown env policy: {}", pair.as_str()) + } } - Action::List => { - let paths = manager.get_options().get_from_type(opttype); - match paths.1 { - OptValue::String(s) => { - println!("{} = {}", opttype, s); - } - OptValue::VecString(v) => { - println!("{} = {}", opttype, v.0.join(&v.1)); - } - OptValue::Bool(b) => { - println!("{} = {}", opttype, b); - } + // === timeout === + Rule::opt_timeout_d_arg => { + let mut reversed = pair.as_str().split(':').rev(); + let mut duration: Duration = + Duration::from_secs(reversed.nth(0).unwrap().parse::().unwrap()); + if let Some(mins) = reversed.nth(1) { + duration += Duration::from_secs(mins.parse::().unwrap() * 60); + } + if let Some(hours) = reversed.nth(2) { + duration += Duration::from_secs(hours.parse::().unwrap() * 3600); } + inputs.timeout_duration = Some(duration); } - } -} - -/** - * Parse the command line arguments - */ -pub fn parse_args(manager: &mut RoleContext) -> Result> { - let args = Cli::parse(); - match args.command.as_ref() { - Some(CCommand::Role { - action, - yes, - role, - user, - group, - }) => { - Ok(true) - } - Some(CCommand::Actors { - action, - yes, - role, - user, - group, - }) => { - Ok(true) - } - Some(CCommand::Task { - action, - yes, - role, - id, - }) => { - Ok(true) - } - Some(CCommand::Cmd { - action, - yes, - role, - task_id, - all_cmd, - whitelist, - blacklist, - }) => { - Ok(true) - } - Some(CCommand::Cred { - action, - yes, - role, - task_id, - caps, - setuid, - setgid, - }) => { - Ok(true) + Rule::opt_timeout_t_arg => { + if pair.as_str() == "tty" { + inputs.timeout_type = Some(TimestampType::TTY); + } else if pair.as_str() == "ppid" { + inputs.timeout_type = Some(TimestampType::PPID); + } else if pair.as_str() == "uid" { + inputs.timeout_type = Some(TimestampType::UID); + } else { + warn!("Unknown timeout type: {}", pair.as_str()) + } } - - Some(CCommand::Config { - action, - yes, - role, - task, - path, - env_keep, - env_check, - allow_bounding, - allow_root, - wildcard_denied, - }) => { - if let Some(role) = role.as_ref() { - manager.select_role_by_name(role)?; + Rule::opt_timeout_m_arg => { + inputs.timeout_max_usage = Some(pair.as_str().parse::().unwrap()); + } + // === roles === + Rule::role_id => { + inputs.role_id = Some(pair.as_str().to_string()); + } + Rule::role_type_arg => { + if pair.as_str() == "all" { + inputs.role_type = Some(RoleType::All); + } else if pair.as_str() == "actors" { + inputs.role_type = Some(RoleType::Actors); + } else if pair.as_str() == "tasks" { + inputs.role_type = Some(RoleType::Tasks); + } else { + warn!("Unknown role type: {}", pair.as_str()) } - if let Some(task) = task { - let tid = match task.parse::() { - Ok(id) => IdTask::Number(id), - Err(_) => IdTask::Name(task.to_string()), - }; - manager.select_task_by_id(&tid)?; + } + // === actors === + Rule::user => { + inputs.actors.push(SActor::from_user_string( + pair.clone().into_inner().nth(0).unwrap().as_str(), + )); + } + Rule::group => { + inputs.actors.push(SActor::from_group_vec_actors( + pair.clone() + .into_inner() + .map(|p| p.as_str().into()) + .collect(), + )); + } + // === tasks === + Rule::task_id => { + inputs.task_id = Some(IdTask::Name(pair.as_str().to_string())); + } + Rule::task_type_arg => { + if pair.as_str() == "all" { + inputs.task_type = Some(TaskType::All); + } else if pair.as_str() == "commands" || pair.as_str() == "cmds" { + inputs.task_type = Some(TaskType::Commands); + } else if pair.as_str().starts_with("cred") { + inputs.task_type = Some(TaskType::Credentials); + } else { + warn!("Unknown role type: {}", pair.as_str()) } - if let Some(path) = path { - perform_option_command( - manager, - action.to_owned(), - OptType::Path, - OptValue::from_str_vec(OptType::Path, path.to_string()), - ); + } + // === commands === + Rule::cmd => { + inputs.cmd_id = Some(pair.as_str().to_string()); + } + // === credentials === + Rule::capability => { + if inputs.cred_caps.is_none() { + let caps = CapSet::empty(); + inputs.cred_caps = Some(caps); } - if let Some(env_keep) = env_keep { - perform_option_command( - manager, - action.to_owned(), - OptType::EnvWhitelist, - OptValue::from_str_vec(OptType::EnvWhitelist, env_keep.to_string()), - ); + if let Ok(cap) = Cap::from_str(pair.as_str()) { + inputs.cred_caps.as_mut().unwrap().add(cap); + } else { + warn!("Unknown capability: {}", pair.as_str()) } - if let Some(env_check) = env_check { - perform_option_command( - manager, - action.to_owned(), - OptType::EnvChecklist, - OptValue::from_str_vec(OptType::EnvChecklist, env_check.to_string()), - ); + } + Rule::cred_u => { + inputs.cred_setuid = Some(pair.as_str().into()); + } + Rule::cred_g => { + let mut vec: Vec = Vec::new(); + for pair in pair.clone().into_inner() { + if pair.as_rule() == Rule::actor_name { + vec.push(pair.as_str().into()); + } } - if let Some(allow_bounding) = allow_bounding { - perform_option_command( - manager, - action.to_owned(), - OptType::Bounding, - OptValue::Bool(allow_bounding.to_owned()), - ); + if vec.is_empty() { + warn!("No group specified"); } - if let Some(allow_root) = allow_root { - perform_option_command( - manager, - action.to_owned(), - OptType::NoRoot, - OptValue::Bool(allow_root.to_owned()), - ); + if vec.len() == 1 { + inputs.cred_setgid = Some(SGroups::Single(vec[0].clone())); + } else { + inputs.cred_setgid = Some(SGroups::Multiple(vec)); + } + } + // === options === + Rule::opt_show => { + inputs.options = true; + } + Rule::opt_env_listing => { + inputs.options_type = Some(OptType::Env); + } + Rule::opt_path_listing => { + inputs.options_type = Some(OptType::Path); + } + Rule::opt_show_arg => { + if pair.as_str() == "all" { + inputs.options_type = None; + } else if pair.as_str() == "path" { + inputs.options_type = Some(OptType::Path); + } else if pair.as_str() == "env" { + inputs.options_type = Some(OptType::Env); + } else if pair.as_str() == "root" { + inputs.options_type = Some(OptType::Root); + } else if pair.as_str() == "bounding" { + inputs.options_type = Some(OptType::Bounding); + } else if pair.as_str() == "wildcard" { + inputs.options_type = Some(OptType::Wildcard); + } else if pair.as_str() == "timeout" { + inputs.options_type = Some(OptType::Timeout); + } else { + warn!("Unknown option type: {}", pair.as_str()) + } + } + Rule::path => { + inputs.options_path = Some(pair.as_str().to_string()); + } + Rule::env => { + if inputs.options_env.is_none() { + inputs.options_env = Some(Vec::new()); + } + let mut inner = pair.clone().into_inner(); + let key = inner.nth(0).unwrap().as_str().to_string(); + let value = inner.nth(2).unwrap().as_str().to_string(); + inputs.options_env.as_mut().unwrap().push((key, value)); + } + Rule::opt_root_args => { + if pair.as_str() == "privileged" { + inputs.options_root = Some(SPrivileged::Privileged); + } else if pair.as_str() == "user" { + inputs.options_root = Some(SPrivileged::User); + } else if pair.as_str() == "inherit" { + inputs.options_root = Some(SPrivileged::Inherit); + } else { + warn!("Unknown root type: {}", pair.as_str()); + } + } + Rule::opt_bounding_args => { + if pair.as_str() == "strict" { + inputs.options_bounding = Some(SBounding::Strict); + } else if pair.as_str() == "ignore" { + inputs.options_bounding = Some(SBounding::Ignore); + } else if pair.as_str() == "inherit" { + inputs.options_bounding = Some(SBounding::Inherit); + } else { + warn!("Unknown bounding type: {}", pair.as_str()); + } + } + Rule::wildcard_value => { + inputs.options_wildcard = Some(pair.as_str().to_string()); + } + _ => { + debug!("Unmatched rule: {:?}", pair.as_rule()); + } + } +} + +fn rule_to_string(rule: &Rule) -> String { + match *rule { + Rule::EOF => "no more input", + Rule::args => "role, options, timeout or --help", + Rule::opt_timeout_operations => "timeout set/unset operations", + Rule::opt_timeout_d_arg => "--duration (hh:mm:ss)", + Rule::opt_timeout_t_arg => "--type (tty, ppid, uid)", + Rule::opt_timeout_m_arg => "--max-usage (\\d+)", + Rule::roles_operations => "roles list/purge/add/del operations or existing role name", + Rule::role_type_arg => "all, actors or tasks", + Rule::role_grant_revoke => "grant, revoke", + Rule::role_show_purge => "show, purge", + Rule::task_keyword => "task", + Rule::task_id => "task identifier", + Rule::command_operations => "cmd", + Rule::credentials_operations => "cred", + Rule::cmd_checklisting => "whitelist, blacklist", + Rule::cmd_policy => "allow-all or deny-all", + Rule::cmd => "a command line", + Rule::cred_c => "--caps \"cap_net_raw, cap_sys_admin, ...\"", + Rule::cred_g => "--group \"g1,g2\"", + Rule::cred_u => "--user \"u1\"", + Rule::cred_caps_operations => "caps", + Rule::EOI => "end of input", + Rule::cli => "a command line", + Rule::chsr => unreachable!(), + Rule::list => todo!(), + Rule::set => todo!(), + Rule::add => todo!(), + Rule::del => todo!(), + Rule::purge => todo!(), + Rule::grant => todo!(), + Rule::revoke => todo!(), + Rule::setpolicy => todo!(), + Rule::whitelist => todo!(), + Rule::blacklist => todo!(), + Rule::checklist => todo!(), + Rule::all => todo!(), + Rule::name => todo!(), + Rule::opt_timeout => todo!(), + Rule::opt_timeout_args => todo!(), + Rule::opt_timeout_type => todo!(), + Rule::time => todo!(), + Rule::colon => todo!(), + Rule::hours => todo!(), + Rule::minutes => todo!(), + Rule::seconds => todo!(), + Rule::opt_timeout_max_usage => todo!(), + Rule::role => todo!(), + Rule::role_operations => todo!(), + Rule::role_id => todo!(), + Rule::user_or_groups => todo!(), + Rule::user => todo!(), + Rule::group => todo!(), + Rule::name_combination => todo!(), + Rule::actor_name => todo!(), + Rule::tasks_operations => todo!(), + Rule::task_operations => todo!(), + Rule::task_show_purge => todo!(), + Rule::task_type_arg => todo!(), + Rule::task_spec => todo!(), + Rule::cmd_keyword => todo!(), + Rule::cmd_setpolicy => todo!(), + Rule::cred_keyword => todo!(), + Rule::cred_set_operations => todo!(), + Rule::cred_set_args => todo!(), + Rule::capabilities => todo!(), + Rule::capability => todo!(), + Rule::caps_setpolicy => todo!(), + Rule::caps_policy => todo!(), + Rule::caps_listing => todo!(), + Rule::options_operations => todo!(), + Rule::opt_args => todo!(), + Rule::opt_show => todo!(), + Rule::opt_show_arg => todo!(), + Rule::opt_path => todo!(), + Rule::opt_path_args => todo!(), + Rule::opt_path_set => todo!(), + Rule::opt_path_setpolicy => todo!(), + Rule::path_policy => todo!(), + Rule::opt_path_listing => todo!(), + Rule::path => todo!(), + Rule::opt_env => todo!(), + Rule::opt_env_args => todo!(), + Rule::opt_env_setpolicy => todo!(), + Rule::env_policy => todo!(), + Rule::opt_env_listing => todo!(), + Rule::opt_env_set => todo!(), + Rule::env_list => todo!(), + Rule::env => todo!(), + Rule::env_key => todo!(), + Rule::env_value => todo!(), + Rule::opt_root => todo!(), + Rule::opt_root_args => todo!(), + Rule::opt_bounding => todo!(), + Rule::opt_bounding_args => todo!(), + Rule::opt_wildcard => todo!(), + Rule::opt_wildcard_args => todo!(), + Rule::wildcard_value => todo!(), + Rule::assignment => todo!(), + Rule::help => todo!(), + Rule::NOT_ESCAPE_QUOTE => todo!(), + Rule::WHITESPACE => todo!(), + _ => todo!(), + } + .to_string() +} + +fn print_role( + role: &std::rc::Rc>, + role_type: &RoleType, +) { + println!("Role: {}", role.as_ref().borrow().name); + match role_type { + RoleType::All => { + println!("{}", serde_json::to_string_pretty(&role).unwrap()); + } + RoleType::Actors => { + println!( + "{}", + serde_json::to_string_pretty(&role.as_ref().borrow().actors).unwrap() + ); + } + RoleType::Tasks => { + println!( + "{}", + serde_json::to_string_pretty(&role.as_ref().borrow().tasks).unwrap() + ); + } + } +} + +pub fn main(storage: &Storage) -> ExitCode { + let binding = std::env::args().fold("\"".to_string(), |mut s, e| { + s.push_str(&e); + s.push_str("\" \""); + s + }); + let args = binding.trim_end_matches(" \""); + let args = Cli::parse(Rule::cli, &args); + let args = match args { + Ok(v) => v, + Err(e) => { + let e = e.clone().renamed_rules(|rule| rule_to_string(rule)); + println!("{UNDERLINE}{BOLD}Usage:{RST} {BOLD}chsr{RST} [command] [options] + +{UNDERLINE}{BOLD}Commands:{RST} + {BOLD}help, -h, --help{RST} Show help for commands and options. + {BOLD}list, show, l{RST} List available items; use with specific commands for detailed views. + {BOLD}role, r{RST} Manage roles and related operations. + +{UNDERLINE}{BOLD}Role Operations:{RST} + chsr role [role_name] [operation] [options] + {BOLD}add, create{RST} Add a new role. + {BOLD}del, delete, unset, d, rm{RST} Delete a specified role. + {BOLD}show, list, l{RST} Show details of a specified role (actors, tasks, all). + {BOLD}purge{RST} Remove all items from a role (actors, tasks, all). + + {BOLD}grant{RST} Grant permissions to a user or group. + {BOLD}revoke{RST} Revoke permissions from a user or group. + {BOLD}-u, --user{RST} [user_name] Specify a user for grant or revoke operations. + {BOLD}-g, --group{RST} [group_names] Specify one or more groups for grant or revoke operations. + +{UNDERLINE}{BOLD}Task Operations:{RST} + chsr role [role_name] task [task_name] [operation] + show, list, l{RST} Show task details (all, cmd, cred). + purge{RST} Purge configurations or credentials of a task (all, cmd, cred). + add, create{RST} Add a new task. + del, delete, unset, d, rm{RST} Remove a task. + +{UNDERLINE}{BOLD}Command Operations:{RST} + chsr role [role_name] task [task_name] command [cmd] + {BOLD}show{RST} Show commands. + {BOLD}setpolicy{RST} [policy] Set policy for commands (allow-all, deny-all). + {BOLD}whitelist, wl{RST} Manage the whitelist for commands. + {BOLD}blacklist, bl{RST} Manage the blacklist for commands. + +{UNDERLINE}{BOLD}Credentials Operations:{RST} + chsr role [role_name] task [task_name] credentials [operation] + {BOLD}show{RST} Show credentials. + {BOLD}set, unset{RST} Set or unset credentials details. + {BOLD}whitelist, wl{RST} Manage whitelist for credentials. + {BOLD}blacklist, bl{RST} Manage blacklist for credentials. + +{UNDERLINE}{BOLD}Options:{RST} + chsr options [option] [operation] + chsr role [role_name] options [option] [operation] + chsr role [role_name] task [task_name] options [option] [operation] + {BOLD}path{RST} Manage path settings (set, whitelist, blacklist). + {BOLD}env{RST} Manage environment variable settings (set, whitelist, blacklist, checklist). + {BOLD}root{RST} Set root options (privileged, user, inherit). + {BOLD}bounding{RST} Set bounding options (strict, ignore, inherit). + {BOLD}wildcard-denied{RST} Manage settings for denied wildcards (add, set, del). + {BOLD}timeout{RST} Manage timeout settings (set, unset). + +Timeout: + chsr timeout [operation] + {BOLD}set, unset{RST} Set or unset timeout settings. + {BOLD}--type{RST} [tty, ppid, uid] Specify the type of timeout. + {BOLD}--duration{RST} [HH:MM:SS] Specify the duration of the timeout. + {BOLD}--max-usage{RST} [number] Specify the maximum usage of the timeout. + +{UNDERLINE}{BOLD}Note: Use '-h' or '--help' with any command to get more detailed help about that specific command.{RST} +", UNDERLINE = "\x1B[4m", BOLD = "\x1B[1m", RST = "\x1B[0m"); + println!("Unrecognized input:\n{}", e.to_string()); + return ExitCode::FAILURE; + } + }; + let mut inputs = Inputs::default(); + for pair in args { + recurse_pair(pair, &mut inputs); + } + + match inputs { + Inputs { + action: InputAction::Help, + .. + } => { + println!("{}", LONG_ABOUT); + ExitCode::SUCCESS + } + Inputs { + action: InputAction::List, + options, // show options ? + role_id, + role_type, + task_id, + task_type, // what to show + options_type, // in json + .. + } => match storage { + Storage::JSON(rconfig) => list_json( + rconfig, + role_id, + task_id, + options, + options_type, + task_type, + role_type, + ), + _ => { + error!("Unsupported storage method"); + ExitCode::FAILURE } - if let Some(wildcard_denied) = wildcard_denied { - perform_option_command( - manager, - action.to_owned(), - OptType::Wildcard, - OptValue::String(wildcard_denied.to_owned()), + }, + Inputs { + action: InputAction::Set, + .. + } => { + println!("Set"); + ExitCode::SUCCESS + } + Inputs { + action: InputAction::Add, + .. + } => { + println!("Add"); + ExitCode::SUCCESS + } + Inputs { + action: InputAction::Del, + .. + } => { + println!("Del"); + ExitCode::SUCCESS + } + Inputs { + action: InputAction::Purge, + .. + } => { + println!("Purge"); + ExitCode::SUCCESS + } + _ => { + println!("Unknown action"); + ExitCode::SUCCESS + } + } +} + +fn list_json( + rconfig: &Rc>, + role_id: Option, + task_id: Option, + options: bool, + options_type: Option, + task_type: Option, + role_type: Option, +) -> ExitCode { + let config = rconfig.as_ref().borrow(); + if let Some(role_id) = role_id { + if let Some(role) = config.role(&role_id) { + list_task( + task_id, + role, + options, + options_type, + task_type, + role_type, + ) + } else { + error!("Role not found"); + ExitCode::FAILURE + } + } else { + println!("{}", serde_json::to_string_pretty(config.deref()).unwrap()); + ExitCode::SUCCESS + } +} + +fn list_task( + task_id: Option, + role: &Rc>, + options: bool, + options_type: Option, + task_type: Option, + role_type: Option, +) -> ExitCode { + if let Some(task_id) = task_id { + if let Some(task) = role.as_ref().borrow().task(&task_id) { + if options { + let stack = OptStack::from_task(task.clone()); + if let Some(opttype) = options_type { + println!("{}", stack.get_description(Level::Task, opttype)); + } else { + println!("{}", stack); + } + } else { + print_task( + task, + task_type.unwrap_or(TaskType::All), ); } - save_config(&manager.get_config().as_ref().borrow())?; - Ok(true) + ExitCode::SUCCESS + } else { + error!("Task not found"); + ExitCode::FAILURE + } + } else { + if options { + println!("{}", OptStack::from_role(role.clone())); + } else { + print_role( + &role, + &role_type.unwrap_or(RoleType::All), + ); } - Some(CCommand::Import { file: _ }) => Err("not implemented".into()), - None => Ok(false), + ExitCode::SUCCESS } } +fn print_task( + task: &std::rc::Rc>, + task_type: TaskType, +) { + match task_type { + TaskType::All => { + println!("{}", serde_json::to_string_pretty(&task).unwrap()); + } + TaskType::Commands => { + println!( + "{}", + serde_json::to_string_pretty(&task.as_ref().borrow().commands).unwrap() + ); + } + TaskType::Credentials => { + println!( + "{}", + serde_json::to_string_pretty(&task.as_ref().borrow().cred).unwrap() + ); + } + } +} + +// Generate tests for all test cases in tests/pest/foo/ and all subdirectories. Since +// `lazy_static = true`, a single `PestTester` is created and used by all tests; otherwise a new +// `PestTester` would be created for each test. + #[cfg(test)] -mod tests { - use super::*; - +mod cli_tests { + use pest_test_gen::pest_tests; + #[pest_tests( + super::super::Cli, + super::super::Rule, + "cli", + subdir = "chsr", + recursive = true + )] + mod grammar_tests {} } diff --git a/src/chsr/main.rs b/src/chsr/main.rs index 8118a2c2..a08f9f1b 100644 --- a/src/chsr/main.rs +++ b/src/chsr/main.rs @@ -1,73 +1,31 @@ //extern crate sudoers_reader; -mod checklist; -mod cli; -#[path = "../config.rs"] -mod config; -mod rolemanager; -mod state; -#[path = "../util.rs"] -mod util; -#[path = "../version.rs"] -mod version; - -use cli::parse_args; -use cursive::Cursive; -use rolemanager::RoleContext; -use state::{role::SelectRoleState, InitState}; -use tracing_subscriber::FmtSubscriber; +use capctl::Cap; +use common::{config::{self, Storage}, database::read_json_config, read_effective}; +use tracing::error; -pub enum ActorType { - User, - Group, -} +mod cli; +#[path = "../mod.rs"] +mod common; -pub struct RoleManagerApp { - manager: RoleContext, - state: Box, -} fn main() { - let roles = config::load_config(); - if let Err(err) = roles { - eprintln!("{}", err); - std::process::exit(1); - } - let roles = roles.unwrap(); - let mut rc_role_manager = RoleContext::new(roles); - match parse_args(&mut rc_role_manager) { - Ok(value) => { - if value { - std::process::exit(0); - } + let settings = config::get_settings(); + let config = match settings.storage_method { + config::StorageMethod::JSON => { + Storage::JSON(read_json_config(settings).expect("Failed to read config")) } - Err(err) => { - eprintln!("{}", err); + _ => { + error!("Unsupported storage method"); std::process::exit(1); } - } - // a builder for `FmtSubscriber`. - let subscriber = FmtSubscriber::builder() - // all spans/events with a level higher than TRACE (e.g, debug, info, warn, etc.) - // will be written to stdout. - .with_max_level(tracing::Level::TRACE) - // completes the builder. - .finish(); - - tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); - - let mut siv = cursive::default(); - //let caps = rc_role_manager.as_ref().borrow().selected_command_group().as_ref().borrow().get_capabilities(); - //siv.add_layer(select_capabilities(rc_role_manager.to_owned(), caps.into())); - - siv.add_layer(SelectRoleState.init(&mut rc_role_manager)); - SelectRoleState.config_cursive(&mut siv); - - let app = RoleManagerApp { - manager: rc_role_manager, - state: Box::new(SelectRoleState), }; + cli::main(&config); +} + +fn olmain() { + read_effective(true).expect("Failed to read_effective"); + let settings = config::get_settings(); + read_effective(false).expect("Failed to read_effective"); - siv.set_user_data(app); - siv.run(); } diff --git a/src/chsr/rolemanager.rs b/src/chsr/rolemanager.rs deleted file mode 100644 index 2f4392ff..00000000 --- a/src/chsr/rolemanager.rs +++ /dev/null @@ -1,505 +0,0 @@ -use std::cell::RefCell; -use std::collections::HashSet; -use std::error::Error; -use std::rc::{Rc, Weak}; -use sxd_document::dom::{Document, Element}; - -use crate::config::{ - options::{Opt, OptStack}, - save_config, - structs::{Config, Groups, IdTask, Role, Save, Task}, -}; -pub trait ContextMemento { - fn restore(&self) -> T; -} - -#[derive(Debug)] -pub struct RoleContextHistory { - mementos: Vec, -} - -impl RoleContextHistory { - pub fn new() -> Self { - RoleContextHistory { - mementos: Vec::new(), - } - } - - pub fn save(&mut self, memento: RoleContext) { - self.mementos.push(memento); - } - - pub fn restore(&mut self) -> Option { - self.mementos.pop() - } -} - -#[derive(Debug)] -pub struct RoleContext { - history: Weak>, - pub roles: Rc>>, - selected_role: Option, - new_role: Option>>>, - selected_task: Option, - new_task: Option>>>, - selected_command_type: Option, - selected_command: Option, - new_command: Option, - new_groups: Option, - new_options: Option, - pub selected_actors: Option>>>, - error: Option>, - is_new: bool, - exiting: bool, -} - -impl Clone for RoleContext { - fn clone(&self) -> Self { - RoleContext { - history: Rc::downgrade(&self.history.upgrade().unwrap()), - roles: Rc::new(RefCell::new(self.roles.as_ref().borrow().clone())), - selected_role: self.selected_role, - new_role: Some(Rc::new(RefCell::new( - self.new_role.clone().unwrap().as_ref().borrow().clone(), - ))), - selected_task: self.selected_task, - new_task: Some(Rc::new(RefCell::new( - self.new_task.clone().unwrap().as_ref().borrow().clone(), - ))), - selected_command_type: self.selected_command_type, - selected_command: self.selected_command, - new_command: self.new_command.clone(), - new_groups: self.new_groups.clone(), - new_options: self.new_options.clone(), - selected_actors: self.selected_actors.clone(), - error: None, - is_new: self.is_new, - exiting: self.exiting, - } - } -} - -impl RoleContext { - pub fn new(roles: Rc>>) -> RoleContext { - RoleContext { - history: Rc::downgrade(&Rc::new(RoleContextHistory::new().into())), - roles, - selected_role: None, - selected_task: None, - selected_command_type: None, - selected_command: None, - selected_actors: None, - new_role: None, - new_task: None, - new_command: None, - new_groups: None, - new_options: None, - error: None, - is_new: false, - exiting: false, - } - } - - pub fn exit(&mut self) { - self.exiting = true; - } - - pub fn is_exiting(&self) -> bool { - self.exiting - } - - pub fn save_state(&self) { - self.history - .upgrade() - .unwrap() - .borrow_mut() - .save(self.clone()) - } - - pub fn restore_state(&mut self) { - if let Some(memento) = self.history.upgrade().unwrap().borrow_mut().restore() { - *self = memento; - } - } - - pub fn is_new(&self) -> bool { - self.new_role.is_some() || self.new_task.is_some() - } - - pub fn list_roles(&self) { - println!("Config:"); - for (i, r) in self.roles.as_ref().borrow().roles.iter().enumerate() { - println!("{}: {}", i, r.as_ref().borrow().name); - } - } - - pub fn select_role_by_index(&mut self, role_index: usize) -> Result<(), Box> { - let len = self.roles.as_ref().borrow().roles.len(); - if role_index > len - 1 { - Err("role not exist".into()) - } else { - self.selected_role = Some(role_index); - Ok(()) - } - } - - pub fn select_role_by_name(&mut self, role_name: &str) -> Result<(), Box> { - let mut index = None; - for (i, r) in self.roles.as_ref().borrow().roles.iter().enumerate() { - if r.as_ref().borrow().name == role_name { - index = Some(i); - break; - } - } - if let Some(index) = index { - self.selected_role = Some(index); - Ok(()) - } else { - Err("role not exist".into()) - } - } - - pub fn create_new_role(&mut self, name: String) { - self.unselect_role(); - self.new_role = Some(Role::new(name, Some(Rc::downgrade(&self.roles.to_owned())))); - } - - pub fn delete_new_role(&mut self) { - self.new_role = None; - } - - pub fn save_new_role(&mut self) { - if let Some(role) = &self.new_role { - self.roles.as_ref().borrow_mut().roles.push(role.to_owned()); - } - self.new_role = None; - } - - pub fn create_new_task(&mut self, pid: Option<&String>) -> Result> { - let parent; - let id; - self.unselect_task(); - if let Some(role) = self.get_role() { - if let Some(pid) = pid { - id = if let Some(value) = pid.parse::().ok() { - IdTask::Number(value) - } else { - IdTask::Name(pid.to_string()) - }; - } else { - id = IdTask::Number(role.as_ref().borrow().tasks.iter().fold(0, |acc, f| { - if let IdTask::Number(n) = f.as_ref().borrow().id { - if n > acc { - n - } else { - acc - } - } else { - acc - } - }) + 1); - } - parent = Rc::downgrade(&role); - } else { - return Err("role not selected".into()); - } - self.new_task = Some(Task::new(id.clone(), parent)); - Ok(id.clone()) - } - - pub fn delete_new_task(&mut self) { - self.new_task = None; - } - - pub fn save_new_task(&mut self) { - if let Some(task) = &self.new_task { - task.as_ref() - .borrow() - .get_role() - .unwrap() - .borrow_mut() - .tasks - .push(task.to_owned()); - } - self.new_task = None; - } - - pub fn get_new_role(&self) -> Option>>> { - self.new_role.to_owned() - } - - pub fn get_new_task(&self) -> Option>>> { - self.new_task.to_owned() - } - - pub fn unselect_role(&mut self) { - self.selected_role = None; - self.unselect_task(); - } - - pub fn select_task_by_index(&mut self, task_index: usize) -> Result<(), Box> { - let len = self.get_role().unwrap().as_ref().borrow().tasks.len(); - if task_index > len - 1 { - Err("command not exist".into()) - } else { - self.selected_task = Some(task_index); - Ok(()) - } - } - - pub fn select_task_by_id_str(&mut self, task_id: &str) -> Result<(), Box> { - let id = if let Some(value) = task_id.parse::().ok() { - IdTask::Number(value) - } else { - IdTask::Name(task_id.to_string()) - }; - self.select_task_by_id(&id) - } - - pub fn select_task_by_id(&mut self, task_id: &IdTask) -> Result<(), Box> { - let mut index = None; - for (i, t) in self - .get_role() - .unwrap() - .as_ref() - .borrow() - .tasks - .iter() - .enumerate() - { - if t.as_ref().borrow().id == *task_id { - index = Some(i); - break; - } - } - if let Some(index) = index { - self.selected_task = Some(index); - Ok(()) - } else { - Err("task not exist".into()) - } - } - - pub fn unselect_task(&mut self) { - self.selected_task = None; - self.unselect_command_set(); - } - - pub fn unselect_command(&mut self) { - self.selected_command = None; - } - - pub fn unselect_command_set(&mut self) { - self.selected_command_type = None; - self.unselect_command(); - } - - pub fn select_command_set(&mut self, is_add: bool) { - self.selected_command_type = Some(is_add); - self.unselect_command(); - } - - pub fn get_command_set(&self) -> Result, Box> { - match self.selected_command_type { - Some(true) => Ok(self - .get_task() - .unwrap() - .as_ref() - .borrow() - .commands - .added().to_owned()), - Some(false) => Ok(self - .get_task() - .unwrap() - .as_ref() - .borrow() - .commands - .removed().to_owned()), - None => Err("no command set selected".into()), - } - } - - pub fn is_blacklist(&self) -> bool { - self.selected_command_type.is_some_and(|b| !b) - } - - pub fn is_command_set_all(&self) -> bool { - self.get_task() - .unwrap() - .as_ref() - .borrow() - .commands.is_all() - } - - pub fn select_command(&mut self, command_index: usize) -> Result<(), Box> { - let len = if self.selected_command_type.is_some_and(|b| b) { - self.get_task().unwrap().as_ref().borrow().commands.added().len() - } else { - self.get_task().unwrap().as_ref().borrow().commands.removed().len() - }; - if command_index > len - 1 { - Err("command not exist".into()) - } else { - self.selected_command = Some(command_index); - Ok(()) - } - } - - pub fn delete_role(&mut self) -> Result<(), Box> { - if let Some(i) = self.selected_role { - self.roles.as_ref().borrow_mut().roles.remove(i); - self.unselect_role(); - Ok(()) - } else { - Err("no role selected".into()) - } - } - - pub fn delete_task(&mut self) -> Result<(), Box> { - if let Some(i) = self.selected_task { - self.get_role() - .unwrap() - .as_ref() - .borrow_mut() - .tasks - .remove(i); - self.unselect_task(); - Ok(()) - } else { - Err("no task selected".into()) - } - } - - pub fn get_selected_role(&self) -> Option>>> { - match self.selected_role { - Some(i) => { - return Some(self.roles.as_ref().borrow().roles[i].to_owned()); - } - None => None, - } - } - - pub fn find_role(&self, name: &str) -> Option>>> { - for role in self.roles.as_ref().borrow().roles.iter() { - if role.as_ref().borrow().name == name { - return Some(role.to_owned()); - } - } - None - } - - pub fn get_role(&self) -> Option>>> { - self.get_selected_role().or(self.get_new_role()) - } - - pub fn get_selected_task(&self) -> Option>>> { - match self.selected_task { - Some(i) => { - let id = self.get_role().unwrap().as_ref().borrow().tasks[i].to_owned(); - Some(id) - } - None => None, - } - } - - pub fn get_task(&self) -> Option>>> { - self.get_selected_task().or(self.get_new_task()) - } - - pub fn get_command(&self) -> Option { - match self.selected_command_type { - Some(true) => { - if let Some(i) = self.selected_command { - return Some( - self.get_task() - .unwrap() - .as_ref() - .borrow() - .commands - .added()[i] - .to_owned(), - ); - } - } - Some(false) => { - if let Some(i) = self.selected_command { - return Some( - self.get_task() - .unwrap() - .as_ref() - .borrow() - .commands - .removed()[i] - .to_owned(), - ); - } - } - None => {} - } - None - } - - pub fn set_command(&mut self, command: String) -> Result<(), Box> { - match self.selected_command_type { - Some(true) => { - if let Some(i) = self.selected_command { - self.get_task() - .unwrap() - .as_ref() - .borrow_mut() - .commands - .added_mut()[i] = command; - return Ok(()); - } - } - Some(false) => { - if let Some(i) = self.selected_command { - self.get_task() - .unwrap() - .as_ref() - .borrow_mut() - .commands - .removed_mut()[i] = command; - return Ok(()); - } - } - None => {} - } - Err("no command selected".into()) - } - - /** - * Return a OptStack that contains Opt in function of selections - */ - pub fn get_options(&self) -> OptStack<'static> { - if let Some(task) = self.get_task() { - OptStack::from_task(task) - } else if let Some(role) = self.get_role() { - OptStack::from_role(role) - } else { - OptStack::from_roles(self.roles.to_owned()) - } - } - - pub fn set_error(&mut self, error: Box) { - self.error = Some(error); - } - - pub fn take_error(&mut self) -> Option> { - self.error.take() - } - - pub(crate) fn get_config(&self) -> Rc>> { - self.roles.clone() - } -} - -impl Save for RoleContext { - fn save( - &self, - _doc: Option<&mut T>, - _element: Option<&mut V>, - ) -> Result> { - save_config(&self.roles.as_ref().borrow()).map(|_| true) - } -} diff --git a/src/chsr/state.rs b/src/chsr/state.rs deleted file mode 100644 index 57dc4dde..00000000 --- a/src/chsr/state.rs +++ /dev/null @@ -1,304 +0,0 @@ -pub mod actor; -pub mod command; -pub mod common; -pub mod options; -pub mod role; -mod task; - -use cursive::{ - event::Key, - theme::{BaseColor, Color, ColorStyle, Effect, Style}, - views::{Dialog, TextView}, - Cursive, -}; - -use crate::util; -use capctl::CapSet; - -use crate::{rolemanager::RoleContext, RoleManagerApp}; - -pub trait PushableItemState { - fn push(&mut self, manager: &mut RoleContext, item: T); -} - -pub trait SettableItemState { - fn set(&mut self, manager: &mut RoleContext, index: usize, item: T); -} - -pub trait DeletableItemState { - fn remove_selected(&mut self, manager: &mut RoleContext, index: usize); -} - -#[derive(PartialEq, Eq, Clone)] -pub enum Input { - String(String), - Vec(Vec), - Caps(CapSet), -} - -#[derive(PartialEq, Eq, Clone)] -pub enum ExecuteType { - Create, - Delete(usize), - Submit(usize), - Cancel, - Confirm, - Config, - Input(Input), - Exit, -} - -impl Input { - pub fn as_string(&self) -> String { - match self { - Input::String(str) => str.to_string(), - Input::Vec(vec) => vec.join(" "), - Input::Caps(caps) => util::capset_to_string(caps), - } - } - pub fn as_vec(&self) -> Vec { - match self { - Input::String(str) => str.split(' ').map(|s| s.to_string()).collect(), - Input::Vec(vec) => vec.to_vec(), - Input::Caps(caps) => util::capset_to_vec(caps), - } - } - pub fn as_caps(&self) -> CapSet { - match self { - Input::String(string) => util::parse_capset(string).unwrap(), - Input::Vec(vec) => util::parse_capset_iter(vec.iter().map(|s| s.as_str())).unwrap(), - Input::Caps(caps) => *caps, - } - } -} - -pub trait State { - fn create(self: Box, manager: &mut RoleContext) -> Box; - fn delete(self: Box, manager: &mut RoleContext, index: usize) -> Box; - fn submit(self: Box, manager: &mut RoleContext, index: usize) -> Box; - fn cancel(self: Box, manager: &mut RoleContext) -> Box; - fn confirm(self: Box, manager: &mut RoleContext) -> Box; - fn config(self: Box, manager: &mut RoleContext) -> Box; - fn input(self: Box, manager: &mut RoleContext, input: Input) -> Box; - fn render(&self, manager: &mut RoleContext, cursive: &mut Cursive); -} - -pub trait InitState { - fn init(&self, manager: &mut RoleContext) -> Dialog; - fn config_cursive(&self, cursive: &mut Cursive); -} - -pub fn execute(s: &mut Cursive, exec_type: ExecuteType) { - let RoleManagerApp { - mut manager, - mut state, - } = s.take_user_data().unwrap(); - - state = match exec_type { - ExecuteType::Create => state.create(&mut manager), - ExecuteType::Delete(index) => state.delete(&mut manager, index), - ExecuteType::Submit(index) => state.submit(&mut manager, index), - ExecuteType::Cancel => state.cancel(&mut manager), - ExecuteType::Confirm => state.confirm(&mut manager), - ExecuteType::Config => state.config(&mut manager), - ExecuteType::Input(input) => state.input(&mut manager, input), - ExecuteType::Exit => { - manager.exit(); - state.confirm(&mut manager) - } - }; - s.pop_layer(); - s.clear_global_callbacks(Key::Del); - s.clear_global_callbacks(Key::Enter); - - state.render(&mut manager, s); - let exiting = manager.is_exiting(); - if let Some(err) = manager.take_error() { - let mut style = Style::from(ColorStyle::new( - Color::Light(BaseColor::White), - Color::Dark(BaseColor::Red), - )); - style.effects.insert(Effect::Bold); - s.add_layer( - Dialog::around(TextView::new(err.to_string()).style(style)).button( - "Understood", - move |s| { - s.pop_layer(); - if exiting { - s.quit(); - } - }, - ), - ); - } else if exiting { - s.quit(); - } - - s.set_user_data(RoleManagerApp { manager, state }); -} - -#[cfg(test)] -mod tests { - - use crate::config::structs::Config; - use crate::rolemanager::RoleContext; - use crate::xml_version::PACKAGE_VERSION; - use capctl::{Cap, CapSet}; - - use super::*; - - trait Downcast { - unsafe fn downcast(&self) -> &T; - } - - impl Downcast for dyn State { - unsafe fn downcast(&self) -> &T { - &*(self as *const dyn State as *const T) - } - } - - #[derive(Debug)] - pub struct TestState { - pub i: usize, - pub j: char, - } - - impl TestState { - pub fn new(i: usize, j: char) -> Self { - Self { i, j } - } - } - - impl State for TestState { - fn create(self: Box, _: &mut RoleContext) -> Box { - Box::new(Self::new(self.i + 1, 'c')) - } - fn delete(self: Box, _: &mut RoleContext, _: usize) -> Box { - Box::new(Self::new(self.i + 1, 'd')) - } - fn submit(self: Box, _: &mut RoleContext, _: usize) -> Box { - Box::new(Self::new(self.i + 1, 's')) - } - fn cancel(self: Box, _: &mut RoleContext) -> Box { - Box::new(Self::new(self.i + 1, 'l')) - } - fn confirm(self: Box, _: &mut RoleContext) -> Box { - Box::new(Self::new(self.i + 1, 'm')) - } - fn config(self: Box, _: &mut RoleContext) -> Box { - Box::new(Self::new(self.i + 1, 'g')) - } - fn input(self: Box, _: &mut RoleContext, _: Input) -> Box { - Box::new(Self::new(self.i + 1, 'i')) - } - fn render(&self, _: &mut RoleContext, _: &mut Cursive) {} - } - - #[test] - fn test_exit_execute() { - let mut s = Cursive::new(); - let manager = RoleContext::new(Config::new(PACKAGE_VERSION)); - let state = Box::new(TestState::new(0, 'a')); - s.set_user_data(RoleManagerApp { manager, state }); - execute(&mut s, ExecuteType::Exit); - let app: RoleManagerApp = s.take_user_data().unwrap(); - assert!(app.manager.is_exiting()); - } - - fn test_dyn_state(state: &Box, i: usize, j: char) { - unsafe { - let state = state.downcast::(); - assert_eq!(state.i, i); - assert_eq!(state.j, j); - } - } - - fn execute_and_test(s: &mut Cursive, exec_type: ExecuteType, i: usize, j: char) { - execute(s, exec_type); - let RoleManagerApp { state, manager } = s.take_user_data().unwrap(); - test_dyn_state(&state, i, j); - s.set_user_data(RoleManagerApp { manager, state }); - } - - #[test] - fn test_execute() { - let mut s = Cursive::new(); - let manager = RoleContext::new(Config::new(PACKAGE_VERSION)); - let state = Box::new(TestState::new(0, 'a')); - s.set_user_data(RoleManagerApp { manager, state }); - execute_and_test(&mut s, ExecuteType::Cancel, 1, 'l'); - execute_and_test(&mut s, ExecuteType::Confirm, 2, 'm'); - execute_and_test(&mut s, ExecuteType::Config, 3, 'g'); - execute_and_test(&mut s, ExecuteType::Create, 4, 'c'); - execute_and_test(&mut s, ExecuteType::Delete(0), 5, 'd'); - execute_and_test( - &mut s, - ExecuteType::Input(Input::String("test".to_string())), - 6, - 'i', - ); - execute_and_test(&mut s, ExecuteType::Submit(0), 7, 's'); - } - - #[test] - fn test_input_string() { - let input = Input::String("CAP_DAC_OVERRIDE CAP_SYS_ADMIN".to_string()); - assert_eq!( - input.as_vec(), - vec!["CAP_DAC_OVERRIDE".to_string(), "CAP_SYS_ADMIN".to_string()] - ); - let mut expected = CapSet::empty(); - expected.add(Cap::DAC_OVERRIDE); - expected.add(Cap::SYS_ADMIN); - assert_eq!(input.as_caps(), expected); - assert_eq!(input.as_string(), "CAP_DAC_OVERRIDE CAP_SYS_ADMIN"); - } - - #[test] - fn test_input_vec() { - let input = Input::Vec(vec![ - "CAP_DAC_OVERRIDE".to_string(), - "CAP_SYS_ADMIN".to_string(), - ]); - assert_eq!(input.as_string(), "CAP_DAC_OVERRIDE CAP_SYS_ADMIN"); - assert_eq!( - input.as_vec(), - vec!["CAP_DAC_OVERRIDE".to_string(), "CAP_SYS_ADMIN".to_string()] - ); - let mut expected = CapSet::empty(); - expected.add(Cap::DAC_OVERRIDE); - expected.add(Cap::SYS_ADMIN); - assert_eq!(input.as_caps(), expected); - } - - #[test] - fn test_input_caps() { - let mut expected = CapSet::empty(); - expected.add(Cap::DAC_OVERRIDE); - expected.add(Cap::SYS_ADMIN); - let input = Input::Caps(expected); - assert_eq!( - input.as_vec(), - vec!["CAP_DAC_OVERRIDE".to_string(), "CAP_SYS_ADMIN".to_string()] - ); - assert_eq!(input.as_string(), "CAP_DAC_OVERRIDE CAP_SYS_ADMIN"); - - assert_eq!(input.as_caps(), expected); - } - - #[test] - fn test_error() { - let mut s = Cursive::new(); - let mut manager = RoleContext::new(Config::new(PACKAGE_VERSION)); - let state = Box::new(TestState::new(0, 'a')); - manager.set_error("err_test".into()); - // asssert that error is set - assert!(manager.take_error().is_some()); - manager.set_error("err_test".into()); - - s.set_user_data(RoleManagerApp { manager, state }); - execute(&mut s, ExecuteType::Exit); - let mut app: RoleManagerApp = s.take_user_data().unwrap(); - assert!(app.manager.take_error().is_none()); - } -} diff --git a/src/chsr/state/actor.rs b/src/chsr/state/actor.rs deleted file mode 100644 index 7ab6df41..00000000 --- a/src/chsr/state/actor.rs +++ /dev/null @@ -1,671 +0,0 @@ -use std::{cell::RefCell, collections::HashSet, ffi::CStr, rc::Rc}; - -use cursive::{ - view::{Nameable, Scrollable}, - views::{Dialog, LinearLayout, SelectView}, - Cursive, -}; -use libc::{endgrent, endpwent, getgrent, getpwent, setgrent, setpwent}; - -use crate::{ - checklist::CheckListView, config::structs::Groups, ActorType, RoleContext, RoleManagerApp, -}; - -use super::{ - common::{ConfirmState, InputState}, - execute, DeletableItemState, ExecuteType, Input, PushableItemState, State, -}; - -#[derive(Clone)] -pub struct Users { - pub name: Rc>>, -} - -impl Default for Users { - fn default() -> Self { - Users { - name: RefCell::new(Vec::new()).into(), - } - } -} - -impl FromIterator for Users { - fn from_iter>(iter: T) -> Users { - let mut users = Vec::new(); - for user in iter { - users.push(user); - } - Users { - name: RefCell::new(users.to_vec()).into(), - } - } -} - -impl From for Vec { - fn from(val: Users) -> Self { - val.name.as_ref().borrow().to_vec() - } -} - -impl From for Users { - fn from(name: String) -> Self { - let vname = vec![name]; - Users { - name: RefCell::new(vname).into(), - } - } -} -impl ToString for Users { - fn to_string(&self) -> String { - self.name.borrow().join(",") - } -} -impl From for String { - fn from(val: Users) -> Self { - val.name.borrow().join(",") - } -} - -impl From> for Users { - fn from(name: Vec) -> Self { - Users { - name: RefCell::new(name).into(), - } - } -} - -#[derive(Clone)] -pub struct SelectUserState -where - T: State + Clone + PushableItemState + 'static, - V: State + Clone + 'static, -{ - previous_state: V, - next_state: T, - checklist: bool, - selected: Users, -} - -impl SelectUserState -where - T: State + Clone + PushableItemState + 'static, - V: State + Clone + 'static, -{ - /** - * Returns a list of all users in system and the one not in the list, merge them and return - */ - fn complete_list(selected: Option>) -> Vec { - let mut users = get_users(); - if let Some(selected) = selected { - for user in selected { - if !users.contains(&user) { - users.push(user.to_string()); - } - } - } - users - } - - pub fn new(previous_state: V, next_state: T, checklist: bool, selected: Option) -> Self { - SelectUserState { - checklist, - selected: selected.unwrap_or_default(), - previous_state, - next_state, - } - } -} - -#[derive(Clone)] -pub struct SelectGroupState -where - T: State + Clone + PushableItemState> + 'static, - V: State + Clone + 'static, -{ - previous_state: V, - next_state: T, - groups: Vec, -} - -#[derive(Clone)] - -pub struct EditGroupState -where - T: State + Clone + 'static, - V: State + Clone + PushableItemState + 'static, -{ - gid_list: Vec, - previous_state: T, - next_state: V, - selected: Option, -} - -fn get_groups() -> Vec { - let mut groups = Vec::new(); - unsafe { setgrent() }; - let mut group = unsafe { getgrent().as_mut() }; - while group.is_some() { - let gr = group.unwrap(); - groups.push(unsafe { CStr::from_ptr(gr.gr_name).to_str().unwrap().to_string() }); - group = unsafe { getgrent().as_mut() }; - } - unsafe { endgrent() }; - groups -} - -fn get_users() -> Vec { - let mut users = Vec::new(); - unsafe { setpwent() }; - let mut pwentry = unsafe { getpwent().as_mut() }; - while pwentry.is_some() { - let user = pwentry.unwrap(); - users.push(unsafe { CStr::from_ptr(user.pw_name).to_str().unwrap().to_string() }); - pwentry = unsafe { getpwent().as_mut() }; - } - unsafe { endpwent() }; - users -} - -fn add_actors( - actortype: ActorType, - view: &mut CheckListView, - already_in_list: Option>, -) { - let actors = match actortype { - ActorType::User => get_users(), - ActorType::Group => get_groups(), - }; - let some = already_in_list.is_some(); - for user in actors.iter().cloned() { - view.add_item( - user.to_string(), - some && already_in_list.as_ref().unwrap().contains(&user), - user, - ); - } - if let Some(already_in_list) = already_in_list { - for user in already_in_list - .into_iter() - .collect::>() - .difference(&actors.into_iter().collect::>()) - { - view.add_item(user.to_string(), true, user.to_string()); - } - } else { - } -} - -fn add_actors_select(actortype: ActorType, view: &mut SelectView) { - let actors = match actortype { - ActorType::User => get_users(), - ActorType::Group => get_groups(), - }; - for user in actors { - view.add_item(&user, user.to_string()); - } -} - -impl State for SelectUserState -where - T: State + Clone + PushableItemState + 'static, - V: State + Clone + 'static, -{ - fn create(self: Box, _manager: &mut RoleContext) -> Box { - Box::new(InputState::< - SelectUserState, - SelectUserState, - String, - >::new(*self, "Enter username or uid", None)) - } - - fn delete(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - - fn submit(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - - fn cancel(self: Box, manager: &mut RoleContext) -> Box { - manager.selected_actors = None; - Box::new(self.previous_state) - } - - fn confirm(self: Box, _manager: &mut RoleContext) -> Box { - self - } - - fn config(self: Box, _manager: &mut RoleContext) -> Box { - self - } - - fn input(mut self: Box, manager: &mut RoleContext, input: Input) -> Box { - self.next_state.push(manager, input.as_vec().into()); - manager.selected_actors = None; - Box::new(self.next_state) - } - - fn render(&self, manager: &mut RoleContext, cursive: &mut Cursive) { - if manager.selected_actors.is_none() { - manager.selected_actors = Some(Rc::new(RefCell::new( - self.selected - .name - .as_ref() - .borrow() - .clone() - .into_iter() - .collect::>(), - ))); - } - if self.checklist { - let mut select = CheckListView::::new() - .on_submit(|s, b, i| { - let RoleManagerApp { mut manager, state } = s.take_user_data().unwrap(); - if b && manager.get_role().unwrap().as_ref().borrow().user_is_forbidden(i.as_str()) { - manager.set_error("By the static separation of duties rules, this user cannot be granted to this role".into()); - return; - } - - if let Some(selected) = manager.selected_actors.as_ref() { - match b { - true => selected.as_ref().borrow_mut().insert(i.to_string()), - false => selected.as_ref().borrow_mut().remove(i), - }; - } - s.set_user_data(RoleManagerApp { manager, state }); - }) - .autojump(); - add_actors( - ActorType::User, - &mut select, - manager - .selected_actors - .clone() - .map(|e| e.as_ref().borrow().iter().cloned().collect::>()), - ); - cursive.add_layer( - Dialog::around(select.with_name("users").scrollable()) - .title("Select User") - .button("Input new user", |s| { - execute(s, ExecuteType::Create); - }) - .button("Cancel", |s| { - execute(s, ExecuteType::Cancel); - }) - .button("Ok", |s| { - let select = s.find_name::>("users").unwrap(); - let items = select.get_checked_item(); - let users = items.iter().map(|x| x.1.clone()).collect(); - execute(s, ExecuteType::Input(Input::Vec(users))); - }), - ); - } else { - let mut select = - SelectView::::new() - .autojump() - .on_submit(|s, user: &String| { - execute(s, ExecuteType::Input(Input::String(user.to_string()))); - }); - add_actors_select(ActorType::User, &mut select); - cursive.add_layer( - Dialog::around(select.scrollable().with_name("users")) - .title("Select User") - .button("Input new user", |s| { - execute(s, ExecuteType::Create); - }) - .button("Cancel", |s| { - execute(s, ExecuteType::Cancel); - }), - ); - } - } -} - -impl PushableItemState for SelectUserState -where - T: State + Clone + PushableItemState + 'static, - V: State + Clone + 'static, -{ - fn push(&mut self, manager: &mut RoleContext, item: String) { - if manager - .get_role() - .unwrap() - .as_ref() - .borrow() - .user_is_forbidden(item.as_str()) - { - manager.set_error("By the static separation of duties rules, this user should not be granted to this role".into()); - return; - } - if let Some(selected) = manager.selected_actors.as_ref() { - selected.as_ref().borrow_mut().insert(item); - } - } -} - -impl SelectGroupState -where - T: State + Clone + PushableItemState> + 'static, - V: State + Clone + 'static, -{ - pub fn new(previous_state: V, next_state: T, groups: Vec) -> Self { - Self { - previous_state, - next_state, - groups, - } - } -} - -impl State for SelectGroupState -where - T: State + Clone + PushableItemState> + 'static, - V: State + Clone + 'static, -{ - fn create(self: Box, _manager: &mut RoleContext) -> Box { - Box::new(EditGroupState::::new( - *self.clone(), - *self, - None, - )) - } - - fn delete(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - - fn submit(self: Box, _manager: &mut RoleContext, index: usize) -> Box { - Box::new(EditGroupState::::new( - *self.clone(), - *self.clone(), - self.groups.get(index).map(|x| x.to_owned()), - )) - } - - fn cancel(self: Box, _manager: &mut RoleContext) -> Box { - // todo rollback - Box::new(self.previous_state) - } - - fn confirm(mut self: Box, manager: &mut RoleContext) -> Box { - self.next_state.push(manager, self.groups); - Box::new(self.next_state) - } - - fn config(self: Box, _manager: &mut RoleContext) -> Box { - self - } - - fn input(self: Box, _manager: &mut RoleContext, _input: Input) -> Box { - self - } - - fn render(&self, _manager: &mut RoleContext, cursive: &mut Cursive) { - let mut select = SelectView::::new().autojump().on_submit(|s, item| { - execute(s, ExecuteType::Submit(*item)); - }); - for (index, group) in self.groups.iter().enumerate() { - select.add_item(group.join(" & "), index); - } - cursive.add_layer( - Dialog::around(select) - .title("Select Group List to Edit") - .button("Cancel", |s| { - execute(s, ExecuteType::Cancel); - }) - .button("Add", move |s| { - execute(s, ExecuteType::Create); - }) - .button("Ok", move |s| { - execute(s, ExecuteType::Confirm); - }), - ); - } -} - -impl EditGroupState -where - T: State + Clone + 'static, - V: State + Clone + PushableItemState + 'static, -{ - /** - * Returns a list of all groups in system and the one not in the list, merge them and return - */ - fn complete_list(selected: Option>) -> Vec { - let mut groups = get_groups(); - if let Some(selected) = selected { - for group in selected { - if !groups.contains(&group) { - groups.push(group.clone()); - } - } - } - groups - } - - pub fn new(previous_state: T, next_state: V, selected: Option) -> Self { - let a = Self::complete_list(selected.to_owned().map(Into::>::into)); - EditGroupState { - gid_list: a, - previous_state, - next_state, - selected, - } - } -} - -impl State for EditGroupState -where - T: State + Clone + 'static, - V: State + Clone + PushableItemState + 'static, -{ - fn create(self: Box, _manager: &mut RoleContext) -> Box { - Box::new(InputState::< - EditGroupState, - EditGroupState, - String, - >::new(*self, "Input new group", None)) - } - - fn delete(self: Box, _manager: &mut RoleContext, index: usize) -> Box { - Box::new(ConfirmState::new(*self, "Confirm delete group", index)) - } - - fn submit(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - - fn cancel(self: Box, manager: &mut RoleContext) -> Box { - manager.selected_actors = None; - Box::new(self.previous_state) - } - - fn confirm(self: Box, _manager: &mut RoleContext) -> Box { - self - } - - fn config(self: Box, _manager: &mut RoleContext) -> Box { - self - } - - fn input(mut self: Box, manager: &mut RoleContext, input: Input) -> Box { - let tmpselected = manager - .selected_actors - .as_ref() - .unwrap() - .as_ref() - .borrow() - .iter() - .cloned() - .collect::>(); - if manager - .get_role() - .unwrap() - .as_ref() - .borrow() - .groups_are_forbidden(&tmpselected) - { - manager.set_error("By the static separation of duties rules, this group combination cannot be granted to this role".into()); - return self; - } - self.next_state.push(manager, input.as_vec().into()); - manager.selected_actors = None; - Box::new(self.next_state) - } - - fn render(&self, manager: &mut RoleContext, cursive: &mut Cursive) { - if manager.selected_actors.is_none() { - if let Some(selected) = &self.selected { - manager.selected_actors = Some(Rc::new(RefCell::new( - selected - .groups - .iter() - .map(|s| s.to_string()) - .collect::>(), - ))); - } else { - manager.selected_actors = Some(Rc::new(RefCell::new(HashSet::new()))); - } - } - let mut select = CheckListView::::new() - .autojump() - .on_submit(|s, _b, i| { - if !i.is_empty() { - let RoleManagerApp { manager, state } = s.take_user_data().unwrap(); - - if let Some(selected) = manager.selected_actors.as_ref() { - selected.as_ref().borrow_mut().insert(i.to_owned()); - } - s.set_user_data(RoleManagerApp { manager, state }); - } - }); - if let Some(group_list) = &manager.selected_actors { - add_actors( - ActorType::Group, - &mut select, - Some(group_list.as_ref().borrow().iter().cloned().collect()), - ); - } else { - add_actors(ActorType::Group, &mut select, None); - } - - let mut view = LinearLayout::horizontal().child(select.with_name("select").scrollable()); - - let tmpselected = manager - .selected_actors - .as_ref() - .unwrap() - .as_ref() - .borrow() - .iter() - .cloned() - .collect::>(); - if manager - .get_role() - .unwrap() - .as_ref() - .borrow() - .groups_are_forbidden(&tmpselected) - { - // set theme in orange - let mut theme = cursive.current_theme().clone(); - theme.palette.set_color( - "Background", - cursive::theme::Color::Dark(cursive::theme::BaseColor::Yellow), - ); - cursive.set_theme(theme); - view.add_child(Dialog::text("By the static separation of duties rules, this group combination cannot be granted to this role")); - } else { - // set theme in default - let mut theme = cursive.current_theme().clone(); - theme.palette.set_color( - "Background", - cursive::theme::Color::Dark(cursive::theme::BaseColor::Blue), - ); - cursive.set_theme(theme); - } - - cursive.add_layer( - Dialog::around(view) - .title("Select Groups combination") - .button("Input new group", |s| { - execute(s, ExecuteType::Create); - }) - .button("Cancel", |s| { - execute(s, ExecuteType::Cancel); - }) - .button("Ok", |s| { - let mut res = None; - s.call_on_name("select", |view: &mut CheckListView| { - res = Some(Input::Vec( - view.iter() - .filter_map(|(_, checked, group)| { - if *checked { - Some(group.to_string()) - } else { - None - } - }) - .collect(), - )); - }); - execute(s, ExecuteType::Input(res.expect("No input"))); - }), - ); - } -} - -impl PushableItemState for EditGroupState -where - T: State + Clone + 'static, - V: State + Clone + PushableItemState + 'static, -{ - fn push(&mut self, manager: &mut RoleContext, item: String) { - if let Some(selected) = manager.selected_actors.as_ref() { - selected.as_ref().borrow_mut().insert(item); - } - } -} - -impl PushableItemState for SelectGroupState -where - V: State + Clone + 'static, - T: State + Clone + PushableItemState> + 'static, -{ - fn push(&mut self, _manager: &mut RoleContext, item: Groups) { - if !item.groups.is_empty() { - self.groups.push(item); - } - } -} - -impl DeletableItemState for EditGroupState -where - T: State + Clone + 'static, - V: State + Clone + PushableItemState + 'static, -{ - fn remove_selected(&mut self, _manager: &mut RoleContext, index: usize) { - self.gid_list.remove(index); - } -} -#[cfg(test)] -mod tests { - - use super::*; - - #[test] - fn test_to_string() { - let users = Users { - name: RefCell::new(vec!["Alice".to_string(), "Bob".to_string()]).into(), - }; - assert_eq!(users.to_string(), "Alice,Bob"); - } - - #[test] - fn test_from() { - let users = Users::from(vec!["Alice".to_string(), "Bob".to_string()]); - assert_eq!(users.to_string(), "Alice,Bob"); - let string = String::from(users.clone()); - assert_eq!(string, "Alice,Bob"); - } -} diff --git a/src/chsr/state/command.rs b/src/chsr/state/command.rs deleted file mode 100644 index 0f03b2ae..00000000 --- a/src/chsr/state/command.rs +++ /dev/null @@ -1,181 +0,0 @@ -use cursive::{ - direction::Orientation, - view::{Margins, Nameable, Resizable, Scrollable}, - views::{Dialog, LinearLayout, TextArea, TextView}, -}; - -#[allow(clippy::all)] -#[rustfmt::skip] -#[path = "../../descriptions.rs"] -mod descriptions; - -use super::{execute, task::EditTaskState, ExecuteType, Input, State}; -use crate::{checklist::CheckListView, Cursive, RoleContext, RoleManagerApp}; - -use capctl::{Cap, CapSet}; - -pub struct EditCapabilitiesState; - -pub struct EditCommandState { - pub remove: bool, -} - -impl State for EditCapabilitiesState { - fn create(self: Box, _manager: &mut RoleContext) -> Box { - self - } - fn delete(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - fn submit(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - fn cancel(self: Box, _manager: &mut RoleContext) -> Box { - Box::new(EditTaskState) - } - fn confirm(self: Box, _manager: &mut RoleContext) -> Box { - self - } - fn config(self: Box, _manager: &mut RoleContext) -> Box { - self - } - fn input(self: Box, manager: &mut RoleContext, input: Input) -> Box { - let task = manager.get_task(); - let role = manager.get_role().unwrap(); - let caps = input.as_caps(); - if role.borrow().capabilities_are_denied(caps) { - manager.set_error( - format!( - "Capabilities {:?} are denied by role definition (or in hierarchy definition)", - role.borrow().denied_capabilities() - ) - .into(), - ); - return self; - } - if let Some(task) = task { - task.borrow_mut().capabilities = Some(caps); - } - - Box::new(EditTaskState) - } - fn render(&self, manager: &mut RoleContext, cursive: &mut Cursive) { - let mut select = CheckListView::::new() - .autojump() - .on_select(|s, _, item| { - let RoleManagerApp { manager, state } = s.take_user_data().unwrap(); - let info = s.find_name::("info"); - if let Some(mut info) = info { - let mut capset = CapSet::empty(); - capset.add(*item); - let warning = if manager.get_role().unwrap().borrow().capabilities_are_denied(capset) { - "WARNING: This capability is denied by role definition (or in hierarchy definition)\n" - } else { - "" - }; - info.set_content(format!("{}{}\n", warning, descriptions::get_capability_description(item))); - } - s.set_user_data(RoleManagerApp { manager, state }); - }); - let task = manager.get_task(); - let mut selected = CapSet::empty(); - if let Some(task) = task { - selected = task - .borrow() - .capabilities - .as_ref() - .unwrap_or(&CapSet::empty()) - .to_owned(); - } - for capability in (!CapSet::empty()).iter() { - select.add_item(capability.to_string(), selected.has(capability), capability); - } - let mut layout = LinearLayout::new(Orientation::Horizontal); - layout.add_child(select.with_name("capabilities").scrollable()); - - layout.add_child( - TextView::new(descriptions::get_capability_description(&Cap::CHOWN)).with_name("info"), - ); - cursive.add_layer(Dialog::around( layout) - .title("Select capabilities, CTRL+A to check all, CTRL+U to uncheck all and CTRL+D to invert selection") - .button("Ok", move|s| { - let view = s.find_name::>("capabilities").unwrap(); - let mut caps = CapSet::empty(); - for item in view.iter() { - if *item.1 { - caps.add(*item.2); - } - } - execute(s,ExecuteType::Input( Input::Caps(caps))); - })); - } -} - -impl State for EditCommandState { - fn create(self: Box, _manager: &mut RoleContext) -> Box { - self - } - fn delete(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - fn submit(self: Box, _manager: &mut RoleContext, _index: usize) -> Box { - self - } - fn cancel(self: Box, _manager: &mut RoleContext) -> Box { - Box::new(EditTaskState) - } - fn confirm(self: Box, _manager: &mut RoleContext) -> Box { - self - } - fn config(self: Box, _manager: &mut RoleContext) -> Box { - self - } - fn input(self: Box, manager: &mut RoleContext, input: Input) -> Box { - if manager.get_command().is_some() { - if let Err(err) = manager.set_command(input.as_string()) { - manager.set_error(err); - return self; - } - } else { - if self.remove { - manager - .get_task() - .unwrap() - .borrow_mut() - .commands - .remove_command(&input.as_string()); - } else { - manager - .get_task() - .unwrap() - .borrow_mut() - .commands - .add_command(&input.as_string()); - } - - } - Box::new(EditTaskState) - } - fn render(&self, manager: &mut RoleContext, cursive: &mut Cursive) { - let mut edit = TextArea::new(); - if manager.get_command().is_some() { - edit.set_content(manager.get_command().unwrap()); - } - - cursive.add_layer( - Dialog::around(edit.with_name("edit").full_screen()) - .title("Edit command") - .button("Ok", move |s| { - let view = s.find_name::